罗康古尔的语言研究团队
OCaml早期名为Objective Caml,出自法国国家信息与自动化研究所(INRIA)罗康古尔中心的CRISTAL项目。团队研究静态类型、模块化与编译,既用Caml进行理论实验,也用它编写实际软件。目标是在程序运行之前发现类型错误,同时让工具具备开发大型程序所需的组织能力和执行效率。
1995年,泽维尔·勒鲁瓦重写Caml Light,形成Caml Special Light。1996年,热罗姆·武永参与实现对象与类,将他和迪迪埃·雷米的对象类型研究纳入系统;勒鲁瓦继续开发模块、维护编译器并移植到不同处理器。
参考:[2]
5月9日的1.00版公告
1996年5月9日,勒鲁瓦向Caml邮件列表及ML讨论组发送首版公告,文末由勒鲁瓦、雷米、武永共同署名。Objective Caml 1.00继承并接替Caml Special Light,保留模块系统、分离编译、字节码编译器和本机代码编译器,在这些基础上增加面向对象能力。
公开发行物包括Unix源代码和Windows NT、Windows 95二进制程序。用户可通过INRIA的FTP服务取得软件,在网页阅读教程及手册,并通过邮件报告缺陷、交流使用问题。这一安排把编译器、学习材料和反馈渠道同时交给外部使用者;发布公告也明确列出对象转换必须显式书写这一限制。
参考:[1]
让大型程序分开检查和编译
勒鲁瓦1994年的模块论文处理了一个实际难题:程序分成多个部分之后,编译某一部分时应当知道其他部分的哪些信息。若必须等全部实现完成才能判断类型是否相容,错误便可能到连接阶段才暴露,妨碍各部分独立开发。
论文区分抽象类型与在接口中明确给出定义的类型。例如接口写出“type t = int”,使用者便知道t是整数;接口隐藏定义时,使用者只能依赖已公开的性质。这样,接口能够承担类型检查依据,实现文件则可以分别编译。它还将模块结构与编译单元分开:结构、签名和以模块为参数的函子,可组合在实现文件及接口文件内,服务于大型软件的组织。
参考:[3]
把对象纳入ML式类型推断
雷米与武永在1997年的论文中解释了对象扩展的设计。对象向外提供方法,内部保存状态;类可以继承其他类,也可以重新定义方法。类型系统依据对象有哪些方法以及方法的输入、输出判断可用性,程序员通常无需逐一手写类接口。
论文以可移动的点为例:点保存坐标,move方法改变它;派生出的缩放点继承移动能力,再加入比例参数,让移动量经过缩放。对象方法可以调用自身的方法,因此派生类重写的行为也会参与运算。需要将具有较多方法的对象作为较简单接口使用时,程序员写出显式转换。作者通过形式化语义和类型论证,把这些对象操作与原有ML多态机制联系起来。
参考:[4]
进入证明器和网页软件
1996年度项目报告记载,Objective Caml已用于Coq证明器、MMM浏览器和V6网页代理。弗朗索瓦·鲁艾与贝尔纳·朗开发的V6允许用户在浏览器和服务器之间安装过滤程序,处理请求及返回文档。实际使用者提出的需求又推动了线程等程序库的完善,语言的对象、模块和编译技术由此进入持续使用与改进的循环。
参考:[2]