这是一篇关于学习 C3 编程语言的文章,主要内容如下:
- C3 简介:C3 旨在基于 C 构建,提供了人体工程学、优化和特性,如模块系统、运算符重载、泛型、编译时执行、语义宏、集成构建系统、错误处理、
defer
、值方法、关联枚举数据、不同类型和子类型、渐进式合约、内置切片、foreach
、动态调用和类型等。文中还给出了 C3 创造者和 FoxKiana 对 C3 的看法。 语言概述:
- Hello World:代码与 C 相似,导入模块会递归导入子模块,C3 要求使用
fn
关键字定义函数,标准打印函数可以打印多种类型,格式化打印与 C 类似。 foreach
loops:C3 有foreach
循环,break
和continue
正常工作,通过在变量名前添加&
实现按引用迭代,foreach
感觉比普通for
更高级。while
loops:C3 的while
循环与 C 相似,但可以在循环条件内声明变量,这是 C99 之前for
循环的改进。enum
types andswitch
statements:C3 与 C 相似,有隐式break
,nextcase
关键字支持多 case 范围,还可以实现类似 Duff's device 的功能。defer
keyword:defer
关键字允许在作用域退出时按逆序调用语句,用于清理资源,errdefer
和okdefer
可以用defer catch
和defer try
表示。struct
types:struct
类型可以包含各种子结构和匿名联合,用于实现 tagged union,C 也可以实现类似功能,但作者很少这样使用。- Error handling:C3 的错误处理结合了“错误联合”和“可选类型”,有可选类型(后缀为
?
)、借口(用faultdef
定义)等,处理方式较为复杂。 - Contracts:C3 支持预条件和后条件,用
<*
和*>
符号包裹,可在调用链中传播并在编译时分析,但作者对这种第三种注释方式感觉奇怪。 struct
methods:命名空间和点语法函数适用于联合、结构体和枚举,是对 C 的改进。macro
s:C3 的宏类似于 C 宏,可在编译时求值,不能在调用者作用域内声明变量,避免了 C 中的\
,参数有$
和#
前缀等特性。- Type Properties:C3 为所有类型提供了内置属性,如
alignof
、kindof
等,用于元编程。 - Base64 & Hex Literals:C3 支持 base64 和 hex 数据字面量,但作者认为
$embed
宏更能满足常见需求,对字符串情况整体感觉不满意。 - Primitives:C3 有整数、布尔、浮点数等 primitive 类型,
char
为无符号,还有 128 位整数,iptr
、uptr
等类型,但作者认为类型名称较短不利于阅读。
- Hello World:代码与 C 相似,导入模块会递归导入子模块,C3 要求使用
学习步骤:
- Installing C3:C3 网站提供了编译器二进制的安装说明,作者在 Gentoo 上未找到包,需要从源代码构建,构建过程中遇到了 LLD 相关的问题,最终下载了适用于笔记本的 C3 编译器。
- Creating a new project:C3 的编译器与 Zig 的编译器相似,都有初始化项目、构建项目和编译源文件的命令,
c3c init
命令创建了一个项目目录,包括LICENSE
、README.md
、project.json
等文件,main.c3
文件包含了默认的代码,编译和运行项目都很简单。
制作计算器:
- What will this require?:制作计算器需要了解函数的创建和调用、获取用户输入、基本的浮点数运算和打印到终端等知识,作者希望通过这个过程找到学习 C3 的优点和不足。
- Getting user input:获取用户输入时需要注意 C3 的内存管理,有两种默认的分配器
tmem
和mem
,@pool
宏用于标记临时分配的上下文,C3 要求main
函数返回值,函数返回值可以被忽略,但最好处理以避免潜在的错误。 - The tokenizer:作者编写了一个 tokenizer 函数,将用户输入的字符串分割成 token 列表,用于后续的解析,在编写过程中遇到了一些问题,如缺乏语言服务器的功能、切片语法与其他语言不一致等,但也体会到了 C3 中
List
类型的方便性和控制流的友好性。 - The parser:解析器相对容易编写,作者通过递归下降解析器实现了计算器的解析功能,代码简洁,错误系统也工作良好,
nextcase
关键字在其中起到了很好的作用。
- 结论:C3 类似于 C,具有一些优点,如更快的开发速度、更安全和更具表达性,但也有一些不足之处,如包含性切片语法和错误系统,作者认为不会每天使用 C3,但它有很大的潜力,源代码易于阅读,宏系统也很好,感谢他人的帮助并鼓励他人尝试 C3。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。