在.NET环境中试验新语法
2006年,查克·埃斯特布鲁克(Chuck Esterbrook)开发的Cobra已有可供使用的编译器,并通过版本说明和开发日志公布变化。这种语言面向微软.NET环境,早期编译器本身却用Python写成。埃斯特布鲁克希望结合简洁的程序书写方式、静态类型检查和软件契约,并减少使用者安装工具时的依赖。
现存0.0.2版说明标注2006年2月10日,列出枚举、共享类变量和构造语法等改动。这些记录显示项目此时已在逐版修整。枚举示例把颜色限定为Red、Green、Blue等成员,再将变量声明为Color类型;程序所表达的取值范围因而进入类型系统,而不是仅靠注释约定。
把示例与.NET程序库接起来
5月21日的0.1版把示例目录分为HowTo、Samples和Reusables:分别放教学示范、有完整功能的程序与面向复用的库代码。发布说明明确请读者通过前两类源代码学习语言。这种安排让早期使用者既能看单个语法的写法,也能追踪较完整程序如何组织。
同版加入引用程序集的命令行选项,使Cobra程序可以指定所需的DLL。开发者还把异常处理词汇从raise、except改为throw、catch,留下raise供以后与.NET事件术语衔接。泛型类型改用尖括号,使类型参数和创建对象时的圆括号更容易区分;编译错误开始附带文件名,而不只报告行号。
参考:[2]
用Cobra重写Cobra编译器
9月1日,埃斯特布鲁克在开发日志中说明,正在把Python版编译器改写为Cobra程序。他列出的目标包括提高性能、使用软件契约和静态类型,以及在编译时检查可能为空的值。对开发者而言,重写也是在一个规模较大的实际程序中使用自己设计的语言。
待新编译器追上旧版功能后,他计划继续加入可选动态类型。他还提到Objective-C允许静态和动态绑定共存的启发,希望由程序开发者决定软件中使用两种绑定方式的程度。
参考:[3]
11月发布自举编译器
0.2.0版发布说明的文件日期为11月16日,宣布新编译器由Cobra自身编写,交付形式为cobra.exe。埃斯特布鲁克11月17日的日志又说自己“昨天”发布了Cobra 0.2,与该日期相合。它接续此前版本,标志着编译器实现的自举。
这次交付移除了旧工具对Python的依赖。编译器能够一次报告多条错误,并提供生成可执行程序、图形程序或库等目标选项。程序员遇到语言尚未覆盖的表达式需求时,还可使用新增的C#表达式嵌入手段。
用一次条件判断收窄变量类型
0.2.0版的具体例子展示了空值检查如何影响后续编译。变量_foo被声明为Foo?,表示其值可能为空;若方法要求一个非空Foo,旧写法即使先做了if判断,调用时仍需再写一次到Foo的类型转换。新编译器能够利用该分支已经排除空值的条件,直接允许传入_foo。
同一处理也适用于参数和局部变量,并识别“不是nil”的比较形式。这减少了程序中为满足类型检查而重复书写的转换。该版还把方法实现部分的关键词从code改为body,与require表达的前置条件相邻排列,使调用约束和实际执行语句在源程序中各有位置。
参考:[4]
随后扩展到Mono环境
11月17日的日志写到,埃斯特布鲁克新取得一台MacBook Pro,计划在Mac上的Novell Mono以及Windows XP上的微软.NET中测试后续版本。此时日志所说的Mac测试仍是计划。12月的0.3版发布说明才明确报告Cobra已经能在Mac OS X上的Novell Mono运行;对其他Unix或兼容环境则只作可能可行的判断。
0.3版还加入切片和for表达式。例如从字符串序列取出每个字符串的长度,可以写成一次序列转换;处理子序列时可指定起止下标。版本继续改进报错与错误恢复,避免一个前面的错误制造成串的次生错误。Cobra在2006年的进展由这些逐项实现组成:先有可用版本,再完成自举,随后验证新的运行环境。