起点和帮助创建编程语言

时间:2018-03-20 14:27:27

标签: build compiler-construction programming-languages interpreter

我现在是一名大学生,等着选择一本很棒的学士论文。我很乐意长期创作一门语言,既然我认为我能够,我想听听以下事项的意见:

我知道很多语言,包括C,C ++,Python,Erlang,PHP,Javascript等。

我几乎可以选择我想要创建一种语言作为我的基础。关键是:我见过很多人用python做这件事,这很棒,但我最擅长PHP。当然不是简单的PHP,我是一个很大的粉丝。

显然,一个名为laravel zero(http://laravel-zero.com/)的社区驱动项目允许在PHP中创建出色的控制台应用程序,这让我很奇怪......如果我以此为基础怎么办?

几个键:我不介意速度,我不介意优化。

我很抱歉C / C ++粉丝,但我不会选择那个作为起点。

如果您使用编程语言,我可能会问另一个问题:

创建编译或解释语言会更好吗?为什么呢?

据我所知,创建一种解释型语言总是要求以某种方式存在“母语”,因为除非是二进制代码,否则你不能自己托管你的翻译。

有人有兴趣与我分享吗?我很乐意听到有关它的意见和建议。

例如,哪里是最好的起点,在进入这个科目之前我应该​​看什么等等。任何事情都会有很大的帮助。

由于

2 个答案:

答案 0 :(得分:3)

在大多数情况下,编程语言并不重要。如果您想使用词法分析器+解析器生成器,您将需要使用可用的语言。对于大多数不完全模糊或特定领域的语言(包括根据快速搜索的PHP)来说就是这种情况,但不同发生器之间的质量肯定存在显着差异,因此您可能需要仔细研究质量选择语言之前可用的工具当然,如果您确实想要使用词法分析器和/或解析器生成器,那么这只是一个考虑因素。如果您打算自己编写词法分析器和解析器,那么任何语言都可以。

如果您决定编写编译器并且希望使用LLVM作为后端,那么如果您的语言存在LLVM绑定,那将是一个加分。这似乎不是PHP的情况(只搜索this extension,用于调用LLVM-bitcode中的函数,而不是生成LLVM-bitcode)。另一方面,您始终可以将LLVM-assembly生成为文本,然后调用LLVM命令行工具。如果您正在编写没有LLVM或解释器的编译器,那么无论如何都无关紧要。

如果您的语言具有用于定义符号表的地图数据结构,则会有所帮助,但大多数语言都有这种结构。

我个人喜欢用于语言实现的函数式语言,因为不可变映射是表示符号表的好方法,而代数数据类型是表示AST的好方法,但这些都不是绝对必要的。

几乎所有您熟悉的语言都可以用来实现语言而不会有太多麻烦。

  

创建编译或解释语言会更好吗?

这完全取决于您的要求和您的语言属性。请注意,“编译”或“已解释”不是语言的真正属性,而是语言当前可用的实现。有语言,然后有它的实现(或实现)。

您的语言具有的“动态”功能越多(例如在运行时定义新函数或变量),编写编译器就越困难,但即使没有这些,编写解释器也会更容易。因此,即使您计划最终使用编译器(或JIT编译器),从解释器开始也是有意义的。

无论如何,从解释器切换到编译器时,大多数前端和中端阶段都可以保持不变。所以,这并不像你想象的那样浪费现有的工作。

  

据我所知,创建一种解释型语言总是要求以某种方式存在“母语”,因为除非是二进制代码,否则你不能自己托管你的翻译。

是的,如果你写一个翻译,你的主语也只有翻译,你需要你的翻译和宿主语言的翻译(运行你的翻译),以便运行用你的语言编写的程序。当然,你总是可以用编译器所存在的语言重写你的解释器,这不是自托管的任何工作(除非你的源语言非常接近你的宿主语言,否则无论如何都是完全重写的。你可以用两种语言的交集来编写你的翻译。)

在您创建自托管编译器之前,编译器也是如此:只要您的编译器是用PHP编写的,您就需要PHP来编译您的语言(尽管不运行已编译的程序)

  

例如,哪里是最好的起点,在进入这个科目之前我应该​​看什么等等。任何事情都会有很大的帮助。

tag wiki for the compiler construction tag有一个关于编译器构造的资源列表。在建立口译员时,大部​​分信息也很重要。

答案 1 :(得分:0)

创建一个完全编译的编程语言可以做很多工作,需要担心大量繁琐的细节。并且可能仅限于特定的处理器和操作系统。

出于这个原因,创建一个解释型语言可以是一个更容易的任务,它可以编写为在任何东西上运行。但是你真的需要用编译语言编写解释器,否则它会毫无希望地缓慢。

如果解释器分为两个任务,一个编译器(对某种字节码)和一个解释器,那么任何语言都可以用于编译器。

依赖另一种语言(你称之为“母语”)并不重要。大多数语言都有某种依赖性(因此CPython是用C语言编写的)。

如果要创建编译语言,那么您可能还需要汇编器和链接器等工具,您可能不想自己编写。或者您以现有语言的形式生成输出(例如C源代码,我相信C ++是如何开始的)。

重要的是,有人可以用您的新语言编写程序,并以某种方式通过您提供的任何方式运行该程序。

(我已经创建了许多语言但只有两种真正的变种:低级编译和中级解释。每种都用于编写另一种语言的编译器/解释器。)