编程语言之OCaml
2023-09-23 09:23:06 阿炯

OCaml(/oʊˈkæməl/ oh-KAM-əl),是一个函数式、指令式、模块化、面向对象的通用的编程语言。在Xavier Leroy和Damien Doligez,于1990年和1991年实现的ML方言Caml Light之上,Didier Rémy和Jérôme Vouillon,于1996年增加了面向对象特征,从而形成了“Objective Caml”,在2011年时重命名为“OCaml”。采用LGPL协议授权使用。


Programming languages matter. They affect the reliability, security, and efficiency of the code you write, as well as how easy it is to read, refactor, and extend. The languages you know can also change how you think, influencing the way you design software even when you’re not using them.


其工具链包括交互式顶层解释器、字节码编译器、优化的本机代码编译器,可逆调试器和一个包管理器(OPAM)。OCaml最初开发于自动定理证明的场景中,并在静态分析和形式方法软件中有超凡的存在感。此外它在系统编程、网页编程和金融工程及其他应用领域都有严肃的应用。

历史上,Ascánder Suárez于1987年基于Guy Cousineau的范畴抽象机器(CAM),重新实现了Gérard Huet早先的ML方言,并用“范畴抽象机语言”的首字母简写将其命名为Caml,Caml Light放弃了这个抽象机器又进行了重新实现。OCaml是开放源代码项目,此项目的管理和大部分维护工作,已经交由法国国家信息与自动化研究所(INRIA)。在2000年代早期,来自OCaml的元素被很多语言接纳,特别是F#和Scala。

OCaml与源于学术界的其他语言的最显著区别可能是强调了性能。它的静态类型系统防止了运行时间类型不匹配,从而排除了动态类型语言运行时间类型和安全检查的性能负担,却在除了关闭数组边界检查,和使用一些类型不安全特征比如序列化之外的情况下,仍能保证运行时间安全性。这些运行时间检查需求足够罕见,在实践中完全可以避免。在类型检查开销之外,函数式编程语言,要编译成高效的机器语言代码,由于如函数参数问题这样的要点,一般而言是具有挑战性的。与标准的循环、寄存器和指令优化一起,OCaml的优化编译器采用静态程序分析方法,来优化值包装(boxing)和闭包分配,帮助结果代码得到最大化的性能,即使它大量使用了函数式编程构造。

OCaml将Caml语言在面向对象方面做了延展。Caml 是函数式编程语言,它的扩展语言还有基于微软.net平台的 f# (fsharp)语言。Caml 的代码大多可以在f#中使用。F#的开发工具有VS .net,Caml的代码也可使用。其开发工具包含交互式顶层解释器(interactive toplevel interpreter),字节码编译器(bytecode compiler),以及最优本地代码编译器(optimizing native code compiler)。它有一个巨大并强悍的标准库,这使得其可以像Python或者Perl语言一样可以方便地开发各种应用程序,健壮的模块化与面向对象编程结构又使得她可以胜任大规模软件工程项目。

Xavier Leroy曾经宣称:“OCaml至少提供了像样的C编译器的50%的性能”,尽管直接比较是不可能的。在OCaml标准库中的一些函数,是采用比在其他语言标准库中等价的函数更快的算法实现的。例如在OCaml标准库中集合并集的实现,在理论上比指令式语言(例如C++、Java)的标准库中的等价函数,要渐进性的更快,因为OCaml实现利用了集合的不可变性,而在输出中重用了输入集合的一些部分(参见可持久化数据结构)。

特征

OCaml的特征包括:静态类型系统、类型推论、参数多态、尾递归、模式匹配、头等词法闭包、函子(参数化模块)、异常处理和增量分代自动垃圾回收。其著称于将ML风格类型推论,扩展到通用语言中的对象系统。这允许了结构子类型,这里的对象类型是兼容的,如果它们的方法签名是兼容的,不用管它们声明的继承,这是在静态类型语言中不寻常的特征。它提供了链接到C原语的外界函数接口,包括了兼容于C和Fortran二者格式的对高效数值数组的语言支持。OCaml还支持建立可以链接到用C写的main程序的OCaml函数库。

OCaml发行包含了:
词法分析和语法解析工具分别叫做ocamllex和ocamlyacc。
支持步进回溯的调试器用来调查错误。
文档生成器。
分析器用来测量性能。
很多通用函数库。

本机代码编译器可以在很多平台上获得,包括Unix、Microsoft Windows和Apple macOS。可移植性是通过至此主要架构的本机代码生成实现的:IA-32、X86-64(AMD64)、Power、RISC-V、ARM和ARM64。OCaml字节码和本机代码程序可以用多线程风格书写,具有抢占式上下文切换。但是由于当前唯一可得的语言完全实现INRIA OCaml的垃圾回收器,不是为并发性而设计的,对称多处理是不支持的。在相同进程中的OCaml线程只能分时执行。但是有一些分布式计算库比如Functory和Plasma。


OCaml作品选

Coq,一个形式证明辅助器。
HOL Light,一个形式证明辅助器。
Coccinelle,用于C程序源代码变换的实用工具。
Frama-C,分析C程序的一个框架。
Flow,Facebook创建的用于推论和检查JavaScript的静态类型的一个静态分析器。
Infer,Facebook创建的用于Java、C、C++和Objective-C的静态分析器,用来检测iOS和Android应用中的缺陷。
pyre-check,Facebook创建的用于Python的类型检查器。
Hack编程语言编译器,Facebook创建,扩展PHP具有静态类型。
Haxe编程语言编译器。
WebAssembly参考解释器,它是意图在web浏览器内执行的低层字节码。
FFTW,C的FFT库,它的多数性能关键代码是由用OCaml写的一个程序生成的。
Owl科学计算,用于科学和工程计算的专用系统。
MirageOS,用纯OCaml写的一个单一内核编程框架。
Ocsigen,一个OCaml的web应用框架。
Opa,用于Web开发的自由和开源的一个编程语言。
0install,一个多平台包管理器。
MLDonkey,一个多网络P2P程序。
Unison,一个文件同步器。

最新版本:5.0
于2022年12中旬发布。

官方主页:https://ocaml.org/


参照语言

Caml,OCaml的先驱语言。
F#,由MSR开发,是一个基于OCaml的一个以.NET为目标的编程语言。
F*,由MSR和INRIA主导开发,是一个基于OCaml的依赖类型函数式程序语言。
Reason,OCaml的语法扩展和工具链,也可以转译成JavaScript。

在此多说一下Caml

Caml(英语:Categorical Abstract Machine Language:范畴抽象机语言),是一种函数式、指令式的编程语言,初见于1985年。最早由法国的INRIA和ENS联合的Formel项目发展出来,是ML语言的两种方言之一,现在主要由INRIA负责维护与发展。Caml是一种语言规范;它早期有过几个实现,目前除了仍然活跃的OCaml,发布于2002年的Caml Light是Caml的另一个实现。当前最新版本为2018年7月发布的4.07版本。

在1990年和1991年,INRIA的Xavier Leroy基于用C实现的字节码解释器,利用Damien Doligez提供的内存管理系统重新实现了Caml,并称其为“Caml Light”。在1995年,Xavier Leroy又增加了本机代码编译器和高层模块系统,这个版本也称为“Caml Special Light”。在1996年,INRIA的Didier Rémy和Jérôme Vouillon,向Caml Special Light增加了面向对象特征,从而创建了OCaml。