fbpx
维基百科

代码膨胀

代码膨胀(英語:Code bloat)是指程序代码(可以是源代码,也可以是机器代码)生成的程序文件过大、运行缓慢或者有其他浪费资源的情况。代码膨胀可能由编写代码的语言、编译时所用的編譯器,或者编写的程序员导致。代码膨胀通常指源代码过于冗长,由程序员的编码习惯和编程语言的设计导致,代码膨胀也可以指编译后的代码或者二进制文件占用空间过大(膨胀)。

常见原因 编辑

通常来说,膨胀的代码是由于程序员使用了较多的代码行,而非使用了解决问题的最佳方案。

程序员写出膨胀代码的部分原因有:

  • 过度设计
    • 过度使用面向对象(OOP)结构,如类和继承。这可能导致麻烦且混乱的设计,使代码量多于必要。
    • 不正确的使用设计模式——面向对象的开发人员可能在不需要使用设计模式的地方强行使用,从而导致问题。
  • 没有用适当的封装方案使代码可重复利用,导致代码重复[1]
  • 宣告式編程——在命令式或面向对象语言中实现宣告式编程风格通常会导致代码膨胀。
  • 过度的循环展开——不理智的过度优化性能。
  • 过度使用多重If条件语句——而没有使用如查找表

一些原生编译器推导膨胀的例子包括:

  • 死代码——代码被编译,但从未被使用。
  • 冗余计算——重新计算已经计算过的表达式。这种冗余计算经常在实现防止缓冲区溢出的“边界检查”代码时产生。 尖端的编译器只将其计算一次,使用常用子表达式消除英语Common subexpression elimination循环不变代码外提技术消除冗余计算。
  • C++中采用的模板系统的一些原生实现是编译该语言的编译器之不足之处的例子。实现此特性的原生编译器可以为使用的每个資料類型引入一个模板类版本的方法。但是,这也导致被编译的方法可能永远不会被用到,导致代码膨胀。更尖端的编译器和链接器能检测多余的副本并将其丢弃,或者避免产生,从而减少膨胀。因而,使用能放弃死代码英语Dead code的编译器可以使模板代码产生更小的二进制文件。[2]

例子 编辑

下列JavaScript程式碼算法有着大量的冗余变量、不必要的逻辑,以及低效的字符串连接。

// Complex  function TK2getImageHTML(size, zoom, sensor, markers) {  var strFinalImage = "";  var strHTMLStart = '<img src="';  var strHTMLEnd = '" alt="The map"></div>';   var strURL = "http://maps.google.com/maps/api/staticmap?center=";  var strSize = '&size='+ size;  var strZoom = '&zoom='+ zoom;  var strSensor = '&sensor='+ sensor;     strURL += markers[0].latitude;  strURL += ",";  strURL += markers[0].longitude;  strURL += strSize;  strURL += strZoom;  strURL += strSensor;    for (var i = 0; i < markers.length; i++) {  strURL += markers[i].addMarker();  }    strFinalImage = strHTMLStart + strURL + strHTMLEnd;  return strFinalImage; }; 

而相同的逻辑可以用下列方式更有效地表达:

// Simplified  function TK2getImageHTML(size, zoom, sensor, markers) {  var url = [ 'http://maps.google.com/maps/api/staticmap',  '?center=', markers[0].latitude, ',', markers[0].longitude,  '&size=', size,  '&zoom=', zoom,  '&sensor=', sensor ];   for (var i = 0; i < markers.length; i++) {  url.push(markers[i].addMarker());  }  return '<img src="' + url.join('') + '" alt="The map" ></div>'; } 

不同语言的代码密度 编辑

各种计算机语言代码密度有着很大差别,以“紧凑”语言(例如领域特定语言微软P代码英语Microsoft P-Code线程代码英语Threaded code)编写的程序以及紧凑语言(以机器代码编写)的直譯器通常比直接用机器语言编写程序消耗更少的代码量。

减少膨胀 编辑

减少代码膨胀的一些技术包括:[3]

  • 重构经常使用的代码序列为子程序,并从多个位置调用该子程序,而不是在各个位置上复制并粘贴英语Copy and paste programming这段代码。
  • 重新使用已经被编写的子程序(可能利用附加参数),而不是从头编写它们的新代码。

参见 编辑

  • 软件膨胀
  • 极简主义英语Minimalism (computing)

参考资料 编辑

  1. ^ 存档副本. [2017-06-12]. (原始内容于2017-05-31). 
  2. ^ hopl-may.dvi (PDF). [2017-06-12]. (原始内容 (PDF)于2007-11-20). 
  3. ^ Code bloat. DocForge. [30 December 2009]. (原始内容于2016-03-05). 

