我想创建自己的编程语言。也许不完全是从头开始的编程语言,但可能基于另一种语言。
我听说过Yacc。所以,我安装了 Flex 和 Bison。但我不明白如何用它制作编译器。我已经在其中制作了Hello world
项目,但是如何在其中制作编译器?
是否有任何简单的方法可以创建一种小型编程语言,我听说过翻译一种语言,例如,Write()
让计算机将其理解为Print()
.
这可能吗?
我想创建自己的编程语言。也许不完全是从头开始的编程语言,但可能基于另一种语言。
我听说过Yacc。所以,我安装了 Flex 和 Bison。但我不明白如何用它制作编译器。我已经在其中制作了Hello world
项目,但是如何在其中制作编译器?
是否有任何简单的方法可以创建一种小型编程语言,我听说过翻译一种语言,例如,Write()
让计算机将其理解为Print()
.
这可能吗?
您可能会考虑从 1964 年(是的,您没看错)论文META II: A Syntax-Oriented Compiler Writing Language中学习如何构建“元编译器”的编译器。
本文共10 页,包含编译器编写理念、易于实现的虚拟编译器指令集的定义、编译器-编译器以及使用编译器-编译器构建的示例编译器。
早在 1970 年,我最初就从这篇论文中学会了如何构建编译器。令人惊讶的是,它是多么的聪明和概念上的简单。
如果有一篇论文我会让每个计算机科学专业的学生都阅读,那就是它。
您可以在此处获取论文,查看教程和 MetaII 在 JavaScript 中的实现。本教程背后的人是 James Neighbors 博士,他是“领域分析”一词的来源。
我对此的看法是,更简单的方法不是弄乱旨在自动创建词法分析器和解析器的核心工具,而是着手创建一个具有相当简单语法的简单解释器,为此可以手动编写解析器 -涉及一个简单的状态机。
我想说一个几乎理想的任务解释语言是Tcl,原因是:
超级简单的语法(几乎没有它):语法主要定义了将字符分组为单词。
然后从正在处理的脚本的源代码行中解析出的一组单词以这种方式解释:第一个单词是命令的名称,其余的是该命令的位置参数。在 Wikipedia 上快速了解它。
一切都是字符串,因为参数的解释掌握在处理它们的命令手中。
逐步让翻译变得更“牛逼”是可能的。例如,一开始可能会省略实现变量替换(Tcl < 2.0 没有它们)和所有高级特性(句法和语义,如名称空间)。同样,可以从没有命令或几乎没有命令可用于此类玩具解释器的脚本开始。然后它们可能会逐渐添加。
通过阅读它的教程,您可以快速了解 Tcl 是什么。有更多文档。你可以让 Tcl 在那里玩它。
#tcl
您可以在IRC 频道上irc.freenode.net
和新闻组上寻求帮助comp.lang.tcl
(可通过 Google Groups 获得)。
我在 yacc 中创建了一种非常小的语言,用于大学一个较高学期的讲座。这是一个非常复杂的事情,我不建议这样做。
您可以创建一个库,例如在 C# 中,定义一些简单的指令,如“消息(字符串)”,并将它们映射到更复杂的内容,如打开窗口和显示消息。它不是一种独立的语言,但您可以定义自己的基本指令,即使它们只是包装所用语言的基本指令。
定义自己的编程语言是一项有趣的挑战,也是对创造力的考验。您应该考虑的一个问题是您希望“语言”在多大程度上作为在尝试执行任何内容之前完全分析程序的东西,在执行任何操作时以与上下文无关的方式解释命令的东西,或者像 Forth 或PostScript 中的命令在来自输入流时被处理,但它能够将输入附加到列表中,或者从列表中读取命令,就好像它们来自输入流一样,这允许人们有效地定义过程通过将所有指令读入一个列表,然后执行列表中的所有指令。
另一个相关的问题是您是否希望您的语言在大规模应用程序开发中实用。例如,如果应用程序不需要超过 26 个变量,则使用字母 az 到 26 个变量的固定映射可能比尝试实现符号表或为变量分配空间更简单。局部变量和参数传递可能有些复杂;将所有变量都放在一个全局范围内并要求代码使用这些全局变量传递参数将简化语言设计,但是用这种语言编写代码很容易变得难以管理,特别是如果想要避免定义过多的一次性变量时[例如因为只有 26 个变量可用]。
我使用了相当多的特定领域语言,包括我设计的一些语言;我喜欢一些,不喜欢另一些。设计一门语言最重要的是确定一个人的目标。这并不是说定义目标会使其他一切都落实到位,但是如果您对目标没有了解,您将无法知道哪些设计理念可以让您实现这些目标并应该遵循,哪些设计理念与您的目标不符,应该放弃。
我制作了一种小型编程语言,使用户编程一种模式来控制键盘的灯光(大写锁定等)。它播放灯光秀。我基于VBS。
我是基于 Web 的编程语言 Jetsam 的创建者。要创建自己的编程语言,首先需要了解各种不同的编程语言,例如 C 到 C++、Java、QML、HTML、JavaScript、Ruby、Python 等。我使用网络创建了它,并且该语言只是在网络上工作。弄乱所有这些语言,然后去他们的基地。你可以看看“如何创建自己的超棒编程语言”一书。有一个网站还教您如何创建编程语言。希望这对您有所帮助。
最简单的选择可能是在 Java 中创建一个读取文本文件的程序,如果它找到了一些东西,它将开始编写一个 .java 文件并写出它在 Java 中的基本含义。因此,例如我的一个名为 main.boss 的文件可能是:
write Hello world
write Bye!
我的java程序会循环遍历它并检测单词write,然后在它后面走一个空格并读取文本直到行尾。这意味着它将得到“Hello world”和“Bye!”。因为说“写”,所以它会在里面写一个 main.java 文件:
public class Main
{
System.out.println("Hello world");
System.out.println("Bye!");
}
然后你可以有一个由你的java程序执行的.bat文件,它会设置类路径,编译文件,然后把它变成一个.jar文件。它可能会与它捆绑一个像 Launch4J 这样的程序,因此它可以选择将 .jar 转换为 .exe。