5

我最近突然想到,我(我认为大多数人)从 Visual Basic 之类的东西开始学习计算机编程。我开始怀疑我们是否先从较低级别开始,如果现在更容易。

作为一个程序员,你认为理解 CPU 的工作原理、基本指令之类的东西有什么价值吗?我的意思是,我们最终不是真的在谈论它吗?

如果我们从 CPU 级别开始并从那里开始教授,我们可能会发现我们可以更容易地理解如何在更高级别上操作它。

4

12 回答 12

12

它是双向的。

例如,很多从较高级别开始的人不知道为什么移位比乘法和除法快得多,或者分支的影响等等。

因此,他们经常编写速度较慢但普通人更容易理解的代码。(请注意,对于某些应用程序,速度更快比易于理解更重要)

了解幕后发生的事情(不同操作需要多少时钟周期,CPU 的管道如何工作,缓存的影响等)的人通常可以编写非常快的代码,但对很多人来说可能很难理解/维护。(这在“优化”没有明显好处的应用程序中尤其困难,可维护性更重要)

就我个人而言,我觉得知道“下面发生了什么”至少让我有能力了解我正在做出的决定的影响。

老实说,在这一点上,我不介意将许多低级细节/优化留给编译器。无论如何,它可能比我做得更好:]

于 2009-02-28T01:09:39.683 回答
5

我学到了很多关于低级编程的知识,而且我认为它对我编写的每一段代码都非常有帮助。即使是高级语言也有一些版本,比如基本同步原语(互斥锁/锁、条件、信号量);他们仍然需要从磁盘或网卡中读取;他们仍然必须将字节从内存中的一个位置复制到另一个位置,依此类推……关键是,您使用的是高级语言这一事实​​并不意味着知道这些东西如何工作是没有用的。如果您了解计算机如何在最低级别运行,那么无论您的平台有多抽象,您都可以始终应用这些知识来编写更高效和/或不易出错的代码。低级操作的知识甚至可以教给你一些你可能永远不会学到的东西——没有比必须实现一个更好的方法来学习如何正确使用诸如互斥锁之类的东西。(好吧,也许这有点夸张,但我希望你明白我的意思)

归根结底,我会说是的,对于所有抽象级别的程序员来说,学习基础知识绝对是一个好主意。但我不认为开始一定是个好主意与基本面。众所周知,汇编语言级别的程序很难理解,我认为试图将其强加给编程初学者可能会阻止他/她。我提到了解基本操作将帮助您编写更高效和/或不易出错的代码,但肯定根本没有必要编写代码。所以在我看来,大多数人可能最好从中间的某个地方开始,在那里他们仍然可以在熟悉编码过程的同时抓住熟悉的概念,比如对象。经过在该领域的一些经验,CPU 的东西是公平的游戏;-)

于 2009-02-28T01:18:11.037 回答
5

我希望我的医生知道我的心脏是如何工作的(但不一定能够进行心脏手术),我希望我的机械师知道我的引擎是如何工作的(但不一定能够制造引擎),我希望我的程序员能够知道 CPU 是如何工作的(但不一定能够构建 CPU,或者用汇编编写企业应用程序。但是,讨论 CPU 缓存或看到一些汇编代码也不应该让他跑到山上)。

我们是专业人士。我们应该知道事情是如何“在幕后”工作的,即使我们通常不在那个层次上工作。

于 2009-02-28T02:20:40.650 回答
2

仍然有一个程序员社区确实是这样学习的。

毫无疑问,了解您正在使用的硬件可以让您深入了解如何最好地为该硬件编写代码。话虽如此,我遇到(和编写)的一些最特定于硬件的代码也是可读性和可维护性最低的。

我认为对于一般的编程来说,它并不是非常重要。但是,一旦您进入性能关键领域,就必须具备这项关键技能。

于 2009-02-28T01:10:11.617 回答
2

我认为了解底层架构对任何程序员都是有用的,过多的抽象可能是一件坏事

我不知道从低级别开始工作是否是一个好主意,因为现代 CPU 非常复杂 - 我学习了 Visual Basic,然后是 Java,但我很高兴我学习了 C 和一些汇编语言,因为它帮助我编写性能关键代码。

于 2009-02-28T01:15:14.863 回答
2

