Hulo 语言架构:从源代码到目标代码的完整流程 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ansurfen
V2EX    程序员

Hulo 语言架构:从源代码到目标代码的完整流程

  •  
  •   ansurfen 138 天前 1555 次点击
    这是一个创建于 138 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近这一段时间忙着工作和开发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: 管道运算符<-changodefer关键字等,这些特性与其他语言相比有很强的辨识度
    • C 语言: 宏定义满天飞,预处理器功能强大
    • TypeScript: 类型体操,复杂的类型系统
    • Rust: 所有权系统、生命周期标注
    • Python: 缩进语法、列表推导式

    这些语法特性不仅影响代码的编写风格,也在很大程度上决定了标准库的设计和实现方式。当然,也不排除各种语法大杂烩的语言,比如说 Hulo 就位列其中 :)

    文件名

    和普通的文本文件类似,代码本身也是一种结构化的文本格式。文件的扩展名可以自由选择,在这里 Hulo 语言选择了.hl作为扩展名。建议在选择扩展名时要与市面上现有的语言区分开来,避免同名扩展名可能导致的编译冲突。尽管文件内容的存储与扩展名无关,但在解析过程中,编译器通常会根据扩展名来确定文件类型和处理方式,因此选择合适的扩展名有助于避免潜在的编译问题。

    3 条回复    2025-08-09 16:59:36 +08:00
    ansurfen
        1
    ansurfen  
    OP
       138 天前
    由于推流,后续的章节 2-3 天一更
    putaozhenhaochi
        2
    putaozhenhaochi  
       138 天前 via Android
    PowerShell 已经跨平台了吧。Hulo 意义在哪
    ansurfen
        3
    ansurfen  
    OP
       138 天前
    @putaozhenhaochi
    既然 Windows 都自带 PowerShell 了,为什么还需要 Hulo ?
    虽然自带 PowerShell ,但 Hulo 并不冲突。未来可以编写一个 Hulo 代码,翻译成 PowerShell 和 Bash 脚本,让批处理脚本一次编写多端运行。这还需要一个命令转换系统,比如 Write-Host 和 echo 的跨平台抽象。
    很少人在 linux 上使用 powershell ,而是使用 bash ,而 hulo 的意义就是作为批处理脚本的 IR 语言。而且 linux 上的 powershell 需要自己安装,不是捆绑在内核中的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2559 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 15:35 PVG 23:35 LAX 07:35 JFK 10:35
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86