
(1)“编程语言”是用于定义计算机程序的形式语言. 这是一种用于向计算机发出指令的标准化通信技术...
(2)编程语言的描述通常可以分为语法和语义. 语法是为了说明在编程语言中正确组合了哪些符号或单词,而语义是为了说明编程...
(3)编程语言通常被称为“计算机语言”,并且有很多类型. 通常,它们可以分为三类: 机器语言,汇编语言和高级语言. 程序是计算机要执行的指令的集合,所有程序均以我们掌握的语言编写...
就像我刚才对衣服的描述一样,理解这三个概念的人已经理解了以上三个概念,而那些不理解的人仍然不理解它. 因为对编程语言的理解不在于语言本身,而在于编译器. 编译器是编程语言的“”,我们很少有人像编译器一样了解编译器,因此我们大多数人都对它很熟悉. 语言的语法只是“惯用的”.
那么什么是编程语言?不管我使用多少个单词,仅仅表达准确性和全面性都是不够的,因为语言的本质是编译器. 了解了编译器之后,答案就在您的内心. 目前,我只能给出相同的“鸡肋”答案-编程语言是编译器用来“将人类思想转化为计算机行为”的语法规则.
编程语言的起源
世界上没有编程语言,只有编译器. 语言本身只是一系列语法规则. 与此规则相对应的“行为”是我们编程的“意图”. 因此,从“规则”到“行为”的分析是语言的本质.
每个人都知道,如果要输出字符串,则可以在PHP中使用echo语句,在C中使用printf函数,在C ++中使用cout. 这表明不同的规则对应于相同的行为,因此语言的多样性只是为了混淆人们的外表,本质行为是相同的脚本语言标准,而变化是不可分割的.
并不是“打印”功能必须与打印,输出等相关联. 这是因为编译器设计人员为了方便用户(当然,是为了自己的设计)采用了该功能. 每个人都同意使用关键字,以避免不必要的混乱.
该语言是否必须使用较低级别的语言编写?
出现这个问题并不奇怪,例如:
(1)Python用C编写. C比Python更适合于低级执行.
(2)编译后,C代码将转换为较低级的汇编代码,再由汇编器转换,然后由汇编器将汇编代码转换为机器代码.
所以给人的印象是,必须以较低级别的语言来实现一种语言,这实际上是一种误解. C最初是用汇编语言编写的,因为在C之前只有汇编语言和机器语言. 人们总是很懒惰,绝对是最方便的使用方式. 汇编语言是机器语言的象征,因此它相对容易使用,因此我必须使用汇编来编写C语言. ,他们用C语言编写.
什么?用C写C吗?一些读者崩溃了,似乎陷入了无限循环. 实际上,这根本不是一回事,因为不是C语言起作用,而是C编译器. 语言只是规则,编译器生成的行为是最关键的. 编译器是一个程序,而C代码只是其文本输入. 用C编写C是自举. 如果编译器是用另一种语言编写的,则您的内心感觉会更好.
实际上,只要使用的语言具有一定的文件编写功能,就可以编写编译器. 为什么这么说因为编译器本身是程序,所以程序本身由操作系统加载和执行. 操作系统识别出程序的格式后,它将根据格式读取程序中的段并将其加载到内存中,最后使程序计数器(注册pc或ip)跳转到该程序. 程序被执行.
因此,用于编写编译器的语言仅需要具有一定程度的文件编写能力,例如至少具有类似于seek的文件定位功能,可用于根据不同格式以不同的偏移量进行编写协议输入数据,因此C编译器可以用Python编写. 在此之前,我写了《操作系统真相还原》(Operation System Truth Restoration)书,第0章第0.17节``预先存在的语言是预先存在的编译器,第一个编译器是如何产生的'',详细介绍了C编译器如何引导,我将发表在下面.
确定的第一件事是现有的编程语言,即使该语言就像一个符号一样简单. 首先设计语言规则,然后编写可以识别此规则集的编译器. 否则,如果没有语言规则作为指导,编译器将无法编写. 第一个编译器是如何产生的?我尚未验证此问题,但是我可以谈谈我自己的理解. 请辩证地看.

