从理解语言实现开始

史蒂夫·德科特在布鲁斯·A.泰特的访谈中回忆,2002年,朋友德鲁·纳尔逊正在实现受Self启发的Cel语言,并向他征求意见。德科特觉得自己对语言实现理解不足,于是动手编写一个小语言,逐渐发展为Io。他追求一致而易于掌握的语法与语义;泰特注明,Io用C语言实现。

参考:[1]

2002年4月的公开介绍

德科特在Self-interest邮件列表的短讯中,把Io介绍为又一种受Self启发的语言,给出自己的项目页面,并邀请收信人提出意见。这里的交流对象是已有语言社区中的读者,重点是小巧与简洁的设计方向。邮件归档保留了2002年4月的日期;这是一份当时的公开介绍,未标出版本号,也未自称第一次发布。

参考:[2]

2005年的技术记录

到2005年,德科特在OOPSLA会议论文中留下了更完整的技术说明:对象由保存键值对的槽和原型列表组成;收到消息后,先寻找同名槽,未找到时再沿原型查找。槽中的值若是方法,就执行方法,否则返回该值。论文把Io用于脚本及嵌入较大项目,并记载了以C实现、以协程组织并发的处理系统。这些描述属于2005年的状态,这些机制以2005年的技术记录为准,不提前归入2002年4月那封未标版本的介绍邮件。

参考:[3]

用一个计数器理解对象与消息

按2005年论文中的对象与赋值规则,可以写一个简短示意:Counter := Object clone; Counter value := 0; Counter add := method(n, value = value + n); c := Counter clone; c add(3); c value println。这里分号分隔表达式,Counter保存初值和方法,c从它克隆而来。这个例子用于解释语义,未在历史版本中实际执行。

创建c时不必把原型的所有槽逐项复制。读取value可沿原型找到初值;add中的赋值随后把接收者自己的数值改为3,最后一行读取该值并发送输出消息。论文区分创建槽的“:=”与更新已有槽的“=”,若找不到待更新槽则会报错。这说明语法简短并未取消对象之间的查找关系。

参考:[3]

2005年演示中的取舍与实现

在2005年Lua工作坊,德科特把Io与自己使用过的Lua比较:他愿意牺牲部分速度和体积优势,换取更一致的纯对象设计。他的经历包括NeXTstep、Objective-C、Python,以及在Yindo项目中使用Lua;这份自述解释了设计问题来自怎样的开发经验。

幻灯片列出的赋值与方法例子,把通常分开的变量读取、方法调用都写成消息序列;数字也可以得到方法。演示中的对象不仅保存数据,还能成为接收异步消息的行为主体。与2002年邮件邀请反馈的做法相延续,工作坊也以讨论和合作为目标。

参考:[4]

介绍、实现与版本计划

该次演示最后把“2005年底推出Io 1.0”列作计划,并列出包、文档和修订控制等待办工作。它保留了一个仍在建设的项目状态,不能将计划日期写成已经实现的正式发行日。2002年的公开介绍、2005年实现说明和后续版本发布,是需要分别记录的阶段。

参考:[4]