|
-1
|
| Erik Campobadal Christophe Herreman · 技术社区 · 8 年前 |
|
|
1
3
在大多数情况下,编程语言并不重要。如果您想使用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
创建一种完全编译的编程语言可能需要大量的工作,同时需要担心大量复杂的细节。并且可能仅限于特定处理器和操作系统。 因此,创建解释性语言可能是一项更容易的任务,而且它可以编写为在任何对象上运行。但是您真的需要用编译语言编写解释器,否则速度会非常慢。 如果解释器分为两个任务,一个编译器(某种字节码)和一个解释器,那么编译器可以使用任何语言。 依赖另一种语言(你称之为“母语”)并不重要。大多数语言都有某种依赖关系(因此CPython是用C编写的)。 如果创建一种编译语言,那么您可能还需要诸如汇编器和链接器之类的工具,而您可能不想自己编写这些工具。或者以现有语言的形式生成输出(例如C源代码,我相信这就是C++的起源)。 重要的是,有人可以用您的新语言编写程序,并且能够以您提供的任何方式运行该程序。 (我创建了许多语言,但只有两种真正的语言:低级编译语言和中级解释语言。每种语言都用于编写另一种语言的编译器/解释器。) |
|
|
Gengetsu · 如何从Bison中的语法启动变量? 8 年前 |
|
|
Jon Deaton · 如何使用元循环计算器引导Lisp解释器 8 年前 |
|
|
liyuan · 解释器如何翻译for循环? 8 年前 |
|
|
ææç · 解释器交互模式保持文件打开的目的 11 年前 |
|
|
user3318845 · 字节码如何更快?[已关闭] 12 年前 |
|
|
Trung Bún · OCaml解释器:为什么我的解释器只执行文件中的一行 12 年前 |