主题:【原创】程序员的入门语言 -- 代码ABC
程序员需要知道什么?
作为程序员必须掌握的最基础的知识是什么?在做了十几年程序员后回头看这个问题,我发现最基础的知识既不是某种语言的语法,也不是算法。而是计算机的工作原理。因为程序员的工作是指挥计算机按照他(她)的想法干活。不了解计算机的脾气是无法有效的指挥的。计算机非常"笨"而且"懒",必须使用排列好的指令序列(程序)去"踢"它,"踢"一下它才动一下,不小心把它"踢"进了死胡同,它是不会自动转出来的。这给程序员带来了无穷的烦恼,程序员必须为计算机预先考虑各种意外情况,并设计好应变的措施,只要有一种情况没有预计到,总有一天你的计算机就会可悲地失败。
计算机的工作原理将详细的告诉程序员计算机各种弱点和优点,你将清楚计算机在各种死胡同面前的反应。工作原理不但告诉你计算机会怎样做,还告诉你计算机为什么会这样。
那么了解计算机工作原理的最佳途径是什么呢?
汇编语言
对了,就是汇编语言!
现在的程序员实在是太舒服了,在十几前,即 80年代初期,程序员开发工具(语言)只有几种,而且十分原始,如果想写点有意思的程序,比如图形界面的游戏,就必须深入了解计算机的结构,通过汇编语言来完成。屏幕上的图形需要一个点一个点地描。虽然辛苦,但是这样一来计算机在程序员面前就像透明了一样,甚至在梦中我可以见到 CPU内部数不清的电子开关在我程序的指挥下不停地开合(那时计算机也不快)。计算机一点都不神秘。
当你使用汇编语言的时候,计算机就成了一个玻璃瓶,你可以看到计算机所有的内部结构,你将很快明白什么是赋值,什么是循环、什么是判断、什么是子程序、什么是函数。当然二进制就更是家常便饭了。有人可能会说这些概念在任何高级语言都有而且更容易理解。在这里我引用一段《 C++参考手册》中的一段话:"一个对象是一片存储区域,左值是引用一个对象的表达式",(所谓左值值的是赋值号左边的东西),这是对赋值语句和变量一个极为抽象的解释,但也是一个最简单的解释,如此晦涩的语言,对于许多只是用高级语言的程序员来说是十分难懂的。即使是 C程序员也需要消化半天。但是对于汇编程序员来说只要看到"左值"的解释就什么都明白了。再举一个例子:大家可能在入门的时候为 I=I+1这样的表达式迷惑过。但是汇编就经常使用有限的几个寄存器自加自减。另外,编译和连接的概念就不是所有语言都有的。
现代的高级语言,即使是向 C/C++这些相对低级的语言都使用了各种库程序对程序员隐藏了许多计算机的细节。也就是计算机被"封装"了,在很大程度上程序员不需要考虑普通功能的实现细节,恐怕即使是科班出身的程序员也只有在学习算法课程的时候才写过排序代码了。这种情况下程序员面对的不是真正的计算机,而是各大软件公司为大家安排好的虚拟机而已。程序员不需要去记汇编的语法,取而代之的是必须记住新语言的语法,开发环境的使用规则,编译开关、连接开关等等。同样都是记忆,但是只知其然,而不知其所以然。掌握汇编的程序员在接触这些工具的时候则不需要死记硬背,因为开发环境也是程序,不这样还能怎样呢?
我提倡程序员的入门语言使用汇编语言,有人可能会说汇编语言很难,其实这是误解。想象一下,一个对计算机没有多少认识的初学者,任何语言的语法都不会有很大差别,而且汇编码都十分简短,比起某些高级语言长单词的语句来说要容易记忆,尤其是英语都没学好的中小学生更是如此。二进制可能会有点困难,不过相信能够记住九九表的学生会很容易记住二进制的加减乘除的。
现在使用汇编入门的实际困难是现在的 CPU已经十分复杂了,多了许多新概念,如内存保护,进程切换等。不过这对理解操作系统和多线程编程十分有用。又有多少程序员真正理解了线程和线程同步呢?
以后的道路
我声明,我不是使用汇编打天下的程序员。实际上我有 15年没有碰过汇编了。但是汇编的确为我打下了坚实的程序基础,并教会了我(或者是迫使我)学会了许多编程技巧,并使我了解代码风格的重要性。
汇编是学习计算机工作原理的好工具,也是学习编程的好工具,但我认为汇编不是一个写程序的好工具。在掌握了基础知识后,再学习一个使用的语言和掌握一个方便的开发工具是必要的。可以说一旦掌握了汇编,你就已经入门的,以后的道路可以自由选择,也可以自由更改。
本帖一共被 1 帖 引用 (帖内工具实现)
我觉得现在的程序员除非是做跟硬件相关或者针对专门处理器做优化,否则应该没有了解计算机底层的必要.
我的观点其实并不新鲜,我后来发现一套书《Write Greate Code》其中第二卷就是讲解用底层语言思想编写高级语言代码。而整套书的思想就是要程序员们去真正理解计算机。
从另一个层面上看,高手都喜欢在使用现成的部件之余,去研究其实现代码。道理上是差不多的。
需要搞点啥“逆向工程”的时候捡起来(以前用SoftICE,现在用IDA),搞完了就丢到一边。结果每次都要去下载本汇编的书对照着看,一直也就在汇编方面没有什么长进。
谈编程的,照例是要送花的。
没有编译器啊,只能查手册,把汇编指令对应的机器码通过仿真器输入eeprom.仿真器连接的PC还运行的是Dos呢。那时候对十六机制,大小写,机器码太熟悉了,绞尽脑汁地在4M字节空间里安排数据和程序。
一直在做嵌入式系统( Embedded System )方面的工作,觉得用C++都太慢,太臃肿,所以大部分时间都用C,甚至于某些底层的程序都要用汇编语言。
现在谁都会编程,但一般来说,工科生,特别是EE出身的,编的程序都比较简洁,因为他比较理解计算机的内部结构。
当年在计算机系选了门课,Computer Architecture,里头带点汇编,虽然只拿了个C+,但是觉得挺有意思。现在在考虑是不是要继续学下去。本人专业数学,以后估计是用不到这个了,除非转行。
现在的计算机系研究生,也没有几个学汇编的。原因吗,因为汇编没有什么用处。计算机CPU的工作原理,除了某些特殊领域,也对日常应用开发没有什么具体指导意义。
这个做入门语言,还是难了一点。我们那时候,是和计算机体系结构一起学的,如果大一学,还是要抓瞎。
大家恐怕都觉得大学里面学的很多东西在日常工作中都是“无用”的,比如,数据结构——现在都有完整的库提供了;比如,编译原理——除了少数写编译器的人;比如,离散数学——噢,谁还能再次通过哪些考试?;就是语言也大大地不同了。
然而恰恰是这些“无用”的东西构成了程序员的不同层次。按我市侩的观点,说谁能用上这些“无用”的东西谁就能获得更好的待遇。
用Pascal和C的比较多。
常备PDF: Intel 80386 Programmer's Reference.
要用汇编的时候就去查PDF...
其实最主要的还是把各种芯片的体系结构搞清楚,汇编的语法还有具体的指令助记符,都是细枝末节了.
所以真正最最关键的计算机课程,其实是<<计算机体系结构>>,判断一个刚毕业的程序员的水平的高低,就看他这门课的成绩就差不多了.
计算机体系结构界于软件硬件之间,搞明白,可软可硬.很是有用. 只可惜有的时候,喜好软件的以为体系结构是硬件的东西,搞硬件的又会觉得离逻辑设计有些距离,就不软不硬了.
一般是Computer Architecture里常用的,不过挺有意思,写些AD/DA程序,从示波器上看看自己写的程序产生的五花八门的波挺好玩儿的。
还是要赞~~ 回头再看就觉得有道理~~~
本想送花!可惜经验值不够了~~~