本次更新发行了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实现