编译器中间表示 (IR) 设计的思考:局部信息决策与优化

2025-06-17
编译器中间表示 (IR) 设计的思考:局部信息决策与优化

本文探讨了编译器中间表示(IR)的设计,核心思想是仅用局部信息就能做出决策。作者比较了控制流图(CFG)、基于寄存器的IR和静态单赋值(SSA)形式,并介绍了静态单信息(SSI)和节点海(SoN)等更高级的IR设计。SSA通过为每个变量只赋值一次来简化分析,而SSI则允许在程序的不同分支上为同一变量添加更精细的信息。SoN则将所有指令表示为图中的节点,通过显式地表示数据和控制依赖关系来提高优化灵活性。这些设计目标都是为了让编译器优化器能够更有效地工作,并最终生成更高效的代码。

阅读更多
开发 中间表示

从零开始构建一个基于Word2Vec的博客搜索引擎

2025-05-20
从零开始构建一个基于Word2Vec的博客搜索引擎

作者和朋友用Python从零构建了一个博客搜索引擎,核心技术是Word2Vec词嵌入。他们将文章和搜索词嵌入到300维向量空间,用余弦相似度计算匹配度排序结果。为了适应Web应用,他们将Word2Vec模型拆分成索引和向量两部分,用HTTP Range请求仅下载所需数据,显著减小了网页加载负担。最终,他们还设计了一个指标来评估搜索引擎的准确性,并讨论了未来改进方向,例如使用TF-IDF技术减少噪声。

阅读更多
开发

改变我对编程语言认知的论文和博文

2025-05-14
改变我对编程语言认知的论文和博文

作者分享了一系列改变其对编程语言和编译器理解的论文和博文,涵盖垃圾收集、代码优化、寄存器分配、正则表达式引擎、机器学习、SSA 形式、编译器设计等多个方面。这些文章以其简洁性、创新性和实用性,为作者提供了新的视角和思路,例如使用Z3作为证明引擎,利用模糊测试发现bug,以及高效的表达式解析方法等。文章体现了作者在持续学习和探索编程语言领域的深度和广度。

阅读更多
开发

手动构建Nix Derivation:深入理解哈希生成

2025-04-09
手动构建Nix Derivation:深入理解哈希生成

本文讲述了作者手动构建一个简单的Nix derivation的经历。作者通过逐步分解Farid的博客文章,深入研究了Nix derivation的内部机制,特别是哈希生成的流程。过程中,作者遇到了许多挑战,例如理解ATerm表示、SHA256哈希计算和Nix独有的base32编码方式等。最终,作者成功地手动生成了与Farid博客文章中一致的哈希值,并成功构建了简单的“hello world” derivation。

阅读更多

将Python程序加速100倍:垃圾回收和GPU的威力

2025-03-25
将Python程序加速100倍:垃圾回收和GPU的威力

本文讲述了作者如何通过简单的代码优化将一个Python程序的运行速度提高了100倍。最初的程序使用NumPy进行并行计算,但由于内存管理不当,运行缓慢且占用大量内存。作者首先通过实现简单的垃圾回收机制,释放不再使用的中间变量,将运行时间从40秒缩短到10秒,内存占用也大幅减少。随后,作者使用CuPy将计算转移到GPU上,进一步将运行时间缩短到1.5秒,实现了惊人的性能提升。

阅读更多
开发 Python优化

Cinder JIT编译器:利用位集和半格优化类型表示

2025-03-11
Cinder JIT编译器:利用位集和半格优化类型表示

Cinder JIT编译器采用了一种巧妙的类型表示方法,将类型视为集合(甚至格),并选择紧凑的位集表示。文章深入探讨了Cinder如何利用位集和半格结构高效地处理类型信息,包括对基本类型的表示、类型联合以及特殊化处理。通过将类型信息编码为位集,Cinder能够有效地表示类型联合,并支持对类型进行更精细的区分。此外,Cinder还引入了特殊化机制,以跟踪特定对象的具体值,从而进一步提高编译器的优化效率。文章还讨论了Bottom类型以及如何生成类型格等细节。

阅读更多
开发 位集

静态单赋值 (SSA) 编译器优化技术:从1980年代到2023年的演进

2025-02-11
静态单赋值 (SSA) 编译器优化技术:从1980年代到2023年的演进

本文回顾了静态单赋值 (SSA) 编译器优化技术的几十年发展历程。从最初的Code Motion和Global Value Numbers论文开始,到Cytron论文提出的最小化phi指令方法,再到Brandis和Mössenböck提出的单遍生成方法,以及Click和Paleczny的Sea of Nodes IR,文章梳理了多个重要论文,并探讨了不同方法的优缺点。此外,文章还提到了Appel对函数式编程与SSA的关联研究,以及Aycock和Horspool的迭代删除phi节点方法,以及近年来基于抽象解释的SSA转换方法。文章最后列举了其他相关的论文和资源,为读者深入了解SSA提供了更全面的视角。

阅读更多

深入了解CPS:一次函数式编程编译之旅

2024-12-25
深入了解CPS:一次函数式编程编译之旅