代码膨胀, 此條目需要精通或熟悉计算机科学的编者参与及协助编辑, 請邀請適合的人士改善本条目, 更多的細節與詳情請參见討論頁, 另見其他需要计算机科学專家關注的頁面, 此條目需要編修, 以確保文法, 用詞, 语气, 格式, 標點等使用恰当, 請按照校對指引, 幫助编辑這個條目, 幫助, 討論, 英語, code, bloat, 是指程序代码, 可以是源代码, 也可以是机器代码, 生成的程序文件过大, 运行缓慢或者有其他浪费资源的情况, 可能由编写代码的语言, 编译时所用的編譯器, 或者编写的程序员导致, 通常指源代. 此條目需要精通或熟悉计算机科学的编者参与及协助编辑 請邀請適合的人士改善本条目 更多的細節與詳情請參见討論頁 另見其他需要计算机科学專家關注的頁面 此條目需要編修 以確保文法 用詞 语气 格式 標點等使用恰当 請按照校對指引 幫助编辑這個條目 幫助 討論 代码膨胀 英語 Code bloat 是指程序代码 可以是源代码 也可以是机器代码 生成的程序文件过大 运行缓慢或者有其他浪费资源的情况 代码膨胀可能由编写代码的语言 编译时所用的編譯器 或者编写的程序员导致 代码膨胀通常指源代码过于冗长 由程序员的编码习惯和编程语言的设计导致 代码膨胀也可以指编译后的代码或者二进制文件占用空间过大 膨胀 目录 1 常见原因 2 例子 3 不同语言的代码密度 4 减少膨胀 5 参见 6 参考资料常见原因 编辑通常来说 膨胀的代码是由于程序员使用了较多的代码行 而非使用了解决问题的最佳方案 程序员写出膨胀代码的部分原因有 过度设计 过度使用面向对象 OOP 结构 如类和继承 这可能导致麻烦且混乱的设计 使代码量多于必要 不正确的使用设计模式 面向对象的开发人员可能在不需要使用设计模式的地方强行使用 从而导致问题 没有用适当的封装方案使代码可重复利用 导致代码重复 1 宣告式編程 在命令式或面向对象语言中实现宣告式编程风格通常会导致代码膨胀 过度的循环展开 不理智的过度优化性能 过度使用多重If条件语句 而没有使用如查找表 一些原生编译器推导膨胀的例子包括 死代码 代码被编译 但从未被使用 冗余计算 重新计算已经计算过的表达式 这种冗余计算经常在实现防止缓冲区溢出的 边界检查 代码时产生 尖端的编译器只将其计算一次 使用常用子表达式消除 英语 Common subexpression elimination 和循环不变代码外提技术消除冗余计算 C 中采用的模板系统的一些原生实现是编译该语言的编译器之不足之处的例子 实现此特性的原生编译器可以为使用的每个資料類型引入一个模板类版本的方法 但是 这也导致被编译的方法可能永远不会被用到 导致代码膨胀 更尖端的编译器和链接器能检测多余的副本并将其丢弃 或者避免产生 从而减少膨胀 因而 使用能放弃死代码 英语 Dead code 的编译器可以使模板代码产生更小的二进制文件 2 例子 编辑下列JavaScript程式碼算法有着大量的冗余变量 不必要的逻辑 以及低效的字符串连接 Complex function TK2getImageHTML size zoom sensor markers var strFinalImage var strHTMLStart lt img src var strHTMLEnd alt The map gt lt div gt var strURL http maps google com maps api staticmap center var strSize amp size size var strZoom amp zoom zoom var strSensor amp sensor sensor strURL markers 0 latitude strURL strURL markers 0 longitude strURL strSize strURL strZoom strURL strSensor for var i 0 i lt markers length i strURL markers i addMarker strFinalImage strHTMLStart strURL strHTMLEnd return strFinalImage 而相同的逻辑可以用下列方式更有效地表达 Simplified function TK2getImageHTML size zoom sensor markers var url http maps google com maps api staticmap center markers 0 latitude markers 0 longitude amp size size amp zoom zoom amp sensor sensor for var i 0 i lt markers length i url push markers i addMarker return lt img src url join alt The map gt lt div gt 不同语言的代码密度 编辑各种计算机语言的代码密度有着很大差别 以 紧凑 语言 例如领域特定语言 微软P代码 英语 Microsoft P Code 线程代码 英语 Threaded code 编写的程序以及紧凑语言 以机器代码编写 的直譯器通常比直接用机器语言编写程序消耗更少的代码量 减少膨胀 编辑减少代码膨胀的一些技术包括 3 重构经常使用的代码序列为子程序 并从多个位置调用该子程序 而不是在各个位置上复制并粘贴 英语 Copy and paste programming 这段代码 重新使用已经被编写的子程序 可能利用附加参数 而不是从头编写它们的新代码 参见 编辑软件膨胀 极简主义 英语 Minimalism computing 参考资料 编辑 存档副本 2017 06 12 原始内容存档于2017 05 31 hopl may dvi PDF 2017 06 12 原始内容存档 PDF 于2007 11 20 Code bloat DocForge 30 December 2009 原始内容存档于2016 03 05 取自 https zh wikipedia org w index php title 代码膨胀 amp oldid 73707585, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。