宏和优化:这只是一个阶段

这篇文章基于之前构建的仅基于消息调度的最小面向对象语言,进一步展示了语言语义的灵活性以及可添加额外阶段的特性。

  • 主要阶段及功能

    • 宏阶段(macro phase):在回复处理程序定义、名称绑定中引用正确的内容,并通过引用右侧实现短路布尔运算符的支持。程序员无需手动引用。
    • 优化阶段(opt phase):应用一些基本优化,如评估常量子表达式、删除不必要的包装等。
    • 运行阶段(run phase):按照既定语义处理表达式。
  • 示例及解释

    • 对于算术表达式,如1 + 2,宏阶段无操作,优化阶段评估为3,运行阶段接收3并输出3
    • 对于比较操作,如1 > 2,宏阶段无操作,优化阶段输出(),运行阶段输出()
    • 对于字符串连接,如"hello " + "joe",宏阶段无操作,优化阶段连接为"hello joe",运行阶段输出"hello joe"
    • 对于复杂表达式,如(1 + 2) : 3,优化阶段先评估内部表达式,再进行后续操作。
    • 对于条件表达式,如()? 1 : 2,宏阶段将非Later的主体用@包裹,优化阶段根据条件值进行相应处理。
    • 对于短路布尔操作,如() and 1,宏阶段包裹右侧,优化阶段根据左侧值进行处理。
  • 代码结构及注意事项

    • 代码基于特定提交[7302325](https://github.com/marianoguerra/mclulang/tree/730232579ff66fead161efb97634d51300b54174),仓库代码可能会变化。
    • 模块导入自[fatter.js](https://github.com/marianoguerra/mclulang/blob/730232579ff66fead161efb97634d51300b54174/fatter.js),其错误处理更好且Frame有额外方法getSendHandler
    • 各阶段的eval函数实现不同,宏阶段扩展可扩展内容,优化阶段减少可优化内容,运行阶段处理已知操作。
  • 额外说明

    • 这两个阶段可以在每次执行前“即时运行”,也可以在“构建时”运行一次并存储优化结果。
    • 没有抽象语法树和中间表示,“树”是运行时值类型的组合,各阶段输入输出类型相同。
    • 为将各阶段的输入输出转换为字符串,有额外的阶段。
阅读 9
0 条评论