命令行覆盖刷新输出

工具
命令行覆盖刷新输出的效果如下图。 覆盖刷新的原理:删除已输出字符(用空白字符屏蔽),重新输出新字符。 删除字符需要用到一个特殊字符\b退格符。注意:在很多语言里语言\b退格符跟键盘上的 Backspace 键不太一样,退格符仅仅是回退,并不会删除字符,因此回退后还需要使用一个空白字符覆盖原有字符,才 …...
Read more →

虚拟机实现原理

编译原理
虚拟机是由软件实现的计算机。 以下是一个由 JavaScript 实现的虚拟机。 let virtualMachine = function(program) { let programCounter = 0; let stack = []; let stackPointer = 0; while …...
Read more →

给 PHP 写 C 扩展

PHP
前期准备 源码编译安装 PHP。本文使用的是 PHP-8.1,其它版本可能会有所差异。 $ # 获取 PHP 源码并编译 $ git clone https://github.com/php/php-src.git $ git checkout PHP-8.1 $ cd php-src $ …...
Read more →

表达式解析

编译原理
之前想写一篇《栈实现的表达式求值》,鸽了。这段时间又在学习编译原理,也有了一些想法,恰好看见Data Structure - Expression Parsing ,如获至宝,感觉有点意思。 算术表达式可以使用三种不同但效果等效的的表示法来表示。这些表示法如下: 中缀表示法 前缀表示法(波兰表示法) …...
Read more →

对 Coroutine 的不成熟理解

编译原理
在需要恢复控制权的位置设置一系列 label:一个位于开始位置,另一个在每个 return 语句后面。我们还设置了一个 state 变量,用于在多次函数调用时告诉我们下次应该在哪里恢复控制权。在每次返回前,都需要更新 state 变量,使其指向正确的 label。而在调用后,我们都会通过 …...
Read more →