上周,新泽西州州长发布了一份「紧急召集令」,急聘精通「上古语言」COBOL的程序员,帮助修复已经使用了40多年的失业保险系统。此新闻一出,IT界瞬间就炸锅了,这么古老的语言还有人在用吗?吓的小编赶紧去把尘封多年的那本「汇编语言入门到精通」翻了出来,压压惊。
其实COBOL是一门非常古老的编程语言,诞生于上世纪五六十年代,鼎盛时期是七十年代,现在多数学校都不再开设相关课程,所以很多年轻码农都不具备此技能,所以要招一个COBOL程序员的确是有点难度。说起来「上古语言」,其实汇编语言要比COBOL更古老。
计算机发明之初,程序员敲代码只需要两个键,“0”和“1”。用一大串“0”和“1”来控制计算机硬件的高低电平或通路开路,而这一大串“0”和“1”就是机器语言。有同学会问,那用机器语言做开发的程序员岂不是很爽,两个键就能完成工作,那不存在“”神马的工作制度。
其实不然,机器语言十分晦涩难懂,指令的含义往往要通过查表或者手册才能理解,使用起来非常痛苦。尤其是当你需求就更时,修改机器语言会让你抓狂。而且程序一旦出现Bug,程序员便如麦秸垛里面找绣花针一样,生不如死。
幸运的是,汇编语言的横空出世,拯救了无数机器语言程序员的“鬓边白发”。
汇编语言用一些容易理解和记忆的字母,单词来代替一个特定的指令。通过这种方法,人们很容易去阅读程序或者理解代码所实现的功能,对bug修复以及后期的运营维护都变得相对简单。
可以说汇编是最接近机器指令的语言,它的执行效率能把Java,Python这些高级语言甩出几百条街。而且有些机器指令,C语言也无法实现,必须要用汇编来写。在Linux内核源代码里面,也依旧能见到汇编语言的踪影。做过二进制漏洞挖掘或是软件逆向工程的同学都知道,汇编语言是必备的基础语言。
问题来了,作为元老级语言,为啥汇编语言,用的人越来越少?是因为它太难吗,还是它已经过时了?
说汇编语言难的程序员,估计是被C语言的指针吓到了。在汇编语言里面没有指针的概念,所有的变量,函数都由栈或是堆上的偏移地址所代替,说白了,就是用一串代表地址数字来代替可读的变量名或是函数名。现代高级语言里面有句时髦的话:万物皆对象。在汇编语言里面,这句话要换一个说法,就是:万物皆地址。汇编语言把变量和函数都抽象成了地址或是地址偏移,如果你有幸参观过别人写的汇编代码的话,你会发现,汇编代码里面不是在取地址,就是在取地址的路上。如果你对计算机原理有了解的话,那么汇编语言其实也并不难,每一条指令,每一行代码所执行的操作,都一目了然。
那么到底为什么越来越少的人用汇编写程序了呢?小编总结了以下几点。
代码量大,开发效率低,不适合业务复杂的大型项目
一行C语言的代码,可能对应汇编的几行甚至几十行的代码,所以用汇编来写业务复杂的程序,就是一场噩梦。不但编码效率低,Bug修改,升级维护都相当费时费力。打个比方,写程序就像是盖房子,用Java写,就好比是钢筋水泥混凝土堆砌,分分钟钟一座摩天大楼就完成浇筑成了。而用汇编写代码,就好比是用砖彻,一砖一砖垒,费时费力,而且不能盖的太高,随时会倒的风险。
可读性差,不便于维护
像Java,Python之类的语言,写代码时,只要变量名字起的好,注释就可以直接忽略。但是汇编里面,你不写注释的话,那就等于给自己挖坑。那句话怎么说的:“士别三日,当刮目相看”,汇编代码也是一样,如果没有加注释,隔三天再去看,你会怀疑这代码不是自己写的。
可移植性差
Java写的程序,如果没有特殊的底层调用,你从Windows上复制到Linux上基本上什么不需要修改,或是简单做一下配置,就可以直接运行。C语言写的程序,如果平台兼容做的好的话,只需要换个编译器,把源代码重新编译一下,就可以了。那汇编怎么办呢?答案只有一个,代码重新写。
总体上来说,汇编语言的难度并不体现在这门语言的学习难度上,而是集中在它的开发效率上。
用汇编的人越来越少,这只是表面现象。程序员在工作中无时无刻不在用汇编,我们每一次对修改后的代码做编译时,编译器都会把代码先转换成汇编代码,然后再编译成机器码。说汇编语言过时,只不过是对编译原理的不了解。