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, 云安全监控, 代码格式化, 前端编译, 威胁情报, 安全专业人员, 工具链, 开发者工具, 性能优化, 检测绕过, 测试工具, 编译器, 自动导入, 逆向工具, 静态分析