链滴
社区愿景和功能特性
优雅的 Markdown 所见即所得编辑
快捷键交互
随时自由编辑分享内容
支持注销账号来去自由
分布式社区网络
开放 API
产品
Symphony 社区系统(Java)
Solo 博客系统(Java)
Vditor 编辑器(TypeScript)
思源笔记(Electron、Go)
Pipe 博客平台(Vue、Go)
发展计划表
发展简史
榜单
GitHub 仓库排行
帖子打赏排行
Solo 博客端排行
积分排行
活跃度排行
贡献排行
本站基于开源项目 Sym
编程代码问答
登录
注册
首页
>
标签
编译原理
21
引用 •
39
回帖 •
2
关注 •
638
浏览
参与讨论
关注
关注
分享
软件工程
29
引用 •
81
回帖
LLVM
20
引用 •
3
回帖 •
1
关注
教程
143
引用 •
602
回帖 •
8
关注
抽象语法树
1
引用 •
16
回帖
Kaleidoscope
11
引用 •
3
回帖
Java
Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。
3187
引用 •
8213
回帖
文法
1
引用
默认
热议
好评
优选
最近回帖
关注者
查看所有标签
关于 SiYuan v3.1.12 后默认自动清理超过 180 天快照的调查
目前思源加入了自动的快照清理功能,触发时机如下: 手动触发同步 每 24 小时执行一次 默认的配置是保留 180 天内的快照,每天保留两份。 在启动、退出时的同步不会触发,但是 30s 的自动同步会触发。 我个人不喜欢这个设计,因此以下的描述可能会有偏颇。不喜欢的原因如下: 清理功能是自动的且没有开关默认开启,这导致假 ..
380
6 小时前
Go 词法语法分析
词法分析 下列一段代码 package main import ( 'fmt' ) func main() { fmt.Println('Hello') } 通过 lex 规则最终解释成 PACKAGE IDENT IMPORT QUOTE IDENT QUOTE IDENT IDENT LPAREN RPAREN L ..
279
4 年前
Abstract Syntax Code
抽象语法树 AST 将代码进行词法分析语法分析后变成树结构以便于生成中间代码的环节 [图片] 如图所示,该树为 2*3+7 词法分析 比如一段代码 const a = 5; 经过词法分析 [{value: 'const', type: 'keyword'}, {value: 'a', type: 'identifier ..
144
4 年前
Static Single Assignment Form
Static Single Assignment Form 静态单一分配形式,每个变量只赋值一次 intermediate representation(IR): 中间代码表示 作用 常数传播(constant propagation) 值域传播(value range propagation) 稀疏有条件的常数传播( ..
198
4 年前
Markdown 解析原理详解和 Markdown AST 描述
概述 本文主要介绍 Markdown 引擎 Lute 的整体处理流程,并详细描述了 Markdown 抽象语法树结构。 编译原理 我们通过编译原理实现了 Lute ,大致步骤是预处理、词法分析、语法分析、代码生成这几个步骤。代码结构方面我们分为两部分,解析和渲染。 // Markdown 将 markdown 文本字节 ..
4.2K
3 年前
使用 Csmith 测试 C 编译器
原文链接: 使用 Csmith 测试 C 编译器 前言 系统软件如编译器无论在小型还是大型软件系统中都有着相当重要的作用,一个编译器的 bug 很有可能对软件带来灾难性的影响。因此,测试编译器变得尤为重要。本文将介绍如何使用 Csmith 测试常见 C 编译器如 GCC,LLVM。关于其具体实现原理我将另外写一篇文章详 ..
1.9K
4 年前
Kaleidoscope 系列第九章:增加调试信息
原文链接:[链接] 本文是[链接]系列第九章,将为 Kaleidoscope 添加调试信息,帮助高效开发新语言。 第九章简介 欢迎来到“[链接]”教程的第九章。在第一章至第八章中,我们构建了一种带有函数和变量的体面的小型编程语言。这时会有一个问题,那就是如果出了问题怎么办,如何调试程序? 源代码级调试使用格式化的数据, ..
337
5 年前
Kaleidoscope 系列第八章:编译为目标代码
原文链接: 本文是系列第八章,将生成的代码编译为目标机器代码。 第八章简介 欢迎来到“”教程的第八章。本章介绍如何将我们的中间代码编译为目标代码。 选择一个目标 LLVM 支持本地交叉编译。我们可以将代码编译为当前计算机的体系结构,也可以像针对其他体系结构一样轻松地进行编译。在本教程中,我们主要针对当前计算机。 为了指 ..
468
5 年前
Kaleidoscope 系列第十章:总结和其他技巧
原文链接: 本文是[链接]系列第十章,对 Kaleidoscope 开发过程进行总结,分析可能使用到的其他技巧。 教程总结 欢迎来到“[链接]”教程的最后一章。在本教程的过程中,我们已经将 Kaleidoscope 这种小语言从一种无用的玩具发展为一种半有趣(但可能仍然无用)的玩具语言。 有趣的是,我们已经走了多远,花 ..
284
5 年前
Kaleidoscope 系列第七章:扩展语言—可变变量
原文链接: [链接] 本文是[链接]系列第七章,继续扩展 Kaleidoscope 语言特性,增加可变变量处理。 第七章简介 欢迎来到“[链接]”教程的第七章。在第一章至第六章中,我们构建了一种尽管简单的但是非常像样的 [链接]。在我们的开发过程中,我们学习了一些解析技术,包括如何构建和表示 AST,如何构建 LLVM ..
306
5 年前
Kaleidoscope 系列第六章:扩展语言—用户自定义运算符
原文链接:[链接] 本文是[链接]系列第六章,继续扩展 Kaleidoscope 语言特性,增加用户自定义运算符处理。 第六章简介 欢迎来到“[链接]”教程的第六章。至此,在本教程中,我们现在有了一种功能齐全的语言,该语言相当少,但也很有用。但是,仍然存在一个大问题。我们的语言没有很多有用的运算符(例如除法,逻辑求反, ..
239
5 年前
Kaleidoscope 系列第五章:扩展语言—控制流
原文链接: Kaleidoscope 系列第五章:扩展语言---控制流 本文是使用 LLVM 开发新语言 Kaleidoscope 教程系列第五章,主要扩展 Kaleidoscope 语言特性,增加多种控制流处理。 第五章简介 欢迎来到“使用 LLVM 开发新语言 Kaleidoscope 教程”教程的第五章。第 1- ..
311
5 年前
Kaleidoscope 系列第四章:添加 JIT 和 Optimizer 支持
原文链接: [链接] 本文是[链接]系列第四章,主要添加 JIT 编译器及 LLVM 中部分优化功能。 第四章简介 欢迎来到“[链接]”教程的第四章。前一至三章介绍了一种简单语言的实现并增加了对生成 LLVM IR 的支持。本章介绍了两种新技术:为我们的语言添加优化器支持,以及添加 JIT 编译器支持。这些补充内容将演 ..
348
5 年前
Kaleidoscope 系列第三章:生成 LLVM 中间代码 IR
原文链接:[链接] 本文是[链接]系列第三章,主要实现将 AST 转化为 LLVM IR 的功能。 第三章简介 欢迎来到“[链接]”教程的第三章。本章介绍如何将第二章中构建的[链接]转换为 LLVM IR。本章将告诉我们一些有关 LLVM 如何工作的知识,并演示它的易用性。构建词法分析器和解析器要比生成 LLVM IR ..
624
5 年前
Kaleidoscope 系列第二章:实现解析器和 AST
原文链接: [链接] 本文是[链接]系列第二章,主要实现 Kaleidoscope 语言的语法解析并生成 AST 的功能。 第二章简介 欢迎来到“[链接]”教程的第二章。本章向我们展示如何使用[链接]中构建的词法[链接]为我们的 Kaleidoscope 语言构建完整的[链接]。有了解析器后,我们将定义并构建一个[链接 ..
254
5 年前
Kaleidoscope 系列第一章:新语言特性和 Lexer
原文链接 [链接] 本文是 [使用 LLVM 开发新语言 Kaleidoscope 教程] ([链接]) 系列第一章,主要介绍 Kaleidoscope 语言特性和词法分析器的构建。 Kaleidoscope 语言特性 本教程以一种名为“[链接]”(google 翻译为万花筒,源自“美丽,形式和视野”)的玩具语言进行开 ..
383
5 年前
使用 LLVM 开发新语言 Kaleidoscope 教程
原文链接: [链接] 前言: 本系列是 [链接] 译文,诣在熟悉 LLVM 的开发流程,网上有一些翻译只有前三个部分,没有翻译全,并且都是四五年前的没有更新过。由于对于编译器的概念只停留在理论上,想从代码的角度深入理解一下编译器,希望通过这部分的练习可以帮助到我。利用国庆假期这几天,我会仔细阅读此系列文档及源码并尝试翻 ..
1.7K
2 年前
深入理解 Java 即时编译器(下)
[图片] 如果您觉得我的文章对您有帮助的话,记得在 GitHub 上 star 一波哈 GitHub_awesome-it-blog 本文会介绍分层编译的机制,然后介绍即时编译器对应用启动性能的影响。 本文内容基于 HotSpot 虚拟机,设计 Java 版本的地方会在文中说明。 0 分层编译概述 在引入分层编译之前, ..
154
5 年前
深入理解 Java 即时编译器(上)
[图片] 如果您觉得我的文章对您有帮助的话,记得在 GitHub 上 star 一波哈 GitHub_awesome-it-blog 本文会先介绍 Java 的执行过程,进而引出对即时编译器的探讨,下篇会介绍分层编译的机制,最后介绍即时编译器对应用启动性能的影响。 本文内容基于 HotSpot 虚拟机,设计 Java ..
123
5 年前
LLVM 概述一:编译器背景及 LLVM 初探
前言 本文较长,部分翻译自《The Architecture of Open Source Applications: LLVM》 。 此文章介绍前半部分,即编译器的背景及 LLVM 初探,后半部分主要说明 LLVM 项目的设计原理和主要优势。 LLVM [1] 是一个包含和开发一组紧密结合的低级工具链组件(例如,汇编 ..
416
5 年前
模板引擎实现(一)词法分析
如果你想实现模版引擎、编译器前端、文本解析器(比如 Markdown )或想要了解它们的实现原理,请一定不要错过本系列的文章 [链接] 另外, 本系列的文章面向的是撸起袖子就开干的朋友,所以不会介绍基础理论,比如 DFA/NFA,算法复杂度等(确切的说是没法介绍理论,因为作者能力有限 ) 在使用到的术语/定义方面作者是 ..
2.9K
6 年前
[编译原理] 学习笔记(二)——文法和语言
一、 对程序设计语言的描述从语法、语义和语用三个因素考虑: a) 语法:对语言结构的定义; b) 语义:语言的含义; c) 语用:从使用的角度描述语言。 形式语言理论是编译的理论基础。 二、 字母表:元素的非空有穷集合; 符号/字符:字母表中的元素; 符号串:符号的有穷序列。 三、 符号串运算: a) 符号串的连接:ε ..
447
7 年前