标签: compiler-theory

为什么编译器无法完全解决死代码检测?

我在C或Java中使用的编译器具有死代码防止功能(当不执行某行时发出警告).我的教授说,编译器永远无法完全解决这个问题.我想知道为什么会这样.我不太熟悉编译器的实际编码,因为这是一个基于理论的类.但我想知道他们检查了什么(例如可能的输入字符串与可接受的输入等),以及为什么这是不够的.

compiler-theory

191
推荐指数
6
解决办法
1万
查看次数

解析树和AST有什么区别?

它们是由编译过程的不同阶段产生的吗?或者它们只是同一个东西的不同名称?

compiler-construction compiler-theory terminology abstract-syntax-tree parse-tree

82
推荐指数
5
解决办法
3万
查看次数

哪些编程语言没有上下文?

或者,更准确一点:哪些编程语言是由无上下文语法定义的?

从我收集的内容来看,由于宏和模板之类的东西,C++不是无上下文的.我的直觉告诉我,函数式语言可能没有上下文,但我没有任何硬数据来支持.

额外的代表简洁的例子:-)

compiler-theory context-free-grammar

59
推荐指数
4
解决办法
2万
查看次数

(何时)我应该学习编译器吗?

根据这篇http://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html 文章,我绝对应该这样做.

引用温和但坚持不懈的执行摘要:如果你不知道编译器是如何工作的,那么你就不知道计算机是如何工作的.如果你不是100%确定你是否知道编译器是如何工作的,那么你就不知道它们是如何工作的.

