最近这一段时间忙着工作和开发Hulo编程语言,满打满算已经过了三个月多了。心血来潮,想梳理下 Hulo 编程语言的开发流程,也顺带以个人的视角解读下编程语言是如何从零开始诞生的。希望通过这篇文章,能够为对编程语言实现感兴趣的开发者提供一个实践性的参考,同时也记录下这段充满挑战和收获的开发历程。
Hulo 语言的定位是批处理脚本的编译器,最终经过编译后的目标语言是 Bash 、Batch 、VBS 、PowerShell 等脚本语言。为了统一抽象这些不同的目标语言,Hulo 不仅仅包含解析器和转译器,还为此设计了完整的编译工具链:
从上面的专有名词上看,Hulo 好像该有的都有。但是,大部分组件都还在开发中,只是局部实现并通过了单元测试嘿嘿。不过,这并不影响本次科普的开展。
至此,Hulo 的完整编译流程大概是这样的:
源代码 → 解析器 → 模块管理 → 解释器(调试器) → 优化器 → 转译器(携带着 unsafe 模板引擎) → 链接器 → 目标语言代码
这个完整的过程,Hulo 将其称之为编译。整个生命周期都是由编译器(compiler)控制的,编译也就是从一个语法转换成另一个语法的过程,比如说 C 语言编译成汇编,Hulo 语言编译成批处理脚本。
传统编译器 | Hulo 编译器 |
---|---|
C → 汇编 | Hulo → Bash/Batch/VBS/PowerShell |
机器码执行 | 脚本解释执行 |
多平台汇编 | 多脚本语言 |
这种设计使得 Hulo 能够为不同的脚本环境生成相应的代码,同时保持了统一的开发体验。
源代码是编程语言实现的基础,每个开发者都熟悉这个概念:编写代码需要创建文件并在其中编写逻辑。源代码主要包含两个部分:文件的扩展名和文件的内容(语法部分)。
语法可以说是一个编程语言区别于其他编程语言的重要标志。每种语言都有其独特的语法特性,这些特性在很大程度上决定了语言的风格和用途。例如:
<-
、chan
、go
、defer
关键字等,这些特性与其他语言相比有很强的辨识度这些语法特性不仅影响代码的编写风格,也在很大程度上决定了标准库的设计和实现方式。当然,也不排除各种语法大杂烩的语言,比如说 Hulo 就位列其中 :)
和普通的文本文件类似,代码本身也是一种结构化的文本格式。文件的扩展名可以自由选择,在这里 Hulo 语言选择了.hl
作为扩展名。建议在选择扩展名时要与市面上现有的语言区分开来,避免同名扩展名可能导致的编译冲突。尽管文件内容的存储与扩展名无关,但在解析过程中,编译器通常会根据扩展名来确定文件类型和处理方式,因此选择合适的扩展名有助于避免潜在的编译问题。
![]() |
1
ansurfen OP 由于推流,后续的章节 2-3 天一更
|
![]() |
2
putaozhenhaochi 5 天前 via Android
PowerShell 已经跨平台了吧。Hulo 意义在哪
|
![]() |
3
ansurfen OP @putaozhenhaochi
既然 Windows 都自带 PowerShell 了,为什么还需要 Hulo ? 虽然自带 PowerShell ,但 Hulo 并不冲突。未来可以编写一个 Hulo 代码,翻译成 PowerShell 和 Bash 脚本,让批处理脚本一次编写多端运行。这还需要一个命令转换系统,比如 Write-Host 和 echo 的跨平台抽象。 很少人在 linux 上使用 powershell ,而是使用 bash ,而 hulo 的意义就是作为批处理脚本的 IR 语言。而且 linux 上的 powershell 需要自己安装,不是捆绑在内核中的 |