了解C语言是否会影响您在高级语言中编写的代码质量?

35
这个问题似乎已经解决了,甚至被过度讨论了。聪明人已经就此发表了聪明的观点。要成为一个真正优秀的程序员,你需要了解C语言
或者说呢?
这周我受到了两次启示。第一次启示让我意识到我的假设不会超越我所掌握的知识,而考虑到在我的计算机上运行的软件的复杂性,那几乎是不存在的。但真正让我产生共鸣的是这篇Slashdot评论
结果是我注意到传统C“裸机”程序员假定高级语言实现方式的很多幼稚方法。他们在影响的项目中做出糟糕的“优化”决策,因为他们不知道编译器如何工作,也不知道一个良好的运行时系统可能与他们理解的幼稚宏汇编模型有多么不同。
然后我想到:C语言只是更多的抽象,像其他所有抽象一样。甚至CPU本身也只是一个抽象!我从来没有看到它崩溃,因为我没有衡量它的工具。
我有些困惑。我的思维已经像Dijkstra所说的BASIC那样无法挽回地被毁坏了吗?我是否一直处于过度优化的状态中?现在我意识到自己对任何事情都一无所知,还有希望吗?有什么东西需要知道吗?为什么这些问题如此迷人,我在过去五年里写的所有东西可能都是基本上错误的?
简而言之:除了API文档告诉我什么之外,还有其他知识价值吗?
编辑:已变更为社区wiki。当然,这也意味着你必须发布比我们更好的解释器/运行时的示例 :)

27
不,它不能。你没事的。了解更多对你有好处。停止担心。 :) 在那个评论中的C程序员可能是那些从未费心正确地学习迁移到的高级语言的人。如果你切换语言,请努力学习它的工作原理,在API和底层(如果可能)都要了解。那么你就永远不会遇到麻烦了。 - FrustratedWithFormsDesigner
1
“唯一真正的智慧在于知道自己一无所知。”-苏格拉底 - RMorrisey
4
请注意不要轻易否认他人的工作和知识,因为我们无法了解所有事情的处理方式。问题在于我们无法掌握所有事情的信息。 - György Andrasek
1
大型编程语言对比基准测试。这个喷子提到的那些精彩的“良好运行时系统”,有多少在实践中经常能够击败C语言?有多少可以接近C语言,比如说25%?那些是多少呢?零。伟大的编程语言对比基准测试:所有基准都要涵盖,所有编程语言都要包括。瞧,Slashdot上的喷子:http://shootout.alioth.debian.org/u32q/benchmark.php?test=all&lang=all但请记住:它们是“低级C程序员无法理解的复杂高级东西”。也许他们确实无法理解,但他们肯定能够打败这些垃圾 ;) - SyntaxT3rr0r
4
我们中的一些人更关心数据丢失,而不是在失去所有数据之前获得几毫秒的性能提升。 - Warren P
显示剩余2条评论
19个回答

38

不懂C语言也不了解底层实现细节不会伤害你本身。即使在不适当的情况下,一贯地以低级细节为思考和工作方式会对你造成伤害。

老话说“真正的程序员可以用任何语言编写FORTRAN”。如果你以同样的方式使用C语言,那并没有提升。如果你在写Lisp,就要用Lisp;如果你在写Python,就要用Python。C语言适合的内容并不适合那些语言(或者其他很多语言)。

优秀的程序员需要能够在许多抽象层面上思考,并且(更重要的是)识别并应用适合当前任务的抽象层次。

了解C语言的抽象层次不会有害,而不了解替代方法则可能会受到伤害。


4
我认为这是过度优化的陷阱。不要担心每种方法的效率如何,始终以编写最简洁、直观、可读性最强的实现方式作为第一步。测量并查找性能瓶颈。返回并修改那些有瓶颈的代码,直到取得结果;但保持其他代码不变。 - RMorrisey
12
实际上,当你遇到瓶颈时,第一反应不应该是乱改它,而是考虑如何改变高级算法以完全避免瓶颈。当你遇到运行缓慢的代码时,不要想着“怎样让它更快”,而是想着“怎样避免执行这段代码”。 - Ants Aasma
真正的程序员可以用任何语言编写FORTRAN :-). 当我看到使用KR参数风格编写的C函数时,因为这就是FORTRAN的做法,我坚信它们不应该这样做。 void function(variable) { int *variable;...} - Anycorn
@aaa,在K&R参数声明中,参数声明在左括号之前。你也可以说,ANSI C风格的函数定义是老CS毕业生试图编写Pascal。只是后者可能是正确的。:p - user14554

20

知识从不会伤害人。在高级语言中编写糟糕代码的人之所以如此,是因为他们没有正确掌握高级语言,这些都是糟糕的开发人员。


