问题标签 [intermediate-code]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
compiler-construction - 哪个是一个好的和简单的中间代码?
假设赋值的目的是编写一个可以在 C 语言子集上工作的编译器(您可以假设任何语言的子集,只支持基本的脚本表达能力,而无需将复杂的事物作为对象)。
什么样的中间代码可以用来验证编译器的正确性?我正在与一位教授交谈,他谈到了这样一个事实,即他不知道该给他的学生什么作为用于“编译代码”的 VM,所以我想知道哪个可能是一个好的解决方案。
其中代码可以是二进制格式,也可以是更好的 ASCII 格式(类似于伪 asm)。
我正在寻找已经制作的东西,而不是如何构建这个中间代码和 VM,只是一个简单易用的,可以用来测试一些已编译的程序..
linux-kernel - 编译 Ubuntu-8.04 时生成中间 .i 文件(预处理文件)
我正在使用 gcc 3.4 构建 ubuntu-8.04,我需要生成 .i 文件,它们是 gcc 预处理器的输出。我已经尝试添加 --save-temps 标志,但这只会为顶级目录(即源代码)生成 .i 文件,并且似乎不会递归地传递给子目录。我还尝试了 -E 标志,它应该输出预处理文件并停止编译,但这也没有生成文件。
我特别希望为 net/core 中的源生成 .i 文件。
任何帮助表示赞赏。谢谢!!
perl - 在脚本中使用预解析的协议定义并使其保持最新
对于我的工作,我有时必须处理来自二进制协议的日志文件(日志文件包含消息的十六进制转储)。我想编写一个 Perl 脚本,它可以为我解释二进制数据并以更友好的格式打印内容。
我有一个专有格式的协议消息的(机器可读)描述,并且我(大部分)弄清楚了如何解析该格式(我无法完全理解的部分与我的目标无关,所以我可以忽略它们),因此我可以将描述转换为数据结构以在我的脚本中使用。
因为协议描述很少改变,每次我想分析一个日志文件时重新解析协议描述似乎是一种浪费,但另一方面,如果描述确实改变了,或者我不小心丢弃了我的预解析表单描述,那么我希望我的脚本自动触发对描述的重新解析。
实现这一点的最佳方法是什么?
parsing - 在编译器中生成中间代码。处理条件时是否总是需要 AST 或解析树?
我正在学习一个编译器设计课程,我们必须在其中实现我们自己的编译器(使用 flex 和 bison)。我有解析(编写 EBNF 和递归下降解析器)的经验,但这是我第一次编写编译器。
语言设计是相当开放的(教授已经把它留给了我们)。在课堂上,教授复习了生成中间代码。他说,我们不需要在解析的时候构建抽象语法树或者解析树,我们可以随手生成中间代码。
我发现这令人困惑有两个原因:
如果你在定义之前调用一个函数怎么办?如何解决分支目标?我想您必须制定一个规则,即您必须在使用函数之前定义它们,或者可能预先定义它们(就像 C 一样?)
你会如何处理条件语句?如果您有一个
if-else
,甚至只有一个if
,您如何解决if
条件为时的分支目标false
(如果您正在生成代码)?
我计划生成一个 AST,然后在创建它之后遍历树,以解析函数和分支目标的地址。这是正确的还是我错过了什么?
c - 选择中间语言
我目前正在玩编程语言。我花了一些时间用高级语言(最著名的是 Haxe)编写解析器和解释器。
我有一些结果,我认为实际上相当不错,但现在我想让它们快点。
我的想法是将输入语言翻译成 C。
我的 C 知识仅限于你在大学学到的知识。除了一些练习之外,我从未编写过真正的 C 程序。但我有信心我可以让它发挥作用。
当然,我可以尝试为 LLVM 编写前端或生成 MSIL 或 JVM 字节码。但我觉得现在要学习的东西太多了,实际上我并没有看到太多的收获。
C 语言也完全是人类可读的,所以如果我搞砸了,更容易理解为什么。毕竟,C 是高级别的。我真的可以从输入语言中翻译概念,而无需费神费力。我应该在合理的时间内启动并运行一些东西,然后在我认为合适的时候对其进行优化。
那么:使用 C 有什么缺点吗?你能推荐一个替代品吗?
感谢您的见解 :)
编辑:一些澄清
- 我想一路走下去的原因是,我正在编写一种支持 OOP 的语言,并且我想手动实现我的方法调度,因为我有一些非常具体的想法。
- 主要使用领域是编写 HTTP 服务,但我可以想象将绑定添加到 GUI 库(可能是 wxWidgets)或其他任何东西。
parsing - 有没有办法在不使用语法导向翻译的情况下编写编译器前端?
我的问题和标题一样。我只是想知道有没有其他翻译技术可以得到不依赖于将动作嵌入到解析器中的中间代码(即解析器会严格创建抽象语法树,它不会生成任何代码) . 感谢您的任何回答。
c - 使用中间格式的最简单方法
我正在开发的工具需要采用编译器生成的中间格式,向其中添加一些代码,然后将修改后的中间代码提供给编译器的后端以生成最终代码。
通过对 gcc 的一些研究,我发现 GIMPLE 格式很容易理解,但我不确定修改 GIMPLE 代码的复杂性,也不知道从那里重新开始编译的任何方法,除了使用插件并添加您自己的通行证。人们还警告我,文档稀缺,当您在使用 gcc 时遇到困难时,情况会变得很艰难。
另一种选择是使用 LLVM 字节码。但我从未使用过 LLVM,所以不知道使用 LLVM 我的任务会有多复杂。我不知道可能还有更好的选择。因此,我只想知道最好的选择。我的偏好如下。
- 平台独立性
- 便于使用
- 有据可查
- 更多人使用它,因此可以获得更多帮助
c - 这个 LLVM IR 代码有什么问题
我有一个看起来像这样的 LLVM IR 代码。
在分配arrayidx1的行中,一切都很好,但是对于OldFuncCounter7,LLVM 编译器会抱怨说“无效使用函数本地名称”。这是由于我正在使用的 %8 。如果我用常数替换它,它工作正常。所以我的问题是为什么 %8 可以正常使用arrayidx1,但不能使用OldFuncCounter7。这里发生了什么?
发生此错误的整个基本块如下所示
c - 插入 getelementptr 指令
我想getelementpr
在我的代码中插入指令,如下所示。
我怎样才能插入它?LoadInst
我可以使用和StoreInst
类的构造函数插入加载和存储指令,但是构造函数GetElementPtrInst
被声明为私有的,所以不能使用它。所以,我的问题是如何从我的代码中为 LLVM 通行证添加这条指令。
c++ - 如何检查迭代器的相等性?
在我的llvm
代码中,我尝试使用以下代码检查迭代器InsertPos是否指向基本块的最后一条指令。
但是,clang
给了我以下错误。
这样做的正确方法是什么?