编程语言是虚拟机。C、C#、Fortran、Basic 等本身就是 CPU,尽管是可移植的。他们说,如果你在 Fortran 上编程,你就是在某种 Fortran 机器上编程。如果您在 C 上编程,那么您是在某种 C 机器上编程。甚至还有一种在硬件级别上实现的语言 LISP。

甚至有一个关于 C 的笑话。 C 编程语言:一种结合了汇编语言的所有优雅和强大功能以及汇编语言的所有可读性和可维护性的语言。

您可以使用诸如 C 或带有不安全选项的 C# 之类的语言到达指针、手动内存操作、指令、函数指针等的每个角落和缝隙。

即使您不深入了解 CPU,您也不会错过任何东西。

但是如果你真的想从你的程序中榨取性能,那么了解引擎盖下的内容是真正有价值的,如果程序值得学习 CPU/汇编语言。

于 2009-02-28T02:37:54.120 回答
1

高级语言旨在将我们从我们正在处理的系统的低级架构中抽象出来。虽然这并不意味着架构信息应该被忽略,但它确实意味着这些信息的价值被削弱了。架构特定的知识确实可以帮助您以不同的方式利用系统,但通常这些方式包括绕过我们的高级语言为我们提供的抽象。这是否是一件好事,我留给你。

于 2009-02-28T01:09:44.067 回答
1

这是没有一个答案的问题之一。

实际上,不,没有太多用处,除非您正在做一些非常具体的事情(在这种情况下,您会提出一个更具体的问题)。

从理论上讲,这是每个反对者都会使用的论点,是的,知道总是很好(......几乎所有东西)......直到它归结为只有一个和零的编程:)

如果您从最低级别开始,您可能永远不会达到这个“高级”级别——这正是最初编写“高级”语言的原因。

于 2009-02-28T01:11:25.387 回答
1

“如果我们从 CPU 级别开始并从那里开始教学,我们可能会发现我们可以更轻松地理解如何在更高级别上操作它。”

错误的。

我在 70 年代开始编程,你必须知道硬件是如何工作的,因为你的选择是 Fortran(或 Jovial)与汇编程序。

现在我使用 Java 和 Python——好吧——我真的不知道。我有一台戴尔笔记本电脑、一台 MacBook、一台 iMac 和一台我无法确定的服务器。

这些可能有 Intel 或 PowerPC 处理器,或者——好吧——我认为服务器是 64 位的,但我不知道是哪一种。

对某些处理器了解很多(很多)并没有帮助。对现代处理器一无所知并不妨碍。

软件获取知识。特定的硬件与软件捕获的知识几乎没有关系。

于 2009-02-28T01:18:28.337 回答
1

它让我对自己正在做的事情更有信心,并让我知道何时应该关注性能或可维护性(在几乎 99% 的情况下,我会选择最后一种 :)

于 2009-02-28T01:56:24.220 回答
1

我开始使用 Basic 编程(在纸带上!),但我早期职业生涯中最好的经历之一是在嵌入式系统中工作,编写 C 和汇编语言程序,并且经常进行交叉编译。了解硬件的功能、高级语言如何映射到 CPU 等等是非常有帮助的。当您在某种程度上了解硬件时,它肯定会帮助您理解指针、指针算术、数据结构对齐、符号扩展,甚至软件性能和操作系统行为。

于 2009-02-28T02:25:50.203 回答
0

比理解 CPU 设计本身更重要的是理解现代语言下抽象的“12 层蛋糕”。这就是为什么Nisan 和 Schocken 的 The Elements of Computing Systems是我最喜欢的编程书籍的原因。它会带您“从 NAND 到俄罗斯方块的 12 个步骤”,并附带单元测试,以确保您在芯片级别、ALU 级别、CPU 级别、机器代码级别等一直“履行合同”。

封装很重要是一回事;如果没有这 12 层之间的封装,则完全是另一回事。这本书教你如何超越一定的复杂性,人脑不再有效,封装是我们用来管理抽象任务的主要工具。通过用逻辑电路构建 CPU 来构建计算机游戏的过程改变了我的编程方式,因为它教会我思考复杂性和通信之间的不利关系,以及层之间明确的公共合同的至高无上的重要性。

于 2010-11-23T05:54:54.037 回答