他们用什么语言建立其他语言?

时间:2010-01-10 02:30:08

标签: java c++ programming-languages

用什么语言来构建像c ++和java这样的低级语言?

你怎么能建立没有语言的第一语言?

8 个答案:

答案 0 :(得分:32)

在编译器的上下文中,此操作通常称为bootstrapping。特别是,请参阅“鸡和鸡蛋问题”部分,直接回答您的问题。

非常第一个编译器是用汇编语言手写的。如果您的下一个问题是“第一个汇编程序是如何编写的?”那么答案就是第一个汇编程序是用二进制机器代码手写的,可能是front panel toggle switches。这无疑是对真实情况的简化,但概念是一样的。

Ken Thompson还有一篇名为Reflections on Trusting Trust的优秀文章,关于使用编译器为语言构建该语言编译器的风险。

答案 1 :(得分:14)

您没有构建语言,但是您构建了compilerinterpreter ...为此,您可以选择任何语言,甚至是您要编译的语言......

  

第一个自托管编译器 -   能够编译自己的来源   用高级语言编写的代码 - 是   为Lisp创建...自20世纪70年代以来   它已成为惯例   用该语言实现编译器   它编译,虽然Pascal和   C一直是受欢迎的选择   实施语言。   http://en.wikipedia.org/wiki/Compiler

答案 2 :(得分:6)

很多此类事情都是在C中完成的。

第一个C编译器不是用C语言编写的;它是PDP-11汇编程序。 其他早期的C编译器已经用各种汇编语言编写。

但是所有后续的C编译器实际上都是用C编写的,基于早期的“Portable C Compiler”。是的,这是循环的。但版本x编译器可用于构建版本x + 1编译器。

答案 3 :(得分:4)

我认为您的问题的关键洞察力是boot-strapping的概念。该链接将描述语言如何自我托管。

在Lisp社区中相对常见。例如一些大学课程将使用Scheme来编写语言子集(这不是编译器类活动)。

也就是说,许多编译器都是用其他语言编写的。例如,PUGS(Perl 6)是用Haskell编写的。 Ruby以C或Java格式提供(如JRuby)。

答案 4 :(得分:3)

有几个选项,您可以使用目标主机上可用的语言实现整个语言,例如C或Ocaml,无论它是什么。一旦你有了这个实现,你可以用语言本身编写一个编译器/解释器,构建它,现在语言自己运行。此过程称为“bootstrapping”。

答案 5 :(得分:1)

没有“没有语言”这样的东西。中央处理单元对一系列信号进行操作,我们称之为比特或1和0(技术上,电流的变化)。在50年代,编码直接在CPU可以“理解”的地方完成,编程的速度每天最多可达20个汇编命令。

答案 6 :(得分:1)

正如其他海报所提到的,你几乎可以用任何语言编写一种语言,并且通常用语言编写的第一个程序之一就是语言本身的编译器。

但是,有些语言专门用于编写计算机语言 - 即lex,yacc,flex,bison(lex和yacc的更新版本)。这些允许您以一种可以编译成有效语言识别器的形式表示某些语言的词汇和语法规范(我相信LLR或LALR)。

您仍然必须自己编写语言编译器/解释器的其他部分,即语义分析,代码生成。

http://dinosaur.compilertools.net/

答案 7 :(得分:0)

通常使用另一台机器或其他语言编写第一个汇编程序和第一个编译器。

只要有可用的工作计算机和工作语言,即使有所不同,问题也可以分两步解决。

  1. 在计算机上使用语言 z 为计算机 y 编写目标语言 x (urk) a

  2. 使用语言 x 为计算机 y 编写目标语言 x 。现在, a 上的单个编译将生成一个可以在 y 上运行的转换器,然后第二个编译可以在 y 上完成 - 自助系统。

  3. 如果语言或机器没有差异,问题会变得更加简单。

    Bootstrapping也可以逐步完成,也许这在50年前更为常见。

    • 在机器代码中编写功能更强大的虚拟机(可能是堆栈机器或带字符串的东西)
    • 现在,写入VM的字节码,写一些更接近语言的内容
    像福斯这样的东西可能会成为一个很好的中间步骤。