来福网

OCaml

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

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

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

ML派生语言最著称的是静态类型系统和类型推论编译器。OCaml将函数式、指令式和面向对象编程统一于类ML的类型系统之下。因此编程者不需要为了使用OCaml而非常熟悉纯函数式编程范型。

通过要求编程者在静态类型系统的约束下工作,OCaml消除了关联于动态类型语言的很多有关于类型的运行时间问题。还有,OCaml的类型推论编译器,极大的减少了在多数静态类型语言中对手工类型标注的需要。例如,变量的数据类型和函数的签名,通常不需要像Java和C#语言中那样显式的声明,因为它们可以从应用于这个变量和代码中其他值的算符和其他函数推论出来。有效的使用OCaml的类型系统可能要求一个编程者面对一些复杂性,但是这种规矩能得到可靠的、高性能软件作为回报。

OCaml与源于学术界的其他语言的最显著区别可能是强调了性能。它的静态类型系统防止了运行时间类型不匹配,从而排除了动态类型语言运行时间类型和安全检查的性能负担,却在除了关闭数组边界检查,和使用一些类型不安全特征比如序列化之外的情况下,仍能保证运行时间安全性。这些运行时间检查需求足够罕见,在实践中完全可以避免。

在类型检查开销之外,函数式编程语言,要编译成高效的机器语言代码,由于如函数参数问题(英语:funarg problem)这样的要点,一般而言是具有挑战性的。与标准的循环、寄存器和指令优化(英语:Optimizing compiler)一起,OCaml的优化编译器采用静态程序分析方法,来优化值包装(英语:Object type (object-oriented programming))(boxing)和闭包分配,帮助结果代码得到最大化的性能,即使它大量使用了函数式编程构造。

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

OCaml的特征包括:静态类型系统、类型推论、参数多态、尾递归、模式匹配、头等词法闭包、函子(参数化模块)、异常处理和增量分代自动垃圾回收。

OCaml著称于将ML风格类型推论,扩展到通用语言中的对象系统。这允许了结构子类型(英语:Structural type system),这里的对象类型是兼容的,如果它们的方法签名是兼容的,不用管它们声明的继承,这是在静态类型语言中不寻常的特征。

OCaml提供了链接到C原语的外界函数接口(英语:foreign function interface),包括了兼容于C和Fortran二者格式的对高效数值数组的语言支持。OCaml还支持创建可以链接到用C写的main程序的OCaml函数库。

OCaml发行包含了:

本机代码编译器可以在很多平台上获得,包括Unix、Microsoft Windows和Apple macOS。可移植性是通过至此主要架构的本机代码生成(英语:code generation (compiler))实现的:IA-32、X86-64(AMD64)、Power(英语:Power ISA)、RISC-V、ARM和ARM64。

OCaml字节码和本机代码程序可以用多线程风格书写,具有抢占式上下文切换。但是由于当前唯一可得的语言完全实现INRIA OCaml的垃圾回收器,不是为并发性而设计的,对称多处理是不支持的。在相同进程中的OCaml线程只能分时执行。但是有一些分布式计算库比如Functory和Plasma。

OCaml的代码片段可以通过键入到顶层REPL中来很容易的研习。这是一个交互式的OCaml会话,它打印结果或定义的表达式的推论出的类型。OCaml顶层可以通过简单执行OCaml程序来启动:

$ ocaml OCaml version 4.13.1#

后台-插件-广告管理-内容底部广告位PC端
后台-插件-广告管理-内容底部广告位手机端

相关推荐

评论

全部评论