我在C或Java中使用的编译器具有死代码防止功能(当不执行某行时发出警告).我的教授说,编译器永远无法完全解决这个问题.我想知道为什么会这样.我不太熟悉编译器的实际编码,因为这是一个基于理论的类.但我想知道他们检查了什么(例如可能的输入字符串与可接受的输入等),以及为什么这是不够的.
它们是由编译过程的不同阶段产生的吗?或者它们只是同一个东西的不同名称?
compiler-construction compiler-theory terminology abstract-syntax-tree parse-tree
或者,更准确一点:哪些编程语言是由无上下文语法定义的?
从我收集的内容来看,由于宏和模板之类的东西,C++不是无上下文的.我的直觉告诉我,函数式语言可能没有上下文,但我没有任何硬数据来支持.
额外的代表简洁的例子:-)
根据这篇http://steve-yegge.blogspot.com/2007/06/rich-programmer-food.html 文章,我绝对应该这样做.
引用温和但坚持不懈的执行摘要:如果你不知道编译器是如何工作的,那么你就不知道计算机是如何工作的.如果你不是100%确定你是否知道编译器是如何工作的,那么你就不知道它们是如何工作的.
我认为这是一篇非常有趣的文章,应用领域非常有用(帮自己一个忙,然后阅读它)但是又一次,我看到成功的高级sw工程师不熟悉编译器,或内部机器这个问题的架构,但确实知道以下列表中每个项目的一两件事:
并非所有这些工具都是成为一名优秀程序员所必需的(就像你不需要它时的GUI一样),但大多数都是.编译器在哪里进入,并且它们真的那么重要,因为正如我所提到的,许多程序员似乎在不了解它们的情况下做得很好,特别是,成为一名优秀的程序员可以看到众多知识领域几乎是终身成就: - ),即使编译器非常重要,是不是总有更重要的东西?
或者我今天应该订购'The Unleashed Compilers Unlimited Bible(24H ..)))?
对于那些阅读过该文章并希望立即开始学习的人:
我一直想用自己的语言编写一段时间(表面上是为了学习经验),因此需要在构建解析器,解释器和编译器时相对基础.所以:
编辑:我不是在寻找编译器编译器/解析器编译器,如Lex,Yacc和Bison ......
compiler-construction parsing interpreter compiler-theory language-theory
我正在寻找一种方法来将局部变量分配给寄存器.我知道有几种严肃的方法(即维基百科上提到的方法),但我仍然坚持如何"溢出"完成.此外,相关文献相当令人生畏.我希望有一些更简单的东西可以满足我的优先事项:
将操作转换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也可作为最后手段.)编译器目前有三个步骤:
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) 函数的返回值通常存储在堆栈或寄存器中.但对于大型结构,它必须在堆栈上.在这个代码的真实编译器中必须进行多少复制?还是优化了?
例如:
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
从正则表达式创建NFA时,我遇到了"描述每个步骤"的问题.问题如下:
将以下正则表达式转换为非确定性有限状态自动机(NFA),清楚地描述您使用的算法的步骤:(b | a)*b(a | b)
我已经制作了一个简单的三态机器,但它非常直观.这是我的讲师在过去的考试中提出的一个问题,他也写了Thompson算法的以下解释:http://www.cs.may.ie/staff/jpower/Courses/Previous/parsing/node5.html
任何人都可以清楚如何"清楚地描述每一步"吗?它看起来像是一组基本规则,而不是一个遵循步骤的算法.
也许我已经在某个地方掩饰了一个算法,但到目前为止,我只是用一个有根据的猜测创建了它们.
我发现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的内部的呢?
我的猜测是,我终于发现了一些实际上是编译魔术的东西
谢谢你的时间.
为了澄清,我的问题是:如何做的< -在代码的第一线操作人员的工作,因为我不上它可作为函数调用的对象.
我在某个地方看到了一个问题,询问LL(0)和LR(0)解析器之间的区别.是否有LL(0)解析器这样的东西?如果是这样,他们如何在不查看任何令牌的情况下进行解析?
compiler-theory ×10
parsing ×2
abi ×1
c ×1
graph-theory ×1
i386 ×1
interpreter ×1
loops ×1
nfa ×1
parse-tree ×1
scala ×1
terminology ×1
theory ×1