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