这个问题属于鸡下蛋和哲学上的鸡下蛋的问题. 这种根深蒂固的根源问题常常令人困惑. 但是现实生活中有很多例子,如下.
(1)英语老师教学生英语,其他学生成为英语老师后也可以教英语.
(2)要写新书,您需要参考其他旧书. 新书将在以后被更新的书引用. 就像编写本书的过程一样,您需要参考许多前辈的工作.
(3)可以使用工具来制作工具,将来可以使用所制作的工具来制作新工具.
(4)编译器可以编译新的编译器.
这种创建自己的现象称为引导.
引导程序?你有没有提起自己?是的,一个人不能振作起来. 这个术语生动地描述了这种“后果一定有原因”现象.
上面的前三个例子都是生活的例子,似乎比第四个更容易接受. 即便如此,我们仍然对前三个示例有疑问:
(1)谁教了第一位讲英语的人?
(2)第一本书是如何制作的?
(3)第一个工具是如何制成的?
实际上,您可能理解第二个示例. 世界上第一本书,其知识来源必须是人类的记忆. 通过询问个人或群众,每个人都同意的知识被记录在某种媒介上,从而诞生了第一本书. 之后记录新知识时,由于有本书的参考,因此无需再次向公众询问原始知识. 从那时起,学者书籍的因果循环就形成了.
这本书中的示例可以证明原始问题中的第一个是由其他事物而不是由您自己创造的.
就像鸡肉或鸡蛋一样,肯定还有其他生物. 这种活生物不是今天提到的鸡. 随着这种生物的长久进化,突然之间有一天可以产卵(也许这个鸡蛋一开始不能孵化成鸡,而这种生物经过了长时间的进化,最终可以产生能够孵化成鸡肉)这样鸡蛋就可以生产鸡肉了. 长期以来,只有人类. 从一开始,人们就与当前的鸡接触,却不知道该生物的存在,所以人们只知道这只鸡是从鸡蛋中生出来的.
在编译C语言时很容易混淆,首先将其编译为汇编代码,然后再从汇编代码中将其编译为机器代码,因此很容易使人们错误地认为某种语言是基于低级语言的语言. 似乎没有汇编语言,也没有办法编译C语言. 以gcc为例,它必须调用汇编程序以完成汇编语言到机器代码的翻译. 因为已经有汇编语言编译器,所以为什么不浪费此资源,您必须将C语言直接转换为机器代码,毕竟,汇编器非常健壮,比将C直接转换为机器代码更困难是C语言. 翻译成汇编语言通常是这样,这是对轮子的重新发明.
我曾经问自己,PHP解释器是用C语言编写的,C编译器是用汇编语言编写的(这句话是不正确的),谁编写了汇编语言?后来得知编译器gcc实际上是用C语言编写的. 乍看之下,什么?用C语言编写C编译器?就像电影《超越黑客》一样,创造自己. 当时的想法似乎陷入了无休止的循环,现在看来并不奇怪. 实际上,编译器使用哪种语言都没有关系,关键是编译指令.
已编译的可执行文件被写入磁盘. 从理论上讲,一个进程,无论它是否是编译器,只要其读写文件的功能足够强大,就可以将任何内容写入磁盘. 两者都可以生成可执行文件,并让操作系统直接加载并运行. 想象一下用Python编写脚本. 该功能是复制二进制可执行文件. 新复制的文件肯定是可执行的. Python脚本直接输出这样的二进制可执行文件,自然可以直接执行,完全在Python解释器之外.
编译器实际上是一种语言,因为编译器必须在设计之初就计划某种语言,并根据该语言规则编写合适的编译器. 因此,要发明一种语言,关键是编写匹配的编译器,两者同时出现. 原始的编译器绝对简单而粗糙. 由于当时的编程语言绝对是不完善的,最多只有几个符号,因此很难称其为语言. 如果它具有完善的功能,符合规范并具有自己的系统集,则只能称为语言.

不用说,这个初始的编译器当然不能编译当今的C语言代码. 编程语言仅是文本,而该文本仅用于查看,并且没有执行能力. 原始编译器必须已经用机器代码编写. 该编译器可以识别文本并可以处理一些符号关键字. 随着符号越来越多,足以不断改进此编译器.
以上符号是编程语言. 后来,编译器支持越来越多的关键字,也就是说,该编译器支持的编程语言变得更加强大. 当您可以编写一些复杂的函数时,只需使用此语言编写一个新的编译器. 当新的编译器诞生时,仍然需要使用旧的编译器进行编译.
只要您有新的编译器,就可以告别旧的编译器. 发明一个新的编译器实际上可以处理更多的符号关键字,即存在一种新的开发语言,该语言可以是全新的语言,也可以是原始语言,具体取决于编译器的实现方式. 这个过程持续不断并发展,今天逐渐有各种语言翻译. 这是一个反复的过程.

图0-1
图0-1在Internet上非常流行. 它通常与鼓舞人心的文字有关. 当我第一次看到这座雕像在雕刻自己时,我真的很感动,感到越来越痛苦. 今天发布它的目的是告诉所有人,原始编译器的功能也很简单且非标准. 但是,经过不断的自我雕刻,它具有当今功能的完美表现.
以下是我提到的其他人文章的内容. 由于我找不到这位主人的签名,因此我必须首先表示诚挚的敬意,并感谢他对寻找者的奉献.
关于C编译器的开发,我们必须提到C语言之父这两位伟大的神丹尼斯·里奇(Dennis Ritchie)和肯·汤普森(Ken Thompson). 丹尼斯和肯(Dennis and Ken)在编程语言和操作系统方面的杰出贡献为他们赢得了计算机科学领域的最高荣誉. 丹尼斯(Dennis)和肯(Ken)于1983年获得了ACM图灵奖.
编译器是通过不断学习和积累而开发的. 这是一个自学过程. 让我们看看他们如何扩展编译器.
我们都知道转义字符. 转义字符是多个以\开头的字符,通常代表一些控制字符. 它们通常是不可键入的,也就是说,这些字符不能直接在键盘上输入,例如\ n Enter和换行符,\ t表示制表符. 由于以\开头的字符表示转义,因此,如果要表示\字符本身,则必须使用\进行转义,即\\表示字符\. 尽管转义字符表示单个字符的含义,但是在编译器看来,转义字符是由多个字符组成的字符串,例如\ n是由字符\和n组成的字符串.
原始的C编译器不处理转义字符. 为了便于叙述,我们现在将其称为旧编译器. 如果在要编译的代码文件中有一个字符串\\,则这是旧编译器认为的\\字符串,而不是转义后的单个字符\. 为了显示编译器和代码文件之间的关系作为输入,我们将应用程序文件称为“代码文件作为输入”. 尽管已编译的代码文件实现了编译器,但在编译器看来,它只是应用程序级的角色. 例如,在gcc -c a.c中,a.c是应用程序文件.
现在,要在编译器中添加对转义符的支持,您需要修改旧编译器的源代码. 假定旧编译器的源代码文件名为compile_old.c. 修改后的编译器代码不属于旧编译器的源代码,因此我们将其命名为compile_new_a.c. 图0-2是修改后的内容.
代码compile_new_a.c

