请原谅我的无知.我正在尝试使用PHP并且让我的脚湿透浏览,并且不得不问一个我多年来一直在想的问题:
当你编写一种全新的编程语言时,你会写什么?
对于你们所有的程序员来说,这听起来真的很愚蠢,我对他们非常尊重,但这对我来说是一个令人困惑的鸡蛋和鸡蛋.你是做什么?对自己说今天我要发明一种新语言!然后开火...记事本?是否所有编译器都是基于以前存在的语言构建的,例如一个人打扰一个,可以将所有编程语言设计成一个怪异的分支树,这个树最终在......我不知道,有些旧吗?
凭借我虚弱的智慧,我觉得这很有吸引力......请教育我!
小智 178
这不是一个愚蠢的问题.这是一个很好的问题.
正如已经回答的那样,简短的回答是"另一种语言".
那导致一些有趣的问题?如果它是为您的特定硬件编写的第一种语言怎么办?对于使用嵌入式设备的人来说,这是一个非常现实的问 已经回答"另一台计算机上的语言".事实上,一些嵌入式设备永远不会得到编译器,它们的程序将始终在不同的计算机上编译.
但你可以进一步推迟它.有史以来写的第一个程序呢?
那么"高级语言"的第一个编译器就是用"汇编语言"编写的.汇编语言是一种语言,其中语言中的每条指令都对应于CPU的单个指令.它的语言非常低,写得非常冗长,而且非常耗费人力.
但即使编写汇编语言也需要一个称为汇编程序的程序来将汇编语言转换为"机器语言".我们回去吧.最初的汇编程序是用"机器代码"编写的.一个完全由二进制数组成的程序,它与计算机本身的原始语言直接一一对应.
但它仍然没有结束.即使只有原始数字的文件仍然需要翻译.您仍然需要将文件中的原始数字输入计算机.
不管你相信与否,早期的计算机前面都有一排开关.你翻转开关直到它们代表一个二进制数字,然后你轻弹另一个开关并将那个单个数字加载到计算机内存中.然后你继续轻弹切换,直到你加载了一个可以从磁盘文件或打卡读取程序的最小计算机程序.你轻弹另一个开关,它启动程序运行.当我在80年代上大学的时候,我看到了具有这种能力的计算机,但从来没有得到过加载程序的工作.
甚至早于计算机程序必须与插板硬接线!
sil*_*cle 10
几乎任何语言,虽然使用适合处理图形和其他复杂数据结构的语言将使许多事情变得更容易.出于性能原因,生产编译器通常用C或C++编写,但OCaml,SML,Prolog和Lisp等语言可以更好地用于语言原型.
语言设计中也使用了几种"小语言".例如,Lex和yacc用于指定语法和语法,并且它们编译为C.(有其他语言的端口,例如ocamllex/ocamlyacc,以及许多其他类似的工具.)
作为一个特例,新的Lisp方言通常建立在现有的Lisp实现上,因为它们可以搭载在大多数相同的基础架构上.编写Scheme解释器可以在一个代码页下的Scheme中完成,此时可以轻松添加新功能.
从根本上说,编译器只是读取内容并将其转换为其他内容的程序 - 将LaTeX源转换为DVI,将C代码转换为汇编然后转换为机器语言,将语法规范转换为C代码以用于解析器等.其设计者指定源格式的结构(解析),这些结构的含义,如何简化数据(优化)以及生成的输出类型.口译员阅读源并直接执行.(解释器通常更容易编写,但速度要慢得多.)
事实上,你几乎可以用任何你喜欢的语言来写作。没有什么可以阻止您在 Ruby 中编写 C 编译器。您所要做的“全部”就是解析程序并发出相应的机器代码。如果您可以读/写文件,那么您的编程语言可能就足够了。
如果您是在新平台上从头开始,您可以进行交叉编译:为您的新平台编写一个编译器,该编译器在 Java 中运行或在 x86 上运行。在您的 PC 上开发,然后将程序传输到您的新目标平台。
最基本的编译器可能是 Assembler 和 C。
“编写新的编程语言”在技术上不涉及任何代码。它只是为您的语言的外观及其工作方式提出了一个规范。一旦您了解您的语言是什么样的,您就可以编写笔译和口译员来真正使您的语言“起作用”。
翻译器输入一种语言的程序并输出另一种语言的等效程序。解释器输入某种语言的程序并运行它。
例如,C 编译器通常将 C 源代码(输入语言)翻译成汇编语言程序(输出语言)。汇编器然后采用汇编语言程序并生成机器语言。获得输出后,您就不需要翻译器来运行您的程序了。由于您现在有一个机器语言程序,因此 CPU 充当解释器。
许多语言的实现方式不同。例如,javac是将 Java 源代码转换为 JVM 字节码的转换器。JVM 是一个解释器 [1],它运行 Java 字节码。运行javac并获取字节码后,您就不再需要javac了。但是,无论何时要运行程序,都需要 JVM。
翻译人员不需要留在身边运行程序这一事实使得“引导”您的语言成为可能,而不会使其最终“在”其他语言的“层”和“层”之上运行。
[1] 大多数 JVM 在幕后进行翻译,但它们并不是真正的翻译器,因为 JVM 的接口不是“输入语言 -> 输出语言”。