@
noli这里的“工具”,如果指的是抽象的“手段”,那么几乎就是废话——差不多什么东西都能当工具。
如果是具体的“器具”,那也不合适,这个之前已经提过。
于是“语言就是工具”论,我就当是民科理论。从建设性来说鼓吹这种论调的还不如李煌老湿,后者好歹能有些娱乐价值。
破事有很多,再提些影响较大的。
首当其冲,想当然和惯性。
绝大多数人学习语言的目的往往是“会用”。这没问题。问题在于,不知不觉有些人就不考虑前提以为处处“存在就是合理”了,而不是联系实际需求,想想到底其中能有多少是有意为之的,哪些又是对现实的妥协。
比如说,越接近自然语言的设计就一定更“易用”吗?
比如说,越接近底层的,抽象特性越贫乏的语言,实现起来性能就一定能更好吗?
比如说,写出来的代码看起来干净,把类型都写清楚,没那么多乱七八糟的符号,就一定是更“清晰”吗?
只是不求甚解也罢了,然而这些问题实在太容易自以为是了。
这种思路这带来了严重的副作用,例如,阻碍现有语言的一些改进。
举个Java的例子。
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4459053十多年前就有人提议过,结果呢……呵呵呵。
有些时候,语言的设计者自己就不够清楚,导致犯下的低级错误影响更坏——特别地,被无知者捧臭脚。
不过好在大多数语言设计者还是相对理性一些……于是结果就是蠢主意扎堆在少数的语言上了,这种语言的用户就是冤大头(虽然也有部分是活该)。
仍然是Java的例子。前无古人后无来者的checked exception,别的语言有好意思抄的么。
(嘛,据说James Gosling还想取消extends呢。林林总总加起来,说是偏执狂也不算冤枉吧。)
然后,如果一句“那么多的共同思想”就能轻描淡写把某些人打发走,那也太便宜了。
这方面仍然缺乏一些系统化的理论。有很多东西就是因为各种原因鸡同鸭讲,因此有时被逼不得不讨论清楚以免误会。
比如,“强类型”和“弱类型”这种普遍没有清晰边界的东西,不围绕具体例子是几乎没法保证知道别人说的是啥的。
再如,都说面向对象,那么是不是都怀疑过为什么“对象”里非要窜出个“类”呢?
其实照OO之父的观点,根本就不是那么回事——重点是对象和消息传递,方法乃至类都是实现方式,顶多这种只能算一种风格(class-based OO)。具体点说,应该是Simula→C with Classes→中古C++→Java等等这样传承下来的。
现实却是似乎有不少见识拙计的,就拿这个偷换概念了,却不知道所谓的prototyping也能毫不含糊地实现OO,反过来鼓吹卖弄什么pure OO,甚至还有什么“继承”“封装”“多态”都好意思拿来当OO的定义了……笑死人。(……敢区分OOP和OOAD么?)
这种可笑的误会如果非要说客观因素的话,恐怕就是缺乏交流导致的——严格意义上的“面向对象”这个概念因为这般鸡同鸭讲,和被废了差不多。
扯到这里倒是正好发现还能发散一些东西(虽然可能在c2.com之类的地方都已经吐槽腻的常识)来黑:无论是继承封装多态,还是SOLID这些所谓OO五原则,其实就没一个是OO的专利。
只挑其中和PLT最相关的两个来讲。
一是继承,在这些实现方式里面都是作为类型之间的关系,说白了就是一种subtyping,是一种类型之间的严格偏序关系的特例。摊上五原则里表面上最依赖“OO思想”的LSP,在System F里早就玩的溜了:
http://typeof.net/2014/m/formation-of-modern-magic--why-functions-are-contravariant-in-the-input-type.html二是多态。OO所谓的多态也就是inclusion polymorphism或者subtyping polymorphism,只是真正的多态中出现较晚的一种而已。出现早的呢?比如重载就是一种ad-hoc polymorpism。泛型则是parametric polymorphism。
大概那些OO语言的设计者对历史也不甚了然,不知道那么些别人早就玩滥的道道,所以就偷懒没明确(这里得承认C++当初也做得不好)。
于是只会照搬语言教科书以及盲目崇拜的无能者/纯OO厨就只能念歪经了。没法指望他们会创造更方便的能解决问题的设计,反而还得负担科普成本,这凭什么要我干呢?
嗯,要搞这坨又没特定目标用户(脑残粉也算),做好我不入地狱谁入地狱的思想准备。