在最近接触了c3和zig这两个语言,作为一个嵌入式工程师,在用C时不止一次出现过内存错误导致的代码运行出问题的情况,所以我迫切的想要一个新语言来大幅度代替C,但很显然现在的新语言都不够成熟!
现来说zig,zig的社区在国内还算丰富。但是0.14到0.15的大幅度升级,导致很多0.14版本的项目都无法使用,所以很多人不敢在往里面下料,怕突然又大改动。
这些算法我也会整成一个大合集,方便观看。
zig -- 桶排序
cpp
const std = @import("std");
const print = std.debug.print;
const c = @cImport({
@cInclude("stdio.h");
});
pub fn main() void {
var a: [11]i32 = undefined;
var t: i32 = 0;
var j: i32 = 1;
// 清零数组
for (0..10) |i| {
a[i] = 0;
}
// 输入4个数字
for (0..5) |_| {
_ = c.scanf("%d", &t);
a[@intCast(t)] = a[@intCast(t)] + 1;
}
var i: i32 = 10;
// 输出桶排序结果
while (i > 0) : (i = i - 1) {
j = 1;
while (j <= a[@intCast(i)]) : (j += 1) {
print("{}", .{i});
}
}
_ = c.getchar();
}
输入
1 3 6 2 4
输出
6 4 3 2 1
根据代码可以知道,csdn连zig的代码高亮都没更新!!!
由于在很多开发文档或者教程里面,都没有提及输入这个函数和用法,这个问题也是困扰我最久的,后面反开发文档时看到一条,zig兼容C语言可以调用ABI,所以我就打算使用C的scanf输入来使用,在zig中 _ 下划线是显式丢弃
啥意思呢?在zig 里面所以变量必须调用,如果有一个变量没调用就会报错(严格的内存机制)
但是在代码中肯定会遇到用不到的变量或者不想在调用的变量,就可以使用_显示丢弃,在这个代码中,_是可有可无的,毕竟c.getchar和c.scanf也不是变量,还有一个点就是@intCast 强制类型转换
在zig数组里面必须是usize 也就是无符号类型,但我在定义是用的是i32,所以需要使用@intCast强制转换一下
接下来就是c3
c3 -- 桶排序
c3的社区相对于zig来说,是没有的!!社区活跃度在国内几乎为0
而且公开的资料也是少还烂,可以这么说C3的官方出的文档写的也是稀里糊涂,看看有没有大神自己做一个
当然c3输入也是没有的,所以我还是调用了C的ABI,它zig一样都可以调用。
cpp
//桶排序
import std;
extern fn int scanf(char*, ...);
fn void main()
{
int[11] a;
int i,j,t;
for(i=0;i<=10;i++)
{
a[i] = 0;
}
for(i=1;i<=5;i++)
{
scanf("%d",&t);
a[t]++;
}
for(i=10;i>0;i--)
{
for(j=1;j<=a[i];j++)
{
io::print(i);
}
}
}
输入
1 3 6 2 4
输出
6 4 3 2 1
C3的代码和C的大相径庭,所以C程序员更容易上手,代码简单我也不过多赘述
zig和c3的前景(个人看法)
zig现在最稳定版本是在0.15.2,而c3是0.7.10,两者均没有出正式版
当然这不是重点,重点是zig每次更新都要大改动,把很多用法语法都改,0.14的版本放到0.15版本压根用不了!更新的太快;C3却相反,更新基本像挤牙膏。
这两个语言一直在卷标准库里面的东西,抛弃了C语言的基本盘,前面我说了我是嵌入式工程师,而C语言最大的服务对象也是,底层、嵌入式这些。反而zig说要代替C,C3说要进化C,结果两个语言公开的硬件库很少,还全是用户更新非官方。所以我更希望这里两个语言的官方不要去卷标准库的内容而是往用户群体最多的地方发展,我也有一天希望我可以使用zig或者C3写单片机,stm32,esp32,然后和同事说,我以前用C的时候,老是出错哈哈哈。
当然啦,语言的发展要适应时代的变化,走什么方向也不是我个人决定的,接下来希望他们能够发展的越来越好,正式版越稳定!!!