起点和帮助创建编程语言

Starting point and help creating a programming language

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

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

我几乎可以选择我想创建一种语言作为我的基础。关键是:我见过很多人用 python 来做这件事,这很好,但我最擅长 PHP。不平凡 PHP 当然,我是一个忠实的 laravel 粉丝。

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

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

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

如果你对编程语言感兴趣,我可能会问另一个问题:

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

据我所知,创建解释性语言总是需要 "mother" 语言以某种方式存在,因为除非它是二进制代码,否则您无法自行托管解释器。

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

例如,最好的起点在哪里,在进入这个主题之前我应该​​看什么等等任何东西都会有很大的帮助。

谢谢

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

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

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

我个人喜欢用于语言实现的函数式语言,因为 immutable 映射是表示符号 table 的好方法,代数数据类型是表示 AST 的好方法,但是 none 是绝对必要的。

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

Is it better to create a compiled or interpreted language?

这完全取决于您的要求和您的语言的属性。请注意,"compiled" 或 "interpreted" 并不是该语言的真正属性,而是该语言当前可用实现的属性。先是语言,然后是它的实现(或实现)。

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

大多数 front-end 和 mid-end 阶段在从解释器切换到编译器时可以保持不变。因此,这并不像您想象的那样浪费现有工作。

As far as I know, creating an interpreted language, will always require that "mother" language to be present somehow, since you can't self-host your interpreter unless it's in binary code.

是的,如果你写一个解释器而你的宿主语言也只有解释器,你将需要你的解释器以及宿主语言的解释器(运行 你的解释器)以便运行 用您的语言编写的程序。当然,你总是可以用存在编译器的语言重写你的解释器,这并不比 self-hosting 更有效(无论如何这是一个完整的重写,除非你的源语言应该与你的主机非常接近您可以用两种语言的交集编写解释器的语言)。

在您创建 self-hosting 编译器之前,这同样适用于您的编译器:只要您的编译器是用 PHP 编写的,您就需要 PHP编译你的语言(虽然不是 运行 编译的程序)。

For example, where's the best starting point, what should I look before entering into this subjects, etc ANYTHING would be of great help.

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

创建完全编译的编程语言可能需要大量工作,需要担心大量繁琐的细节。并且可能仅限于特定的处理器和 OS.

因此,创建解释性语言可能是一项更容易的任务,并且可以将其写入 运行 任何内容。但是你真的需要用编译语言来写解释器,否则会慢得无可救药。

如果解释器被分成两个任务,一个编译器(对某种byte-code)和一个解释器,那么任何语言都可以用于编译器。

依赖于另一种语言(您称之为 'mother' 语言)并不重要。大多数语言都会有某种依赖性(因此 CPython 是用 C 编写的)。

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

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

(我创造了多种语言,但只有两种真正的变体:low-level 编译语言和 mid-level 解释语言。每种语言都用于编写另一种语言的 compiler/interpreter .)