@
cmdOptionKana #77 原文:“@oahebky 鸭子类型最大的问题在于,这只动物不走、不叫(即不动、程序不运行)的时候,你不知道它是什么动物。也就是说,静态分析难度大。就算让它走了、叫了(即,在运行时),前面运行得好好的,看起来像极了鸭子,后面偶尔有一段代码要求它拍翅膀,这才发现它虽然走起来像鸭子、叫起来像鸭子,却没有翅膀!程序抛出异常。当一个程序越来越大的时候,一个动物(类、对象)的特性就越多、越复杂,偶尔发现它不是想要的动物的情况就会很多,多到项目失控。静态语言的好处是,静态分析轻松,只要声明它是鸭子即可,它不管去到多么复杂的系统里都能一眼看出来就是鸭子,不需要它把全部动作都做一遍(程序不需要运行,直接静态分析),一边写程序一边有精确的提示,重构的时候极方便,不容易出错。”
======
回复:
我没有说静态语言完全没有好处。
我说的是“我个人坚信语言往静态发展是倒退。往动态发展是进步。”
我的意思也就是说,对于你说的动态语言问题,思路是通过进化编译器逐渐解决,也就是进步。
但是因为动态语言有这个问题,就退回到没有这个问题的静态语言上,那么静态语言要怎么进步呢?不就是泛类型化 -- 往动态性演变。“最终还是变成一个拥有动态语言(语法)的静态编译器”。
静态语言不是因为你一眼看出来是鸭子,是鸽子所以不容易出错(编译器报错)。
而是因为你把时间花在查看源码实现,以及实现给鸭子安上火箭推进器上。
而不是像动态语言一样可以“凭感觉”写,把鸭子的声线和鸭掌按倒火箭推进器上,然后把这个火箭推进器返回(鸭子变成了火箭推进器)。
如果你写动态语言也一样对一个变量追到它的创建,修改,销毁一生的流程,那么同样可以写出不容易出错的代码。