# 2025/01/27 工作日志

本次更新发行了``2.4.36``.

本次提交规范了项目的文档，整合并优化了项目的代码，同时修复了大量漏洞。

在这段时间的开发和思考当中，我结合了原有的开发经验，纠正了目前的开发路线：

* 比起分步动作机制，将中间代码重构为STVC-TAC是更为重要的
* 应该先重构编译器，再重构虚拟机
* 在重构编译器之前，应该先把属性文法编写完毕

### 整理项目文档

我将一些工作日志的一些空白的头注释删去了，并且将过时的技术文档明确标记出来。

与此同时，也更新了抽象语法树文件的编码技术文档。

### 提交了词法编码文件的读取器和写入器

它们位于``src/action``目录下，分别是``TokenFileReader.cpp``和``TokenFileWriter.cpp``。

这两份源码目前仍未经过调试，并且并没有接入到项目主体当中，我会在接下来的更新当中接入它。

### 修复了一些漏洞

这些漏洞的具体内容是：

* ``Main.cpp``：无法正常处理程序抛出的错误。
* ``Parser.cpp``：表达式的语法分析有误。
* ``SFN.cpp``：将字符串转为数字时，未检查格式。

### 纠正了一些不致命的错误，对部分代码做出了调整

这些调整的具体内容是：

* ``Main.cpp``：补全了Stamon的帮助信息。
* ``Stamon.hpp``：利用依赖库的接口实现了数组拼接。
* ``ExprAst.cpp``：规范了枚举代码
* ``DataType.hpp``：规范了枚举代码

### 让更多错误留在编译期

在以往的Stamon版本当中，若将``continue``或``break``写在循环体外，编译仍然可以通过，只有在虚拟机执行时才会报错。

为此，我在``Parser.cpp``当中加入了检查``continue``和``break``是否都在循环体中的功能。让更多致命性的错误留在编译期。

### 重构虚拟机的计算系统

以往的计算系统的实现代码非常冗余、且在计算时会产生大量的中间对象。

为此，我建立了``TypeCalculator.cpp``，将计算系统迁移到了这里（并与``AstRunner.cpp``对接），同时优化了代码的效率和可读性，确保每一次运算不会产生任何中间对象，即一步到位，直接产生结果对象。

计算过程中的类型判断和精度转换是个让人头疼的问题，但是我在``TypeCalculator.cpp``中用一种优雅的方式解决了它。

在重构计算系统之后，我让``2.4.31``版本与``2.4.36``版本运行百万次空循环，又递归计算了第二十项斐波那契数列，在计算期间统计了对象的申请次数。实验结果表明：**重构后的申请次数普遍低于重构前的申请次数的50%**。

### 还有更多地方有待优化

``ArrayList.hpp``的标准C实现以及``AstRunner.cpp``容易出现内存泄漏。我打算将前者改进成安全的实现，而并不打算处理后者，因为``AstRunner.cpp``将会随着重构而被弃用。

### 接下来要做的事

1. 优化``ArrayList.hpp``的标准C实现
2. 开发Stamon的安装工具
3. 推进Stamon包管理器的开发
4. 支持文件处理库