#编译器

Compilers Are Hard(blog.shipreq.com)
2021-1-21 12:43
我经常听说编写编译器很困难,并且与编写其他类型的软件有所不同。一些近期的经验使我对为什么会这样有深刻的认识,并证明了这很有趣! 我最近完成了ShipReq的新功能的工作。我花了大约2个月的时间进行开发,最终成为我一生中编写过的最困难的代码。我已经进行了数十年的编码,从事过许多不同的项目,并且从事的工作非常庞大组织;......
2020-12-26 19:28
从模糊的,空洞的想法到如何在新的编程语言中实现,再到健壮,自洽,实际的实现这些想法,还有很长的路要走。从头开始设计和实现新的编程语言是程序员可以执行的最具挑战性的任务之一。 注意:这篇文章的目标读者是那些想要在设计有用的编程语言上做出艰苦尝试的积极进取的程序员。如果您只是想将一种语言作为有趣的附带项目,那么您完全可......
2020-12-12 0:14
CS 6120是Adrian Sampson撰写的有关编程语言实现的博士学位级别的Cornell CS课程。它涵盖通用编译器主题,例如中间表示,数据流和“经典”优化,以及更多研究型主题,例如并行化,即时输入。编译和垃圾回收。这项工作包括阅读论文和开源黑客任务,这些任务使用LLVM和为此课程发明的教育IR。 本页列出......
2020-11-29 16:5
Nim是一种静态类型的编译系统编程语言。它结合了来自成熟语言(如Python,Ada和Modula)的成功概念。其设计注重效率,表达力,...
2020-11-25 22:0
下载PDF摘要:在法国,所得税是根据法国公共财政局(DGFiP)创作,设计和维护的,从纳税人的个人收益中计算得出的。该算法依赖于传统的自定义语言和最初于1990年设计的编译器,它与法国葡萄酒不同,没有随着时间的流逝而衰老。由于输入语言的不足和编译器的技术局限性,该算法越来越难以维护,它依靠临时行为和变通办法来实现税法......
2020-11-22 6:9
非本地语义编译器转换(例如自动区分和某些贝叶斯推理算法)给动态化带来了特殊挑战。
2020-11-7 11:6
在过去的几个月里,我一直在用C语言编写一个C编译器,这是一次非常困难的经历。我这么做是为了看看能不能把《龙》这本著名的书中提到的理论概念用上,其中有几个让我有点摸不着头脑。 所以我做了一个小程序,简单地声明了`x`,并给它赋值,这个值是`x`的乘法。 这是可以编译的,但我想知道编译器如何决定在RHS上设置‘x’的值来......
Minicompiler: Lexing(christine.website)
2020-10-31 19:54
我一直想做自己的编译器。编译器是我日常工作中不可或缺的一部分,我经常使用它们的成果。不久前,当我浏览TempleOS源代码时,在::/Demos/Lessons文件夹中发现了MiniCompiler.HC,我有点吃惊。它实现了一个从简单的数学表达式到AMD64字节码的两阶段编译器(完成后将其比特转换为代码稍后跳转到的......
2020-10-24 7:24
应大众要求,我正在做另一篇LLVM帖子。这一次,它是单一静态赋值(或SSA)形式,这是优化编译器的中间表示中的一个常见特性。 就像上一个一样,SSA是编译器和IR设计的主题,我大部分都能理解,但可以从一些自我指导的学习中受益。我们到了。 在最高级别,编译器的工作是单一的:将一些源语言输入转换成一些机器语言输出。在内部......
2020-9-30 18:43
上周,我试图向libsecp256k1添加一些测试代码,我拔掉头发试图让它正常工作。没有多少printf工作来说明我做错了什么。最后,出于无奈,我想我应该快速检查一下是否有与memcmp相关的编译器错误,结果,我发现了GCC错误#95189:memcmp像strcmp一样被错误地剥离。 老实说,读起来这是一个相当可怕......
Bootstrapping(bootstrapping.miraheze.org)
2020-9-24 21:23
简单说明:自举是指使用比自身更小的工具构建编译器,而不是使用已构建的自身版本构建编译器。第二个问题是:预构建的二进制文件是从哪里来的? 这是从使用十六进制编辑器编写的十六进制汇编器开始引导一系列语言过程的详细日志。 本文讨论了软件长期保存的方法。简要介绍不会随着时间的推移而降级的硬件,但本文的大部分内容是关于如何设计......
How the CPython compiler works(tenthousandmeters.com)
2020-9-24 17:31
在本系列的第一篇文章中,我们介绍了CPython VM。我们已经了解到它是通过执行一系列称为字节码的指令来工作的。我们还看到,Python字节码不足以完全描述一段代码的功能。这就是存在代码对象概念的原因。执行诸如模块或函数的代码块意味着执行相应的代码对象。代码对象包含块的字节码、常量和块中使用的变量名称以及块的各种属......
2020-9-8 7:16
由于Mozilla最近的变化,我从事Rust编译器的时间即将结束。我仍然在Mozilla工作,但在可预见的未来,我将专注于Firefox的工作。 所以我想我应该结束我的“如何加速铁锈编译器”系列,这个系列始于2016年。 如何提高铁锈编译器的速度。原始的帖子,标题最有意义的帖子。它主要关注如何为性能工作设置编译器,包......
2020-9-1 22:59
构建编译器很困难。优化编译器是耗资数百万美元的项目 多年来的发展,但仍然无法充分利用可用的性能, 并且很容易被窃听。快速过渡到异构并行和 多样化的体系结构提高了对积极优化编译器的需求 一直居高不下,使得编译器开发人员难以跟上。我们需要的是 简化编译器构造的更好工具。 本文提出了显著降低编译器成本的新技术 构造,同时提......
Guide to the Rust Compiler Development(rustc-dev-guide.rust-lang.org)
2020-8-30 3:39
本指南旨在帮助记录Rustc(Rust编译器)是如何工作的,并帮助新的贡献者参与到Rustc开发中来。 构建和调试rustc:包含无论您如何贡献都应该有用的信息,关于构建、调试、概要分析等。 贡献给Rustc:包含无论您如何贡献都应该有用的信息,关于贡献的程序、稳定特性等。 高级编译器体系结构:讨论编译器的高级体系结......
2020-8-24 19:8
现在,当我们开始编译时,我们只需处理一种事情--整个过程,当我们拿回结果代码并将其打包以运行它时,我们将始终处理整个过程的代码。这使得创建要调用的实际闭包变得很容易。 我们用来开始编译的主要例程是Compile-Procedure,它以表达式、编译时环境、编译时连续和文字列表作为参数。它返回过程的中间代码和更新后的文......
2020-8-24 2:51
在这篇文章中,我们将用Python编写一个Python到C的编译器。这特别容易做到,因为Python有一个内置的解析库,而且许多CPython内部都向扩展编写者公开。 在本文结束时,只要几百行Python代码,我们就可以编译并运行以下程序: $cat tests/recursive_fib.pydef fib(N):......
2020-8-22 1:6
编译器在每个版本中都变得越来越好。有时,在同一编译器的不同版本中,同一段代码的汇编输出可以观察到明显的差异(可以通过编译器资源管理器轻松地完成)。 最近,我开始了检查程序集输出的实践,以分析各种实现的开销。当心,有时它会让人上瘾。但我认为这是学习阅读汇编语言的一种很好的方式,同时也会惊讶于现在的编译器是多么聪明。 在......
2020-8-13 13:22
今天,我想成为一名C编译器。我从前面的编码练习中添加了一个手工编译的ECHO汇编版本,并添加了一个新的make目标make asm,它将对其进行汇编。让我们看看我们手工编译的程序集,并将其与我们的C编译器进行比较,然后问问它是否值得。 .text.p2ign 2.globl main.type main,@funct......
2020-7-24 7:59
早在2017年,我就写过为什么D编程语言是开发的绝佳选择。但是D中有一个突出的特性我没有进行足够的扩展:通用函数调用语法(UFCS)。UFCS是D中的语法糖,可以将任何常规函数链接到一个类型(字符串、数字、布尔值等)上。类似于该类型的成员函数。 如果您尚未安装D,请安装D编译器,以便您可以自己运行本文中的D代码。 /......
2020-7-19 11:18
Toad.com的约翰·吉尔莫·格努于美国东部标准时间2020年5月23日06:39:25在gmail.com>;的泰勒·亚当斯<;Coppero1237写道:>;>;是因为给GCC添加后台是免费的,C已经广为人知,而C已经足够了?Skeeve.com的阿诺德写道:>;天鹅座解决方案公司(Hi J......
2020-7-14 1:17
2019年11月12日第17卷第5期编译器是将高级的、更容易编写的代码转化为高效的机器代码以供计算机执行的必备技术。他们在做这件事上的老练经常被忽视。您可能会花费大量时间仔细考虑算法和处理错误消息,但可能没有足够的时间来了解编译器能够做些什么。 本文介绍了一些编译器和代码生成概念,然后介绍了您的编译器正在为您完成的一......
2020-7-13 3:42
下载PDF摘要:传统编译器在单个通用中间表示(IR)上操作。这些IR通常是低级的,接近机器指令。因此,依赖领域特定信息的优化要么是不可能的,要么需要复杂的分析来恢复丢失的信息。相反,多级重写实例化方言层次结构(IR),逐层降低程序,并在最合适的级别执行代码转换。我们展示了这种方法在天气和气候领域的有效性。特别地,我们......
2020-7-12 8:43
在2020年7月10日星期五下午3:59,Josh Triplett<;[email protected]&>写道:据我回忆,Greg;最初引入此选项的最大条件是执行与LTO使用的相同的Kconfig选项,并关闭其下的&>选项。有足够的时间来做实验。否,请将其设为铁锈可用自动配置选项。与我们已......
2020-7-7 5:42
这是系列文章中的最后一篇,也是最有趣的一篇。第1部分和第2部分重点介绍了Golang-Goroutines和几乎停顿的GC的两个关键特性。这篇帖子补充了所有缺失的部分。 但是,在如何实现所有这些功能方面,有更多的不同之处而不是相似之处。让我们跳到这些内容:)。 Go编译成本机二进制文件--也就是说,它的二进制文件“绑......
2020-7-6 5:13
这篇文章详细介绍了5+JIT和各种优化策略,并讨论了它们如何与不同的JIT协同工作。这篇博文中的信息是深度优先的,因此有许多重要的概念可以跳过。 有关JIT编译器的背景信息,请参阅JIT编译器深度介绍:JIT不是非常及时的。如果标题对你没有意义,那么它可能值得浏览一下。 我经常描述一种优化行为,并声称它可能存在于其他......
2020-6-30 0:55
为了帮助支持我们的社区在新冠肺炎期间远程工作,我们将在2020年6月30日之前免费提供ACM在我们数字图书馆中发布的所有作品。了解更多。 我们使用饼干,以确保我们给你最好的经验,在我们的网站。 您的浏览器似乎不支持它们,这会影响网站功能。
2020-6-28 6:44
我知道浮点算术在现代计算机上有点疯狂。例如,浮点数不具有关联性: 但是,至少在我的经验中,这是相当一致的。您不应该简单地假设像关联性这样的花哨属性在现实世界中起作用。 如果上帝真的存在,可变比率就会是0.50178230318,故事就到此为止了。不幸的是,没有正好为0.50178230318的浮点数。相反,它落在浮点......
2020-6-26 5:18
注意:这是一篇来自Sixten编程语言文档的老帖子,我对它进行了润色和充实。在写完之后,我发现了Salsa,这是一个与我的Rock库有着非常相似目标的Rust库,它也绝对值得一看! 编译器不再仅仅是获取一堆源文件并产生汇编代码的黑匣子。我们期望他们: 是增量的,这意味着如果我们在做了一些更改之后重新编译一个项目,我们......
Tiny C Compiler(bellard.org)
2020-6-24 2:46
小的!。您可以在任何地方编译和执行C代码,例如在救援盘上(x86TCC可执行文件大约100KB,包括C预处理器、C编译器、汇编器和链接器)。 快地!。TCC生成x86代码。无字节码开销。编译、汇编、链接比GCC快好几倍。 无限量!任何C动态库都可以直接使用。TCC正朝着完全符合ISOC99的方向发展。TCC当然可以自......