makekryl/vanadium

GitHub: makekryl/vanadium

Vanadium 是一个现代化的 TTCN-3 语言工具集,通过极快的编译器前端和语言服务器提供代码补全、格式化及静态分析功能,旨在解决现有 TTCN-3 开发工具性能低下的问题。

Stars: 3 | Forks: 0

# Vanadium Vanadium 是一个现代化的免费开源 TTCN-3 工具集,围绕一个从零开始编写的_非常_快速的编译器前端构建,并始终注重性能。 它提供: - 一个功能完整的 **language server**,支持 VS Code 和其他编辑器,支持自动导入、ASN.1 等功能 - 一个易于集成的 **static code analyzer**,用于识别并报告有问题的代码模式 - 一个有主见的 **formatter**,用于保持代码风格整洁,避免代码风格讨论及相关的合并冲突 目前,Vanadium 并不_取代_现有解决方案,而是_补充_它们。关于编译器和运行时的概念已初步成型,可能会在当前正处于积极开发阶段的编译器前端稳定后开始工作。 ## 入门指南 本章节正在建设中。 ### 安装 二进制分发版即将推出。目前,Vanadium 必须手动构建;请参阅下方的相关章节。 ### 声明项目 为了让 Vanadium 理解你的项目结构,你必须声明一个项目清单。 在项目根目录下创建一个名为 `.vanadiumrc.toml` 的文件。 示例: ``` root = true [project] name = "my-project" subprojects = [ "subproject-1", "subproject-2" ] [external] external-project-a = { path = "deps/a" } external-project-b = { path = "deps/b", references = [ "external-project-a" ] } ``` 接下来,在 `./subproject-1` 和 `./subproject-2` 目录内分别创建一个 .vanadiumrc.toml 文件: ``` root = false [project] name = "subproject-1" references = [ "subproject-2", "external-project-b" ] ``` “常规”项目与外部项目的区别在于,外部项目不必是 Vanadium 项目,它们可能只是包含大量 TTCN-3 文件的目录。 #### 配置工具 Vanadium 工具从工作目录中的清单文件读取其响应选项。 如果省略了某个选项,则使用默认值。 默认值在下面支持的所有值列表中指定。 ##### Formatter ``` [tools.fmt] tab_width = 4 print_width = 80 max_empty_newlines = 2 ``` ## 与其他项目的对比 不幸的是,TTCN-3 生态系统相当缺乏支持,可用的开源工具寥寥无几。截至 2026 年 1 月,这些工具包括: - [Eclipse Titan](https://gitlab.eclipse.org/eclipse/titan/titan.core) - 唯一的开源编译器,也是事实上的标准 - [ntt](https://github.com/nokia/ntt) - 编辑器语言支持,具备一些由快速的 language server 驱动的基本智能功能,但因缺乏真正的语义和类型分析器而受限 - [Titan Language Server](https://gitlab.eclipse.org/eclipse/titan/titan.language-server) - 编辑器语言支持,但存在性能限制,对于大型代码库来说不切实际 最初,Vanadium 项目的目标是提供一个高效且功能完整的 language server,以简化开发人员的工作,同时保持低内存占用。以下是 language servers 的性能对比,在一个大型项目(约 600 个文件,约 250K 行代码)上使用 4 个线程进行测量: | | vanadium | ntt | Titan LS | | ------------------ | -------- | ----------- | ------------- | | Startup time | 0.45s | 1.1s | 73s | | Memory usage | 90 MB | 350 MB | 3 GB | | ASN.1 support | + | - | partial | | Autocompletion | + | weak | weak/too slow | | Inlay Hints | + | partial | partial | | Diagnostics | + | syntax only | + | | Semantic Highlight | + | weak | + | | Signature Help | + | - | unstable | | Go to Definition | + | weak | unstable | | Go to References | WIP | weak | unstable | | Formatter | + | - | - | | Written in | C++ | Go | Java | ## 贡献 Vanadium 是一个根据 BSD 3-Clause License 许可的非商业项目,我们很高兴接受各类贡献。 ### 快速开始 Vanadium 使用现代 C++23 编写,并使用 CMake 作为构建系统。Python 被用作开发目的的辅助语言,[pyinvoke](https://github.com/pyinvoke/invoke) 用于项目任务编排,[uv](https://github.com/astral-sh/uv) 用于 Python 包和环境管理。 构建项目需要满足以下条件: - `cmake >= 3.31` - `clang >= 19` 或 `gcc >= 14` - `python >= 3.11` 用于生成 AST 相关内容 - `flex` 和 `bison` 用于生成 ASN.1 parser - `llvm >= 19` 用于构建编译器 此外,你可能需要: - `ninja` 作为更快的 CMake 构建后端 - `gdb` 和 `valgrind` 用于开发 - `clang-format >= 19` 仓库中有一个 [devcontainer](https://containers.dev/),其中包含了你可能需要的一切。 使用 `uv` 设置虚拟环境并安装依赖: ``` $ uv sync $ source .venv/bin/activate ``` 这样你就可以使用 `inv` 调用任务了。你可以通过执行以下命令列出所有可用任务来检查其是否可用: ``` (venv) $ inv --list ``` #### 构建和启动工具 要构建像 linter 或 formatter 这样的命令行工具,你可以使用以下命令(以 `vanadium_tidy` 为例): ``` $ inv build --target vanadium_tidy --sanitizers --reconfigure ``` 启动: ``` $ ./out/build/clang-debug-sanitizers/bin/tidy/vanadium_tidy ``` 关于 `inv build` 标志的说明: - `--reconfigure` 在构建前运行 CMake 重新配置,如果不需要可以跳过 - `--sanitizers` 向活动的 CMake preset 追加 `-sanitizers` 后缀,从而选择相应的 preset(参见 `CMakePresets.json`) - `--toolchain ` - 选择活动的 toolchain #### 构建和启动 language server 在这方面,Vanadium 被组织为一个 monorepo,即 language server 和 Visual Studio Code 扩展都在此处开发。 ``` $ inv build --target vanadiumd --sanitizers --reconfigure ``` 现在你可以启动该扩展了。 ##### 调试 language server 如果 language server 在启动后立即崩溃,调试它可能不是一件愉快的事情。在 playground 工作区内,创建 `.vscode/settings.json` 并添加 ``` "vanadiumd.arguments": [ "--wait-dbg" ] ``` 在它崩溃之前,你将有时间将 debugger 附加到该进程。 #### 运行测试 CMake 的 CTest 被用作测试运行器,[gtest](https://google.github.io/googletest/) 被用作测试框架。 测试分为两种——单元测试和端到端测试。单元测试放置在相应目标的目录中,端到端测试放置在 `test/` 目录中。 - 要运行单元测试: ``` $ inv test.unit ``` - 要运行端到端测试: ``` $ inv test.e2e ``` 要使用正则表达式过滤或排除特定测试,可以使用标志 `-f` 和 `-e`。 ### 设计 Vanadium 的核心是其编译器前端,该前端专为 language server 开发而设计。AST 的内存占用非常低,且编译器前端支持增量分析,同时具有高度并行性。 以下是一些旨在保持 Vanadium 快速的核心设计原则: - 如果动态内存分配不可避免,应批量分配内存并尽可能重用 - Lambda 表达式很有用:相比返回动态分配的集合,更倾向于通过回调消费结果,尤其是当不需要所有结果时 - 缓存并不总是有益的,尤其是当它增加内存使用量时 - 通过将小函数放在头文件中来内联它们,但将较大的函数保留在源文件中,以避免减慢构建时间 - 使用 `if constexpr` 在编译时对热路径上的函数进行参数化,并通过作为模板参数注入的编译时结构传递配置 ## 致谢 如果没有这些精彩的开源项目,构建本项目将是不可能的: - **[nokia/ntt](https://github.com/nokia/ntt)** - _ntt_ 提供了坚实的基础,其高性能的手写递归下降 TTCN-3 parser 被重写为 C++ 并进一步优化 - **[vlm/asn1c](https://github.com/vlm/asn1c)** - 如果没有 _asn1c_ parser 和从其语义分析器中借鉴的思想,添加具有复杂语法和令人费解的构造的 ASN.1 支持将令人难以忍受 - **[stephenberry/glaze](https://github.com/stephenberry/glaze)** - _glaze_ 是一个高效、现代的 C++ JSON 和反射库,使构建 language server 变得简单而轻松 - 以及更多:**[fmtlib/fmt](https://github.com/fmtlib/fmt)**、**[Neargye/magic_enum](https://github.com/Neargye/magic_enum)**、**[p-ranav/argparse](https://github.com/p-ranav/argparse)**、**[getml/reflect-cpp](https://github.com/getml/reflect-cpp)**、**[uxlfoundation/oneTBB](https://github.com/uxlfoundation/oneTBB)** *Made with ❤️ without AI*
标签:ASN.1, Bash脚本, IDE 集成, Language Server Protocol, LSP, TTCN-3, VS Code, 云安全监控, 代码格式化, 前端编译, 威胁情报, 安全专业人员, 工具链, 开发者工具, 性能优化, 检测绕过, 测试工具, 编译器, 自动导入, 逆向工具, 静态分析