知道C真的会伤害你用更高级语言编写的代码吗?

时间:2010-05-21 13:44:20

标签: c language-agnostic optimization premature-optimization

问题似乎已经解决,甚至被打死。聪明人曾就这个问题说过smart things。要成为一名优秀的程序员,you need to know C

或者你呢?

本周我开悟了两次。 The first one让我意识到我的假设并不比我背后的知识更进一步,并且考虑到我的机器上运行的软件的复杂性,这几乎是不存在的。但真正开车回家的是this Slashdot comment

最终的结果是我注意到传统的C“裸机”程序员认为实现更高级语言的许多天真的方式。他们在他们影响的项目中做出错误的“优化”决策,因为他们不知道编译器如何工作,或者他们理解的天真宏汇编程序模型与良好的运行时系统有多么不同。

然后它击中了我:C就像所有其他人一样只是one more abstraction。即使the CPU itself也只是一种抽象!我从来没有看到它破裂,因为我没有测量它的工具。

我很困惑。像Dijkstra谈到BASIC一样,我的思想是否已经被肢解,无法恢复?我是否处于不成熟的过早优化状态?对我来说有希望,现在我意识到我什么都不知道吗?有什么需要知道的吗?为什么它如此迷人,我在过去五年写的所有内容都可能是根本错误的?

总结一下:知道更多API文档告诉我的是否有任何价值?

编辑:制作CW。当然这也意味着你现在必须更好地发布解释器/运行时优化的例子:)

19 个答案:

答案 0 :(得分:38)

既不知道C也不知道实施的低级细节会伤害你 - 本身。如果你始终以低级别的细节思考和工作,即使它不合适,也会伤害你。

俗话说“真正的程序员可以用任何语言编写FORTRAN。”如果你使用C做同样的事情,那不是一个改进。如果您正在编写Lisp,请编写Lisp。如果您正在编写Python,请编写Python。 C的适当和合理的不适用于那些(或任何其他任何一个)。

一个优秀的程序员需要能够在许多不同的抽象层次上思考,并且(更重要的是)识别和应用适合于手头任务的抽象级别。

了解C的抽象级别并没有受到伤害。无视替代品可以(并且将会)。

答案 1 :(得分:20)

知识不会造成伤害。永远。 那些在高级语言中编写错误代码的人是因为他们没有正确掌握更高级别的语言,糟糕的开发人员。

答案 2 :(得分:12)

对于一个糟糕的开发者来说,任何类型的知识都是危险的。

对于一个优秀的开发者来说,任何类型的知识都是一种资产。

答案 3 :(得分:7)

使用语言 - 自然(口语)或人工(编程) - 需要思维以某种方式适应。每种语言都有它自己的语法,它自己的词汇表(API)等。如果你主要是一个Java程序员并切换到Ruby,你至少会遵循Java程序员的思维模式,如果不是基本上编写Java代码的话。红宝石。在您开始对新环境(Ruby语法,Ruby API)感到满意并开始编写 Ruby 代码之前,需要花费一些精力和练习。

因此,该过程完全正常,以前模式的任何不利影响都很短暂。更重要的是,你学到的每一种语言都会拓宽你的视野,让学习下一个更容易。旅行愉快。 :

答案 4 :(得分:6)

编程与编程语言无关。它是关于解决问题。用于解决问题的工具恰好是编程语言。你不编写代码来编写代码,编写代码来执行代码并解决问题。

您越了解自己的工具,就能越快越好地解决问题。但是当你使用锤子将螺丝钉入木头时会遇到严重的麻烦,软件有一个很好的特性:对于任何给定的问题,都有一种荒谬的解决方案。

所以完全有可能用一把锤子敲击一个螺钉,这个角度使得螺丝会告诉木头自己打一个洞,这样螺丝就可以装入。然后你可以将它隐藏在一个按钮后面,用户甚至不需要知道锤子究竟是什么。

虽然它不是最有效的解决方案,但它仍然是一个有效且有效的解决方案。当你使用过的工具变得更好时,最后你会发现当API没有提供螺丝刀时如何编写螺丝刀。

您知道的工具越多,您知道如何解决任何问题的方式越多,您拥有的选择就越多,您对使用哪种解决方案的决策就越好。为工作选择合适的工具。但是,当你不了解工具和可能的解决方案时,你怎么能这样做?

答案 5 :(得分:4)

扩展其他人的评论...虽然我不确定我是否相信自然语言中的http://en.wikipedia.org/wiki/Whorfian_hypothesis">Whorfian假设,但它非常清楚在编程方面是正确的。你知道的语言会影响你如何解决问题。两个例子:

1)我从很多年前的一位教授那里得知:他试图找出他的数组中是否有任何重复。这是在70年代,所以他在FORTRAN写这篇文章。他的蛮力n ^ 2执行时间太长了。所以他跟朋友说话。他的朋友知道PL1(我认为是,也许是APL),它有一个排序运算符。所以,在那种语言中,你学会分类,以及它有多大用处,因为它很容易。朋友首先提出了明显的排序,然后看看相邻的元素算法。要快得多,我的FORTRAN写作教授也不会想到,尽管它在FORTRAN中完全可以实现。

2)当我在读研究生时,我有一个室内研究生为室友。他去了麻省理工学院,只参加了一个编程课,当然是在Scheme中。有一天,我在他的办公室停了下来,他说:“嘿,Brian,你能看看这段代码并告诉我它是否应该有用吗?”这是一个排序程序。我瞥了一眼,说它不可能工作,因为它显然是bubbleort,但它只有一个循环(不,不是一个时髦的循环,你可以写如果你生病的扭曲)。所以,我说过。他回答说“哦,但它底部有一个递归的呼叫!”写一个递归的bubblesort永远不会发生在我身上。但更重要的是,HIM编写非递归函数永远不会发生!

