首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是基于现有语言的自定义编程语言编译器吗?

是基于现有语言的自定义编程语言编译器吗?
EN

Stack Overflow用户
提问于 2014-01-04 03:00:43
回答 4查看 514关注 0票数 1

我试着开始,弄清楚如何创建一个简单的编程语言。使用语法和编译器本身。我已经对这个话题做了一些研究,但我真的不明白我真正的问题是什么。

我认为,现有的编程语言--编译器,是建立在已经存在的编程语言的基础上的,因此,将我的编译器建立在其中一种语言上也是有意义的。

而且,从理论上讲,这是编译器的第一种语言,没有其他语言可供使用,这不可能是一个真实的事实,而且必须基于其他的东西,比如核心计算机系统语言。

要达到我的目标,创建一种简单的(有扩展空间的)编程语言,哪种方式是最好的,以及如何实现呢?

任何回答都是感激的!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-01-04 15:40:01

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

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

要创建一个好的编程语言,你必须有你的语言的目标。

由于您提到了编程语言,而不是其他类型的语言(如SQL )或标记语言(如HTML ),所以我认为您需要一种图灵完备语言。

由于大多数图灵完整语言都支持算术,所以我从一种简单的算术表达式语言开始,并在此基础上进行构建。互联网上有很多这样的例子,但请注意,很多人都有问题。

接下来,了解如何为算术表达式构建抽象语法树 (AST)。即

3+2*6

代码语言:javascript
复制
    +
   / \
  3   *
     / \
    2   6

不要使用编译器来构建AST,而是用您正在编写编程语言的语言手工构建它们。也就是说,如果您使用Java来创建一个C++编译器,那么使用Java创建AST。

然后为将遍历树的AST编写一个评估器。

一旦您能够正确地构建AST和评估,然后添加词法/解析器,它将人类可读的源代码转换为AST。这是你需要得到的一本好的编译器设计书。

现在,您可以将AST编译成程序集或字节码,也可以继续使用评估器。

从现在开始,您只需向语言中添加特性,再次从AST开始,然后修改解析器和代码生成器(如果您实现了的话)。

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

正如我所指出的:从算术计算器开始,每次添加一个语言概念。由于您在这方面是新手,您可能会发现,您添加的概念实际上更好地组合了更简单的概念,并且您应该先添加一个更简单的概念,然后再添加另一个概念,最后到达更高的概念。

因为你的问题太笼统了,我不能给出更具体的答案。我看到你们已经有了几张密切的选票,注意到了这一点。

票数 1
EN

Stack Overflow用户

发布于 2014-01-04 04:36:54

第一批编译器是基于汇编程序编码的。装配工从哪里来的?

第一批汇编程序是基于痛苦地输入原始二进制机器代码指令的。

几乎没有人进入二进制程序;至少,使用某种调试器程序来实现这一点。几乎没有人再用汇编语言来编码编译器了;在许多情况下,语言的第一个编译器是用C语言编码的。

如果您想要构建一种编程语言,您的第一步是获得一本编译器书(google“编译器手册”),并从封面到另一页阅读。如果你试图避免这一步,你将花费大量的精力去尝试和发明你需要的东西,你很可能会失败。

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

票数 2
EN

Stack Overflow用户

发布于 2014-01-04 17:10:33

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

通过这种方式,您可以从一些非常简单和小的语言开始,然后通过使用自己的宏对其进行扩展,从而构建任意复杂的语言或一组不同的语言。这样的语言可以被转化成任何其他的语言。

看看Forth和Lisp --它们都可以建立在一些极其琐碎的核心之上,然后扩展到一种完全有能力的语言。您甚至不需要任何其他高级语言来实现这样的链:可以在大约几百行x86程序集中引导一个简单的Forth。

如果您有足够的决心,您甚至可以跳过汇编程序并立即用机器代码编写,对于这种规模的东西,它在合理的时间内是相当容易管理的,并且可能会给您提供一些必不可少的经验。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20916322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档