图0-2
其中,next()函数的功能是返回要处理的文本(即已编译的源代码文件)中的下一个字符. 要强调的是,它是“单个字符”,而不是符号分析中的单词(即标记).
使用旧编译器编译新编译器的源代码compile_new_a.c,以生成可执行文件. 该文件是新的编译器,我们将其称为新的editor_a. 为了便于说明它们的关系,它们在表0-1中列出.


表0-1
此处编译的新编译器_a可以编译包含转义符\\的应用程序代码,即,要编译的文件(即应用程序代码)应由\\ \表示. 单字符\在新的编译器_a中未处理,因此无法编译. 因此,新的编译器_a此时不能编译其自己的源代码compile_new_a.c,因为源文件只是单个\字符,而新的编译器_a仅识别\\. 首先更新它们的关系,请参阅表0-2.

表0-2
也就是说,现在新的编译器_a无法编译其自己的源文件compile_new_a.c,只有旧的编译器才能编译它. 此外,新的编译器_a无法正确编译其自身的源文件compile_new_a.c的原因是脚本语言标准,compile_new_a.c中的\字符应引用为转义字符,即,所有应将\替换为\\的地方. 回顾新的编译器_a的源代码compile_new_a.c,它仅处理字符串\\,并且对于单个\没有对应的处理逻辑. 修改下面的代码,并将新修改的代码命名为compile_new_b.c,如图0-3所示.
代码compile_new_b.c

图0-3
实际上,compile_new_b.c只是更新了转义字符的语法. 这是新的编译器_a支持的新语法. 下面是新的编译器_a,用于编译新的编译器.
使用新的编译器_a编译该文件,将生成新的编译器_b,并将新的关系输入表0-3.

表0-3
在继续之前先讨论一下: 使用编译器来编译另一个编译器的源代码. 一些读者可能会觉得很困惑. 实际上,如果您将“编译的编译器源代码”视为普通的应用程序源代码,则特别容易理解. . 在上面的编译器代码compile_new_b.c中,第3、6和7行上的字符串\\在被新的editor_a处理后将被替换为单个字符\(这是新的compile_a的源代码中的return语句)函数),因此处理后的最终代码等同于代码compile_new_a.c. 现在,我想添加对换行符\ n的支持,如图0-4所示.

图0-4
因为编译器现在无法识别\ n,所以这肯定行不通,但是可以将其替换为名为compile_new_c.c的ASCII代码,如图0-5所示.
代码compile_new_c.c


图0-5
带有新的Compiler_a的Compile_new_c.c将生成新的compile_c. new compile_c的代码等效于将compile_new_c.c中的所有\\替换为\,如0-4中列出的表所示,临时称为代码compile_new_c1.c,如图0-6所示.
代码compile_new_c1.c

图0-6

表0-4
最后将compile_new_c.c修改为compile_new_d.c,并用\ n替换10,如图0-7所示.
代码compile_new_d.c

图0-7
使用新的编译器_c编译compile_new_d.c以生成新的编译器d,它将直接被识别\ n. 类似地,新编译器d的代码等效于代码compile_new_d.c,所有字符串\\被字符\替换,字符\ n被数字10替换,这等效于代码compile_new_c1.c ,如列出的0-5所示.
经过不断的训练,编译器变得越来越强大,但是却占用了越来越多的空间.

表0-5

“自制编程语言”
郑刚
本书首先全面介绍了脚本语言和虚拟机. 它说明了词法分析的实现,一些基础数据结构,符号表和类结构符号表的实现,常量存储,局部变量,模块变量,方法存储,虚拟机原理,运行时堆栈实现,编译实现,语法分析和语法指导的自上而下的运算符优先级构造规则,调试,查看指令流,查看运行时堆栈,向类添加更多方法,垃圾回收实现,添加命令行支持命令行界面.
“今天互动”
您最想从这本书中学到什么?为什么?截止日期为7月27日17:00,将消息发送并转发给朋友圈该程序是一种高级的自定义脚本语言)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-218882-1.html
你知道美国在我周边煽动别国闹事