关键在于您所知道的语言在很大程度上决定了您要编写的代码类型。您知道的语言越多,您拥有的工具就越多,只要您知道何时使用每种工具,就会有更多的工具从不坏......

答案 6 :(得分:3)

  

要成为一名优秀的程序员,你需要了解C。

我同意这一点。

但我同意,要成为一名优秀的程序员, 如何用另一种语言编写C代码。)

答案 7 :(得分:3)

了解C不会损害代码的质量,但确定“只有C”肯定会

答案 8 :(得分:2)

没有

如果你失去了你想要知道和改善的愿望,你就会受伤。

答案 9 :(得分:2)

了解不同的语言是一种资产。了解如何构建编译器和解释器也是一种资产。最后,每个程序员都应该花一些时间用汇编语言来欣赏更高级的语言。 : - )

在我的大学,我们上了一门课程“编程语言”,我们学习了LISP,SNOBOL和ADA。在解决编程问题时,这些语言让您对不同的概念思维开放。摘要是选择最适合问题的语言。

了解编程语言只是基础。如果我不了解其他相关主题,我的职业生涯就不会很远:数据结构,算法,线性代数,布尔代数,微处理器设计和通信(人与人之间)。任何人都可以拿起一本书,学习一门语言并称自己为程序员。这是其他技能,可以将熟练的开发人员与街头的开发人员区分开来。

学习编程语言。好好学习,这样你就可以将更多的脑力集中在手头的其他任务上。您不应经常参考编程手册。我的大部分注意力集中在任务的要求以及算法和数据结构上,以便在最短的时间内正确实现。

答案 10 :(得分:2)

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

答案 11 :(得分:1)

如果您在不需要时将这些知识应用于更高级别的语言,那么这只会受到伤害。当然,在编写我自己的集合类时有一些低级别的C经验,我也可以用Java编写。但是它是现有Collections库的更好的替代品(Java API作为Commons Collections附加功能)吗?也许

在实践中,你必须计算投入的时间是否值得。

事实上,您应该在破解代码之前先进行研究。看看您尝试做什么可以使用内置或第三方工具完成。如果可以,那么看看内置或第三方工具是否符合您的要求,以及它们是否表现良好。如果他们不这样做,找出原因。如果他们/真的/不,重写。

正如其他人所说,所有知识都是值得的。我的意思是/所有/ - 都是低级优化的C代码,作为对高级库的高级调用。如果你们两个都知道,你就会知道在什么时候使用哪一个,以及为什么。

答案 12 :(得分:1)

这里真正的问题是假设。那些其他开发者假设他们知道它是如何工作的无论是来自经验丰富的开发人员,还是来自认为他们都已经弄明白的新手,这些假设都是魔鬼。

至少,这就是我在这里假设的

答案 13 :(得分:1)

短而甜蜜:

要成为一名优秀的程序员,您需要能够以有条理的方式思考。无论如何,C或LUA或Java。

答案 14 :(得分:1)

不,了解编程语言的多种实现只能帮助您更好地理解这些抽象。

问题是你是否接受一个最佳抽象,这将导致你不能使用你认为较小的其他人成功。

每个抽象都设计有特定的不同目标,选择最适合您需求的抽象目标。知道Linux会让Windows或Mac OS变得更难吗?它接受它们不同

答案 15 :(得分:1)

学习C是件好事。尝试用更高级别的语言编写C代码是件坏事。

答案 16 :(得分:1)

学习C(或任何语言)会对程序员造成伤害,这似乎取决于你在学习C之后无法学习任何。这里的教训应该是'停止学习。此外,不要认为任何其他语言或技术必须像C(或您最喜欢的C编译器)一样工作。

那就是说,我认为学习C可以是学习硬件如何工作以及机器中实际发生的事情的好方法。我不知道怎么知道这会以任何方式伤害你。我不认为无知有任何好处(除非他们是偶然的)。我承认学习C不是了解机器的唯一方法,但它只是一种方法。

答案 17 :(得分:0)

理解多种语言/框架和编程范例永远不应该受到伤害 - 它应该是有益的。

重要的是要了解您目前正在使用的语言/框架/环境,只要您了解进行实施选择的含义。在这里,与其他语言合作所获得的知识可能会让您睁大眼睛看到更广泛的可能性 - 但您必须根据当前的环境来评估这些可能性。

那些陷入困境的人是那些学习某种语言的人,例如C,然后用C语言学习另一种语言而不是学习它本身的优点,优点和缺点(有点像勤杂工用锤子作为他唯一的工具 - 所有问题看起来都像钉子一样。)

答案 18 :(得分:0)

了解C,然后使用我最喜欢的非常高级语言(Python),就是为什么我发现知道C有帮助的一个例子。

了解C,当我使用Python时,有以下几种方式:

(a)我很感谢Python的列表,词典和内置类型,因为它可以在一行代码中轻松地执行某些操作,这需要我选择一些代码库,学习它,以及链接到它(哈希表,数据结构等),并避免用脚射击自己。

(b)Python是用C语言编写的。作为一个C程序员也意味着,如果Python在99%的方式上得到了我,但是在python中可能会有一些额外的抽象,我可以在Python中编写这种抽象。我可以查看CPython解释器的源代码,并了解内部发生的情况。实际上,我是一名python程序员,仍然使用在C语言上构建的东西。因此,知道语言仍然有价值。

我上面说的一切也适用于使用Perl,Ruby和PHP的人。