是基于现有语言的定制编程语言编译器吗?

时间:2014-01-04 03:00:43

标签: windows assembly programming-languages system computer-science

我正在努力开始,弄清楚如何创建一个简单的编程语言。两者都有语法和编译器本身。我已就这个主题做了一些研究,但我真的不明白我的真正问题是什么。

我认为,现有的编程语言编译器是基于已有的编程语言构建的,因此只有将我的编译器基于其中一种语言才有意义。

Altho,因为理论上这是第一种带编译器的语言,没有其他语言可以基于,这不是一个真实的事实,而且必须基于其他东西,比如核心计算机系统语言。

最好的方法是什么,以及如何实现我的目标,即创建一个简单的(有扩展空间)编程语言?

感谢任何回答!

4 个答案:

答案 0 :(得分:2)

最初的编译器基于汇编编码。装配工从何而来?

最初的汇编程序基于痛苦输入的原始二进制机器代码指令。

几乎没有人进入二进制;至少,某种调试程序用于执行此操作。几乎没有人使用汇编程序编写编译器代码;在许多情况下,语言的第一个编译器用C编码。

如果你想构建一种编程语言,你的第一步就是获得一本编译器书(谷歌“编译器书”)并从头到尾阅读。如果你试图避免这一步骤,你将花费大量的精力来尝试发明你需要的东西,你可能会失败。

构建编译器的关键工具是解析器生成器和程序转换系统。前者是经典的答案。后者是一个高科技的答案,并不常见,但可以比经典答案更快地生成语言处理工具。您需要编译器书籍背景才能理解这些工具。

答案 1 :(得分:1)

  

哪种方式是创建简单编程语言的最佳方法?

与大多数人不同,我不认为创建语言是关于使用编译器或解释器。虽然您很可能需要编译器或解释器来实现您的新语言,但它们就像铅笔和纸一样。不要先使用工具,并认为你已经完成了某些事情。这就像使用扳手制造一个不起作用的发动机,但你声称你制造了一个发动机,因为使用了扳手。

要创建一种优秀的编程语言,您必须为您的语言设定目标。

由于您提到编程语言而不是某些其他类型的语言(如SQL)或标记语言(如HTML),我会认为您需要Turing complete语言。

由于大多数图灵完整语言都支持算术,因此我将从一个简单的算术表达式语言开始,并以此为基础。互联网上有大量的这些例子,但事先警告说,许多人都有问题。

接下来学习如何为算术表达式构建Abstract Syntax Trees(AST)。即。

3 + 2 * 6

    +
   / \
  3   *
     / \
    2   6

不要使用编译器来构建AST,而是使用您用来编写编程语言的语言手动构建它们。即如果您使用Java创建C ++编译器,则使用Java创建AST。

然后为将要遍历树的AST编写一个求值程序。

一旦你能够正确地构建AST并进行评估,然后添加lexer/parser,它将人类可读的源代码转换为AST。这是你需要获得一本好的编译器设计书。

现在您可以将AST编译为汇编代码或字节代码,或者继续使用评估程序。

从这一点开始,您只需在语言中添加功能,再次使用AST,然后修改解析器和代码生成器(如果已实现)。

  

如何创建一个简单的(有扩展空间)编程语言?

正如我所说:从算术评估器开始,一次添加一个语言概念。既然你是新手,你可能会发现你添加的概念实际上更好地作为一个更简单概念的组合,你应该先添加一个更简单的概念,然后再添加其他概念,最后达到更高的概念。

因为你的问题很普遍,所以我不能给出更具体的答案。我看到你已经有一些关闭的投票了。

答案 2 :(得分:1)

如果您想在您的语言中构建无限的可扩展性,请考虑在其中实现一个简单的元编程系统。

通过这种方式,您可以从一些非常简单的小语言开始,然后通过使用自己的宏扩展它来构建任意复杂语言或一组不同语言。这种语言可以简单地变成任何其他语言。

看看Forth和Lisp--两者都可以构建在一些非常简单的核心上,然后扩展为一个完全有能力的语言。你甚至不需要任何其他高级语言来实现这样一个链:一个简单的Forth可以在大约几百行x86汇编中进行自举。

如果你足够坚定,你甚至可以跳过汇编程序并立即写入机器代码,因为这种规模的东西在合理的时间内非常容易管理,并且可能会给你一些不可或缺的经验。 / p>

答案 3 :(得分:0)

发明一种语言正在发明一种语言...你如何实现它你通常使用现有的语言,然后在某些时候假设你的新语言可以用作编译器,然后你编写一个编译器你的新语言,你使用当前语言的二进制文件编译相同的语言编译器,然后再使用同一语言编译器的二进制文件再次执行它,如果这些都是自托管的。一个可以编译自己的语言编译器的编译器。

如果你从未制作过语言或编译器,那么你还有很长的路要走,你可以在一个简单的C类编译器上尝试其中一个例子,它只能做一些简单的事情(并且永远不会自我 - 编译),用这样的东西弄湿你的脚。

在一天结束时,有用的编程语言必须编译成某种东西,理想情况下,机器代码可以是真实的机器,也可以是虚拟的,如python或java或旧的pascal。但是有时候一种语言会编译成另一种已知的语言,例如C ++,然后你就可以使用该语言的现有工具来处理可以执行的事情。

现在已经多次询问和回答了这个问题。如果你回到足够远或希望得到尽可能纯的,你可以从机器代码和输入它的方式开始(参见许多计算机,dec pdp系列,altair等,输入方法是地址,数据和时钟手动开关)。 “编译器”或者在汇编/机器代码的情况下,“汇编程序”是人类用纸和铅笔或笔,如果你那么好。您手动编写汇编语言,然后手动将其转换为机器代码,然后手动翻转开关以将程序输入ram然后手动按下运行按钮。 第一个汇编程序和后来的编译器都是用这种方式编写的,你使用人工汇编程序使用机器代码编写汇编程序,然后自行托管。然后你要么使用人工汇编程序或软件汇编程序为你的第一个非汇编语言编写你的第一个编译器,然后用新语言重新编写编译器,然后你自己托管它。重复直到现在,你可以掌握更多的编译器和语言,以及为编写新语言的编译器和语言的无数选择。