这是我的第一篇文章,我正在通过手机发帖,请原谅格式问题,我相信我会有。
正如标题所示,我想为我编写的小型虚拟机创建一种语言。目前我的虚拟机非常简单,支持大约16种不同的操作码。我慢慢地学习如何优化VM并为其添加更多功能。我想补充的最大特点是能够用简单的C派生语言编写程序。
我很困惑,甚至开始写这样一种“语言”。我会把它写成翻译成我的VM汇编代码的解释器吗?
任何帮助都会很棒。文章,书籍,讲座,我什么都有。我只是喜欢学习,到目前为止,这是我最大的,也是迄今为止我最喜欢的项目。
我希望我在正确的地区提出要求,如果需要的话,我愿意在早上提供额外的信息。
答案 0 :(得分:0)
假设您的指令集足够强大,您应该能够为它构造一个编译器(代码转换器)。解释器也是可能的,但如果您可以从C编译,则可以解锁社区代码。
根据你的评论,你可以订购编译器写作的圣经:Compilers: Principles, Techniques, and Tools我会推迟其他书籍,直到你掌握了那个;然后你会知道你想去哪里。
你将学习语法,解析器等等,但是你需要做出一些实际的决定。避免构建编译器的大部分工作的一个选择是仅为现有编译器构建后端,例如GCC或Clang(通过LLVM)。通过构建后端,您还可以在多个语言前端之一中编译,例如D;所以只需一点努力就可以获得C ++,D等编译器。
答案 1 :(得分:0)
购买/阅读编译器书籍并从根本上理解编译器的工作原理后,我建议您使用LLVM完成任务。具体而言,专注于创建目标而不必担心前端(词法分析/解析器生成器/ AST)。这样,您就可以支持生成LLVM IR的任何语言。
首先查看LLVM与目标无关的代码生成器框架,这是您将执行魔术的地方:
http://llvm.org/docs/CodeGenerator.html
LLVM与目标无关的代码生成器是一个框架,它提供了一套可重用的组件,用于将LLVM内部表示转换为指定目标的机器代码 - 以汇编形式(适用于静态编译器)或二进制机器代码格式(可用于JIT编译器)。
此外,LLVM足以引导您完成后端的开发,这是您感兴趣的部分:
http://llvm.org/docs/WritingAnLLVMBackend.html
它概述了执行此类任务所需的先决条件读数。这包括代码示例,优化技术,如何执行指令选择和指令打印(适用于您的VM)。最后,如果需要,如何支持JITing。
如果您下载源代码,则可以根据VM的要求分支和修改许多完整的后端。
答案 2 :(得分:0)
我应该问,这是基于堆栈还是寄存器的虚拟机?
每个人都有优点和缺点。如果您希望您的语言尽可能快地运行,我建议注册机器;如果你想要它比堆叠机器简单。
像其他人建议的那样,您可以将语言编译为LLVM,当然也取决于您的需求。