打印
[C语言]

面对对象滚蛋篇之2--程序语言不是工具【转】

[复制链接]
1695|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlsbz|  楼主 | 2014-10-31 23:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xlsbz 于 2014-11-1 13:58 编辑

程序语言不是工具

(王垠 yinwang.org 版权所有,未经许可,请勿转载)

在谈论到程序语言的好坏的时候,总是有人说:“程序语言只是一种工具。只要你的算法好,不管用什么语言都能写出一样好的程序。”在本科第一堂编程课上,我的教授就这么对我们说。可是现在我却发现,这是一个根本错误的说法。

我不知道这种说法确切的来源,然而昨天在浏览网页的时候,偶然发现了 C++ 的设计者 Bjarne Stroustrup 的一些类似的说法。这些说法来自于 2007 年 MIT Technology Review 对 Stroustrup 的采访

  • 问:一个好的语言是什么样的?
    Stroustrup:所有能帮助人们表达他们的想法的东西都会让语言更好。一个语言在一个好的工匠手里应该能胜任每天的任务。语言是否优美是次要的问题。被认为是丑陋的语言开发出来的有用的系统,比优美的语言开发出来的系统要多得多。
  • 问:优雅难道不重要吗?
    Stroustrup:优雅很重要,可是你如何衡量“优雅”?可以表达问题答案的最少字数?我觉得我们应该看构造出来的应用程序的优雅程度,而不是语言自身的优雅程度。就像你不能把木工的一套复杂的工具(很多是危险的工具)叫做“优雅”一样。但是我的餐桌和椅子却真的很优雅,很美。当然,如果一个语言本身也很美,那当然最好。
一些基本的错误

对这两个回答,我都不满意,我觉得这只是他对于 C++ 的恶劣设计的借口而已。下面我对其中几个说法进行质疑:

所有能帮助人们表达他们的想法的东西都会让语言更好。

作为一个程序语言,并不是好心想“帮助人”就可以说是好的。如果是这样的话,那么我就可以把所有国家的脏话都加到你的语言里面,因为它们可以帮助我们骂人。

被认为是丑陋的语言开发出来的有用的系统,比优美的语言开发出来的系统要多得多。

系统的数量再多也不能说明这个语言好。正好相反,众多的系统由于语言的一些设计失误,把人们的生命置于危险之中,这说明了这个语言的危害性之大。一种像炸药一样的语言,用的人越多越是危险。

语言不是工具,而是材料

我这篇**想说的最关键的部分,其实是他所支持的“语言工具论”的错误。

Stroustrup 说:

我觉得我们应该看构造出来的应用程序的优雅程度,而不是语言自身的优雅程度。就像你不能把木工的一套复杂的工具(很多是危险的工具)叫做“优雅”一样。但是我的餐桌和椅子却很优雅,很美。

他的言下之意就是把程序语言比作木工的工具,而餐桌也椅子就是这些工具做出来的产品。比方的威力是很大的,很多人一见到大牛给出这么形象的比方,想都不用想就接受了。如果你不仔细分析的话,这貌似一个恰当的比方,然而经过仔细推敲,这却是错误的比方。这是因为程序语言其实不是一种“工具”,而是一种“材料”。

木工不会把自己的锯子,墨线等东西放进餐桌和椅子里面,而程序员却需要把语言的代码放到应用程序里面。虽然这些程序经过了编译器的转化,但是程序本身却仍然带有语言的特征。这就像一种木材经过墨线和锯子的加工,仍然是同样的木材。一个 C++ 的程序在编译之后有可能产生内存泄漏和下标越界等低级错误,而更加安全的语言却不会出现这个问题。

所以在这个比方里面,程序语言所对应的应该是木工所用的木料,钉子和粘胶等“材料”,而不是锯子和墨线等“工具”。这些材料其实随着应用程序一起,到了用户的手里。那么对应木工工具的是什么呢?是 Emacs, vi, Eclipse,Visual Studio 等编程环境,以及各种编译器,调试器,make,界面设计工具,等等。这些真正的“工具”丑一点,真的暂时无所谓。

现在你还觉得程序语言的优雅程度是次要的问题吗?一个复杂而不安全的语言就像劣质的木料和粘胶。它不但会让餐桌和椅子的美观程度大打折扣,而且会造成它们结构的不牢靠,以至于威胁到用户的生命安全。同时它还可能会造成木工的工作效率低下以及工伤的产生。

这也许就是为什么我的一个同事说,他看 C++ 代码的时候都会带上 OSHA(美国职业安全与健康管理局)批准的护目镜。




相关帖子