我认为这是一篇非常有趣的文章,应用领域非常有用(帮自己一个忙,然后阅读它)但是又一次,我看到成功的高级sw工程师不熟悉编译器,或内部机器这个问题的架构,但确实知道以下列表中每个项目的一两件事:

  • 编程范式(OO,功能,...)
  • 编程语言API(C#,Java ..)和至少2个非常不同的人说!(Java/Haskell)
  • 编程框架(Java,.NET)
  • 一个让您提高工作效率的IDE(Eclipse,VisualStudio,Emacs,......)
  • 编程最佳实践(例如,参见fxcop规则)
  • 编程原理(DRY,高内聚,低耦合,......)
  • 编程方法(TDD, MDE)
  • 设计模式(结构,行为,......)
  • 建筑基础(层,层,过程模型(瀑布,敏捷,...)
  • 测试工具(单元测试,模型测试,......)
  • GUI技术(WPF,Swing)
  • 记录工具(Javadoc,Sandcastle ..)
  • 建模语言(可能是工具)(UML,VisualParadigm,Rational)
  • (毫无疑问,这里忘记了非常重要的东西)

并非所有这些工具都是成为一名优秀程序员所必需的(就像你不需要它时的GUI一样),但大多数都是.编译器在哪里进入,并且它们真的那么重要,因为正如我所提到的,许多程序员似乎在不了解它们的情况下做得很好,特别是,成为一名优秀的程序员可以看到众多知识领域几乎是终身成就: - ),即使编译器非常重要,是不是总有更重要的东西?

或者我今天应该订购'The Unleashed Compilers Unlimited Bible(24H ..)))?

对于那些阅读过该文章并希望立即开始学习的人:

在解析器,解释器和编译器上学习资源

compiler-theory

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

在解析器,解释器和编译器上学习资源

我一直想用自己的语言编写一段时间(表面上是为了学习经验),因此需要在构建解析器,解释器和编译器时相对基础.所以:

  • 有谁知道构建解析器,解释器和编译器的任何好资源?

编辑:我不是在寻找编译器编译器/解析器编译器,如Lex,Yacc和Bison ......

compiler-construction parsing interpreter compiler-theory language-theory

29
推荐指数
6
解决办法
7784
查看次数

注册分配和溢出,简单方法?

我正在寻找一种方法来将局部变量分配给寄存器.我知道有几种严肃的方法(即维基百科上提到的方法),但我仍然坚持如何"溢出"完成.此外,相关文献相当令人生畏.我希望有一些更简单的东西可以满足我的优先事项:

  1. 正确性 - 一种算法,无论有多少局部变量,都会生成正确的代码.
  2. 简单 - 我无需阅读太多文献即可理解.
  3. 效率 - 它需要比现有方法更好,即:

将操作转换x = y # z为:

movl y, %eax
movl z, %ebx
op %ebx, %eax
movl %eax, x
Run Code Online (Sandbox Code Playgroud)

由于我的目标是英特尔386,因此一些相关的限制是:

  • 二进制操作有两个参数,其中一个是源和目标.一元操作只需一个参数.
  • 操作只能访问一个内存位置; 因此,二进制运算需要寄存器中至少有一个参数.
  • 最多有六个寄存器:%eax %ebx %ecx %edx %esi %edi.(%ebp也可作为最后手段.)
  • 有一些特殊情况,例如整数除法和返回寄存器,但我现在可以忽略它们.

编译器目前有三个步骤:

  • i386ification:所有操作都转换为表单a = a # b(或a = #a用于一元操作).
  • 活力分析:确定每个操作之前和之后的活变量集.
  • 寄存器分配:构建干扰图并着色.

然后编译器抛出它的蜡笔,不知道接下来该做什么.

public int mf(int cr, int ci) {
    int i = 0;
    int zr = 0;
    int zi = …
Run Code Online (Sandbox Code Playgroud)

compiler-theory graph-theory register-allocation i386

26
推荐指数
2
解决办法
7692
查看次数

C编译器如何实现返回大型结构的函数?

函数的返回值通常存储在堆栈或寄存器中.但对于大型结构,它必须在堆栈上.在这个代码的真实编译器中必须进行多少复制?还是优化了?

例如:

struct Data {
    unsigned values[256];
};

Data createData() 
{
    Data data;
    // initialize data values...
    return data;
}
Run Code Online (Sandbox Code Playgroud)

(假设函数无法内联..)

c compiler-theory abi calling-convention compiler-optimization

24
推荐指数
3
解决办法
6767
查看次数

从正则表达式创建NFA的步骤

从正则表达式创建NFA时,我遇到了"描述每个步骤"的问题.问题如下:

将以下正则表达式转换为非确定性有限状态自动机(NFA),清楚地描述您使用的算法的步骤:(b | a)*b(a | b)

我已经制作了一个简单的三态机器,但它非常直观.这是我的讲师在过去的考试中提出的一个问题,他也写了Thompson算法的以下解释:http://www.cs.may.ie/staff/jpower/Courses/Previous/parsing/node5.html

任何人都可以清楚如何"清楚地描述每一步"吗?它看起来像是一组基本规则,而不是一个遵循步骤的算法.

也许我已经在某个地方掩饰了一个算法,但到目前为止,我只是用一个有根据的猜测创建了它们.

theory compiler-theory nfa

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

Scala"< - "用于理解

我发现Scala总是对任何东西都有"自然的解释".总是像"哦,但这只是一个函数被调用此函数和该对象与此参数".从某种意义上说,我们从其他语言中知道它并不是真正的编译器魔法.

我的问题是在以下代码中使用的< -运算符:

for(i <- 0 to 10) println(i)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我可以看到它被重写为:

0.to(10).foreach((i:Int)=>println(i))
Run Code Online (Sandbox Code Playgroud)

但这并没有解释如何进入foreach函数内的匿名函数.在你写i的时候,它不是一个对象,也不是一个声明的变量.那是什么呢,它是如何被带到foreach的内部的呢?

我的猜测是,我终于发现了一些实际上是编译魔术的东西

谢谢你的时间.

为了澄清,我的问题是:如何做的< -在代码的第一线操作人员的工作,因为我不上它可作为函数调用的对象.

loops scala compiler-theory for-comprehension

23
推荐指数
3
解决办法
2万
查看次数

是否有LL(0)解析器这样的东西?


我在某个地方看到了一个问题,询问LL(0)和LR(0)解析器之间的区别.是否有LL(0)解析器这样的东西?如果是这样,他们如何在不查看任何令牌的情况下进行解析?

parsing compiler-theory

23
推荐指数
1
解决办法
2万
查看次数