首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 归档 标签 关于

Clice v1.0 发布:欢迎来到现代 C++

2026-11-16 1 阅读 约6分钟阅读 molenzwiebel
分享:
字号:
clice 最近达到了 1,000 次提交,这是该项目的一个特殊里程碑。自 2026 年 7 月 19 日以来,clice 一直在发布夜间版本,并经历了大约四个月的 alpha 测试,由于早期用户的实际反馈,修复了大量错误。与此同时,我为 clice 构建了严格的测试系统,并在许多真实的开源项目中进行了广泛的测试,跟踪并修复了他们发现的问题。这意味着什么?现在每个核心功能都很稳定,您在日常使用中很少遇到问题。所以我认为现在是发布第一个稳定版本的时候了。今天这个项目看起来和两年前的《新C++语言服务器的设计与实现》有很大不同,这可能是我第一次广泛推广它,所以请让我再次向大家介绍一下!这是我在过去的两年半里倾注了心血的项目,是我最引以为傲的工作,是最令我兴奋、无数次让我悲伤和焦虑的工作,也是我在短暂的一生中承担的最雄心勃勃的事情。什么是克利西?简而言之,clice 是一个用现代 C++ 编写的 C/C++ 语言服务器,但它不仅仅是一个语言服务器。它仍然基于 LLVM/Clang 构建,但与同样基于 Clang 的 clangd 和 ccls 不同,clice 从头开始​​重新设计,以解决这些服务器多年来未解决的架构问题。它完全用 C++23 编写,本身就是现代 C++ 最佳实践的一个例子,所有主要的现代 C++ 功能都很好地结合在一起:完全用 C++20 协程编写,使用我们自己的基于 libuv 的结构化并发异步库来实现复杂的异步逻辑。它是一个复杂的并发程序,在主线程上运行事件循环,同时协调多个进程 (IPC) 和多个线程。完全使用 C++20 命名模块和 C++23 import std 编写,并且完全自托管:第三方库的模块包装器由 clice modulize 自动生成,并且 clice 在自己的代码库上平稳运行,以提供模块感知的语言服务。使用基于模板和 C++20 概念构建的静态反射进行跨格式的所有序列化和反序列化,包括 TOML、JSON、bincode、blob 和命令行参数,并具有类似 Rust 宏的声明性注释和零样板文件。整个代码设计都是面向数据的,除了 Clang 需要的回调接口之外几乎没有虚函数。大量使用现代 C++ API,如 std::format 、 std::expected 、 std::ranges 和 std::views ,避开过时的遗留 C++98/11 API。由 Bazel 提供支持的完全密封、可重复的构建,使用统一的 xclang 工具链进行编译,以实现一致的跨平台交叉编译工作流程。编译的二进制文件经过严格优化(PGO + LTO),并且构建工件不依赖于系统库之外的任何内容。人们总是在争论现代 C++ 功能(例如模块)是否真正适合实际工作。 clice的回答是:可以,当然可以,完全可用!它们适用于像 clice 这样具有数十万行代码的复杂软件。也许这就是我们一直希望的现代C++的样子。也就是说,周围的生态系统现在确实很不方便,要让整个工作流程端到端运行,我需要付出巨大的努力来跟踪问题并调整一切。语言服务器 以下是 clice 的主要功能概述: 多进程编译:clice 在模仿现代 Web 浏览器的进程池中编译代码,而 clangd 使用多线程。为什么要多进程?因为 C++ 太复杂了,并且在某些极端情况下,编译器很容易崩溃或泄漏内存。对于编辑过程中不完整的代码尤其如此:巨大的下游用户群在完整的代码上测试编译器,而很少有人在半编写的代码上测试它们,编译器大多依靠尽力而为的启发式方法。在 clangd 中,编译器崩溃会导致整个服务器崩溃并强制重新启动。在 clice 中,编译发生在独立的子进程中:失去一个工作进程不会影响服务器的其余部分,因此转到定义、突出显示和其他服务继续工作。它还使管理内存使用和安排编译优先级变得更加容易,从而减少不必要的资源消耗。模块和共享缓存:clice 完全支持 C++20 命名模块。您所需要的只是一个包含所有模块文件的compile_commands.json,clice 会自行扫描依赖项,并根据需要延迟构建所需的模块,无论您的构建系统或编译器如何,完全支持模块完成、突出显示、转到定义、悬停等。内置的 PCH 和 PCM 也缓存在本地磁盘上,以便跨会话重复使用。相比之下,clangd 仅提供非常有限的模块支持,并且没有
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