标签: compiler-development

什么是A-Normal表格?

我正在阅读各种中间形式,但除了类似wiki的条目之外,我无法获得有关A-normal表单的信息.这里有没有人知道这个或有很好的资源吗?

compiler-construction compiler-development

11
推荐指数
1
解决办法
1899
查看次数

编译器优化问题

  1. 编译器消除重复的子表达式重新计算的一些方法是什么?你如何跟踪子表达式?你如何识别重复的?
  2. 除了使用按位运算符之外,常见编译器还使用了哪些强度降低技术?

compiler-construction optimization compiler-development

6
推荐指数
3
解决办法
762
查看次数

如何在编译器中实现前向引用?

我正在用Lex和YACC创建一个编译器(实际上是Flex和Bison).该语言允许无限制地向前引用任何符号(如C#).问题是在不知道标识符是什么的情况下解析语言是不可能的.

我所知道的唯一解决方案是对整个源进行修改,然后执行"广度优先"解析,因此在使用它们的函数之前,会对类声明和函数声明等更高级别的内容进行解析.但是,这会占用大文件的大量内存,并且使用YACC很难处理(我必须为每种类型的声明/正文创建单独的语法).我也必须手写lexer(这不是一个很大的问题).

我并不关心效率(尽管它仍然很重要),因为一旦我完成它我就会重写编译器,但是我想要那个版本很快(所以如果有快速通用的话)在Lex/YACC中无法完成但可以手工完成的技术,请同时提出建议.所以现在,易于开发是最重要的因素.

这个问题有什么好的解决方案吗?这通常是如何在C#或Java等语言的编译器中完成的?

parsing yacc bison forward-reference compiler-development

5
推荐指数
1
解决办法
771
查看次数

LLVM中的部分应用

我正在尝试创建一个函数“add”,它可以应用于单个参数,然后是另一个。我不知道如何用 LLVM IR 表示这一点,因为我不明白如何使用单个值调用函数,然后将该值保存在内存中的某处并返回另一个应用于该 val 的函数。我需要在 LLVM 中使用某种关闭机制。

我已经在 C 中搜索了这个实现,以便我可以通过 clang 查看发出的 LLVM,但是我发现的解决方案非常复杂,所以我想我可以直接调查 LLVM。

这将是未经处理的版本

define i8 @add(i8 %a, i8 %b) {
entry:
  %res = add i8 %a, %b
  ret i8 %res
}
Run Code Online (Sandbox Code Playgroud)

不知何故,我想add(1)返回一个i8 (i8)类型。我想我必须以某种方式拆分该功能。

附:我正在研究这个,因为我正在研究一个小型函数式语言的编译器,所以我正在寻找任何关于编译器设计中部分应用程序/柯里化的实现的建议。

更新:我现在有以下代码工作,但它非常复杂,我认为自动生成并不容易

declare i32 @printf(i8* noalias nocapture, ...)

define { i8, i8 (i8, i8) * } @add1(i8 %a) {
  ; allocate the struct containing the supplied argument 
  ; and a function ptr to the actual function
  %nextPtr = alloca { …
Run Code Online (Sandbox Code Playgroud)

compiler-construction llvm compiler-development llvm-ir

5
推荐指数
1
解决办法
602
查看次数

识别不同语言并将它们发送到相应编译器的编译器.可能?

我在想是否有可能将asp.net,php和java连接成一个页面.

其实我现在不需要任何这样的东西.由于某些语言的某些功能很好而且某些功能或其他一些语言都很好,所以这个想法让我大吃一惊,所以如果我将所有这些功能合并为一个,我就会想到

我的意思是,我正在创建一个页面,其中包含来自所有3种语言的asp.net php和java的代码.

<asp code></asp code>
<php code></php code>
<java code></java code>
Run Code Online (Sandbox Code Playgroud)

要么

<html>
    <asp code>
    <php code></php code>
    <java code></java code>
    </asp code>
</html>
Run Code Online (Sandbox Code Playgroud)

或类似的编译器识别不同的代码段并将它们发送到其编译器上运行以执行.并且输出可以被XML中的其他语言识别和使用

我不是说所有的语言互相交流.虽然他们可以通过XML互相交流.但我只想说该文件被编译为具有不同编程语言代码的单个实体,这些代码被发送到各自的编译器以执行并最终返回到父编译器

我正在考虑一个可以开发的编译器,它可以识别不同的语言代码并将它们发送到编译器,如.net框架所做的那样,例如MSIL

language-agnostic compiler-construction programming-languages compiler-development

4
推荐指数
1
解决办法
799
查看次数

如何让我自己的C++编译器理解模板,嵌套类等C++的强大功能?

在我的小组中编写类C语言的编译器是一项大学任务.当然,我将实现我们心爱的C++的一小部分.
确切的任务是绝对愚蠢的,讲师告诉我们它需要自我编译(应该能够编译自己) - 因此,他的意思是不使用Boost和STL等库.
他也不希望我们使用模板,因为它很难实现.
问题是 - 这对我来说是否真实,因为我将自己编写这个项目,截止日期为5月底 - 6月中旬(今年),不仅要实现模板,还要嵌套语法分析级别的类,命名空间,虚函数表?
PS我不是C++中的noobie

c++ templates compiler-development

4
推荐指数
5
解决办法
4416
查看次数