本次更新发行了2.4.36
.
本次提交规范了项目的文档,整合并优化了项目的代码,同时修复了大量漏洞。
在这段时间的开发和思考当中,我结合了原有的开发经验,纠正了目前的开发路线:
我将一些工作日志的一些空白的头注释删去了,并且将过时的技术文档明确标记出来。
与此同时,也更新了抽象语法树文件的编码技术文档。
它们位于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
将会随着重构而被弃用。
ArrayList.hpp
的标准C实现