ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Cotowali多后端之谜:同一份.li代码如何同时编译为sh与PowerShell

Cotowali多后端之谜:同一份.li代码如何同时编译为sh与PowerShell Cotowali多后端之谜同一份.li代码如何同时编译为sh与PowerShell【免费下载链接】cotowaliA statically typed scripting language that transpile into POSIX sh项目地址: https://gitcode.com/gh_mirrors/co/cotowaliCotowali是一门静态类型化的脚本语言最迷人的地方在于同一份.li源码通过编译器参数就能分别转译成 POSIX sh、PowerShell甚至一个“双系统都能跑”的混合脚本。本文将带你揭开 Cotowali 编译器多后端架构的设计秘密并给出 7 种后端的完整使用指南。为什么脚本语言需要多后端传统上一门脚本语言只对应一种运行环境Python 跑在 CPython 上Lua 跑在 lua 解释器上。而 Cotowali 选择了另一条路——写一次到处编译Unix 环境Linux/macOS/Cygwin编译为sh、dash、bash、zshWindows 环境编译为pwshPowerShell 7混合环境ushuniversal sh输出一个 sh 和 PowerShell 都能直接执行的“多语言脚本”实验性后端himorogiCotowali 自研的即时解释器后端定义位于 cotowali/config/config.v每个后端都自带 shebang 与输出脚本扩展名如sh→.sh、pwsh→.ps1、ush→.ush这让编译产物天然可执行。一键切换后端lic编译器的-b标志Cotowali 的编译器入口是lic后端选择通过全局标志-b--backend完成默认值为sh# 默认编译为 sh lic examples/add.li # 编译为 PowerShell lic -b pwsh examples/add.li # 生成 sh PowerShell 双兼容脚本 lic -b ush examples/add.li命令行标志的解析逻辑在 cmd/cmdutil/cmdutil.v 中backend_from_str还支持powershell、universal等别名写法输入不合法的后端名会直接报错退出避免产生无法执行的产物。编译流水线AST 是唯一的分岔口同一份.li代码如何变成两种截然不同的目标脚本关键在于前端共享、后端分离的经典编译器架构见 cotowali/compiler/compiler.v词法分析cotowali/lexer/lexer.v 把源码切成 token语法分析cotawali/parser/parse.v 生成语法树AST类型检查cotawali/checker/check.v 静态校验类型保证类型错误在编译期暴露代码生成根据后端枚举选择对应的 Emitter 遍历 AST 输出脚本选择逻辑集中在 cotawali/emit/emitter.vsh/dash/bash/zsh交给 sh Emitterpwsh交给 pwsh Emitter。两套 Emitter 都是独立的完整实现各自处理变量命名、字符串转义、管道与重定向、函数定义等细节sh 后端cotawali/emit/sh/ 目录用 awk 实现浮点运算用[ ... ]测试命令表达布尔判断pwsh 后端cotawali/emit/pwsh/ 目录用Compare-Object实现数组相等比较用$_风格变量命名最神奇的 ush一份脚本双系统通吃ushuniversal sh后端是 Cotowali 最“魔法”的能力。它并不是第三套代码生成器而是把同一份.li分别编译成 sh 代码和 pwsh 代码再用精心设计的 polyglot 模板把两者拼进同一个文件逻辑见 cotawali/compiler/compiler.v 中的ush_compile_to与 cotawali/emit/ush/ush.vsh 执行到 heredoc 指令就把 PowerShell 部分当“数据”跳过PowerShell 通过一个注释技巧提前“吞掉” sh 部分两个后端各自只执行自己那一段也就是说lic -b ush fib.li生成的fib.ush文件在 Linux 的sh里能跑在 Windows 的pwsh里也能跑——真正的代码写一次两边都能用。ush后端寻找执行器时cotawali/config/config.v 的find_executable_path也会优先找sh、找不到再找pwsh与这个“双栖”设计完全呼应。实战一份.li两种产物以官方示例 examples/add.li 为例其 Cotowali 写法简洁直观变量、函数、类型注解一应俱全。分别编译后可以观察到-b sh输出 POSIX 兼容脚本函数形如name() { ... }浮点比较借助 awk-b pwsh输出.ps1脚本变量统一加$前缀数组操作映射为 PowerShell 原生算子由于类型系统在前端就已检查完毕两种后端输出行为严格一致跨平台测试成本大大降低。更多示例见 examples/ 目录fib、fizzbuzz、raytracing 一应俱全。如何选择后端场景推荐后端说明Linux/macOS 生产脚本sh默认严格 POSIX兼容性最强需要 bash 特性bash/zsh自动匹配对应解释器Windows 自动化pwsh生成.ps1享受 .NET 生态跨平台分发的单文件脚本ush一个文件双系统直接执行开发调试、追求启动速度himorogicotawali/himorogi/ 自研解释器免编译直接运行总结Cotowali 的多后端之谜本质是共享前端 可插拔 Emitter架构的胜利AST 与类型检查只执行一次sh 与 PowerShell 两套代码生成器各自独立演化而ush后端则通过 polyglot 模板把“多后端”推向极致。对于需要在 Unix 与 Windows 之间维护自动化脚本的开发者来说Cotowali 提供了一个少见的、开箱即用的静态类型化答案。【免费下载链接】cotowaliA statically typed scripting language that transpile into POSIX sh项目地址: https://gitcode.com/gh_mirrors/co/cotowali创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表