知道C让你成为更好的高级程序员的具体例子是什么?

Jav*_*ier 14 c low-level high-level

我知道这个这个问题存在的问题.让我解释.

在阅读Joel的文章Back to Basics并在SO上看到许多类似的问题之后,我开始想知道什么是具体的例子,知道像C这样的东西可以让你成为更好的高级程序员.

我想知道的是,有很多例子.很多时候,这个问题的答案就像" 了解C让你更好地了解幕后发生的事情 "或" 你需要为你的计划奠定坚实的基础 ",这些答案没有多大意义.我想了解您从了解低级概念中获益的不同具体方式,

Joel给出了几个例子:二进制数据库与XML和字符串.但是有两个例子并不能证明学习C和/或汇编是正确的.所以我的问题是:知道C让你成为更好的高级程序员的具体例子是什么?

Uri*_*Uri 15

我教授学生和与只学习高级语言的人一起工作的经验是,他们倾向于在一定程度的抽象层次上思考,并且他们认为"一切都是免费的".他们可以成为非常称职的程序员,但最终他们必须处理一些具有性能问题的代码,然后才会咬它们.

当你使用C工作很多时,你会考虑内存分配.您经常考虑内存布局(以及缓存局部性,如果这是一个问题).您了解某些图形操作的成本和原因.某些套接字行为的效率或效率如何.缓冲区是如何工作的等等我觉得当你知道如何在封面下面实现它时,使用更高级语言的抽象有时会在考虑性能时给你"额外的秘密".

例如,Java有一个垃圾收集器,你无法直接将内容分配给内存.然而,您可以做出某些影响性能的设计选择(例如,使用自定义数据结构),因为这与C中的问题相同.

此外,更一般地说,我认为对于一个权力程序员来说,不仅要知道大O符号(大多数学校教授),而且在现实生活中应用这个常数也很重要(学校试图忽略) .我的轶事经验是,具有两种语言水平技能的人倾向于更好地理解常数,可能是因为我上面所描述的.

此外,我见过的许多更高级别的系统与较低级别的库和基础架构相互作用.例如,一些通信,数据库或图形库.某些设备的某些驱动程序等.如果您是一名强力程序员,您甚至可能不得不冒险去那里,至少可以了解正在发生的事情.


Jas*_*ams 9

了解低级别的东西可以帮助很多.

要成为赛车手,您必须学习并了解轮胎如何抓住道路的基本物理原理.任何人都可以学会驾驶相当快,但你需要很好地理解"低水平"的东西(力和摩擦力,赛车线,精细油门和刹车控制等),以获得最后几个百分点的性能,这将使你能够赢得比赛.

例如,如果您了解CPU架构在计算机中的工作原理,您可以编写更好的代码(例如,如果您知道每个CPU缓存行中有一定的CPU缓存大小或一定数量的字节,则可以安排您的数据结构和访问它们的方式,以充分利用缓存 - 例如,按顺序处理数组中的许多元素通常比处理随机元素更快,因为CPU缓存).如果你有一台多核计算机,那么了解线程工作等低级技术可以带来巨大的好处(就像不了解低级别可能导致线程中的灾难一样).

如果您了解磁盘I/O和缓存的工作原理,您可以修改文件操作以使其正常工作(例如,如果您从一个文件读取并写入另一个文件,则在RAM中处理大批量数据可以帮助减少I/O争用在代码的读写阶段之间,并大大提高吞吐量)

如果了解虚函数的工作原理,可以设计出能够很好地使用虚函数的高级代码.如果使用不当,可能会严重影响性能.

如果您了解如何处理绘图,则可以使用巧妙的技巧来提高绘图速度.例如,您可以通过交替绘制64个白色和黑色方块来绘制棋盘.但是绘制32个白色平方和32个黑色通常会更快(因为您只需要更改绘图颜色两次而不是64次).但实际上你可以把整个黑板画成黑色,然后在整个黑板上画出XOR 4条纹,在白板上画下4条条纹,这样可以更加快速(2种颜色变化,只有9种矩形可以画出而不是64种).这个棋盘技巧教你一个非常重要的编程技巧:横向思维.通过很好地设计算法,您通常可以对程序的运行情况产生重大影响.


Bob*_*mer 5

理解C或者任何低级编程语言,让你有机会理解内存使用(比如创建数百万个重物的原因),指针/对象引用是如何工作的等等.

问题在于,随着我们创建不断增加的抽象级别,我们发现自己正在进行大量的"lego block"编程,而不了解legos的实际功能.通过拥有几乎无限的资源,我们开始像水一样处理记忆和资源,并倾向于通过在这种情况下投入更多铁来解决问题.

虽然不仅限于C,但是对于像Arduino或老式8位处理器这样的更小,内存受限的系统而言,在低水平上工作会带来巨大的好处.它让您在更加平易近人的包装中体验接近金属编码的经验,并且在花费时间将应用程序压缩到512K后,您会发现自己在日常编程中更大程度地应用这些技能.

因此,语言本身并不重要,但是对所有比特如何组合起来有更深入的了解,以及如何在更接近硬件的水平上有效地工作是一组有益于任何软件开发人员的技能.