学一个编程语言太难了。我们将从发明者的角度去尝试发明一个编程语言。
在模拟发明编程语言的过程中,我们会遇到一些问题,就能理解C语言这样做的原因,从而快速理解学习C语言编程。
首先我们有一台电脑硬件,电脑有CPU、内存条、硬盘、键盘和显示器等。
(相关资料图)
请记住我们的目标是让电脑做数学运算。
现在我们开始发明一个编程语言。这是一个遇到问题,分析问题和解决问题的过程。
已知一只母鸡每天下蛋10个,每个鸡蛋2元,请问母鸡一个月产值多少元?
那么,我们可以直接把这段文字当成是电脑指令么?当然是可以的。
这个叫AI编程语言,AI编程语言目前还没被发明出来,但是我可以对它进行一些描述。
AI编译器会把这段文字进行理解翻译,转化成C语言源代码,然后把源代码编译成二进制指令程序。即可完成这个程序的开发。
AI编程语言跟传统编程语言不同之处就是,在编译前,它会理解人类语言,转化成最佳的源代码,然后再进行编译。
编程就是这么简单,向电脑发送一段指令,什么都可以,只要电脑可以理解它,并进行计算操作即可。
目前,我们只想发明一个传统的编程语言,我们只有硬邦邦的电脑硬件。
对刚才的问题,我们的计算公式是:
日产值= 鸡蛋日数量 X 鸡蛋价格;
母鸡月产值= 日产值 X 每月天数;
那么,我们可以把这段公式做成电脑指令么?当然不可以。因为它是公式,也可以认为是一个函数,y=f(x)。
电脑实质上就是一台计算机,没有参数,它是没法做计算的。
没有AI的电脑就是这么死板,你必须非常非常具体地告诉电脑,每一步要怎么做,不能有任何的差错,否则它就会产生BUG。
举个实实在在的例子,谷歌浏览器的开发。据说谷歌从2008年开始,总共人数超过1000多名研发人员,浏览器代码达到2400万行,差不多半个操作系统的规模了,而这10年以来,这个浏览器项目花了上百亿美元。
虽然写程序很艰难,但是要看到事情的两面性,越艰难的事情,做的人少,反而薪资待遇就越高。
所以,我们继续上面的问题。把问题的参数代入。
日产值= 10 X 2;
母鸡月产值= 日产值 X 30;
那么,我们可以把这段式子做成电脑指令么?当然可以!!!
这就是电脑指令,执行它,可以计算出结果,这就是与公式不同之处。
这就是传说中的源代码,跟一般的软件项目的源代码行数比起来,就是蟑螂比大象。
只可惜目前的操作系统都是讲英文的人发明的。所以,我们需要写成英文格式。
amount =10* 2;
income = amount *30;
其中,变量amount是日产值,变量income是母鸡月产值。
当然可以用翻译软件自动进行翻译。但是,我们需要与世界接轨,需要把源代码写成英文格式。
用键盘把这段电脑指令输入到电脑,保存在硬盘上。向操作系统发送执行命令,让它执行这段电脑指令。
我们觉得事情到此,问题应该算是解决完毕了。我们就是需要这样一个简单的工具。
只可惜,现在市面上的CPU没有集成编译器,无法识别这段源代码。现代CPU应该集成C语言编译器,这样开发驱动就不用汇编语言了。
目前的电脑硬件,也无法保存这段源代码。存储设备只能存储数字,不知道什么是文字。
所以,我们必须先解决存储问题。怎样把这段源代码保存到硬盘上呢?
我们上学读书的时候,学校会给我们每一个人取一个唯一的学号。我们也用相同的办法,对英文字母、标点符号和阿拉伯数字也搞一个唯一的学号,总128个字符,128个学号。把这个学号称作编号,也叫编码,都是描述同一个意思。
阿拉伯数字文字0的学号是48,阿拉伯数字文字1的学号是49,大写英文字母A的学号是65等等。这就是ASCII编号表,国际标准,在世界各地都一样。
至于为什么阿拉伯数字文字1的学号不是1呢?这个需要问制作编码表的大神。反正编号是1,2,3...所映射的字符,不是阿拉伯数字。
英文有128个字符,ASCII编码表足够使用。但是,对于近万个汉字,需要对每个汉字进行编号,总共需要上万个编号,需要Unicode编号表,也是国际标准。
汉字的编号太多了,这就是编程只使用英文的根本原因。
有了编码表,把源代码存储到硬盘的问题算是完美解决了。只要把源代码照着编号表翻译成数字,就可以保存到硬盘上,读硬盘的时候,只要照着编号表把数字翻译成源代码就可以。
对着ASCII编号表把下面的源代码转换成数字
amount =10* 2;
照着ASCII编号表抄
97(a)109(m)111(o)117(u)110(n)116(t)61(=)49(1)48(0)42(*)50(e)59(;)
数字非常长,人看一眼就头脑大,但对于电脑来说小菜一碟。幸好,我们不用去了解它,知道有这么一回事就可以,就像驾驶汽车,无需了解发动机结构。把注意力放到怎么使用工具上。
如果没有空格隔开,很难分清哪一个数字代表的是哪个字符。
如果采用16进制,2个数字代表一个字符,就可以去掉空格。
616D6F756E743D31302B323B
这段16进制格式数字,读起来很困难,但是能读出是什么内容,对着ASCII码表进行翻译,就可以了。90年代的无线电加密电报也是类似原理。
实际上,不管是十进制还是16进制都是给人类看的,电脑只认识二进制,翻译成二进制有专门的软件负责,我们也是无需了解太多。
终于,我们知道怎样把源代码保存到硬盘上了,接下来需要解决把源代码转化成汇编语言的问题。
CPU汇编指令都是简单加减乘除运算,用这些加减乘除运算组装成复杂的计算。需要对源代码进行拆解,变成汇编指令。可以看出这个翻译过程是枯燥乏味,极度消耗时间的过程。所以,我们必须制作一个工具,让它快速完成这件事情。这个工具就是编译器(比如linux的gcc,win32的cl,安卓的ndk)。
也就是,发明一门编程语言,必须需要开发一个编译器,把源代码翻译成汇编指令,即编译过程;相反过程就是反汇编。没有编译器,那么这个编程语言就没有会去使用。
编译原理比较复杂,即使是大多数应用程序员,在工作中都不会接触汇编。我们只要关注写好源代码就可以,其他的就交给编译器办理,只要按照编译的识别的语法去写代码,编译器就可以把源代码生成执行程序。
我们觉得事情到此,问题应该算是解决完毕了。我们就是需要这样一个简单的工具。
amount =10* 2;
income = amount *30;
确实有这样的编程语言(比如js、lua),执行这样的源代码,就可以计算出结果。
只可惜,我们需要造一个C语言,用它开发操作系统内核,必须高效率,早期计算机的内存才几个KB。月薪2万,养一个小孩子没啥问题,要是生了10个小孩,月薪2万也只是穷光蛋。
这个问题说白了,就是怎样把源代码转化成高效率的汇编语言。前面也说了,电脑只是一台冰冷的机器设备,必须告诉它每一个步骤细节,否则它就会出BUG,导致系统蓝屏。
要追一个女孩,必须先了解女孩的性格,喜欢爱好等,才能在接触中,不触碰对方的雷区,一步步靠近,最后把妹子把到手。
我们需要了解电脑是怎样执行程序的,才能更好开发编译器,设计一门语言,把源代码翻译成最高效的汇编代码。
操作系统启动程序的时候,因为CPU只能读写内存上的数据,需先把程序指令和数据加载到内存中,然后把程序指令和数据发给CPU做运算,CPU计算完毕返回把结果返回给内存保存。
整个过程就是这样简单,其他的太底层,无需要去了解。
现在遇到一个大问题。10个鸡蛋的10,用多少内存来记录它?早期计算机的内存才几个KB,而源代码几十万行。
这就是把源代码翻译成汇编代码需要解决的首要问题。
待续。。。
关键词: