中间代码生成

在将给定源语言的一个程序翻译成特定机器代码的过程中,一个编译器可能构造出一系列中间表示。高层的中间表示接近源语言,而底层的表示接近目标语言。语法树是高层表示,它刻画了源程序的自然层次性结构,且适用于静态类型检查。低层表示适用于机器相关处理,如寄存器分配、指令选择等。

语法制导翻译

最通用的语法制导翻译的方法是先通过构造一棵语法分析树,然后通过访问这棵树的各个结点来计算结点的属性值。在很多情况下,翻译可以在语法扫描分析期间完成,不需要构造出明确的语法分析树。语法制导翻译主要有两类:

语法分析 2

自顶向下语法可以被看作输入串构造语法分析树的问题,从语法分析树的根结点开始,深度优先创建这棵树的各个结点。

对于输入 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}\]

I/O 复用

在客户端阻塞在 read 等待用户输入时,服务器关闭会导致向客户端发送 FIN,这是客户端的另一个输入。但由于客户端阻塞在 read 从而无法立即接受这个输入,直到从套接字读入为止。这就需要进程提前告知内核,使得内核在进程指定的输入准备好后,或可以输出后,立即通知进程,这个能力被称为 I/O 复用 (I/O multiplexing)。

Unix 套接字 API

套接字函数基本都需要一个指向套接字地址结构的指针作为参数,每个协议族都有自己的套接字定义,均以 sockaddr_ 开头,并有协议族的唯一后缀。

IPv4 套接字地址结构通常称之为 互联网套接字结构 (Internet socket address structure),结构体 sockaddr_in,定义于 <netinet/in.h> 中 (POSIX)。

Lua 语言学习

Lua 是一个动态弱类型脚本语言,核心由 C 语言实现,执行效率高,可直接做 C / C++ 扩展。另外 Lua 另一个主流实现 Lua JIT 主要研究针对 Lua 的即时编译系统。

而 Lua 由于其高性能、小巧、简单、与 C 结合性好等特点,大量运用于游戏领域,而饥荒的实现以及扩展也基本使用 Lua 完成。