前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C,C++,还是 Rust?

C,C++,还是 Rust?

作者头像
roseduan
发布2023-12-11 12:18:07
2910
发布2023-12-11 12:18:07
举报

最近工作中,对我司的 MPP 数据库产品 (https://github.com/cloudberrydb/cloudberrydb) 进行存算分离的改造,我们的组件最开始是 C++ 写的,但是由于产品本身是基于 Postgres (C 语言),所以又引入了非常多的 C 代码。

几个月下来,同事之间的代码风格不一,并且对 C++ 的熟悉程度参差不齐,于是我们的代码看起来非常的不伦不类,Leader 提出了重构的想法。

然后我也即兴发了个朋友圈问问了票圈好友们的看法,大家的结论是:

我简单统计了一下,大概是这样的:

  • C 10 票
  • C++ 3 票
  • Rust 15 票

结果还真是有点出乎我的意料,也简单来谈谈对这几种语言的看法,顺便聊聊最后的选型。

C

C 语言大家其实都耳熟能详了,多多少少都接触到,但是目前能够精通的人还是少。主要是它比较底层,诞生在 Unix 操作系统这样的背景之下,可以说是现代编程语言的鼻祖之一了。

它的语法比较简洁,性能极高,并且提供对计算机底层的直接访问,拥有强大的指针,可以用它玩出很多黑魔法,但指针也是一把双刃剑,无比强大的同时又非常的危险,需要手动管理内存,非常容易导致内存泄漏,其实后续的编程语言,都是在手动和自动内存管理之间进行权衡。

C 语言的一些库用起来可能不是非常的方便,而且自带的标准库功能很少,堪称上古时期的 make、Makefile 让人叫苦不迭,包管理也是一塌糊涂。

但是在几十年前,C 语言仍然是备受青睐的一门语言,很多早些时期开发的数据库系统,都是用 C 写的,比如 Postgres、SQLite、Redis、LMDB、Memcached 等等。

只不过现在的新兴的系统,估计很少会使用 C 语言去从零开始构建了。

C++

C++ 在 C 的基础之上发展而来,拥有现代语言特性,面向对象、泛型、智能指针,丰富的 STL 标准库等等,性能同样出色。但是 C++ 经历了几十年的发展迭代,功能及其庞杂,想要写好非常的不容易,对编程功底的要求较高。

无论是几十年前,还是十几年前,甚至是现在,C++ 始终都是构建数据库系统一个很好的选择,非常多知名的数据库产品都是使用 C++ 的,比如 Mysql、MongoDB、ClickHouse、FoundationDB、RocksDB、DuckDB 等等。

Rust

Rust 是近些年来热度很高的一门新兴编程语言,之前的 Java、Go、Python、C# 等等,都无一例外的使用自动内存管理,但是由此带来了 GC 的消耗,性能会受到影响,这也让它们不太可能成为一个高性能底层系统的选择。

而 Rust 则另辟蹊径,使用所有权、生命周期巧妙的解决了内存管理的问题,不需要手动管理内存,也不用担心内存泄漏等问题。

Rust 的创新在近些年来的编程语言中还是让人眼前一亮的,但是学习的成本会比较高,公认的不太好入门。

近些年来,有一些新兴的数据库系统开始尝试使用 Rust 来进行构建了,比如 neon、databend、risingwave、SurrealDB、TiKV 等。


说完了这三种语言的一些特性和现状,回到我们公司项目的选型上面来说,其实能考虑的点还是挺多的。

Rust 确实是一个非常不错的语言,但是我们会首先排除它,因为我们团队的经验大多是在 C/C++。如果从一开始设计的时候,那么有可能会考虑 Rust,但是我们现在的项目是已经用 C++写了,所以再用 Rust 的成本会很高。但如果是一些从零开始,没有任何历史包袱的系统,采用 Rust 会是一个非常好的选择。

从我的朋友圈留言看,Rust 呼声非常高,这也从侧面印证了它的受欢迎程度,我个人也比较喜欢 Rust。

再来看 C++,唯一的缺点是它太复杂了,没有几年经验很难写出高质量的 C++代码,我们 team 的人对 C++的掌握程度不一,有的熟练,有的并不太熟悉,并且没有在一开始统一代码风格,所以项目看起来比较的乱。C++ 的一大优点是开发效率比 C 更高,一些语法写起来比 C 快得多,也好用得多,但是后期如果维护不好的话,很容易背负技术债务。

综合考虑,我们最终还是选择了 C 语言,我们的产品背靠 Postgres,所以 C 语言成了自然而然的选择。

虽说开发阶段,C 语言会稍微拖慢一些节奏,但是会踩的坑比较少,因为我们可以直接参考 Postgres 的一些方法、代码风格,甚至可以直接使用 Postgres 的 MemoryContext、异常处理等封装好的特性。

这能够在很大的程度上弥补 C 语言开发带来的效率以及内存安全问题,让我们把主要的精力集中在 feature 的开发上面,而不是像 C++ 一样在语言层面变得小心翼翼。

技术选型,其实需要综合各种因素进行考虑,比如是否有可参考的系统,团队的技术偏向,语言本身的性能、安全性、开发效率等,是否有沉重的历史包袱等等。

我的想法简单概括就是,如果我们的系统是承继了另一个数据库,比如 Mysql,那么大概率会使用 C++,如果是 Postgres,那么 C 也是一个不错的选择。当然一些不涉及到内核修改的插件,可以选择任意语言进行开发。

如果是新兴的数据库系统,没有任何的历史包袱,那么 Rust 会成为越来越多人的选择。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 roseduan写字的地方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C
  • C++
  • Rust
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档