学习 C3 | alloc.dev

这是一篇关于学习 C3 编程语言的文章,主要内容如下:

  • C3 简介:C3 旨在基于 C 构建,提供了人体工程学、优化和特性,如模块系统、运算符重载、泛型、编译时执行、语义宏、集成构建系统、错误处理、defer、值方法、关联枚举数据、不同类型和子类型、渐进式合约、内置切片、foreach、动态调用和类型等。文中还给出了 C3 创造者和 FoxKiana 对 C3 的看法。
  • 语言概述

    • Hello World:代码与 C 相似,导入模块会递归导入子模块,C3 要求使用fn关键字定义函数,标准打印函数可以打印多种类型,格式化打印与 C 类似。
    • foreach loops:C3 有foreach循环,breakcontinue正常工作,通过在变量名前添加&实现按引用迭代,foreach感觉比普通for更高级。
    • while loops:C3 的while循环与 C 相似,但可以在循环条件内声明变量,这是 C99 之前for循环的改进。
    • enum types and switch statements:C3 与 C 相似,有隐式breaknextcase关键字支持多 case 范围,还可以实现类似 Duff's device 的功能。
    • defer keyworddefer关键字允许在作用域退出时按逆序调用语句,用于清理资源,errdeferokdefer可以用defer catchdefer try表示。
    • struct typesstruct类型可以包含各种子结构和匿名联合,用于实现 tagged union,C 也可以实现类似功能,但作者很少这样使用。
    • Error handling:C3 的错误处理结合了“错误联合”和“可选类型”,有可选类型(后缀为?)、借口(用faultdef定义)等,处理方式较为复杂。
    • Contracts:C3 支持预条件和后条件,用<**>符号包裹,可在调用链中传播并在编译时分析,但作者对这种第三种注释方式感觉奇怪。
    • struct methods:命名空间和点语法函数适用于联合、结构体和枚举,是对 C 的改进。
    • macros:C3 的宏类似于 C 宏,可在编译时求值,不能在调用者作用域内声明变量,避免了 C 中的\,参数有$#前缀等特性。
    • Type Properties:C3 为所有类型提供了内置属性,如alignofkindof等,用于元编程。
    • Base64 & Hex Literals:C3 支持 base64 和 hex 数据字面量,但作者认为$embed宏更能满足常见需求,对字符串情况整体感觉不满意。
    • Primitives:C3 有整数、布尔、浮点数等 primitive 类型,char为无符号,还有 128 位整数,iptruptr等类型,但作者认为类型名称较短不利于阅读。
  • 学习步骤

    • Installing C3:C3 网站提供了编译器二进制的安装说明,作者在 Gentoo 上未找到包,需要从源代码构建,构建过程中遇到了 LLD 相关的问题,最终下载了适用于笔记本的 C3 编译器。
    • Creating a new project:C3 的编译器与 Zig 的编译器相似,都有初始化项目、构建项目和编译源文件的命令,c3c init命令创建了一个项目目录,包括LICENSEREADME.mdproject.json等文件,main.c3文件包含了默认的代码,编译和运行项目都很简单。
  • 制作计算器

    • What will this require?:制作计算器需要了解函数的创建和调用、获取用户输入、基本的浮点数运算和打印到终端等知识,作者希望通过这个过程找到学习 C3 的优点和不足。
    • Getting user input:获取用户输入时需要注意 C3 的内存管理,有两种默认的分配器tmemmem@pool宏用于标记临时分配的上下文,C3 要求main函数返回值,函数返回值可以被忽略,但最好处理以避免潜在的错误。
    • The tokenizer:作者编写了一个 tokenizer 函数,将用户输入的字符串分割成 token 列表,用于后续的解析,在编写过程中遇到了一些问题,如缺乏语言服务器的功能、切片语法与其他语言不一致等,但也体会到了 C3 中List类型的方便性和控制流的友好性。
    • The parser:解析器相对容易编写,作者通过递归下降解析器实现了计算器的解析功能,代码简洁,错误系统也工作良好,nextcase关键字在其中起到了很好的作用。
  • 结论:C3 类似于 C,具有一些优点,如更快的开发速度、更安全和更具表达性,但也有一些不足之处,如包含性切片语法和错误系统,作者认为不会每天使用 C3,但它有很大的潜力,源代码易于阅读,宏系统也很好,感谢他人的帮助并鼓励他人尝试 C3。
阅读 15
0 条评论