Questions tagged «compilers»

有关以一种语言(源语言)读取代码并将其翻译为另一种语言(目标语言)的等效程序的程序的问题。

1
推断优化类型
在工作中,我的任务是推断一些有关动态语言的类型信息。我将语句序列重写为嵌套let表达式,如下所示: return x; Z => x var x; Z => let x = undefined in Z x = y; Z => let x = y in Z if x then T else F; Z => if x then { T; Z } else { F; Z } 由于我从一般类型信息开始,并试图推断出更具体的类型,因此自然的选择是精简类型。例如,条件运算符返回其真假分支类型的并集。在简单的情况下,它效果很好。 但是,在尝试推断以下类型时遇到了障碍: function …
11 programming-languages  logic  type-theory  type-inference  machine-learning  data-mining  clustering  order-theory  reference-request  information-theory  entropy  algorithms  algorithm-analysis  space-complexity  lower-bounds  formal-languages  computability  formal-grammars  context-free  parsing  complexity-theory  time-complexity  terminology  turing-machines  nondeterminism  programming-languages  semantics  operational-semantics  complexity-theory  time-complexity  complexity-theory  reference-request  turing-machines  machine-models  simulation  graphs  probability-theory  data-structures  terminology  distributed-systems  hash-tables  history  terminology  programming-languages  meta-programming  terminology  formal-grammars  compilers  algorithms  search-algorithms  formal-languages  regular-languages  complexity-theory  satisfiability  sat-solvers  factoring  algorithms  randomized-algorithms  streaming-algorithm  in-place  algorithms  numerical-analysis  regular-languages  automata  finite-automata  regular-expressions  algorithms  data-structures  efficiency  coding-theory  algorithms  graph-theory  reference-request  education  books  formal-languages  context-free  proof-techniques  algorithms  graph-theory  greedy-algorithms  matroids  complexity-theory  graph-theory  np-complete  intuition  complexity-theory  np-complete  traveling-salesman  algorithms  graphs  probabilistic-algorithms  weighted-graphs  data-structures  time-complexity  priority-queues  computability  turing-machines  automata  pushdown-automata  algorithms  graphs  binary-trees  algorithms  algorithm-analysis  spanning-trees  terminology  asymptotics  landau-notation  algorithms  graph-theory  network-flow  terminology  computability  undecidability  rice-theorem  algorithms  data-structures  computational-geometry 

3
具有语法
谁能启发我,为什么尝试回溯产生式和(按顺序)的带有回溯的递归下降解析器不能识别语法形成的语言。小号→ 一个一个小号→ 一个小号一个| 一个一个小号→ 一个小号一个小号→一个小号一个S \rightarrow aSa小号→ 一个一个小号→一个一个S \rightarrow aa小号→ 一个小号一个| 一个一个 小号→一个小号一个 | 一个一个S \rightarrow aSa\ |\ aa 它似乎只能解析语言单词。{ a2ñ | Ñ≥1 }{a2ñ | n≥1个}\{a^{2^n}\ |\ n \ge 1 \} 我使用具有生产规则的ABNF Parser Generator生成了这样的解析器,例如,S = "a" S "a" / "aa"解析器无法识别单词aaaaaa。 我希望它使用生产,直到解析树的终端节点从7左边开始串联的,然后去分析树选择生产小号→ 一个一个来代替,直到树看起来像这样:小号→ 一个S一个小号→一个小号一个S \rightarrow aSaa小号→ 一个一个小号→一个一个S \rightarrow aa S / …

3
程序分析入门
我正在寻找有关程序分析入门的资源。 我找到的关于该主题的唯一一本书是尼尔森与尼尔森的书。 除此之外,似乎只有“编译器”书中的“程序分析”将作为一章或类似内容。 人们是否还知道其他资源?

