最近我想到我(我认为大多数人)从Visual Basic开始学习计算机编程。如果现在更容易,我开始怀疑我们是否先从较低层开始。
您是否认为作为程序员理解CPU的工作方式,基本指令以及类似的东西是否有价值?我的意思是毕竟不是我们最终真的在谈论它吗?
如果我们从CPU级别开始并从那里开始教授,我们可能会发现我们可以更容易地理解如何在高级别操作它。
答案 0 :(得分:12)
它是双向的。
例如,许多从更高层次开始的人都不知道为什么班次比乘法和除法快得多,或者分支的影响等等。
因此,他们经常编写的代码速度较慢,但普通人更容易理解。 (请注意,对于某些应用程序,更快的速度比易于理解更重要)
了解幕后发生的事情(不同操作需要多少个时钟周期,CPU管道如何工作,缓存的影响等)的人通常可以编写速度非常快的代码,但可能很难让很多人了解/维护。 (在“优化”没有可感知的益处,可维护性更重要的应用中,这尤其困难)
就我个人而言,我觉得知道“下面发生的事情”至少让我有能力知道我正在做出的决定的影响。
老实说,在这一点上,我不介意将很多低级细节/优化留给编译器。它可能比我做得更好:]
答案 1 :(得分:5)
我已经学到了很多关于低级编程的知识,我认为它对我编写的每一段代码都非常有帮助。甚至高级语言也有一些版本,比如基本的同步原语(互斥/锁,条件,信号量);他们仍然需要从磁盘或网卡上读取;他们仍然需要将字节从内存中的一个位置复制到另一个位置,依此类推......重点是,你使用高级语言并不意味着知道这些东西是如何工作的。如果您了解计算机如何在最低级别运行,那么无论您的平台如何抽象,您都可以始终应用该知识来编写更高效和/或更少错误的代码。对低级操作的了解甚至可以教你一些你可能从未学过的东西 - 没有更好的方法来学习如何正确使用类似互斥的东西,而不是必须实现一个。 (好吧,也许这有点夸张,但你明白了我的意思)
总而言之,我想说是的,对于各个抽象层次的程序员来说,了解基础知识绝对是一个好主意。但我不认为用基本原理开始一定是个好主意。汇编语言水平的程序众所周知难以理解,我认为试图在初学者编程时强调这一点可能会让他/她感到沮丧。我提到理解基本操作将帮助您编写更高效和/或更少错误的代码,但根本不需要编写代码。所以在我看来,大多数人可能最好从中间的某个地方开始,他们仍然可以在熟悉编码过程的同时熟悉对象等熟悉的概念。经过该领域的一些经验,CPU的东西是公平的游戏; - )
答案 2 :(得分:5)
我希望我的医生知道我的心脏是如何工作的(但不一定能够进行心脏手术),我希望我的机械师知道我的引擎是如何工作的(但不一定能够建造引擎),我希望我的程序员知道CPU是如何工作的(但不一定能够构建CPU,或者在汇编中编写企业应用程序。但是,讨论CPU缓存或看到一些汇编代码不应该让他在山上运行)。
我们是专业人士。即使我们通常不在那个层面上工作,我们也应该知道事情是如何工作的。“
答案 3 :(得分:2)
仍有一个程序员社区确实以这种方式学习。
我的脑海中没有争议的是,了解您正在使用的硬件可以让您深入了解如何最好地为该硬件编写代码。话虽如此,我遇到(和编写)的一些最特定于硬件的代码也是最不易读和可维护的。
我认为对于一般的编程来说,它并不是非常重要。但是,一旦进入绩效关键领域,这是一项关键技能。
答案 4 :(得分:2)
我认为对底层架构的理解对于任何程序员都是有用的,并且过多的抽象可以是bad thing。
我不知道从低级开始工作是不是一个好主意,因为现代CPU非常复杂 - 我学习了Visual Basic后跟Java,但很高兴我学会了C语言和一些汇编语言,因为它帮助我编写性能关键代码。
答案 5 :(得分:2)
编程语言是虚拟机。 C,C#,Fortran,Basic等都是CPU本身,虽然是便携式的。他们说如果你在Fortran上编程,你就是在某种Fortran机器上编程。如果您使用C编程,则需要在某种C机器上进行编程。甚至还有一种语言在硬件级别上实现,LISP。
C语言甚至是一个笑话.C编程语言:汇编语言的所有优雅和力量与汇编语言的所有可读性和可维护性相结合的语言。
你可以使用C语言或C#等不安全选项来达到指针,手动内存操作,指令,函数指针等的每个角落和缝隙。
即使您不深入了解CPU,也不会错过任何内容。
但是,如果你真的想要从性能中删除你的程序,那么了解内幕是什么有一个真正的价值,如果程序有用的话,可以学习CPU /汇编语言。
答案 6 :(得分:1)
更高级别的语言旨在将我们从我们正在研究的系统的低级架构中抽象出来。虽然这并不意味着应该忽略架构信息,但它确实意味着这些信息的价值会降低。架构特定知识确实可以帮助您以不同方式利用系统,但通常这些方式包括绕过我们的高级语言为我们提供的抽象。这是不是一件好事,我留给你。
答案 7 :(得分:1)
这是没有人回答的问题之一。
实际上,不,没有多少用处,除非你做了一些非常具体的事情(在这种情况下你会提出一个更具体的问题)。
从理论上讲,这是一个反对每个人都会使用的论据,是的,知道(几乎所有事情)总是好的......直到它只用零和零来编程:)
如果你从最低级别开始,你可能永远不会达到这个“高级”水平 - 这正是为什么首先编写“高级”语言的原因。
答案 8 :(得分:1)
“如果我们从CPU级别开始并从那里开始教授,我们可能会发现我们可以更容易理解如何在高级别操作它。”
假。
我在70年代开始编程,你绝对必须知道硬件是如何工作的,因为你的选择是Fortran(或Jovial)与汇编程序。
现在我使用Java和Python - 嗯 - 我真的不知道。我有戴尔笔记本电脑,MacBook,iMac和服务器,我无法确定。
这些可能有英特尔或PowerPC处理器,或者 - 好吧 - 我认为服务器是64位,但我不知道哪种。
对一些处理器了解很多(很多)并没有帮助。对现代处理器一无所知并不妨碍。
软件捕获知识。特定的硬件与软件捕获的知识几乎没有关系。
答案 9 :(得分:1)
它让我对自己的工作更有信心,并让我了解何时关注性能或可维护性(在我选择最后一种情况的近99%的情况下):
答案 10 :(得分:1)
我开始使用Basic编程(在纸带上!),但我早期职业生涯中最好的经验之一是在嵌入式系统中工作,编写C语言和汇编语言程序,并经常进行交叉编译。了解硬件的功能,更高级语言如何映射到CPU等等非常有用。当您在某种程度上理解硬件时,它当然可以帮助您理解指针,指针结构,数据结构对齐,符号扩展,甚至软件性能和操作系统行为。
答案 11 :(得分:0)
比理解CPU设计本身更重要的是理解现代语言下的抽象“12层蛋糕”。这就是为什么 The Elements of Computing Systems by Nisan and Schocken 是我最喜欢的编程书籍;它需要你“从NAND到俄罗斯方块的12个步骤”,并附带单元测试,以确保你在芯片级别,ALU级别,CPU级别,机器代码级别等方面“尊重合同”。
说封装很重要是一回事;如果没有这12层之间的封装,那么完全可以看到这项业务如何不可能。本书教你如何超越一定的复杂性,人类大脑不再有效,封装是我们用来管理抽象任务的主要工具。通过用逻辑电路构建CPU来构建计算机游戏的过程改变了我编程的方式,因为它教会我思考复杂性和通信之间的不利关系,以及层之间明确的公共契约的至高重要性。