沙发
dirtwillfly| | 2014-11-1 09:05 | 只看该作者
有道理啊

使用特权

评论回复
板凳
李富贵| | 2014-11-1 11:46 | 只看该作者
撸主就是一个典型的反智主义。

RTOS不行,要裸奔。《Pointers on C》不行要看谭浩强。面向对象不行要结构化。

总之,凡是先进的技术都不行,一定要用落后的,这就是撸主基本逻辑。

使用特权

评论回复
地板
link8001| | 2014-11-1 13:39 | 只看该作者
反正我是信了

使用特权

评论回复
5
xlsbz|  楼主 | 2014-11-1 13:55 | 只看该作者
李富贵 发表于 2014-11-1 11:46
撸主就是一个典型的反智主义。

RTOS不行,要裸奔。《Pointers on C》不行要看谭浩强。面向对象不行要结构 ...

基本思想是多样性。不要盲目崇拜哪一种方式。

使用特权

评论回复
6
通宵敲代码| | 2014-11-2 00:03 | 只看该作者
略感有理,
但工具何尝不是材料做的呢!

使用特权

评论回复
7
李富贵| | 2014-11-3 21:42 | 只看该作者
xlsbz 发表于 2014-11-1 13:55
基本思想是多样性。不要盲目崇拜哪一种方式。

多样性、存在即合理都是你们这群学不会新把戏的老狗的借口。街上有要饭的,完全是多样性的表现,你怎么不去要饭去???

使用特权

评论回复
评论
xlsbz 2014-11-7 13:27 回复TA
李富贵 我还以为姓李呢? 这李富贵挺善于研究的。水平很高。 
逍遥派掌门 2014-11-4 10:21 回复TA
虾扯蛋 
john_lee 2014-11-3 22:07 回复TA
老朴,你那嘴啊!! 
8
Ryanhsiung| | 2014-11-7 08:38 | 只看该作者
程序语言就是工具,用来实现我们的想法及功能。
  看了LZ两篇**,想问LZ工作几年了啊?
    应该工作不超过2年,写的最长代码(单体)不超过1W行。看我猜对了没

使用特权

评论回复
9
chen_jhhb| | 2014-11-7 09:14 | 只看该作者
语言就是工具,算法和思路才是灵魂

使用特权

评论回复
10
xlsbz|  楼主 | 2014-11-7 12:54 | 只看该作者
Ryanhsiung 发表于 2014-11-7 08:38
程序语言就是工具,用来实现我们的想法及功能。
  看了LZ两篇**,想问LZ工作几年了啊?
    应该工作不 ...

不是我写的 是王垠写的。
早先玩linux的都知道这个人。搞语言的。

使用特权

评论回复
11
xlsbz|  楼主 | 2014-11-7 13:00 | 只看该作者
Ryanhsiung 发表于 2014-11-7 08:38
程序语言就是工具,用来实现我们的想法及功能。
  看了LZ两篇**,想问LZ工作几年了啊?
    应该工作不 ...

看了一下你的**。你整体水平不错。但是单从编码来看,你不一定赶得上我。

使用特权

评论回复
12
mcu5i51| | 2014-11-7 13:17 | 只看该作者
每个的都有自己的理解,看看就好;
每一种语言的存在都有它的合理性。

使用特权

评论回复
13
Ryanhsiung| | 2014-11-7 14:42 | 只看该作者
本帖最后由 Ryanhsiung 于 2014-11-7 14:44 编辑
xlsbz 发表于 2014-11-7 13:00
看了一下你的**。你整体水平不错。但是单从编码来看,你不一定赶得上我。 ...

找到重点!
  使用语言都是为了实现功能。
    模块化是为了提高工作效率(阅读、维护、移植)
      文档的重点,不是你要多少字,怎么简洁明了 怎么写。我下属写的太多还会被我骂。

      我的学历只有大专,但是为什么我的薪资比硕士高,重点是什么?工程师的重点就是“解决问题”。 而不是花俏的编程技巧。(就像“风扇吹肥皂的故事”),除非你是搞科研的。
         看LZ还是心浮气躁,还要磨练磨练。 没事跟我跑跑马拉松吧。
         

使用特权

评论回复
14
xlsbz|  楼主 | 2014-11-7 15:40 | 只看该作者
Ryanhsiung 发表于 2014-11-7 14:42
找到重点!
  使用语言都是为了实现功能。
    模块化是为了提高工作效率(阅读、维护、移植)

不用争了。咱俩观点是一致的。
但是你编码水平不一定有我高 也是事实。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

1614

帖子

4

粉丝