什么backpatching意思?请举一个简单的例子来说明.
language-agnostic compiler-construction intermediate-language intermediate-code
编译器通常选择基于堆栈或无限寄存器的中间表示(IR).这些过度表达树的优点是什么?
我正在使用编译器设计类,我们必须实现自己的编译器(使用flex和bison).我曾在解析(写入EBNF的和递归下降解析器)的经验,但是这是我第一次写的编译器.
语言设计非常开放(教授把它留给了我们).在课堂上,教授过去生成中间代码.他说,这是没有必要为我们构建一个抽象语法树或在解析解析树,而且因为我们去,我们可以生成中间代码.
我发现这令人困惑有两个原因:
如果在定义函数之前调用函数怎么办?你如何解决分支目标?我想你必须制定一个规则,你必须在使用之前定义函数,或者可能预先定义它们(比如C吗?)
你会如何处理条件?如果你有一个if-else甚至只是一个if,你怎么能解决分支目标为if在条件false(如果你是因为你去生成代码)?
我计划生成AST然后在创建它之后走树,以解析函数和分支目标的地址.这是正确的还是我错过了什么?
compiler-construction parsing language-design intermediate-code
我从链接http://llvm.org/demo/尝试了LLVM演示 这是什么类型的IR?HIR,MIR还是LIR?我认为,SSA表示通常用于MIR.那么,它是MIR吗?但它可以存储依赖性分析的信息.因此,它可以是一个HIR吗?
什么文件扩展名实际上代表LLVM IR,.ll或.bc?
如何获取LLVM中使用的符号表?
我目前正在玩编程语言.我花了一些时间用高级语言编写解析器和解释器(最值得注意的是haXe).
我有一些结果,我认为实际上非常好,但现在我想让它们快速.
我的想法是将输入语言翻译成C.
我的C知识仅限于你在大学学到的知识.除了一些练习,我从未编写过实际的C程序.但我相信我能让它发挥作用.
当然,我可以尝试为LLVM编写前端或生成MSIL或JVM字节码.但我觉得现在学到的东西太多了,实际上并没有看到太大的收获.
C也完全是人类可读的,所以如果我搞砸了,理解其中的原因要容易得多.毕竟,C是高水平的.我可以真正地从输入语言中翻译概念,而不需要过多的思维弯曲.我应该在合理的时间内完成一些工作并运行,然后根据需要对其进行优化.
那么:使用C有什么缺点吗?你能推荐另一种选择吗?
感谢您的见解 :)
编辑:一些澄清
我正在用gcc 3.4构建ubuntu-8.04,我需要生成.i文件,它们是gcc预处理器的输出.我已经尝试添加--save-temps标志但这只生成顶级目录的.i文件,即源,并且似乎不会递归地传递到子目录.我还尝试了-E标志,它应该输出预处理文件并停止编译,但这也没有生成文件.
我特别希望为net/core中的源生成.i文件.
任何帮助表示赞赏.谢谢!!
我的问题与标题相同.我只是想知道是否有任何其他翻译技术来获取不依赖于将操作嵌入到解析器中的中间代码(也就是说,解析器将严格创建抽象语法树,它不会生成任何代码) .谢谢你的回答.
compiler-construction parsing code-translation intermediate-code
我的老师告诉我,中间代码对于所有系统都是通用的,但是编译器的一个组件会根据运行代码的系统/环境使其不同.有人可以解释一下吗.
c c++ compiler-construction systems-programming intermediate-code