Skip to content

Commit

Permalink
polish zig cpp
Browse files Browse the repository at this point in the history
  • Loading branch information
jiacai2050 committed Apr 8, 2024
1 parent 0e559fd commit 9e070d1
Showing 1 changed file with 9 additions and 7 deletions.
16 changes: 9 additions & 7 deletions content/post/2024-04-06-zig-cpp.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ x = y; //x的类型是T,复制运算符重载,当然也有可能是移动运
不过话说回来,很多底层系统的开发需求往往和这种类型系统的构建相悖,比如如果你的类型就是一个`int`的封装,那么即使发生拷贝你也无所谓性能开销。但是如果是一个`struct`,那么通常情况下,你会比较 care 拷贝,而可能考虑“移动”之类的手段。这个时候各种 C++的提供的幻觉,就成了程序员开发的绊脚石,经常你需要分析一段 C++表达式里到底有没有发生拷贝,他是左值还是右值,其实你在写 C 语言的时候也很少去考虑了这些,你在 Zig 里同样也不需要。
# Zig 语言里,类型是一等成员
# 类型系统
C 语言最大弊病就是没有提供标准库,C++的标准库你要是能看懂,得具备相当的 C++的语法知识,但是 Zig 的标准库几乎不需要文档就能看懂。这其实是因为,在 C++里,类型不是一等成员(first class member),因此实现一些模版元编程算法特别不直观。但是在 Zig 里,`type`就是 first class member,比如你可以写:
C 语言最大弊病就是没有提供标准库,C++的标准库你要是能看懂,得具备相当的 C++的语法知识,但是 Zig 的标准库几乎不需要文档就能看懂。这其实是因为,在 C++里,类型不是一等成员(first class member),因此实现一些模版元编程算法特别不直观。但是在 Zig 里,`type`就是一等成员,比如你可以写:
```zig
const x: type = u32;
```

即,把一个`type`当成一个变量使用。但是 C++里如何来实现这一行代码呢?其实是如下
即,把一个`type`当成一个变量使用。但是 C++里如何来实现这一行代码呢?其实是如下

```C++
using x = uint32_t;
Expand Down Expand Up @@ -61,7 +61,7 @@ Some<InputType>::OutputType

相当于对于 InputType 调用一个 Some“函数”,然后输出一个 OutputType。

# Zig Comptime 是命令式,而 C++是模式匹配+递归
# 命令式 VS 声明式

比如实现一个函数,输入一个 bool 值,根据 bool 值,如果为真,那么输出 type A,如果为假那么输出 type B。

Expand All @@ -79,15 +79,15 @@ struct Fn<false, A, B> {
};
```
从这里 C++代码可以感觉出,其实你是拿着尺子,对照着基础模式,然后通过模版偏特化来实现一种`if-else语句`
从这里 C++代码可以感觉出,其实你是拿着尺子,对照着基础模式,然后通过模版偏特化来实现不同分支的逻辑
```C++
Fn<sizeof(A) > sizeof(B), A, B>::OutputType
```

这就是比较类型的 size 大小,如果 A 大,OutputType 就是 A,如果 B 大,OutputType 就是 B。
这就是比较类型的大小,如果 A 大,OutputType 就是 A,如果 B 大,OutputType 就是 B。这种类型生成的方式对于开发者来说完全是黑盒的,需要依赖编译器的特殊支持,有种声明式语言的特点,即:结果导向,不关心具体实现逻辑

如果用 Zig 来做,则完全是命令式的
如果用 Zig 来做,则完全是命令式的,即关心实现过程,通过一系列基本步骤来达到目的。上面这个例子用 Zig 来实现的话,逻辑如下:

```Zig
fn Fn(comptime A:type, comptime B: type) type {
Expand All @@ -98,6 +98,8 @@ fn Fn(comptime A:type, comptime B: type) type {
}
```

这段代码和普通的 [CRUD](https://en.wikipedia.org/wiki/Create,_read,_update_and_delete) 逻辑没什么区别,特殊的地方在于操作的对象是『类型』。

我们再来看递归的列子。比如有一个类型的 list,我们需要返回其中第 N 个 type。同样,由于在 C++中,类型不是一等成员,因此我们不可能有一个`vector<type>`的东东。那怎么办呢?方法就是直接把`type list`放在模板的参数列表里:`typename ...T`

于是,我们写出“函数原型”。
Expand Down

0 comments on commit 9e070d1

Please sign in to comment.