单片机的演进史
单片机为什么要使用C语言呢?每件事物又有它的成长历史,开始说说它的发展历史。
单片机在选用语言上共进化了三次:二进制机器码→汇编语言→C语言。下面来说说
早期的二进制机器码
最早期的时候,CPU也很简单,指令集很少,二进制位数也不多。那时候编译器也没被发明,编程语言也没被发明,那时候就是用二进制直接编程的。
总结:最早的编程没有语言也没有编译器,程序员直接使用二进制和机器(CPU)对话。就是用如 0xff 直接对CPU内的寄存器操作。现在所用C语言编程其本质上也用二进制码来操作CPU,是这样的,C语言编译器把编号的C语言编译hex文件,其文件内都是0和1。下个问题是CPU只能识别0和1?
CPU还是个孩子,只会叫爸爸和妈妈,题外话。CPU只识别0和1,因从其原理说起,数电里的“与”“或”“非”我们最熟悉不过了,与或非门成就了整个电子界的发展。印象最深的就是“非”字了,但是我们的老师是长沙人,“与或灰”就是这三个字让我影响深刻。
单片机生产原理就是按照很多个与或非门组合实现的,所以单片机CPU只识别0和1。类似下图,单片机的就不止这么简单了。
这种方式的坏处就是不容易扩展,随着CPU的进一步复杂化,指令的变多,指令位数的变多,编程难度呈几何倍数增长。人的大脑慢慢就跟不上这个节奏。一旦出了麻烦就会出现像钟南山这样的英雄,所以就有人发明了汇编语言。
二进制机器码到汇编语言
第一次革命:发明了汇编语言。汇编语言就像是C语言的宏定义,本质就是用一个符号来代替一串二进制。
MOV 10101010101010
SUB 01010101010101
有了汇编语言之后,程序员就不用再去记忆二进制序列了。编程时只需要用汇编指令来编程即可,汇编指令就是一个符号(符号就是由文字构成的,如MOV)。因为人类大脑天生对文字符号更加友好,因此用符号编程更简单。
用汇编语言编写的源程序不能直接给CPU运行,必须通过一个翻译过程,把源代码翻译成二进制序列才能给CPU。这个翻译的过程就叫汇编,执行翻译动作的就是汇编器。
汇编语言也有一些不尽如人意的地方,比如没有可移植性。
现在大部分的开发其实都不在需要汇编语言,甚至在单片机领域都不在用汇编语言编写程序,但是有些公司在招聘X研发岗位是要求要会汇编。
我猜原因可以以下几点:
1.汇编语言对理解高级语言的特性有很大帮助。可以先举几个例子:在C语言中,有两种传递参数的种类,一种是值传递,一种是指针传递。也就是值传递,是把变量的数值传递给子函数。我们经常有一个疑问,一个变量传递给子函数为什么会只是传值呢,如果你了解汇编语言,知道C语言的函数调用时栈的变化你就会理解这是怎么回事。
2.汇编语言有助于程序的调试
汇编语言到C语言
汇编语言没有可移植性。在这个CPU上写的汇编程序无法直接在另一个CPU上运行。因此汇编语言是和CPU一一对应的。
为了可移植性于是乎发明了高级语言C。第一个高级语言就是C语言。C语言进一步靠近人的思维,为人的思维发明了很多CPU没有的东西,譬如数组。最终的目的就是降低编程难度,让高级语言更接近人的思维,然后通过编译器、汇编器等的翻译将这些源代码变成二进制然后给CPU运行。
革命无穷尽、层次变更多
在C语言之上还有更高级语言,譬如:C++、Java、C#、bash等。越往上越靠近人的思维,越往上语言本身提供的封装越多,越往上编程难度越低、语言的掌握越容易。
以后会不能有C语言到XX语言呢这个不好说,比如Android开发是用Java语言,近年来出现了python语言也可以开发Android,而且实现同一功能python的实现代码要比Java的少。
一个完整的Python HelloWorld程序只要一行代码:
print("Hello World")
一个完整的Java HelloWorld需要几行代码:
public class HelloWorld {
public static void main(String[] args) {System.out.println("Hello World"
转帖自网络