编译器编程语言【免费下载链接】cangjie_compiler仓颉编译器源码及 cjdb 调试工具。项目地址https://gitcode.com/Cangjie/cangjie_compiler点击查看免费下载仓颉编程语言编译器cangjie_compiler是仓颉语言官方开源的编译器实现涵盖从源码解析、中间表示优化到机器码生成与调试的完整编译链路。本文以仓库根目录的 README_zh.md 为主体骨架结合 build.py、doc/Standalone_Build_Guide.md 等源码与构建脚本系统讲解其整体架构、目录组织、平台支持现状并给出从源码完成编译、安装、验证与运行单元测试的完整实操流程。读者读完本文后将能够独立克隆并构建 cjc 编译器、理解各构建选项的含义并对编译器内部各阶段词法、语法、语义、CHIR、LLVM IR的职责与对应源码位置形成清晰的认知。一、仓库定位与组成本仓提供仓颉编译器相关源码整体包含两部分编译器前端和LLVM 开源修改部分后者包括 LLVM 编译器后端、opt 优化器、llc、ld 链接器以及调试器等。开源组件依赖说明可参考 第三方库说明。仓颉语言本身是一种面向全场景应用开发的通用编程语言兼顾开发效率和运行性能具有语法简明高效、多范式编程、类型安全等特点更多语言特性介绍见仓颉语言开发指南与仓颉编程语言白皮书在仓颉官方文档站发布。从源码结构看前端编译器源码集中在 src 目录并配套 include/cangjie 头文件目录、unittests 单元测试目录以及 cmake、integration_build、schema、third_party 等构建与依赖目录。二、系统架构前端、LLVM 后端与 OS 三层整体架构分为三层前端Frontend、LLVM编译器后端及工具链与OS操作系统平台层。2.1 前端从源码到中间表示的完整流水线前端负责将仓颉源码从文本转换为中间表示涵盖词法、语法、宏、语义等分析确保代码结构和语义正确为后端生成目标代码做好准备。该模块依赖 mingw-w64 用以支持 Windows 平台仓颉能力为用户生成最终可调用 Windows API 的可执行二进制文件同时依赖 libboundscheck 提供安全函数库访问。前端内部可进一步划分为以下阶段词法分析将仓颉源码分解为有意义的记号Token。对应源码位于 src/Lex核心实现在 src/Lex/Lexer.cpp 与 src/Lex/LexerImpl.cpp记号定义在 include/cangjie/Lex/Tokens.inc。语法分析根据仓颉语法规则将记号序列构建为抽象语法树AST反映程序结构。对应源码位于 src/Parse入口为 src/Parse/Parser.cpp。语义分析对 AST 进行类型检查、类型推断、作用域分析等确保程序语义正确。对应源码位于 src/Sema包含类型检查、泛型实例化、继承检查等子目录。名称修饰Mangle负责对仓颉符号进行名称修饰同时包含 demangler 反向解析工具。对应源码位于 src/Mangle反向解析工具位于 demangler含 CangjieDemangle、Demangler 等实现。包管理负责管理和加载代码模块处理依赖关系与命名空间隔离支持多模块协同开发依赖 flatbuffer 三方库能力进行序列化和反序列化。对应源码位于 src/ModulesFlatBuffers Schema 定义在 schema如 schema/CjoFormat.fbs。元编程宏展开处理代码中的宏定义和宏调用实现代码生成和复用。对应源码位于 src/Macro。条件编译通过预定义或者自定的条件进行编译。对应源码位于 src/ConditionalCompilation。CHIR 生成及优化CHIR 为 Cangjie High Level IR此模块将 AST 转换为编译器中间层表示并进行优化。对应源码位于 src/CHIR包含 AST2CHIR 转换、Analysis 分析、Optimization 优化、Interpreter 解释器等子模块。LLVM IR 代码生成将中间表示CHIR翻译为 LLVM IR准备生成目标机器码LLVM BitCode。对应源码位于 src/CodeGen如 src/CodeGen/EmitPackageIR.cpp 负责包级 IR 发射。此外编译器流程由 src/Driver流程驱动用于启动前端以及调用后端命令、src/Frontend编译器实例类组织编译器流程与 src/FrontendTool提供给周边工具的编译器实例类共同组织。从 src/main.cpp 的入口逻辑可以看到当程序以cjc-frontend符号链接名被调用时会直接进入ExecuteFrontend前端模式执行否则进入 Driver 模式。2.2 LLVM 后端优化、代码生成、链接与调试LLVM 层包括编译器后端以及相关工具链后端接收前端生成的中间表示经过优化、生成目标平台机器码并通过链接器整合为可执行文件opt 优化器对 LLVM IR 进行多种优化处理如常量折叠、循环优化等提高生成代码的执行效率和质量。llc 编译器将优化后的 LLVM IR 转换为目标平台的机器码适配不同硬件架构。ld 链接器将多个目标文件和依赖库链接为最终的可执行文件解决符号引用生成可部署的程序产物。调试器cjdb提供仓颉语言相关的调试能力基于 LLDB 实现可通过构建选项--build-cjdb启用。LLVM 层当前基于开源版本 llvmorg-15.0.4对应 commit 5c68a1cb123161b54b72ce90e7975d95a8eaf2a4修改实现修改内容以 llvmPatch.diff patch 文件形式提供详见 third_party/README.md。2.3 OS 平台层与交叉编译能力仓颉编译器及 LLVM 相关工具链当前支持在如下平台运行Windows x86-64、Linux x86-64/AArch64、Mac x86/arm64鸿蒙平台正在开发中。除可 native 编译出上述平台产物外仓颉编译器还支持交叉编译出ohos-aarch64平台二进制产物详细指导见仓颉 SDK 集成构建指导书与下文平台支持计划。三、目录结构从顶层到源码模块仓库整体目录组织如下与 README_zh.md 中的结构一致/cangjie_compiler ├── cmake # cmake文件夹用于保存构建辅助脚本 ├── demangler # 符号还原 ├── doc # 文档 ├── figures # 文档相关图片 ├── include # 头文件文件夹 ├── integration_build # 仓颉SDK集成构建脚本 ├── schema # 用于保存 FlatBuffers Schema 序列化数据结构文件 ├── src # 编译器源码文件夹 │ ├── AST # 抽象语法树相关内容 │ ├── Basic # 编译器基础组件 │ ├── CHIR # 编译器中间层该阶段对代码进行优化分析 │ ├── CodeGen # 代码生成将 CHIR 翻译为 LLVMIR │ ├── ConditionalCompilation # 条件编译 │ ├── Driver # 编译器流程驱动用于启动前端以及调用后端命令 │ ├── Frontend # 编译器实例类组织编译器流程 │ ├── FrontendTool # 提供给周边工具的编译器实例类 │ ├── IncrementalCompilation # 增量编译 │ ├── Lex # 词法分析 │ ├── Macro # 宏展开 │ ├── main.cpp # 编译器入口 │ ├── Mangle # 符号改名 │ ├── Modules # 包管理模块 │ ├── Option # 编译器选项控制 │ ├── Parse # 语法分析 │ ├── Sema # 语义分析 │ └── Utils # 公共组件 ├── third_party # 依赖的三方库构建脚本及依赖库 patch 文件 │ ├── cmake # 三方库 cmake 构建辅助脚本 │ ├── llvmPatch.diff # llvm 后端 patch 文件包含 llvm 及 cjdb 相关源码 │ └── flatbufferPatch.diff # flatbuffer 源码 patch 文件 ├── unittests # 单元测试用例 └── utils # 编译器周边组件对照实际源码可以进一步印证各目录职责src/AST 存放抽象语法树节点实现头文件位于 include/cangjie/AST其中 include/cangjie/AST/ASTKind.inc 与 include/cangjie/AST/TypeKind.inc 定义了 AST 节点与类型体系的枚举种类。src/IncrementalCompilation 提供增量编译能力包含 ASTDiff、依赖序列化等实现。src/Option 控制编译器选项选项表定义于 include/cangjie/Option/Options.inc。cmake 目录下按目标平台拆分工具链文件如 linux_x86_64_toolchain.cmake、mingw_x86_64_toolchain.cmake、ohos_aarch64_clang_toolchain.cmake 等为各平台构建提供 CMake 支持。四、构建约束与平台支持计划当前暂不支持 Windows 环境内构建仓颉编译器产物需要在 Linux 环境内通过交叉编译方式生成可在 Windows 平台运行的编译器产物详见仓颉 SDK 集成构建指导书。仓库公开的平台支持计划如下以 README_zh.md 记录为准构建平台演进计划 2025 Q4 支持 Windows Native 构建仓颉编译器产物。编译器运行平台演进计划 2026 Q2 支持 OHOSPC平台可运行仓颉编译器。仓颉应用运行平台演进计划 2025.10.20 支持仓颉应用在 OHOS-ARM32 平台运行反射、动态加载、部分编译器优化等高级特性计划 2025 Q4 支持。五、编译构建实战注意本章节描述如何从源码构建仓颉编译器。如果您期望使用仓颉编译器编译仓颉源代码或项目请忽略此章节直接从仓颉官方网站下载发布包使用或参考下文“集成构建指导”章节进行集成构建。5.1 构建准备在各个平台构建编译器所需的环境要求及软件依赖请参阅 独立构建指导书。该文档覆盖 Linux 上构建 Linux 编译器、MacOS 上构建 MacOS 编译器、Linux 上交叉编译 Windows 平台编译器、Linux/MacOS 上交叉编译 Android 基础库、MacOS 上交叉编译 iOS 基础库等场景并给出各场景的环境准备说明如 Ubuntu 22.04、Macos 14 Sonoma与build.py全部二级选项的帮助信息。下载源码git clone https://gitcode.com/Cangjie/cangjie_compiler.git -b main;5.2 构建步骤cd cangjie_compiler python3 build.py clean python3 build.py build -t release python3 build.py install三个子命令的职责如下clean命令用于清空工作区临时文件清理build、output等目录及日志build命令开始执行编译选项-t即--build-type指定编译产物类型可以是release、debug或relwithdebinfo。对应到 build.py 中的BuildType枚举Debug/Release/RelWithDebInfo会以-DCMAKE_BUILD_TYPE形式传递给 CMakeinstall命令将编译产物安装到output目录下。构建完成后output目录结构如下./output ├── bin │ ├── cjc # 仓颉编译器可执行文件 │ └── cjc-frontend - cjc # 仓颉编译器前端可执行文件 ├── envsetup.sh # 一键环境变量配置脚本 ├── include # 编译前端对外头文件 ├── lib # 仓颉编译产物依赖库子文件夹按照目标平台拆分 ├── modules # 仓颉标准库 cjo 文件预留文件夹子文件夹按照目标平台拆分 ├── runtime # 仓颉编译产物依赖运行时库 ├── third_party # llvm 等第三方依赖二进制及库 └── tools # 仓颉工具文件夹其中cjc-frontend是指向cjc的符号链接与 src/main.cpp 中按可执行文件名分发到前端模式或 Driver 模式的逻辑对应。Linux 环境下可通过source ./output/envsetup.sh命令应用 cjc 环境执行cjc -v查看当前编译器版本信息及 cjc 的平台信息source ./output/envsetup.sh cjc -v输出如下Cangjie Compiler: x.xx.xx (cjnative) Target: xxxx-xxxx-xxxx版本串与 Target 串由 build.py 中的generate_version_tail函数生成(cjnative)表示 native 后端Target 形如架构-vendor-操作系统如x86_64-unknown-linux-gnu。5.3 执行 unittest 单元测试单元测试用例在编译构建时默认构建可通过--no-tests关闭构建成功后通过以下指令验证python3 build.py test从 build.py 的unit_test实现看该命令实际是在构建目录中执行ctest --output-on-failure。测试用例源码分布在 unittests 目录下覆盖 AST、Basic、CHIR、CodeGen、Lex、Parse、Sema、Macro、Modules、Driver、IncrementalCompilation 等模块。5.4 更多构建选项详解如需了解更多构建选项请参阅 build.py 构建脚本 或通过--help选项查看python3 build.py --help结合 build.py 的命令行解析逻辑与 独立构建指导书各二级选项的完整说明整理如下clean选项用于清理build、output等文件夹含各交叉编译产物的output-target目录。build选项用于构建工程文件主要二级选项包括选项取值说明-t, --build-typerelease、debug、relwithdebinfo指定编译产物类型--print-cmd-仅打印构建脚本配置的完整 cmake 命令而不实际执行-j, --jobs JOBS整数并发执行构建任务数0 表示默认--link-jobs LINK_JOBS整数并发执行链接任务数0 表示默认--enable-assert-使能编译器断言与自检仅在 release 模式下有效供开发调试编译器使用--no-tests-不编译 unittest 用例代码--disable-stack-grow-feature-关闭 cjnative 后端的栈增长功能该功能默认开启但会带来代码体积与性能开销--hwasan-开启编译器源码硬件 asan仅当目标为 ohos-aarch64 或 ohos-x86_64 时可用--gcc-toolchain路径指定 gcc 工具链用于交叉编译--target见下指定目标平台描述构建对应平台的标准库-L, --target-lib路径指定目标平台所需链接的依赖库路径--target-toolchain路径指定编译工具所在路径交叉编译时使用该路径下的编译器-I, --include路径指定目标平台头文件查找路径--target-sysroot路径传递 sysroot 内容到 C/C 编译器的--sysroot选项--productall、cjc、libs指定构建目标产物all包含 cjc 与 libscjc仅编译器二进制libs为标准库依赖的编译器库。未指定时本机构建默认all交叉编译默认libs--build-cjdb-开启构建仓颉调试器 cjdb基于 lldb--cjdb-disable-python-构建不带 python 扩展的 cjdb--install-cjdb-script-安装带 python 脚本的 cjdb--use-oh-llvm-repo-使用 OpenHarmony 的 llvm 仓库外加 Cangjie llvm patch 构建而非默认的 cangjie llvm 仓库--cjlib-sanitizer-supportasan、tsan、hwasan构建 sanitizer 版本的仓颉库需配合--productlibs使用--enable-sanitize-option-使 cjc 的--sanitize选项对开发者可见-v, --version版本串指定编译产物版本号如 0.0.1--android-ndk路径指定 Android NDK 路径--target支持的取值以 build.py 中的TARGET_DICTIONARY为准包括native、ohos-aarch64、ohos-arm、ohos-x86_64、windows-x86_64、ios-simulator-aarch64、ios-simulator-x86_64、ios-aarch64、android-aarch64、android31-aarch64、android26-aarch64、android23-aarch64、android23-arm、android-x86_64、android31-x86_64、android26-x86_64。从实现上看build.py 的generate_cmake_defs会根据--target自动选择 cmake 目录下对应的工具链文件如ohos_aarch64_clang_toolchain.cmake、mingw_x86_64_toolchain.cmake、android_aarch64_toolchain.cmake、ios_arm64_toolchain.cmake等并透传CMAKE_BUILD_TYPE、CMAKE_INSTALL_PREFIX、CANGJIE_BUILD_TESTS、CANGJIE_BUILD_CJC、CANGJIE_BUILD_CJDB等 CMake 定义构建器在 Linux/Mac 上优先使用 NinjaWindows 上优先 Ninja、退化为 MinGW Makefiles。install选项用于将编译产物组织到指定目录下--host指定目标平台安装策略取值同--target列表。不带--host时本机构建目录与所有交叉编译 libs 会安装到output目录带--host triple时交叉编译的 cjc 与 libs 会安装到独立的output-target目录。--prefix指定产物安装文件夹路径该选项与--host均未指定时安装到工程目录下output文件夹与--host同时指定时以--prefix为准。test选项执行编译好的 unittest 用例ctest --output-on-failure若编译时指定--no-tests则该选项无作用。5.5 交叉编译示例与集成构建指导结合 doc/Standalone_Build_Guide.md几个典型场景的命令示例如下Linux 上构建 Windows 平台运行的编译器交叉编译cd $WORKSPACE/cangjie_compiler; export CMAKE_PREFIX_PATH${MINGW_PATH}/x86_64-w64-mingw32; python3 build.py build -t release \ --product cjc \ --target windows-x86_64 \ --target-sysroot /opt/buildtools/mingw-w64/ \ --target-toolchain /opt/buildtools/mingw-w64/bin \ --build-cjdb; python3 build.py install --host windows-x86_64;Windows 产物需要拷贝至 Windows 机器后使用./output/envsetup.bat脚本应用环境并执行cjc.exe -v验证。Linux 上构建适用于 Android 平台的基础库交叉编译export ANDROID_NDK_ROOT/opt/android-ndk-r25c; python3 build.py build -t release --build-cjdb --no-tests; python3 build.py build -t release \ --target android-aarch64 \ --android-ndk ${ANDROID_NDK_ROOT} \ --no-tests; python3 build.py install --host android-aarch64;MacOS 上构建适用于 iOS 平台的基础库交叉编译python3 build.py build -t release --no-tests --build-cjdb; python3 build.py install; export XCODE_DEVELOPER_DIR/Applications/Xcode.app/Contents/Developer export IOS_SDKROOT${XCODE_DEVELOPER_DIR}/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS17.5.sdk export IOS_SIMULATOR_SDKROOT${XCODE_DEVELOPER_DIR}/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator17.5.sdk export TOOLCHAIN_BIN${XCODE_DEVELOPER_DIR}/Toolchains/XcodeDefault.xctoolchain/usr/bin python3 build.py build -t release \ --product libs \ --target ios-aarch64 \ --target-sysroot ${IOS_SDKROOT} \ --target-toolchain ${TOOLCHAIN_BIN}; python3 build.py install;集成构建若希望将仓颉编译器与标准库、运行时等按 SDK 方式整体构建请参阅仓颉 SDK 集成构建指导书cangjie_build 仓库仓库内的 integration_build 目录也提供了相关构建脚本如 integration_build/scripts/cjnative/build_native.sh、build_windows-x86_64.sh 等。六、开源依赖与协议本项目基于 Apache-2.0 with Runtime Library Exception 协议开源详见 LICENSE。使用的开源软件声明如下开源软件名称开源许可协议使用说明使用主体使用方式mingw-w64Zope Public License V2.1仓颉 Windows 版本 SDK 携带 Mingw 中的部分静态库文件与仓颉代码生成的目标文件链接在一起为用户生成最终的可以调用 Windows API 的可执行二进制文件编译器集成到仓颉二进制发布包中LLVMApache 2.0 with LLVM Exception仓颉编译器后端基于 llvm 开发实现编译器集成到仓颉二进制发布包中flatbuffersApache License V2.0仓颉的 cjo 文件和宏实现依赖该软件进行序列化和反序列化编译器和标准库(std.ast)集成到仓颉二进制发布包中libboundscheckMulan Permissive Software License Version 2编译器等相关代码基于该软件实现编译器、标准库、扩展库集成到仓颉二进制发布包中各依赖的版本来源与构建方式详见 third_party/README.mdLLVM 基于 llvmorg-15.0.4commit 5c68a1cb123161b54b72ce90e7975d95a8eaf2a4通过 llvmPatch.diff 携带仓颉侧修改flatbuffers 通过 schema/install_flatbuffers_cangjie.cmake 等脚本以 CMake 子目标方式引入构建。其他构建依赖使用情况可参考仓颉 SDK 集成构建指导书中的构建依赖工具说明。七、参与贡献欢迎开发者们提供任何形式的贡献包括但不限于代码、文档、issue 等。仓库同时维护了多个配套开源仓包括仓颉语言文档cangjie_docs、运行时cangjie_runtime、工具链cangjie_tools、标准扩展库cangjie_stdx、SDK 集成构建cangjie_build以及测试仓cangjie_test可结合使用以构建完整的仓颉开发与验证环境。赞分享编译器编程语言【免费下载链接】cangjie_compiler仓颉编译器源码及 cjdb 调试工具。项目地址https://gitcode.com/Cangjie/cangjie_compiler点击查看免费下载相关推荐仓颉标准库源码构建实战build.py 三步完成编译、交叉编译与构建系统底层解析仓颉标准库源码构建实战build.py 三步完成编译、交叉编译与构建系统底层解析 本篇技术指南以 stdlib/build_std_zh.md https:/编程语言语言运行时标准库垃圾回收并发编程仓颉-JavaScript 互操作库 cangjie_js_interop系统架构、编译构建与跨语言调用实战仓颉 JavaScript 互操作库 cangjie_js_interop系统架构、编译构建与跨语言调用实战 本篇围绕开源仓库 cangjie_js_inteOpenHarmony仓颉编译器深度剖析从源码架构到编译全流程解析仓颉编译器深度剖析从源码架构到编译全流程解析 引言为什么选择仓颉编译器 你是否在寻找兼顾开发效率与运行性能的全场景编程语言解决方案作为一款通用编程语言编译器编程语言创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考