一.编译型语言与解释型语言( 五 )


比如一个句子是“板凳宽,扁担长,板凳不让扁担绑在板凳上” 。用动态语言表示,则写成“A宽,B长,A不让B绑在A上” 。写起来很省事,但维护起来就费劲了 。因为A和B可以代表任何东西,凭什么一定就是“板凳宽,扁担长”,而不是“肥皂宽,牙刷长”?而用静态语言表示,则是“板凳A宽,扁担B长,A不让B绑在A上” 。通过对比发现,静态语言比动态语言,多了一开始的“板凳”和“扁担”这两个词语 。相当于从一开始,就标明了A是板凳,B是扁担 。虽然要多写四个字,但可以避免歧义,增强可读性 。只要用脑子记住“A是板凳,B是扁担”,岂不就能达到同样的效果?仅仅一个句子当然是可以的,人人都能记得住 。而商业程序的代码量,一般在十万行以上 。你不仅需要记住什么代表板凳和扁担,你还得记住水桶,暖壶,扫帚,簸萁,锅,碗,瓢,盆,油,盐,酱,醋,烟,酒,茶,糖 。。。所以,为了解决这个问题,动态语言就需要靠加注释,来弥补自身可维护性的不足 。可这样做也是不靠谱的 。因为如果对代码进行封装,所需要注释的文字量,就会超过代码量本身,到时候你根本不是“写代码加注释”,而是“写注释加代码” 。总之,动态语言只适合写非常非常小的程序,中型以上的程序,通常要使用静态语言编写,才会比较容易维护 。
我个人只在编写1000行以内的小工具时,才会使用动态语言,如、Lua等 。但即便如此,还是常常一不小心,就陷入“第二天看不懂”的窘境 。当然,“不适合”并不代表“绝对不能”,就像“徒手搬砖只适用于小型建筑,大中型建筑要使用工程机械”,这说法我一般认为是正确的 。但总有一些人会举极端的例子来反驳,说万里长城和金字塔是用手磊出来的,这就实在没意思了 。。。动态语言存在的的第二个问题,就是容易产生BUG,并且很难在第一时间发现 。假如我们遇到一个游戏,它是用静态语言编写的,其中有一段代码是这样的(伪代码):角色 A=李逍遥;怪物 B=树妖;技能 C=御剑术;武器 D=钢剑;然后我们编写了一段代码:“A装备着D,发动了C,击败了B”这段代码很容易翻译,就是“李逍遥装备着钢剑,发动了御剑术,击败了树妖” 。假如我们一时不小心,把代码写成“李逍遥装备着树妖,发动了钢剑,击败了御剑术”的话,会怎么样?这时候IDE会立刻报错,并提示你出现了三个错误 。1,树妖是怪物,不能装备2,钢剑是武器,不能当做技能使用3,御剑术是技能,无法被击败如果不排除这些错误,你的程序就无法继续顺利编写下去 。所以你只好先排除这三个问题之后,才能继续写代码,套用前面的例子,也就是高年级学生“查字典”了 。
由于绝大多数的问题,都必须在写代码的过程中,通过“查字典”排除掉,所以只要你的程序可以顺利写完,运行起来也基本不会有太大的问题了 。但如果这个程序是使用动态语言编写的,则不会报错 。既然B可以是任何东西,那凭什么必须是钢剑,而不能是树妖?这完全符合动态语言的语法规则,IDE当然不会报错 。所以直到你的程序写完,BUG一堆一堆的冒出来,IDE却始终认为你的代码完全正确 。所以使用动态语言,有很多错误,IDE是不会帮你检查的 。你就要在每一个可能出错的地方,加上注释,提醒自己A是啥东西,B又是啥东西 。。。。。最后你会发现,若要保证你自己写的程序不出BUG,而且日后还可以正常维护的话,那么你需要写的注释,比代码本身还多 。写着写着,你就不像在编程了,而像在写一本说明书 。
常见语言分类
以下语言,皆属于动态类型: