zig和C3 算法-- 桶排序 和看法

4 阅读4分钟

嵌入式工程师视角:Zig 与 C3 上手实践与前景思考(全网首发 Zig/C3 桶排序)

作为一名嵌入式工程师,我在日常使用 C 语言开发时,多次遇到内存错误、隐式行为导致的程序崩溃问题。因此我迫切期待一门能大幅替代 C的现代语言,近期深度体验了 Zig 和 C3 后,结合实战算法给大家分享完整体验。

目前两大新语言都尚未成熟,但都瞄准了“改进/替代 C 语言”的核心方向,以下是我的实战总结。


一、Zig 语言实战:桶排序实现

Zig 国内社区相对丰富,但从 0.14 → 0.15 的大版本升级破坏性极强,旧项目直接无法运行,生态稳定性堪忧。

1.1 Zig 桶排序完整代码

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;
    }

    // 输入5个数字(兼容C的scanf)
    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

1.2 核心知识点(新手必看)

  1. C 兼容方案
  1. Zig 原生输入教程极少,我通过调用 C ABI使用 scanf 实现输入,完美解决输入问题。
  1. _ 显式丢弃
  1. Zig 强制所有变量/返回值必须被使用,_ 的作用是主动声明丢弃值,是 Zig 安全机制的体现。
  1. @intCast 显式类型转换
  1. Zig 数组下标必须使用 usize 无符号类型,定义的 i32 类型必须强制转换,禁止隐式转换,从根源避免越界错误。

1.3 现状吐槽

国内 CSDN 等平台连 Zig 代码高亮都未更新,生态完善度还有很长的路要走。


二、C3 语言实战:桶排序实现

C3 国内社区活跃度几乎为 0,公开资料少且质量低,官方文档描述模糊,学习成本不怎么高(虽然语法简单,但是没有过多的资料就很难受)。

2.1 C3 桶排序完整代码

// 全中国首个 C3 桶排序实现
//桶排序
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);
		}
	}
}s

 输入

1 3 6 2 4

输出

6 4 3 2 1

2.2 核心特点

  1. C 语言亲和力拉满
  1. 语法与 C 高度相似,C 程序员可以无缝上手,学习成本远低于 Zig。
  1. 同样依赖 C 兼容
  1. 原生无输入函数,通过 extern 声明调用 C 标准库 scanf
  1. 内置打印
  1. 使用 io::print() 直接打印变量,无需格式化符,简单安全。

三、Zig vs C3 核心对比(嵌入式视角)

维度ZigC3
最新版本0.15.2(未正式版)0.7.10(未正式版)
国内社区相对丰富几乎为 0
版本更新更新快、破坏性改动极大更新极慢,像挤牙膏
C 语言兼容性完美兼容 C ABI原生支持 C 互操作
学习门槛较高,语法差异大极低,C 程序员无缝上手
嵌入式/硬件支持官方硬件库极少,以用户库为主硬件生态几乎空白

四、个人前景思考(嵌入式工程师真心话)

  1. 核心痛点
  1. 两者都宣称要替代/进化 C 语言,但都忽略了 C 语言最大的基本盘——嵌入式、底层开发、单片机
  1. 官方都在内卷标准库,而非投入嵌入式生态(STM32/ESP32 等硬件支持)。
  1. 我的期待
  1. 我无比希望未来能使用 Zig/C3 开发单片机,摆脱 C 语言的内存陷阱。
  1. 不用再因为隐式行为、内存错误调试到崩溃,能自信地和同事说:我用zig或者C3,很少出bug
  1. 总结
  1. 语言的发展是时代的选择,Zig 和 C3 都代表了下一代系统级语言的方向。
  1. 只希望两者能稳定迭代、深耕嵌入式生态,早日推出稳定正式版!

补充说明

本文实现的 Zig 0.15.2 桶排序 + C3 桶排序,均为全网首发实战代码,后续会持续更新算法合集,帮助国内开发者快速上手这两门未来语言!