为初学者创建一个小编程语言

时间:2013-07-12 07:56:55

标签: compiler-construction programming-languages language-design bison yacc

我想创建自己的编程语言。也许不是从头开始编程语言,但可能是基于另一种语言。

我听说过Yacc。所以,我安装了Flex和Bison。但我不明白如何使用它编译。我已经在其中创建了Hello world项目,但是如何在其中创建编译器?

有没有简单的方法可以创建一种小型编程语言,我听说过将语言翻译成例如Write(),并让计算机将其理解为Print()

这可能吗?。

7 个答案:

答案 0 :(得分:6)

你可能会考虑从一个神话般的1964年(是的,你读的那个)论文META II: A Syntax-Oriented Compiler Writing Language学习如何构建“元编译器”。

本文包含 10页,编译器编写原理,易于实现的虚拟编译器指令集的定义,编译器编译器以及使用编译器构建的示例编译器-compiler。

我最初了解到如何在1970年以后从本文构建编译器。令人惊讶的是聪明以及概念上的简单。

如果有一篇论文我会让每个计算机科学专业的学生都阅读,那就是它。

你可以get the paper, see a tutorial and an implementation of MetaII in JavaScript here。该教程背后的人是James Neighbors博士,他是“域名分析”一词的来源。

答案 1 :(得分:3)

我对此的看法是,更简单的方法是不要弄乱用于自动创建词法分析器和解析器的硬核工具,而是开始创建一个简单的解释器,这个语法相当简单,解析器可以手工编写 - 涉及一个简单的状态机。

我会说这个任务的几乎理想的解释语言是Tcl,其原因是:

  • 超简单的语法(几乎没有它):语法主要定义字符分组为单词。

    然后以这种方式解释从正在处理的脚本的源行解析的一组单词:第一个单词是命令的名称,其余的是该命令的位置参数。快速了解它on Wikipedia

  • 所有内容都是字符串,因为参数的解释权在处理它们的命令之中。

  • 有可能逐渐使翻译更“健壮”。例如,对于开始,可以省略实现变量替换(Tcl <2.0没有它们)和所有高级特征(语法和语义,如命名空间)。同样,可以从没有命令或几乎没有可用于这种玩具解释器的脚本的命令开始。然后他们可能会逐渐添加。

通过tutorial工作,您可以快速了解Tcl是什么。更多文档是there。你可以让Tcl玩它there

您可以在#tclirc.freenode.net新闻组(可通过Google网上论坛群组)的comp.lang.tcl个IRC频道寻求帮助。

答案 2 :(得分:1)

我在yacc创建了一个非常小的语言,用于在大学的一个较高学期进行的讲座。这是一件非常复杂的事情,我不建议这样做。

您可以创建一个库,例如在C#中,定义一些简单的指令,如“message(string)”,并将它们映射到更复杂的事情,比如打开一个窗口和显示消息。它不是一种独立的语言,但您可以定义自己的基本指令,即使它们只包含所用语言的基本指令。

答案 3 :(得分:1)

定义自己的编程语言是一项有趣的挑战和对创造力的考验。您应该考虑的一个问题是您希望“语言”在尝试执行任何操作之前完全分析程序的程度,在某些情况下以无上下文的方式解释命令,或类似Forth或PostScript,其中命令处理来自输入流,但是能够将输入附加到列表,或者从列表中读取命令,就像它们来自输入流一样,这允许人们有效地定义过程通过将所有指令读入列表,然后执行列表中的所有指令。

另一个相关问题是您是否希望您的语言适用于大规模应用程序开发。如果应用程序不需要超过26个变量,例如,使用字母a-z到26变量的固定映射可能比尝试实现符号表或为变量分配空间更简单。局部变量和参数传递可能有些复杂;将所有变量放在一个全局范围内并要求代码使用这些全局变量传递参数将简化语言设计,但是用这样的语言编写代码很容易变得难以管理,特别是如果想要避免定义过多的一次性变量[例如因为只有26个变量可用]。

我使用了相当多的特定领域语言,包括我设计的一些语言;我喜欢一些并且不喜欢别人。设计语言最重要的是决定一个人的目标。这并不是说定义目标会使其他一切都落实到位,但是如果你对目标没有意识,你将无法知道哪些设计理念会让你实现这些目标而应该遵循,哪些设计理念与您的目标不符,应该放弃。

答案 4 :(得分:1)

我制作了一种小型编程语言,该语言使用户可以编程一种模式来控制键盘的灯光(大写锁定等)。它播放灯光秀。我基于VBS。

答案 5 :(得分:0)

我是基于网络的编程语言Jetsam的创建者。要首先创建自己的编程语言,您需要学习各种不同的编程语言,例如C到C ++,Java,QML,HTML,JavaScript,Ruby,Python等等。我是用网络创建的,而且这种语言只是在网上工作。 乱用所有这些语言并去他们的基地。你可以看看书&#34;如何创建你自己的怪异的编程语言&#34;。还有一个website,它还教你如何创建编程语言。希望这对你有所帮助。

答案 6 :(得分:-1)

最简单的选择可能是在Java中创建一个读取文本文件的程序,如果它找到了什么,它将开始编写.java文件并编写它在Java中的基本含义。例如,我的名为main.boss的文件可能是:

write Hello world
write Bye!

我的java程序将遍历它并检测单词write,然后在它之后移动一个空格并读取文本直到行结束。意思是它会得到&#34; Hello world&#34;和&#34;再见!&#34;。因为说&#34;写&#34;然后它会在其中写一个main.java文件:

public class Main
{
System.out.println("Hello world");
System.out.println("Bye!");
}

然后你可以有一个由你的java程序执行的.bat文件,它会设置classpath,编译文件,并把它变成.jar文件。它可能会捆绑一个像Launch4J这样的程序,因此它可以选择将.jar转换为.exe。