首先向C语言父亲Dennis Ritchie致敬!
今天c语言编程软件教程,几乎所有实用的编译器/口译员(以下称为编译器)今天用C语言编写。有一些语言,例如Clojure,Jython等,基于JVM或Java。 Ironpyon和其他基于.NET基于基于.NET。意识到,但是Java和C#等也依靠C/C ++来实现它,这等同于间接称呼C。因此,测量某种高语言的移植性实际上正在讨论ANSI/ISO C的移植。
C语言是一种非常低的语言。在许多方面,它类似于汇编语言。在“ Intel 32 -Pit edpered语言程序设计”一书中,它甚至将手工翻译的简单C语言的方法引入了组装。对于诸如编译器之类的系统软件,很自然地使用C语言编写。即使是像Python这样的高级语言,仍然取决于底部的C语言(Python的示例是因为英特尔的黑客正在尝试使Python无需需要运行的操作系统可以运行 - 实际上是豁免的从BIOS上的一个时间C代码)。在研究了编译原理后,只要您具有一些编程能力,就可以实现一个简单的C语言编译器。
但是问题是,我不知道您是否已经考虑过。每个人都使用C语言或基于语言的语言编写编译器。那么世界上第一个C语言编译器是如何编写的?这不是“鸡肉和鸡蛋”的问题...
让我们回顾C语言的历史:1970年,汤姆夫森(Tomphson)和里奇(Ritchie)根据BCPL(一种解释语言)开发了B语言。 1973年,目前的C语言是基于B语言成功开发的。在将C语言用作系统编程语言之前,Tomphson还使用B语言编写操作系统。可以看出,在实施C语言之前,可以将B语言实用。因此,第一个C语言编译器的原型可以用B语言或混合B语言和PDP组装语言编写。我们现在知道,B语言的实施效率相对较低,但是如果所有这些语言都用汇编语言编写,不仅开发周期很长,而且很难维护,而且更糟糕的是,它会失去所需的移植高级程序的设计语言。因此,早期的C语言编译器采用了一种聪明的方法:首先使用汇编语言编写子集编译器的C语言,然后由该子集偿还完整的C语言编译器。详细过程如下:
首先创建具有C语言最基本功能的子集,该子集被记录为C0语言。 C0语言已经足够简单了。您可以用汇编语言直接编写C0的编译器。依赖于C0的现有功能,设计比C0更复杂,但是另一种具有不完整C语言的子集C1语言,其中C0属于C1和C1。C0属于C。使用C0开发的编译器开发C1语言。在C1的基础上,设计了C语言的另一种子集C2语言。 C2语言比C1更复杂,但它仍然不是完整的C语言。由C2语言开发的编译器...因此,在CN之前,CN已经足够强大,这已经足够强大了。建立完整的C语言编译器的实现就足够了。至于这里的n是什么,这取决于目标语言的复杂性(这里是C语言)和程序员的编程能力 - 简而言之,如果您到达子集阶段,则可以在实现实现时非常方便地轻松地使用现有功能C语言,然后找到n。下图说明了此抽象过程:
那么,这个大胆的亚类简化方法如何实现?有什么理论基础?首先介绍一个概念,即“自我编译”自相编译,也就是说,对于某些具有明显自我提示属性的强大类型(所谓的强类型是程序中的每个变量,必须在类型类型的类型必须为宣布,例如C相反,有一些脚本语言。这些语言包括C,Pascal,ADA等。您可以自行编译。您可以看到Tsinghua University Press的“汇编原则”。该书意识到了Pascal子集的编译器。简而言之,计算机科学家已经证明,通过上述CVM方法可以从理论上实现C语言。那么如何简化呢?这张照片有点熟悉吗?顺便说一句,我在谈论虚拟机时看到了它,但这是CVM(C语言虚拟机)。每种语言都可以在每个虚拟层独立编译。另外,输出将用作下一层输入(最后一层的输出是应用程序),这与雪球相同。在手(装配语言)中,组合了一个小雪,形成了一点滚雪球。这可能是So -so -called 0 Life 1,1 Life c,c c,c Life?
以下是C99的关键字:
实际上,仔细观察有许多关键字可以帮助编译器优化,并且有些用于限制变量,函数功能,可链接性或生存周期(功能)(功能)。根本不需要添加,因此您可以删除自动,限制,外部,挥发性,const,sizeOf,static,静态,内线,注册,键入,键入,以便C的c3语言和C3语言的关键字如下:
如果您再次考虑一下,发现C3中有许多类型和类型的修饰符类型,则无需一次添加它。例如,有三个整数。只要您实施它,就可以删除这些关键字。 float,short,char(char is int),签名,_bool,_complex,_ Imaginary,long,以便形成我们的C2语言。 C2语言关键字如下:下面:
继续思考,即使只有18个关键字C2语言,仍然有许多高级位置,例如基于基本数据类型的复合数据结构。另外,复合分配运算符 - >,++, - 等都可以完全删除,因此可以删除的关键字是:枚举,结构,联合,以便我们可以获得C1语言字符的关键:
这是完美的,但是最后一步自然更大。目前,必须删除阵列和指针。此外,C1语言仍然有很多减少。例如,有许多方法可以控制循环和分支。实际上,它们可以简化为一个。循环时,请...在循环和循环时c语言编程软件教程,只要保持循环就足够了;分支语句也具有If ... {},如果…{}…else,If…{}…else,如果是切换的,则以表单中的这四种类型的这四种类型的形式,可以由两个以上实现。 .. {},因此,请保留,如果... {}就足够了。但同样,SO称为的分支和周期只是有条件跳跃的短语。函数调用语句只是一个堆栈和跳跃句子,因此它只需要goto(无限goto)。因此,所有结构化的关键字都会大胆删除,甚至该功能也不可用。获得的C0语言关键字如下:
只有5个关键字可以在汇编语言中快速实现。通过反向分析,我们恢复了第一个C语言编译器的写作过程,并感受到老年人科学家的智慧和辛勤工作!我们只是巨人肩上的灰尘! 0 Births 1,1 Life C,C,C的生活,真的很聪明!
活动建议:AWS Summit AWS技术峰会2015(上海)