Hulo语言架构:从源代码到目标代码的完整流程
最近这一段时间忙着工作和开发Hulo编程语言,满打满算已经过了三个月多了。心血来潮,想梳理下Hulo编程语言的开发流程,也顺带以个人的视角解读下编程语言是如何从零开始诞生的。希望通过这篇文章,能够为对编程语言实现感兴趣的开发者提供一个实践性的参考,同时也记录下这段充满挑战和收获的开发历程。
架构
Hulo语言的定位是批处理脚本的编译器,最终经过编译后的目标语言是Bash、Batch、VBS、PowerShell等脚本语言。为了统一抽象这些不同的目标语言,Hulo不仅仅包含解析器和转译器,还为此设计了完整的编译工具链:
核心组件
- 解析器 (Parser): 将源代码转换为抽象语法树(AST)
- 模块管理 (Module Manager): 处理依赖关系和符号解析
- 解释器 (Interpreter): 支持元编程和编译时计算
- 调试器 (Debugger): 配合解释器进行调试和错误诊断
- 优化器 (Optimizer): 负责代码剪枝和性能优化
- 转译器 (Transpiler): 将AST转换为目标语言代码
- Unsafe模板引擎: 在转译过程中支持嵌入原生代码
- 链接器 (Linker): 负责将原生代码块链接到一起
编译流程
从上面的专有名词上看,Hulo好像该有的都有。但是,大部分组件都还在开发中,只是局部实现并通过了单元测试嘿嘿。不过,这并不影响本次科普的开展。
至此,Hulo的完整编译流程大概是这样的:
源代码 → 解析器 → 模块管理 → 解释器(调试器) → 优化器 → 转译器(携带着unsafe模板引擎) → 链接器 → 目标语言代码
编译概念
这个完整的过程,Hulo将其称之为编译。整个生命周期都是由编译器(compiler)控制的,编译也就是从一个语法转换成另一个语法的过程,比如说C语言编译成汇编,Hulo语言编译成批处理脚本。
与传统编译器的对比
| 传统编译器 | Hulo编译器 |
|---|---|
| C → 汇编 | Hulo → Bash/Batch/VBS/PowerShell |
| 机器码执行 | 脚本解释执行 |
| 多平台汇编 | 多脚本语言 |
这种设计使得Hulo能够为不同的脚本环境生成相应的代码,同时保持了统一的开发体验。
源代码
源代码是编程语言实现的基础,每个开发者都熟悉这个概念:编写代码需要创建文件并在其中编写逻辑。源代码主要包含两个部分:文件的扩展名和文件的内容(语法部分)。
语法
语法可以说是一个编程语言区别于其他编程语言的重要标志。每种语言都有其独特的语法特性,这些特性在很大程度上决定了语言的风格和用途。例如:
- Golang: 管道运算符
<-、chan、go、defer关键字等,这些特性与其他语言相比有很强的辨识度 - C语言: 宏定义满天飞,预处理器功能强大
- TypeScript: 类型体操,复杂的类型系统
- Rust: 所有权系统、生命周期标注
- Python: 缩进语法、列表推导式
这些语法特性不仅影响代码的编写风格,也在很大程度上决定了标准库的设计和实现方式。当然,也不排除各种语法大杂烩的语言,比如说Hulo就位列其中 :)
文件名
和普通的文本文件类似,代码本身也是一种结构化的文本格式。文件的扩展名可以自由选择,在这里Hulo语言选择了.hl作为扩展名。建议在选择扩展名时要与市面上现有的语言区分开来,避免同名扩展名可能导致的编译冲突。尽管文件内容的存储与扩展名无关,但在解析过程中,编译器通常会根据扩展名来确定文件类型和处理方式,因此选择合适的扩展名有助于避免潜在的编译问题。

浙公网安备 33010602011771号