中间代码生成
在将给定源语言的一个程序翻译成特定机器代码的过程中,一个编译器可能构造出一系列中间表示。高层的中间表示接近源语言,而底层的表示接近目标语言。语法树是高层表示,它刻画了源程序的自然层次性结构,且适用于静态类型检查。低层表示适用于机器相关处理,如寄存器分配、指令选择等。
在将给定源语言的一个程序翻译成特定机器代码的过程中,一个编译器可能构造出一系列中间表示。高层的中间表示接近源语言,而底层的表示接近目标语言。语法树是高层表示,它刻画了源程序的自然层次性结构,且适用于静态类型检查。低层表示适用于机器相关处理,如寄存器分配、指令选择等。
最通用的语法制导翻译的方法是先通过构造一棵语法分析树,然后通过访问这棵树的各个结点来计算结点的属性值。在很多情况下,翻译可以在语法扫描分析期间完成,不需要构造出明确的语法分析树。语法制导翻译主要有两类:
正正规规地开始写实现一个编译器感觉压力还是蛮大的。初步选型是
C++
支持 17 简直太棒了!!!还不知道毕昇杯能不能用 CMake 去构建。
一个自底向上的语法分析过程对应于为输入字符串构造语法分析树的过程,它从叶节点开始开始逐渐向上构造。虽然大部分编译器前端不会显示构造语法分析树,而是直接翻译,但自底向上构建有些像构建语法分析树。
自顶向下语法可以被看作输入串构造语法分析树的问题,从语法分析树的根结点开始,深度优先创建这棵树的各个结点。
对于输入 id +
id *
id,可以根据最左推导序列产生语法分析树序列:
\[\begin{aligned}
E &\rightarrow TE^{’}\\
E^{’} &\rightarrow +\ T\ E^{’}\,|\,\varepsilon\\
T &\rightarrow FT^{’}\\
T^{’} &\rightarrow *\ F\ T^{’}\,|\,\varepsilon\\
F &\rightarrow (\ E\ )\,|\,\textbf{id}\\
\end{aligned}\]
本篇是基于 tecosaur 的 Emacs 配置 大幅缩减版本,如果你对 Org Mode 感兴趣可以看他制作的 This Month in Org。
正好家里买了打印机,HP 4800 系列,耗材是真便宜,喷墨是真慢啊。不过正好记录一下 Linux 下的 HP 打印机配置过程。
另外 HP 对开源的态度真不错,估计也是因为自家是开源大厂的缘故吧。
在客户端阻塞在 read 等待用户输入时,服务器关闭会导致向客户端发送 FIN,这是客户端的另一个输入。但由于客户端阻塞在 read 从而无法立即接受这个输入,直到从套接字读入为止。这就需要进程提前告知内核,使得内核在进程指定的输入准备好后,或可以输出后,立即通知进程,这个能力被称为 I/O 复用 (I/O multiplexing)。
在网络编程中第一步往往调用 socket 函数,以指定通讯协议的详情。
本次介绍 mod 配置 Tropical Experience | The Volcano Biome (热带冒险 | 火山生态群),版本 v2.70,这也就是常说的 3 合 1
三合一是将单机版 DLC 巨人国、船难和哈姆雷特合并在一张地图上的 mod,大型但兼容性较差,请谨慎添加 mod。
Lua 是一个动态弱类型脚本语言,核心由 C 语言实现,执行效率高,可直接做 C / C++ 扩展。另外 Lua 另一个主流实现 Lua JIT 主要研究针对 Lua 的即时编译系统。
而 Lua 由于其高性能、小巧、简单、与 C 结合性好等特点,大量运用于游戏领域,而饥荒的实现以及扩展也基本使用 Lua 完成。