编译原理 14

数组越界导致的函数调用

编译原理
C语言中数组越界是未定义行为,因此以下代码在不同的编译器或者不同版本的同一编译器行为是不可预测的。在gcc某些版本中,以下代码会出现有意思的行为。 // demo.c #include <stdio.h> #include <stdlib.h> void jmp() { …...
Read more →

字节码缓存提升程序性能的原理浅谈

编译原理
像Java这类语言,编译器会把代码预先编译为字节码,JVM直接解释执行这些字节码,程序就可以运行起来了。PHP使用者在性能优化时可能也会遇到OPcache这个名词,所谓OPcache其实就是opcode的cache,opcode其实类似于字节码,虽然本质上有点差异,但可以类比为同一种事物。 PHP在 …...
Read more →

从一个小型编译器一窥编译原理的本质

编译原理
编译器可以粗略地分为几个简单的部分:词法分析器、语法分析器、代码生成器。其中语义分析器、代码优化器这些不影响本文示例功能。另外,本文的编译器生成的是字节码,因此还需要一个虚拟机来执行。 Lexer 词法分析器 Lexer的功能是将代码串不同的符号进行标记分组,例如(3 + 5) * 2可以拆分为不同 …...
Read more →

语法分析

编译原理
语法分析是编译前端部分的重要部分。 # todo class PlusMinus: def __init__(self, left, op, right): self.left = left self.op = op self.right = right def __str__(self): …...
Read more →

Stack Machines

编译原理
Stack Machines,感觉不翻译看起来会顺眼一点,翻译成栈机感觉怪怪的。该文章总结自Igor Wiedler的Stack Machines系列文章,可惜他很久没贡献过代码以及没更新过博客了。先贴代码,到时候再写文章,可能需要一段时间来消化这个系列。 <?php // php 8.2 …...
Read more →