)
Odin 编程语言入门指南数据导向的高性能系统编程语言基于官方 README 深度解析【免费下载链接】OdinOdin Programming Language项目地址: https://gitcode.com/GitHub_Trending/od/OdinOdin 是一门面向高性能、现代系统编程场景的通用编程语言以数据导向Data-Oriented为核心设计理念强调显式类型distinct typing与内建数据导向类型。本文以仓库根目录 README.md 为骨架结合编译器源码、core/base标准库与构建脚本完整讲解 Odin 的定位、第一个可运行程序、从源码构建编译器的方法、官方文档资源体系以及语言核心特性读者读完即可独立上手运行 Odin 程序并理解其底层设计。Odin 是什么面向健全软件开发的数据导向语言README 首页对 Odin 的定位是一句话The Data-Oriented Language for Sane Software Development面向健全软件开发的 Data-Oriented 语言。完整的官方描述如下Odin is a general-purpose programming language with distinct typing, built for high performance, modern systems, and built-in>package main import core:fmt main :: proc() { program : * - / accumulator : 0 for token in program { switch token { case : accumulator 1 case -: accumulator - 1 case *: accumulator * 2 case /: accumulator / 2 case : accumulator * accumulator case: // Ignore everything else } } fmt.printf(The program \%s\ calculates the value %d\n, program, accumulator) }这个示例浓缩了 Odin 的多项核心语法值得逐行解读package main与import core:fmt每个 Odin 程序从一个包声明开始main包是程序入口import引入标准库包路径从core、base等库集合根目录开始与 examples/demo/demo.odin 中import core:os、import base:runtime的写法一致。main :: proc()::声明一个常量绑定此处将main绑定到一个无参无返回值的过程proc即函数main过程是程序入口签名可带- int返回退出码。program : * - /:声明并初始化变量类型由右值推断为string字符串按UTF-8处理因此emoji可以直接作为字符字面量参与比较。for token in programOdin 只有for一种循环语句这里使用 range 形式遍历字符串的每个 runeUnicode 码点每次迭代将字符绑定到token。switch token { case ... }switch是 Odin 的另一个核心语句与 C 不同每个 case 执行完自动跳出无需breakcase:表示默认分支对应 C 的default。fmt.printf来自core:fmt包的格式化输出%s输出字符串、%d输出整数——与 C 的printf风格一致其实现细节见下文深入core:fmt一节。按代码逻辑逐字符推演→1、→2、*→4、→16、-→15、/→7整数除法空格被case:忽略最终输出The program * - / calculates the value 7如何运行这段代码将上述代码保存为main.odin在已安装编译器的环境中执行odin run main.odin若使用-file标志则按单文件模式编译odin run main.odin -file这也是仓库 Makefile 中make demo目标实际执行的命令形态./odin run examples/demo/demo.odin -file。编译器的常用子命令还包括odin check 目录仅做类型检查与语义分析不生成可执行文件examples/README.md 提到可用odin check一次性检查所有core包odin build 目录编译并输出可执行文件odin run 目录编译并直接运行odin report输出编译器自身的诊断报告build_odin.sh 的report模式会先构建再执行./odin report。从源码构建 Odin 编译器README 的文档导航将安装编译器列为第一步。官方预编译包可通过发布页获取同时也支持从源码自行构建。仓库根目录的 build_odin.sh 是 Linux/macOS/BSD 下的标准构建脚本其构建要求与细节如下。依赖LLVM 版本Odin 编译器后端基于 LLVM构建脚本明确规定了版本要求见 build_odin.sh 顶部常量常量值含义SUPPORTED_LLVM_VERSIONS22 21 20 19 18 17支持的 LLVM 主版本号SUGGESTED_LLVM_VERSION22建议使用的 LLVM 版本MINIMUM_LLVM_VERSION17最低可用的 LLVM 版本版本低于 17 时脚本会直接报错Unsupported LLVM version ... must be 17, 18, 19, 20, 21 or 22。脚本通过llvm-config或llvm-config-$V等命名变体探测 LLVM 安装位置在 macOS 上还会借助 Homebrew 的$(brew --prefix llvm$V)路径定位因为 brew 不建议把 llvm 加入$PATH。可用环境变量LLVM_CONFIG显式指定llvm-config路径。构建模式不带参数执行./build_odin.sh时默认以debug模式构建-g调试信息并自动运行examples/demo做冒烟验证执行./odin run examples/demo -vet -strict-style -- Hellope World。显式支持四种模式命令编译器标志说明./build_odin.sh debug-g调试构建含符号信息./build_odin.sh release-O3发布构建全量优化./build_odin.sh release-native-O3 -marchnativex86/-mcpunativeARM针对本机 CPU 微架构优化./build_odin.sh nightly-DNIGHTLY -O3供 nightly 流水线使用脚本按uname -s区分平台Darwin/FreeBSD/NetBSD/Linux/OpenBSD分别链接相应的系统库如 Linux 需-lstdc -ldl并链接 LLVM 的 core/native/passes/arm/aarch64/x86/webassembly/riscv 等组件同时支持CXX、CPPFLAGS、CXXFLAGS、LDFLAGS等标准环境变量覆盖。编译器版本号来自 Git 提交GIT_SHA与提交月份非 Git 检出时使用当前日期格式为dev-YYYY-MM。Makefile 快捷方式仓库 Makefile 提供了与脚本对应的快捷目标make # 等价于 ./build_odin.sh debug make debug # 调试构建 make release # 发布构建 make release-native # 本机优化构建也接受 release_native make nightly # nightly 构建 make demo # ./odin run examples/demo/demo.odin -file make report # ./odin report静态链接构建LinuxCI 目录中的 ci/build_linux_static.sh 展示了针对 Alpine 容器等场景的完全静态链接构建方案固定使用clang-20与llvm-config-20链接标志为-static -lm -lzstd -lz -lffi -pthread -ldl -fuse-ldmold使用 mold 链接器加速并将-DNIGHTLY -O3编译进产物。官方文档与学习资源导览README 的 Documentation 部分系统列出了官方的学习路径覆盖安装→概览→FAQ→包文档→示例→社区的完整闭环。这些资源对应的仓库内实体如下README 栏目用途仓库内对应实体Getting Started下载并安装编译器与库build_odin.sh、MakefileNightly Builds获取最新 nightly 构建ci/nightly.py上传流水线、ci/build_linux_static.shOverview of Odin语言特性总览examples/demo/demo.odin特性示例、odin.ebnf语法定义FAQ常见问题解答官方站点维护仓库不包含Packages官方包文档core/base 库集合core/ 全部包源码、base/ 运行时Examples惯用 Odin 写法示例examples/ 目录Odin Documentation语言本身文档odin.ebnf、源码注释文档仓库内的示例体系examples/README.md 说明示例目录包含两个包demodemo.odin是一个近 2600 行的语言特性大观园覆盖了基本语法、控制流、命名返回值、变参过程、显式过程重载、结构体/联合体、using语句、隐式 context 系统、参数多态等几乎所有核心特性all导入全部core与vendor包便于一次性执行odin check校验所有标准库同时起到编译覆盖率检查的作用。语言核心特性速览源码级佐证README 用一句话浓缩了语言哲学而 examples/demo/demo.odin 则用可运行代码展示了这些特性的具体形态。以下特性均可在该文件中找到对应示例显式类型与无类型常量Odin 的常量字面量是无类型untyped的可在无精度损失时隐式转换到目标类型demo.odinx: int 1.0 // 浮点字面量可无损表示为整数自动转换 y : 1 // 推断为 int z: f64 1 // 整数字面量可隐式转为 f64数值字面量支持0b二进制、0o八进制、0x十六进制、下划线分隔1_000_000_000、科学计数1.0e9与虚数后缀2i。循环与控制流只有for一种循环支持 C 风格三段式、条件式等价 while、无限循环、range 形式0..10、0..9、对字符串/数组/切片/动态数组/映射的迭代以及#partial switch、区间 casecase A..Z:、fallthrough、defer逆序执行、编译期when等语句。数据导向的类型系统struct支持布局控制#align(4)对齐、#packed去填充、#raw_unionC 风格联合体字段共享偏移 0union与any的二元对立union是封闭的类型集合数据内嵌在二进制块中any是开放的任意类型保存数据指针二者可用完全相同的switch v in val/ 类型断言val.(int)语法访问借助using字段实现子类型多态subtype polymorphism无需虚表vtable、无需隐藏结构布局详见 demo.odin 中的Entity/Frog/Monster示例。参数多态编译期泛型用$前缀参数实现编译期多态例如泛型过程与泛型结构体add :: proc(p, q: $T) - T { ... } Table :: struct($Key, $Value: typeid) { ... }隐式 context 系统这是 Odin 最具特色的机制之一。每个作用域都有一个隐式的context值它以指针形式隐式传递给该作用域内所有 Odin 调用约定的过程调用。其类型定义位于 base/runtime/core.odinContext :: struct { allocator: Allocator, temp_allocator: Allocator, assertion_failure_proc: Assertion_Failure_Proc, logger: Logger, random_generator: Random_Generator, user_ptr: rawptr, user_index: int, _internal: rawptr, }context的主要用途是拦截与注入例如在某个作用域内把context.allocator换成自定义分配器则该作用域内所有依赖隐式 context 的分配调用new、make、delete等都会自动改用新分配器而无需修改任何库代码——这替代了 C 语言中用宏覆盖的做法。context.user_index/user_ptr则为用户提供自由扩展位见 demo.odin 中implicit_context_system一节。编译期常量base/builtin/builtin.odin 声明了一批编译器注入的常量典型如ODIN_ARCH目标 CPU 架构枚举.amd64、.i386、.arm64、.wasm32、.riscv64等、ODIN_BUILD_MODE-build-mode指定的输出类型.Executable、.Dynamic、.Static、.Object、.Assembly、.LLVM_IR、ODIN_ENDIAN、ODIN_COMPILE_TIMESTAMP、ODIN_DEBUG等。它们常与when语句配合实现平台相关代码且是经过类型检查的区别于 C 预处理器的文本替换。深入core:fmt格式化输出的实现机制README 示例中用到的core:fmt包是 Odin 最常用的标准库之一其实现位于 core/fmt/fmt.odin跨平台入口在 core/fmt/fmt_os.odin。核心 API 定义如下fmt_os.odinprintf :: proc(fmt: string, args: ..any, flush : true) - (bytes_written: int) printfln :: proc(fmt: string, args: ..any, flush : true) - (bytes_written: int) println :: proc(args: ..any, sep : , flush : true) - (bytes_written: int) eprintln :: proc(args: ..any, sep : , flush : true) - (bytes_written: int)printf/printfln输出到标准输出os.stdouteprintln输出到标准错误os.stderr格式化状态由Info结构体承载fmt.odin其中Info_State记录了minus左对齐、plus正号、space、zero零填充、hash备用格式、width、prec精度等格式化标志对应%d、%-5s、%08x等 C 风格格式串底层通过core:io.Writer抽象输出目标因此同一套格式化逻辑可复用于 stdout、stderr、文件、字符串缓冲sprintf系等。fmt包还提供用户自定义格式化器机制User_Formatter :: #type proc(fi: ^Info, arg: any, verb: rune) - bool通过fmt.set_user_formattersfmt.register_user_formatter注册某类型专属的格式化过程使fmt.println(x)能以自定义方式输出任意类型完整用法示例见 fmt.odin 中的注释代码。Nightly 构建与持续集成README 推荐通过官方 nightly 构建获取最新编译器。仓库 ci/nightly.py 展示了该流水线的实现它面向 Backblaze B2 对象存储提供三个子命令artifact 平台前缀 产物路径将构建产物打包并上传命名规则为odin-{platform}-nightly{YYYY-MM-DD}Linux/macOS 为.tar.gzWindows 为.zip包内文件置于dist/前缀下prune按DAYS_TO_KEEP环境变量清理过期产物json生成并上传nightly.json索引文件记录每个日期产物包的下载 URL、SHA1 与字节大小供官方 nightly 页面渲染。流水线所需的凭据与配置通过APPID、APPKEY、BUCKET、DAYS_TO_KEEP等环境变量注入构建触发由 CI 配置如 GitHub Actions 的ci.yml驱动。注意事项与现状README 末尾给出了一个重要警告The Odin compiler is still in development.Odin 编译器仍处于活跃开发阶段这意味着语言规范与编译器行为可能随版本演进生产环境使用时应锁定具体版本并优先参考当前仓库 src/ 与 tests/ 中的实现与测试用例验证行为。对学习者而言建议从 examples/demo/demo.odin 逐节阅读、对照 odin.ebnf 语法定义并结合core标准库源码如 core/fmt、core/os深入理解其惯用法——这正是官方推荐的Overview → Examples → Packages学习路径在仓库内的落地形态。【免费下载链接】OdinOdin Programming Language项目地址: https://gitcode.com/GitHub_Trending/od/Odin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考