4
我会这样说,“你不知道的东西会伤害你”。而你所知道的只能帮助你。 - Warren P
显然,你没有读过H.G. Wells的《时间机器》。"他黯淡地想到人类的进步,并在日益增长的文明堆积中看到一个愚蠢的堆积,最终必将回落并摧毁其创造者。" 更多的知识总是一件好事 - 直到它不是为止。 - Eloff
2
@Eloff,知识本身并不坏,但是那些拥有知识却愚蠢的人是危险的! :) - Arkaitz Jimenez
聪明的人有知识更加危险。知识本身并不是好或坏的,但即使是最基本的知识(比如火)在被误用时也会造成伤害。更高级的知识往往会造成更严重的后果——比如分裂和融合原子的知识。回到我们讨论的话题,C语言的知识并不是好或坏的,但无论是愚蠢的人还是聪明的人都可能会误用它。 - Eloff

12

对于一个不好的开发者,任何类型的知识都可能是危险的。

对于一个好的开发者,任何类型的知识都是一项资产。


7
使用自然语言(口语)或人工语言(编程)需要大脑以某种方式适应。每种语言都有自己的语法,自己的词汇(API等)。如果你主要是Java程序员,并转换到Ruby,则至少会遵循Java程序员的思维模式,即使不是用Ruby编写基本上是Java代码的内容。需要一些努力和实践,才能开始在新环境(Ruby语法,Ruby API)中感到舒适并开始编写Ruby代码。
因此,这个过程是完全正常的,之前模式的任何不良影响也非常短暂。更重要的是,您学习的每种语言都会拓宽您的视野,并使下一个语言的学习更容易。享受旅程吧。:]

6
编程并不只是编程语言,它更关注于解决问题。用来解决问题的工具恰好是编程语言。你写代码不是为了写代码,而是为了执行它并解决问题。
你越了解你的工具,就能更好、更快地解决问题。但是,当你试图使用锤子将螺丝钉固定在木头上时,你会遇到严重的麻烦。然而,软件有一个很好的特性:对于任何给定的问题,都可以有许多不同的解决方案。
因此,完全有可能编写一把锤子,以这样的角度击中螺丝钉,使得螺丝钉告诉木头自己要开个孔,以便螺丝钉适合进去。然后你可以将其隐藏在一个按钮后面,用户甚至不需要知道锤子实际上是什么。
虽然这不是最有效的解决方案,但它仍然是一个有效的、可行的解决方案。当你更加熟练掌握所使用的工具时,最终你会发现如何在API没有提供的情况下编写一个螺丝刀。
你掌握的工具越多,解决问题的方法也越多,你就有更多的选择,并且你对所使用的解决方案做出的决策也会更好。选择正确的工具来完成工作。但是当你不了解工具和可能的解决方案时,怎么能做到呢?

4
进一步探讨其他人的评论...虽然我不确定自己是否相信沃尔夫假说,即http://en.wikipedia.org/wiki/Whorfian_hypothesis">语言相对论,但在编程方面很明显是真实的。你所掌握的编程语言影响着你解决问题的方式。以下是两个例子:
1) 上世纪七十年代我的一位教授尝试查找字符串数组中是否有重复项。他使用FORTRAN编写代码,但是暴力n²算法执行速度太慢了。所以他向一位朋友请教,这位朋友熟悉PL1(我想是这种语言,也许是APL),它具有一个排序运算符。因此,在那种语言中,您学会如何排序,以及它有多么有用,因为操作起来很容易。这位朋友首先想到了明显的排序结果,然后使用一种更快的算法来查看相邻元素。这种方法快得多,并且即使对于我的FORTRAN教授来说,它也能够完美地实现。
2) 在读研期间,我的室友是一位物理学研究生。他在麻省理工学院只上过一门编程课程,当然是Scheme。有一天,我去他的办公室,他说:“嘿,布莱恩,你能看一下这段代码并告诉我它是否可行吗?”那是一个排序例程。我瞥了一眼,说不可能运行,因为它显然是冒泡排序,但它只有一个循环(不是那个可以使用如果您生病和扭曲)的奇怪循环来编写冒泡排序)。所以我这样说。他回答说:“哦,但是底部有一个递归调用!”我从未想过编写递归冒泡排序。但更重要的是,对他来说,他从未想过编写非递归函数!
重点是你所掌握的语言在很大程度上决定你将编写什么类型的代码。你掌握的语言越多,你拥有的工具也就越多,并且只要你知道何时使用每种工具,那么更多工具永远不会是坏事...

3

要成为一个真正优秀的程序员,你需要了解C语言。

我同意这一点。

但我也认为,要成为一个真正优秀的程序员,你必须真正地知道如何使用另一种语言编写代码(而不是在另一种语言中编写C代码)。


3

了解C语言不会损害您的代码质量,但仅仅了解C语言则有可能会。


2

不。

即使你受到了伤害,如果失去了追求知识和进步的愿望,那也是不好的。


2

软件工程是关于理解抽象概念以及如何使用抽象概念来高效地解决问题的(无论高效意味着成本更低、性能更快还是功能交付时间最短)。理解C语言只是我们每天使用的抽象层面的另一种洞察力,而“缩小视野”到这个细节层面所需的技能是有价值的,只要你也能开发出必要时“放大视野”的技能。这种技能组合将在该领域的各个方面为您服务,无论是设计对象模型、设置清晰的功能组合,还是仅仅为了明确和可维护性而构建单个方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接