耗时一周,我的编程语言 Hulo 新增 Bash 转译和包管理工具 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
ansurfen
V2EX    分享创造

耗时一周,我的编程语言 Hulo 新增 Bash 转译和包管理工具

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

    嘿,脚本开发者们!

    还记得上周我介绍的那个能编译成 Vbscript 的现代编程语言 Hulo 吗?这周它又有了重大更新!

    本周重磅更新

    1. Bash 转译器正式上线!

    是的,你没看错! Hulo 现在不仅支持 Vbscript ,还支持 Bash 了!

    这意味着你可以用同一套现代语法,同时生成 Windows 和 Linux/macOS 的脚本:

    // main.hl class User { pub name: str pub age: num pub fn to_str() -> str { return "User(name: $name, age: $age)" } pub fn greet(other: str) { MsgBox "Hello, $other! I'm $name." } } let u = User("John", 20) MsgBox $u.to_str(); $u.greet("Jane"); 

    在文件所在的工作目录执行 hulo main.hl 命令即可得到两份转译后的文件(当然 Hulo 命令还支持其他功能,以及从 huloc.yaml 读取配置,在此就不一一列举了,可以通过 hulo -h 查看,或者查询官方文档)。

    生成的 Bash 代码:

    #!/bin/bash function create_user() { local name=$1 local age=$2 declare -A user user["name"]=$name user["age"]=$age echo "$(declare -p user)" } function user_to_str() { eval "declare -A user=${1}" echo "User(name: $name, age: $age)" } function user_greet() { eval "declare -A user=${1}" local other=$2 MsgBox "Hello, $other! I'm $name." } u=$(create_user "John" 20) MsgBox $(user_to_str $u) user_greet $u "Jane" 

    生成的 Vbscript 代码:

    Class User Public name Public age Public Function to_str() to_str = "User(name: " & name & ", age: " & age & ")" End Function Public Function greet(other) MsgBox("Hello, " & other & "! I'm " & name & ".") End Function End Class Set u = New User u.name = "John" u.age = 20 MsgBox(u.to_str()) u.greet("Jane") 

    至此,看起来一切正常对吗?不幸的是,在 Bash 平台上的代码是无法正常运行的,他会因为缺少 MsgBox 而报错,这是因为我们在 Hulo 代码中使用的是 MsgBox 而非 echo 。因此,如果你想让他正常运行就需要将 MsgBox 更改为 echo 在进行转译。但是,这不就和 Hulo 的跨平台宣传产生冲突了? hhh ,原因是类似 use MsgBox = If<$platform == "vbs", MsgBox, If<$platform == "powershell", Write-Host, echo>> 的语法糖还没有完工,造成了命令没法转译的割裂感。Hulo 也不想采用硬编码的方式强行把命令在转译器中做转换,由此带来了比较差的开发体验。这个特性将在未来的版本实现,请给 Hulo 以时间。

    Ps. Hulo 将这个特性称之为命令体操,为了实现这个特性,Hulo 吸取了 TypeScript 类型体操的所有优点,这意味着这套系统将连带着 Omit 、Pick 、Exclude 等类型工具一同构成强大的命令系统。

    2. 包管理工具 HLPM 来了!

    hlpm 的核心功能就是分发第三方库,由于 import 暂时不支持模块解析,尽管 hlpm 核心功能已经开发完成,但是调用模块的运行还是不支持的。但是,你可以用其先初始化项目,并编写 hulo.pkg.yamlhuloc.yaml 文件控制项目的编译过程。这有点类似于 package.jsontsconfig.json 的作用。

    # 初始化新项目 hlpm init my-script # 运行脚本 hlpm run test # 运行文件,等价于 hulo main.hl hlpm run main.hl 

    3. 交互式开发环境 Hulo-REPL

    新增了 hulo-repl 命令:

    • 代码补全
    • 主题设置
    • 实时词法分析、语法分析调试(即将上线)
    • 实时转译(即将上线)
    PS C:\hulo> hulo-repl Hulo-REPL dev Type help for commands, exit to quit >>> e else Else statement enum Enum declaration extend Extend declaration exit Exit the REPL 

    技术改进

    重构了 Vbscript 转译器

    • 代码结构更清晰,更易维护
    • 修复了echo "Hello World"字符串转译问题

    本次更新是一次破坏性更新,v0.1.0 版本所实现的功能可能部分无法在 v0.2.0 运行。尤其是涉及到 import 的地方,模块的设计会在接下来更近。

    配置系统升级

    • hulo 命令现在支持从工作目录的 huloc.yaml 读取配置
    • 更灵活的项目配置管理

    下一步计划

    1. Batch 转译支持 - 让 Hulo 在 Windows 上更强大
    2. 包发布系统 - 让社区能分享和复用代码
    3. Import 系统 - 支持第三方库导入
    4. 命令体操 - 更智能的代码生成

    写在最后

    项目地址: https://github.com/hulo-lang/hulo

    如果你觉得这个项目有意思,欢迎在 GitHub 提 issue 或参与讨论!给个 Star 支持一下,让更多人看到这个项目。

    你觉得这种"一次编写,多平台运行"的脚本开发方式怎么样?有什么建议或想法吗?

    5 条回复    2025-07-20 00:41:13 +08:00
    xiaohanyu
        1
    xiaohanyu  
       85 天前
    好奇,这门语言设想的应用场景是?
    w568w
        2
    w568w  
       85 天前
    看着挺好的。建议增加和同类项目的比较:

    - https://github.com/amber-lang/amber (这个和 Hulo 一样是类 Rust 语法,本身也是用 Rust 写的)
    - https://github.com/batsh-dev-team/Batsh
    - https://github.com/monstermichl/TypeShell

    另外你这里 bash 的转译可能有个问题。Bash 的 local scope 是 dynamic scope 而不是 lexical scope ,如果不为每个函数重命名变量,会导致意外的变量覆盖。此外还有不能递归的问题。
    ansurfen
        3
    ansurfen  
    OP
       85 天前   1
    @w568w okok 我有参考过他们,这个比较会在 Hulo 开发完成度比较高的时候在贴出。这几个项目基本上是把命令当函数使唤,本质上和通用编程语言无异,amber 的 unsafe 没什么用,那样设计不能对命令进行代码提示和类型检测,因此 Hulo 的解决方案是直接将命令当成基础数据类型,对 cmd 进行操作,cmd 就是 class 就是 interface ,这点以后会实现。现在的翻译不是最终定稿,我知道需要对变量名进行混淆,混淆器在实现,但是他涉及到 import "time" as t, import { date as d } from "time",这样情况,我始终没法设计出对 import 的最佳实践,只能边发语言边优化,所以现在基本上只能看个大概。
    ansurfen
        4
    ansurfen  
    OP
       85 天前
    @xiaohanyu 目前的目标是 Hulo 能够重写如 nvm(基于 bash), scoop(基于 powershell) 这样的项目,以一种比较现代化语言的方式。
    w568w
        5
    w568w  
       84 天前
    @ansurfen #3 不错,已 star 。期待一下!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2842 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 13:12 PVG 21:12 LAX 06:12 JFK 09:12
    Do have faith in what you're doing.
    ubao 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