本文深入探讨了延续传递风格(CPS)及其在函数式编程语言编译中的应用。作者通过一个简单的Scheme-like语言,逐步构建了一个CPS转换器,并阐述了优化策略和代码生成方法。文章详细介绍了如何将整数、变量、函数调用、算术运算符、lambda表达式和if表达式转换为CPS形式,并讨论了元延续和优化技术,例如常量折叠和β归约。最后,文章还概述了将CPS代码转换为可执行代码的几种方法,包括生成C代码、使用蹦床和单一大型开关语句等。

阅读更多
开发 CPS

C-Reduce 可用于任何语言

2024-11-28
C-Reduce 可用于任何语言

C-Reduce是一个用于最小化C编译器错误重现的工具,但它并非仅限于C语言。文章作者用RustPython和scrapscript遇到的bug为例,展示了如何使用C-Reduce来缩小问题范围。只需要一个确定性条件、一个快速的重现器和一个或多个可变的源文件,就可以使用C-Reduce。作者通过运行一个简单的脚本 interesting.sh 并使用 `creduce --not-c` 命令,快速地将文件大小减少了近50%。`--not-c` 参数是为了避免C-Reduce使用C语言特定的优化,从而加快处理速度。

阅读更多
未分类 C-Reduce

论通用关系

2024-10-30
论通用关系

作者去年上了数据库课程,了解到一篇经典论文《论通用关系》(1979),作者为多伦多大学的Marc H. Graham。由于该论文难以获取,作者费力找到实体副本,扫描后上传,供大家查阅。作者尝试联系过大学和作者本人,但未得到回应。

阅读更多
未分类 通用关系

为Damas-Hindley-Milner类型系统添加行多态

2024-10-23
为Damas-Hindley-Milner类型系统添加行多态

本文介绍了如何在Damas-Hindley-Milner(HM)类型系统中添加行多态。文章首先解释了记录和行的概念,以及如何在类型系统中表示它们。然后,文章详细讨论了如何推断记录字面量的类型,以及如何在模式匹配中处理记录。最后,文章解释了行统一的概念,以及如何使用let多态实现行多态。

阅读更多
未分类 行多态

两种方式实现Damas-Hindley-Milner类型推断

2024-10-16
两种方式实现Damas-Hindley-Milner类型推断

本文介绍了两种实现Damas-Hindley-Milner (HM) 类型推断的方法:Algorithm W 和 Algorithm J,并探讨了将HM扩展到递归、模式匹配、行多态等方面的应用。文章首先解释了HM的核心思想,即通过生成和求解类型约束来推断类型。然后详细介绍了Algorithm W 和 Algorithm J 的实现细节,包括类型构造器、类型变量、替换、上下文、泛化、实例化等概念,并通过代码示例演示了如何使用这两种算法进行类型推断。最后,文章还讨论了HM在Scrapscript语言中的扩展,包括递归、更多数据类型、模式匹配、行多态、延迟动态、变体、类型变量的规范化和最小化、类型携带代码等。

阅读更多

microui+fenster=小型GUI

2024-09-08
microui+fenster=小型GUI

本文介绍了如何结合使用microui和fenster这两个轻量级库来创建小型GUI应用程序。fenster提供了一个简单的画布用于绘制像素,并处理键盘和鼠标输入。microui则用于将GUI元素转换为绘图指令。作者详细介绍了如何将这两个库连接起来,并提供了一个示例程序。

阅读更多
未分类

玩具优化器中的抽象解释

2024-07-27
玩具优化器中的抽象解释

本文介绍了一种用于玩具IR的小型抽象解释器,并展示了如何使用它进行一些简单的优化。抽象解释是一种在不运行程序的情况下推理程序行为的通用框架,它使用抽象值来表示程序状态,并定义了抽象转换函数来模拟程序语句对抽象状态的影响。文章以“奇偶性”抽象域为例,展示了如何使用抽象解释来优化程序。

阅读更多
未分类 优化器

Scrapscript编译器的技巧

2024-07-16
Scrapscript编译器的技巧

本文介绍了Scrapscript编译器实现的一些优化技巧,包括:1. 立即对象:利用指针编码小字符串和特定类型的变体,减少堆分配;2. 常量堆:将编译时已知的常量数据结构存储在常量堆中,避免运行时重复分配。文章还展示了如何使用C代码生成这些优化的数据结构,并讨论了如何处理垃圾回收和指针标记等问题。

阅读更多
未分类

Scrapscript 基准编译器

2024-06-03
Scrapscript 基准编译器

本文介绍了 Scrapscript 语言的基准编译器的设计与实现。Scrapscript 是一种小型、纯函数式、内容寻址、网络优先的编程语言。编译器将 Scrapscript 代码转换为 C 代码,并使用半空间垃圾回收机制管理内存。文章详细介绍了编译器如何处理表达式、函数和模式匹配,以及运行时如何实现标记指针和句柄来支持垃圾回收。

阅读更多
未分类

利用weval免费获取编译器

2024-05-19
利用weval免费获取编译器

文章介绍了weval,一个WebAssembly部分求值器,它可以通过将解释器与字节码融合来提高WebAssembly程序的运行速度。作者通过一个简单的解释器示例展示了weval如何将解释器循环展开,并将字节码转换为直线式WebAssembly代码,从而实现8.5倍的加速效果。文章还探讨了weval在更大型解释器(如SpiderMonkey和CPython)中的应用潜力,以及将其用作CPython的Wasm JIT编译器的可能性。

阅读更多
未分类