代码之家  ›  专栏  ›  技术社区  ›  Erik Campobadal Christophe Herreman

创建编程语言的起点和帮助[关闭]

  •  -1
  • Erik Campobadal Christophe Herreman  · 技术社区  · 8 年前

    我目前是一名大学生,正在等待选择一篇优秀的学士学位论文。我愿意创造一种语言已经很长时间了,既然我认为我有能力,我想听听关于以下问题的意见:

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

    我几乎可以选择一种我想创建的语言作为我的基础。重点是:我见过很多人用python做这件事,wich很棒,但我最擅长PHP。当然不是普通的PHP,我是laravel的忠实粉丝。

    显然,一个名为laravel zero的社区驱动项目( http://laravel-zero.com/ )允许在PHP中创建很棒的控制台应用程序,这让我想知道。。。如果我用这个作为我的基地呢?

    几个关键点:我不在乎速度,也不在乎优化。

    我为C/C++的粉丝们感到抱歉,但我不会选择这作为起点。

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

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

    据我所知,创建解释性语言总是需要以某种方式呈现“母亲”语言,因为除非是二进制代码,否则您无法自行托管您的解释器。

    有人有什么感兴趣的事和我分享吗?我很想听听关于它的意见和东西。

    例如,最好的起点在哪里,在进入这门课程之前我应该看些什么,等等,任何事情都会有很大的帮助。

    谢谢

    2 回复  |  直到 8 年前
        1
  •  3
  •   sepp2k    8 年前

    在大多数情况下,编程语言并不重要。如果您想使用lexer+解析器生成器,那么您需要使用一种可以使用这些生成器的语言。对于大多数并非完全晦涩难懂或领域特定的语言(包括根据快速搜索的PHP),情况就是这样,但不同生成器之间的质量肯定存在显著差异,因此在选择语言之前,您可能需要仔细查看可用工具的质量。当然,如果您确实想使用lexer和/或解析器生成器,那么这只是一个考虑因素。如果您要自己编写lexer和解析器,任何语言都可以。

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

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

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

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

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

    这完全取决于您的需求和语言的属性。请注意,“编译”或“解释”并不是该语言的真正属性,而是该语言当前可用的实现的属性。有了语言,就有了实现(或多个实现)。

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

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

    据我所知,创建解释性语言总是需要以某种方式呈现“母亲”语言,因为除非是二进制代码,否则您无法自行托管您的解释器。

    对,如果您编写了一个解释器,并且您的宿主语言也只有解释器,那么您将需要您的解释器以及宿主语言的解释器(运行您的解释器),以便运行用您的语言编写的程序。当然,您总是可以用编译器存在的语言重写您的解释器,这只不过是自我托管(这是一种完全的重写,除非您的源语言与宿主语言非常接近,您可以在两种语言的交叉处编写解释器)。

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

    例如,最好的起点在哪里,在进入这门课程之前我应该看些什么,等等,任何事情都会有很大的帮助。

    这个 tag wiki for the compiler construction tag 有一个关于编译器构造的资源列表。在构建口译员时,这些信息中的大部分也是相关的。

        2
  •  0
  •   bartc    8 年前

    创建一种完全编译的编程语言可能需要大量的工作,同时需要担心大量复杂的细节。并且可能仅限于特定处理器和操作系统。

    因此,创建解释性语言可能是一项更容易的任务,而且它可以编写为在任何对象上运行。但是您真的需要用编译语言编写解释器,否则速度会非常慢。

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

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

    如果创建一种编译语言,那么您可能还需要诸如汇编器和链接器之类的工具,而您可能不想自己编写这些工具。或者以现有语言的形式生成输出(例如C源代码,我相信这就是C++的起源)。

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

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