You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
post/2024/04/06/zig-cpp/
尽管 Zig 社区宣称 Zig 语言是一个更好的 C (better C),但是我个人在学习 Zig 语言时经常会“触类旁通”C++。在这里列举一些例子来说明我的一些体会,可能会有一些不正确的地方,欢迎批评指正。
“元能力” vs “元类型” 在我看来,C++的增强方式是希望赋予语言一种“元能力”,能够让人重新发明新的类型,使得使用 C++的程序员使用自定义的类型,进行一种类似于“领域内语言”(DSL)编程。一个通常的说法就是 C++中任何类型定义都像是在模仿基本类型int。比如我们有一种类型 T,那么我们则需要定义 T 在以下几种使用场景的行为:
1 2 3 4 5 T x; //构造 T x = y; //隐式拷贝构造 T x{y}; //显示拷贝构造 x = y; //x的类型是T,复制运算符重载,当然也有可能是移动运算符重载。 //以及一大堆其他行为,比如析构等等。 通过定义各种行为,程序员可以用 C++去模拟基础类型int,自定义的创造新类型。但是 Zig 却采取了另一条路,这里我觉得 Zig 的取舍挺有意思,即它剥夺了程序员定义新类型的能力,只遵循 C 的思路,即struct就是struct,他和int就是不一样的,没有必要通过各种运算符重载来制造一种“幻觉”,模拟int。相反,Zig 吸收现代语言中最有用的“元类型”,比如slice,tuple,tagged union等作为语言内置的基本类型,从这一点上对 C 进行增强。虽然这样降低了语言的表现力,但是却简化了设计,降低了“心智负担”。
比如 Zig 里的tuple,C++里也有std::tuple。当然,std::tuple是通过一系列的模板元编程的方式实现的,但是这个在 Zig 里是内置的,因此写代码时出现语法错误,Zig 可以直接告诉你是tuple用的不对,但是 C++则会打印很多错误日志。再比如optional,C++里也有std::optinonal,Zig 里只用?T。C++里有std::variant,而 Zig 里有tagged union。当然我们可以说,C++因为具备了这种元能力,当语法不足够“甜”时,我们可以发明新的轮子,但是代价就是系统愈发的复杂。而 Zig 则持续保持简单。
不过话说回来,很多底层系统的开发需求往往和这种类型系统的构建相悖,比如如果你的类型就是一个int的封装,那么即使发生拷贝你也无所谓性能开销。但是如果是一个struct,那么通常情况下,你会比较 care 拷贝,而可能考虑“移动”之类的手段。这个时候各种 C++的提供的幻觉,就成了程序员开发的绊脚石,经常你需要分析一段 C++表达式里到底有没有发生拷贝,他是左值还是右值,其实你在写 C 语言的时候也很少去考虑了这些,你在 Zig 里同样也不需要。
https://ziglang.cc/post/2024/04/06/zig-cpp/
Beta Was this translation helpful? Give feedback.
All reactions