本文发表在 rolia.net 枫下论坛哥在之前那篇里说过,编程语言之间没有什么优劣。只是材料、工艺、硬件技术在不停的进步,管理、商业运作和融资的方式在不停的改变,一切day-to-day life的发展都多多少少在影响着人们对电子产品的需求,从而推动着整体程序设计观念的变化。
在这个朝秦暮楚水性杨花的编程语言世界里,每一种新语言的设计,无非是为了解决一些现有的编程语言,在面对新的需求时,显得力不从心的地方。所以过去的几十年里,有许多语言产生和湮灭。未来的几十年里,同会有新的语言涌现,或旧的语言消失。
早期的程序是machine code,程序员都像电影Matrix里那样看着二进制,想象着蒙娜丽莎流口水。从1971年的10um process 到今天的 32 nm node,CPU总是要从内存里load binary instructions,对二进制的machine code解码,然后完成相应的加减乘除、move、shift等指令操作的。
汇编的产生是很自然的事。用一个字符串处理程序(assembler),把JMP (60A4)转换成C3 60 A4三个byte的machine code,执行时CPU看到C3,解码为jump,继续load下面两个byte,把60A4放在program counter里,下一个指令从60A4地址上load。
于是不用看binary了,MOV,JNZ,ADD等等比编码了的数字make sense多了。不过写汇编要求对硬件的特性,还有指令集,很了解。早期的CPU大都是CISC的,指令也繁复的一塌糊涂。所以这东西是个geek的事。
终于高级语言和Compiler/Interpreter华丽丽的出现了。人们用compiler作自动翻译,把底层的繁复知识隐藏起来。”Hello, world”变成小学生也很快就能学会的东东,计算机可以从娃娃抓起了。
其实你可以看出,广大Programmer最大的优点是懒 – 就是因为懒,为了少写几行程序,才发明了一个又一个编程语言。
C是一种Compiled Language。Compiler把Source Code直接转变为Machine Code,在运行的时候CPU看到的是Instructions。所以Compiled Language在运行时很高效。在Embedded世界里,各种千差万别的系统架构都要由高效的Compiled Language来写 – 用此来压低对CPU/内存/总线的要求,而且降低能耗,to reduce hardware cost,更加便携,and better battery life, etc.
Java/C#等号称JIT Compile,但是也属于Interpreted Language。毕竟,同一个++i,Compiled Language一般只要1-3个CPU cycle(s) – this differs depends on RISC/CISC CPU。JVM执行起来,则要耗10+ CPU cycles。所以virtual machine这东西是90后也不奇怪 – 在CPU比较慢的年代,咱都耽误不起那功夫。
别看”Hello World”程序那么简单,C语言的Programmer应该有深厚的CPU和硬件知识,对Compiler有相当的了解,以及对OS的内存管理、Task调度的知识,才能写出有质量的程序。不过这么NB的Programmer一般都没什么时间写程序。
说到这里提一下C++。好多人认为C++和C是两种不同的语言,哥对此不以为然。
要知道C++语言设计的基本原则之一就是和C兼容。哥写C程序的时候,脑子里想的是编译之后的汇编指令是如何在CPU里执行的。写C++的时候,想的还是汇编。
C++的出现,是因为当C进化了10年之后,程序越写越庞大,越写越复杂,程序在Architecture Design上出现了瓶颈。其实在C++之前,许多C程序里就出现了通过Function Pointer + Callback的方式来实现OO设计。C++本身,是通过compiler来实现OO。而不是一些fancy的C语言的编程手法。
顺便说一下隔壁楼的贴,说没见过好的C++国人,要人帖个C++程序给哥看。哥觉得每个人的境遇不同哈,没见过不代表没有。哥周围就好几个C++超人。还有C++是个Architecture Design进步,程序没有到几十万行,开发团队在10个人以内,看不大出不同的架构设计之间的差别。打个比方,难道咱换个马桶,还要请architect设计吗?所以贴个程序给哥看应该是开玩笑了。
要说决大多数C++ Programmer,都只为了养家糊口而以,大多是一知半解的。所以后来遍地都是漏洞,错误百出的C++程序,一点也不奇怪。GP CPU的速度和存储器的容量进步神速。Java/C#等基于Virtual Machine的语言于是应运而生,把底层硬件,还有OS,与程序隔离开。于是Programmer的门槛降低了很多。不用有Paging, Stack, Kernel, Assembly, CPU, Cache, Bus, RAM, Interrupt, IO的概念,就可以写程序。顶多是把Virtual Machine或者Script Engine写死,只要OS稳定,别的Task就不受影响。
总结一下。哥希望各位聪明人看出来了语言背后,是硬件工艺的进步和商业运作的推动。C/C++通过提高运行的效率来降低硬件的Cost,但是对Programmer的要求比较高 (thus higher pay)。Sun和MS主推的Java/C#对Programmer的要求低一些(thus less labor cost),但是对硬件的要求就高了。
各种程序设计语言,都是Programmer们面对当前bottle neck时,生琢磨出来的。语言将来如何进化,要看今天的程序设计面对哪些问题。不过当前各种语言的Compiler也好,Virtual Machine也好,Script Engine也好,几乎清一色是C++写的。如果你是个Rookie,C++是很值得花心思学好的。Regardless how programming languages are going to evolve,你都能在C++ 里找到设计者的思想。更多精彩文章及讨论,请光临枫下论坛 rolia.net
在这个朝秦暮楚水性杨花的编程语言世界里,每一种新语言的设计,无非是为了解决一些现有的编程语言,在面对新的需求时,显得力不从心的地方。所以过去的几十年里,有许多语言产生和湮灭。未来的几十年里,同会有新的语言涌现,或旧的语言消失。
早期的程序是machine code,程序员都像电影Matrix里那样看着二进制,想象着蒙娜丽莎流口水。从1971年的10um process 到今天的 32 nm node,CPU总是要从内存里load binary instructions,对二进制的machine code解码,然后完成相应的加减乘除、move、shift等指令操作的。
汇编的产生是很自然的事。用一个字符串处理程序(assembler),把JMP (60A4)转换成C3 60 A4三个byte的machine code,执行时CPU看到C3,解码为jump,继续load下面两个byte,把60A4放在program counter里,下一个指令从60A4地址上load。
于是不用看binary了,MOV,JNZ,ADD等等比编码了的数字make sense多了。不过写汇编要求对硬件的特性,还有指令集,很了解。早期的CPU大都是CISC的,指令也繁复的一塌糊涂。所以这东西是个geek的事。
终于高级语言和Compiler/Interpreter华丽丽的出现了。人们用compiler作自动翻译,把底层的繁复知识隐藏起来。”Hello, world”变成小学生也很快就能学会的东东,计算机可以从娃娃抓起了。
其实你可以看出,广大Programmer最大的优点是懒 – 就是因为懒,为了少写几行程序,才发明了一个又一个编程语言。
C是一种Compiled Language。Compiler把Source Code直接转变为Machine Code,在运行的时候CPU看到的是Instructions。所以Compiled Language在运行时很高效。在Embedded世界里,各种千差万别的系统架构都要由高效的Compiled Language来写 – 用此来压低对CPU/内存/总线的要求,而且降低能耗,to reduce hardware cost,更加便携,and better battery life, etc.
Java/C#等号称JIT Compile,但是也属于Interpreted Language。毕竟,同一个++i,Compiled Language一般只要1-3个CPU cycle(s) – this differs depends on RISC/CISC CPU。JVM执行起来,则要耗10+ CPU cycles。所以virtual machine这东西是90后也不奇怪 – 在CPU比较慢的年代,咱都耽误不起那功夫。
别看”Hello World”程序那么简单,C语言的Programmer应该有深厚的CPU和硬件知识,对Compiler有相当的了解,以及对OS的内存管理、Task调度的知识,才能写出有质量的程序。不过这么NB的Programmer一般都没什么时间写程序。
说到这里提一下C++。好多人认为C++和C是两种不同的语言,哥对此不以为然。
要知道C++语言设计的基本原则之一就是和C兼容。哥写C程序的时候,脑子里想的是编译之后的汇编指令是如何在CPU里执行的。写C++的时候,想的还是汇编。
C++的出现,是因为当C进化了10年之后,程序越写越庞大,越写越复杂,程序在Architecture Design上出现了瓶颈。其实在C++之前,许多C程序里就出现了通过Function Pointer + Callback的方式来实现OO设计。C++本身,是通过compiler来实现OO。而不是一些fancy的C语言的编程手法。
顺便说一下隔壁楼的贴,说没见过好的C++国人,要人帖个C++程序给哥看。哥觉得每个人的境遇不同哈,没见过不代表没有。哥周围就好几个C++超人。还有C++是个Architecture Design进步,程序没有到几十万行,开发团队在10个人以内,看不大出不同的架构设计之间的差别。打个比方,难道咱换个马桶,还要请architect设计吗?所以贴个程序给哥看应该是开玩笑了。
要说决大多数C++ Programmer,都只为了养家糊口而以,大多是一知半解的。所以后来遍地都是漏洞,错误百出的C++程序,一点也不奇怪。GP CPU的速度和存储器的容量进步神速。Java/C#等基于Virtual Machine的语言于是应运而生,把底层硬件,还有OS,与程序隔离开。于是Programmer的门槛降低了很多。不用有Paging, Stack, Kernel, Assembly, CPU, Cache, Bus, RAM, Interrupt, IO的概念,就可以写程序。顶多是把Virtual Machine或者Script Engine写死,只要OS稳定,别的Task就不受影响。
总结一下。哥希望各位聪明人看出来了语言背后,是硬件工艺的进步和商业运作的推动。C/C++通过提高运行的效率来降低硬件的Cost,但是对Programmer的要求比较高 (thus higher pay)。Sun和MS主推的Java/C#对Programmer的要求低一些(thus less labor cost),但是对硬件的要求就高了。
各种程序设计语言,都是Programmer们面对当前bottle neck时,生琢磨出来的。语言将来如何进化,要看今天的程序设计面对哪些问题。不过当前各种语言的Compiler也好,Virtual Machine也好,Script Engine也好,几乎清一色是C++写的。如果你是个Rookie,C++是很值得花心思学好的。Regardless how programming languages are going to evolve,你都能在C++ 里找到设计者的思想。更多精彩文章及讨论,请光临枫下论坛 rolia.net