Questions tagged «compiler»

编译器是一种计算机程序,可以将以一种编程语言编写的源代码转换为另一种计算机语言。

1
功能性中间形式的缺点
我正在为类似于JavaScript的语言编写优化器,并且需要选择一个中间代码表示形式。如今,显而易见的/典型的选择是静态单一分配(SSA)。 但是,C语言中的Modern Compiler Implementation也讨论了功能中间形式,这基本上意味着对中间表示使用纯功能(仅在局部变量方面是纯函数,堆数据仍然是可变的,而在CPS方面则是可变的,只是简单的let块和尾调用)。在易于推理方面具有一些优势。 大概这不是理所当然的,或者每个人都已经在使用这种表示形式了,所以我的问题是,功能性中间形式与SSA相比有哪些缺点?

9
职业建议:编程语言理论博士学位[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 6年前关闭。 我对编程语言的理论非常感兴趣,并打算在该主题上申请博士学位,但我想对研究生教育后的职业有更多了解。除了当教授,我还能获得什么职业?

2
编译器是否利用多线程来加快编译时间?
如果我正确地记住了我的编译器课程,那么典型的编译器将具有以下简化的轮廓: 词法分析器逐字符扫描(或调用某些扫描功能)源代码 根据词素词典检查输入字符的字符串是否有效 如果lexeme有效,则将其分类为与其对应的令牌 解析器验证令牌组合的语法;逐个令牌。 从理论上讲,将源代码分成四分之一(或其他分母)并在扫描和解析过程中使用多线程是否可行?是否存在利用多线程的编译器?

5
实现新的编译器后端时,Scrum是否有意义?
我有一种需要移植到新平台的现有语言。我可能会通过更改现有编译器的后端进行尝试。 重写后端需要大量的工作。在不违反INVEST标准的情况下,我看不到将其分解为明智的故事的方法。 我看不到每个故事如何可以面议-它们都是正常工作的编译器所必需的。这些故事都具有同等优先权,无论我按什么顺序发表它们都无所谓。我需要全部做。 我正在实施的软件中某些部分的优先级比其他部分低,我可以看到我们可以逐步提供该部分。但是,必须具备一个重要的核心。 我计划尝试遵循Scrum,但是我只是在进行议案吗? 有针对此类项目的推荐做法吗?




13
C编译器的第一个版本运行了数十分钟,并且需要在阶段之间交换软盘,这是真的吗?
受到这个问题的启发。 我听说一些非常早期的个人计算机C编译器版本(我猜是在1980年左右)驻留在两个或三个软盘上,因此要编译程序,必须先用“ first pass”插入磁盘,然后运行“第一遍”,然后通过“第二遍”切换到磁盘,运行该磁盘,然后对“第三遍”执行相同的操作。每遍都花了几十分钟,所以即使出现错字,开发人员也浪费了很多时间。 这个说法有多现实?实际数字和细节是什么?
15 history  compiler 

4
编译器工作-需要多少教育[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 4年前关闭。 我受到“ 作为主题的编译器构造”问题的激励,并认为我会问这个问题。 我从一些人那里听说他们有一支优秀的“编译器团队”(不要问我在哪里听到的,我不记得了),这使我想知道,如何在这样的团队中找到一份工作? 我知道本科课程中有此类课程,但是那是研究生学位最低的课程(至少是硕士学位)吗? 我将在两个月内开始攻读计算机科学硕士学位,而我要去的学校将开设两个编译器课程,这是否足以从事编译器开发工作,还是需要投入更多时间?

12
是否有任何尝试自行修复语法错误的编译器?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 不久前,我听说曾经有一个编译器试图通过分析上下文并推断出意图来修复语法错误。 这样的编译器真的存在吗?显然,它没有什么实用价值,但是玩和学习会很有意思。
15 syntax  compiler 

10
编译器警告
许多编译器都有警告消息来警告程序员有关潜在的运行时,逻辑和性能错误,大多数情况下,您可以快速修复它们,但是不可修复的警告呢? 您如何处理不可修复的警告?您是重写代码的一部分,还是以“漫长而无用的方式”重写代码,还是一起禁用警告?最佳做法应该是什么? 如果您正在编辑别人的代码并且他的代码有警告,该怎么办? 这是一个很好的例子:由于检测到Mozilla类浏览器,jQuery有很多JavaScript警告,为什么jQ开发人员不解决这些警告?如果您对jQuery有所贡献,您是否会解决它们?
15 compiler 

2
在现代编译器中如何实现泛型?
我的意思是我们如何从某些模板T add(T a, T b) ...进入生成的代码?我已经想到了几种方法来实现,我们将通用函数存储在AST中Function_Node,然后每次使用它时,都会在原始函数节点中存储其自身的副本,其中所有类型都T替换为正在使用。例如add<int>(5, 6)将存储的通用功能的副本add并替换所有类型T 的副本有int。 所以它看起来像: struct Function_Node { std::string name; // etc. Type return_type; std::vector<std::pair<Type, std::string>> arguments; std::vector<Function_Node> copies; }; 然后,您可以为这些代码生成代码,并在访问Function_Node副本列表所在的位置时copies.size() > 0调用visitFunction所有副本。 visitFunction(Function_Node& node) { if (node.copies.size() > 0) { for (auto& node : nodes.copies) { visitFunction(node); } // it's a generic function so we …

8
为什么要用C ++编写编译器?
我想知道为什么C ++是编写编译器的好选择。当然,C对此也有好处,因为许多编译器都是用C或C ++编写的,但是这次我对C ++更加感兴趣。有什么好的理由吗?我一直在互联网上寻找该信息,但找不到任何好的理由。
14 c++  compiler 

1
为什么LLVM具有类似程序集的IR,而不是类似树的IR?或者:为什么项目针对LLVM IR而不是clang的AST?
为什么LLVM的中间表示(LLVM IR)类似于树而不是像树? 或者,为什么语言实现针对LLVM IR而不是clang的AST? 我不是想立刻问两个不同的问题。在我看来,似乎客户和库程序员都已达成共识,LLVM的API(仅此而已)显然是好的软件设计,我的问题是“为什么?”。 我问的原因是,如果IR类似于AST,LLVM似乎可以为前端提供更多功能,因为那时clang基于AST的工具可以用于任何前端。另外,如果针对LLVM IR的语言针对clang的AST,则可以获得更多功能。 Clang具有用于创建和使用AST的类和函数,并且它是唯一与LLVM项目紧密相关的前端项目,那么为什么clang的AST功能在LLVM外部? 在我的头顶上,我知道Rust(rustc),D(ldc)和Haskell(GHC)都可以使用LLVM作为后端,但是它们不使用Clang AST(据我所知,我可以是错的)。我不知道这些编译器的所有内部细节,但是至少Rust和D当然看起来可以将它们编译为clang的AST。也许Haskell也可以,但是我对此不太确定。 这是因为历史原因(LLVM最初是“低级虚拟机”,后来出现了clang)吗?这是因为其他前端希望对提供给LLVM的内容进行尽可能多的控制吗?clang的AST不适合“非C类”语言是否有根本原因? 我不希望这个问题成为阅读中的练习。我只是希望它对那些对编译器设计感到好奇但还不太熟练的人有所帮助。由于LLVM和clang项目是公开开发的,所以我希望熟悉这些项目开发的人员可以回答,或者希望答案对于某些自己有足够信心回答的书呆子很明显。 抢占一些显而易见但不令人满意的答案: 是的,拥有类似程序集的IR可以使制作IR的人获得更多控制权(也许X lang比clang更好的代码库和AST格式),但是如果这是唯一的答案,那么问题就变成了“为什么LLVM 仅具有程序集-例如IR,而不是高级树状IR和底层程序集IR?”。 是的,将编程语言解析为AST并不难(至少与其他编译步骤相比)。即使这样,为什么还要使用单独的AST?如果没有其他问题,则使用相同的AST可以使您使用在AST上运行的工具(即使只是简单的东西,例如AST打印机)。 是的,我强烈同意,更加模块化是一件好事,但如果这是唯一的原因,那么为什么其他语言的实现往往针对LLVM IR代替铛的AST? 这些先发制人可能是错误的或忽略了细节,因此,如果您有更多细节或我的假设有误,请随时提供这些答案。 对于任何想回答一个更为明确的问题的人:类组装IR与树形IR的优缺点是什么?

3
编译器如何了解其他类及其属性?
我正在写我的第一种面向对象的编程语言,到目前为止,它与创建单个“类”一样好。但是,假设我要上课,说ClassA和ClassB。只要这两个彼此无关,那么一切都很好。但是,说ClassA创建ClassB-提出了2个相关问题: -如何将编译时,编译器知道ClassA是ClassB即使存在,并且,如果是这样,它是如何知道它的属性? 到目前为止,我的想法是:而不是一次编译每个类(即扫描,解析和生成代码),每个“文件”(本质上不是真正的文件,而是一个“类”)我需要先扫描+解析每个类,然后为所有人生成代码?

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.