2
现代计算机的理论最小寄存器数?
我在我的本科课程中学习了关于编译器的课程,其中我们编写了一个编译器,该编译器将类似于Java的玩具语言的源程序编译为玩具汇编语言(为此我们提供了解释器)。在项目中,我们对与“真正的”本机可执行文件密切相关的目标计算机做出了一些假设,包括: 运行时堆栈,由专用堆栈指针(“ SP”)寄存器跟踪 用于动态对象分配的堆,由专用堆指针(“ HP”)寄存器跟踪 专用程序计数器寄存器(“ PC”) 目标机器有16个寄存器 对数据的操作(与例如跳转相反)是寄存器到寄存器的操作 当我们到达使用寄存器分配作为优化的单元时,我感到很奇怪:这种机器的理论最小寄存器数量是多少?通过我们的假设,您可以看到我们在编译器中使用了五个寄存器(SP,HP,PC,另外两个用作二进制操作的存储)。尽管诸如寄存器分配之类的优化当然可以利用更多的寄存器,但有没有办法在保持堆栈结构(如堆栈和堆)的同时减少使用?我想通过寄存器寻址(寄存器到寄存器操作)我们至少需要两个寄存器,但是我们需要两个以上吗?

1
给定一个字符串和一个CFG,可以在字符串之后跟随哪些字符(以CFG的句子形式)?
令是某些上下文无关文法G的终结符集合,N是非终结符符号G的非终结符集合。ΣΣ\SigmañNNGGG 说我有一个字符串,使得X 一Ý ∈ 小号(ģ )其中X ,ÿ ∈ (Σ ∪ Ñ )*和小号(ģ )是的句型ģ。一个∈ (Σ ∪ Ñ)+a∈(Σ∪N)+a \in (\Sigma \cup N)^+X 一ÿ∈ 小号(G )xay∈S(G)x a y \in \mathcal{S}(G)X ,ÿ∈ (Σ ∪ Ñ)∗x,y∈(Σ∪N)∗x,y\in (\Sigma \cup N)^*小号(G )S(G)\mathcal{S}(G)GGG 鉴于,我想以确定一组C ^ = { b | 瓦特一个b ž ∈ 小号(ģ ),b ∈ Σ ∪ Ñ …

2
自行编译编程语言
我是计算机科学专业的学生。我想创建自己的编程语言(一种基本语言,几乎没有说明)。 我知道如何进行语法分析器,我已经在Perl中做到了。在一篇文章中,我阅读了一些有关编译器的信息,编译器本身就是完成的。 例如,C编译器是用C编写的。这怎么可能?我可以使用自己的语言,但不知道如何执行?任何的想法? 这确实是一个很好的问题,我可以为该项目写博客。

1
静态类型检查过于保守的无人为例是什么?
在程序设计语言的概念,约翰米切尔写道,静态类型检查是必要的保守(过于严格的),因为停机问题。他举了一个例子: if (complicated-expression-that-could-run-forever) then (expression-with-type-error) else (expression-with-type-error) 有人可以提供一个确实会引起实际关注的非故意答案吗? 我了解到Java允许针对以下情况进行动态检查的类型转换: if (foo instanceof Person) { Person p = (Person) foo; : } 但我认为这是Java语言/编译器缺陷的必要,而不是跨语言问题。

3
数据流分析,抽象解释和类型推断是否等效?
@Babou 对最近一个问题的回答使我想起,我一次看过一篇关于数据流分析的等效性(就可以推断或证明的事实以及运行推理算法的时间复杂性)的论文,抽象解释和类型推断。 在某些子情况下(例如在前向上下文相关的过程间数据流分析与抽象解释之间),对我来说等效性是相对明显的,但对于其他比较而言,这个问题似乎更加微妙。例如,我不知道如何使用Hindley-Milner类型推断来证明可以通过对流量敏感的数据流分析来证明的某些属性。 有哪些开创性的参考文献讨论数据流分析,抽象解释和类型推断之间的等效性(或差异)?

3
交叉编译器的T图
我正在研究Red Dragon Book Compilers的Bootstrapping,发现交叉编译器的T图非常令人困惑。我不明白“通过编译器2运行编译器1”的含义。谁能提供一些更好的解释,类比或与某些实际编译器相关的例子? 首先一些符号。由 我的意思是语言的编译器大号 书面语言小号产生输出语言/机器代码Ñ。这是一个墓碑或T型图。LSN=LSN=LSN= LLLSSSNNN 编译一个编译器 假设我们在实现语言S中为新语言L交叉编译,从而为机器N生成代码。 LSN=LSN=LSN= 假设我们还有一个在M机上运行的现有S编译器,为M机实现代码: SMM=SMM=SMM= 通过SMM运行LSN以生成LMN 编译器构造 LMN=LSN+SMMLMN=LSN+SMMLMN = LSN + SMM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.