(Translated by https://www.hiragana.jp/)
OCaml - 维基百科,自由的百科全书 とべ转到内容ないよう

OCaml

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん
OCaml
编程范型范型函数かんすうしき指令しれいしきかたぎ块化[1]めんこう对象[2]
语言家族かぞくML
設計せっけいしゃXavier LeroyえいXavier Leroy, Damien DoligezえいDamien Doligez, Didier Rémy, Jérôme Vouillon
じつ作者さくしゃINRIA
发行时间1996ねん,​28ねんまえ​(1996
とうぜん版本はんぽん
  • 5.2.0(2024ねん5がつ13にち;穩定版本はんぽん[3]
編輯維基數據鏈接
かたたい系統けいとうせいつよ类型推论
操作そうさけいまたが平台ひらだい
許可きょかしょうGNU宽通用つうよう公共こうきょう许可证
あみocaml.org 編輯維基數據鏈接
衍生ふくかたりげん
F#, JoCamlえいJoCaml, MetaOCaml[4]
啟發けいはつげん
C, Caml, Modula-2[1], Standard ML
影響えいきょうげん
ATSえいATS (programming language), Coq, Elm, F#, F*, Haxe, OpaえいOpa (programming language), Rust, Scala

OCaml/ˈkæməl/ oh-KAM-əl),いち函数かんすうしき指令しれいしきかたぎ块化[1]めんこう对象てき通用つうようてき编程语言ざいXavier LeroyえいXavier LeroyDamien DoligezえいDamien Doligez,于1990ねん1991ねん实现てきML方言ほうげんCaml Lightこれじょう[5],Didier RémyJérôme Vouillon,于1996ねん增加ぞうかりょうめんこう对象とくせい[2],从而形成けいせいりょう“Objective Caml”[6]ざい2011ねん时重命名めいめい为“OCaml”[7]

OCaml工具こうぐ包括ほうかつ交互こうごしき顶层かい释器节码编译、优化てきほんつくえだい编译可逆かぎゃく调试いちつつみ管理かんり(OPAM)。OCaml最初さいしょ开发于定理ていり证明てき场景ちゅう,并在せい分析ぶんせき形式けいしき方法ほうほう软件中有ちゅうう超凡ちょうぼんてき存在そんざいかん。此外,它在けい统编ほど网页编程金融きんゆう工程こうてい及其应用领域ゆう严肃てき应用。

历史じょう,Ascánder Suárez于1987ねんもとGuy CousineauほうGuy Cousineauてき范畴抽象ちゅうしょうつくええいCategorical abstract machine(CAM)[8]じゅうしん实现りょうGérard HuetえいGérard HuetはやさきてきML方言ほうげん[9],并用“范畴抽象ちゅうしょうつくえ语言”てきくび字母じぼ简写はた命名めいめいCaml[10],Caml Light弃了这个抽象ちゅうしょうつくえまた进行りょうじゅうしん实现[11]。OCaml开放げんだい项目,此项目的もくてき管理かんり和大かずひろ部分ぶぶん维护工作こうさくやめ经交ゆかりほうこく国家こっかしんいきあずか动化研究所けんきゅうじょ(INRIA)。ざい2000年代ねんだい早期そうきOCamlてき元素げんそ很多语言せっ纳,とく别是F#Scala

哲学てつがく

[编辑]

ML派生はせい语言さいちょしょうてきせい类型けい类型推论编译。OCamlしょう函数かんすうしき指令しれいしきめんこう对象编程统一于类MLてき类型けい统之よし此编ほどしゃ需要じゅよう为了使用しようOCaml而非常ひじょうじゅく纯函数式すうしき编程范型。

つう要求ようきゅう编程しゃざいせい态类がたけい统的约束工作こうさく,OCamlしょうじょりょう关联于动态类がた语言てき很多ゆう关于类型てき运行时间问题。还有,OCamlてき类型推论编译,极大てき减少りょうざい多数たすうせい态类がた语言ちゅう对手こう类型标注てき需要じゅようれい如,变量てきかずすえ类型かず函数かんすうてき签名通常つうじょう需要じゅようぞうJavaC#语言ちゅう样显しきてき声明せいめいいん为它们可以从应用于这个变りょう和代かずよ码中其他值的さん其他函数かんすう推论出来でき有效ゆうこうてき使用しようOCamlてき类型けい可能かのう要求ようきゅう一个编程者面对一些复杂性,ただし这种规矩のういたもたれてき高性能こうせいのう软件さく为回报。

OCamlあずかみなもと于学术界てき其他语言てきさい显著可能かのうきょう调了性能せいのう。它的せい态类がたけい防止ぼうしりょう运行时间类型ひきはい,从而排除はいじょりょう动态类型语言运行时间类型安全あんぜん检查てき性能せいのう负担,却在じょりょう关闭すう组边かい检查,使用しよう一些类型不安全特征比如序列化之外的情况下,仍能证运ぎょう时间安全あんぜんせい。这些运行时间检查需求あし够罕见,ざい实践ちゅう完全かんぜん以避めん

ざい类型检查开销そと函数かんすうしき编程语言,よう编译なりだかこうてきつくえ语言だい码,ゆかり于如函数かんすうさんすう问题えいfunarg problem这样てき要点ようてん,一般而言是具有挑战性的。あずか标准てき循环、よせそん指令しれい优化一起かずき,OCamlてき优化编译さいようせい态程じょ分析ぶんせき方法ほうほうらい优化值包装ほうそうえいObject type (object-oriented programming)(boxing)闭包分配ぶんぱい,帮助结果だい码得いた最大さいだいてき性能せいのうそく使つかい它大りょう使用しようりょう函数かんすうしき编程构造。

Xavier LeroyえいXavier Leroy曾经せんしょう:“OCamlいたりしょう提供ていきょうりょうぞう样的C编译てき50%てき性能せいのう[12]つきかん直接ちょくせつ较是不可能ふかのうてきざいOCaml标准库中てきいち些函すうさいようざい其他语言标准库中とう价的函数かんすうさらかいてき算法さんぽう实现てきれい如,ざいOCaml标准库中集合しゅうごう并集てき实现,ざい论上指令しれいしき语言(れい如C++、Java)てき标准库中てきとう价函すうよう渐进性的せいてきさらかいいん为OCaml实现利用りようりょう集合しゅうごうてき不可ふか变性,而在输出ちゅう重用じゅうようりょう输入集合しゅうごうてきいち些部份(まいり持久じきゅうすうすえ结构)。

とくせい

[编辑]

OCamlてきとくせい包括ほうかつしず类型けい类型推论まいり数多すうた递归しきひきはい头等词法闭包はこさんすう块)、例外れいがい处理增量ぞうりょうぶんだい动垃圾回收かいしゅう

OCamlちょしょう于将ML风格类型推论,扩展いた通用つうよう语言ちゅうてき对象けい统。这允许了结构类型えいStructural type system,这里てき对象类型けんようてき,如果它们てき方法ほうほう签名けんようてき不用ふようかん它们声明せいめいてき继承,这是ざいせい态类がた语言ちゅう寻常てきとくせい

OCaml提供ていきょうりょう链接いたCはら语的外界がいかい函数かんすうせっこうえいforeign function interface包括ほうかつりょうけんよう于CFortran二者格式的对高效数值かずてき语言支持しじ。OCaml还支持しじ建立こんりゅう以链せっいたようCうつしてきmainほどじょてきOCaml函数かんすう

OCaml发行包含ほうがんりょう

ほんつくえだい码编译器以在很多平台ひらだいじょう获得,包括ほうかつUnixMicrosoft WindowsApple macOS移植いしょくせいどおり过至此主よう构的ほんつくえだい生成せいせいえいcode generation (compiler)实现てきIA-32X86-64(AMD64)、PowerえいPower ISARISC-VARMARM64[13]

OCaml节码和本わほんつくえだい码程じょ以用线程风格书写,具有ぐゆう抢占しき上下じょうげぶんきり换。ただしよし于当ぜんただ一可得的语言完全实现INRIA OCamlてき垃圾回收かいしゅう并发せい而设计的,对称处理支持しじてき[14]ざいしょうどう进程ちゅうてきOCaml线程ただのうぶん时执ぎょうただしゆう一些分布式计算库比如Functory[15]かずPlasma[16]

だい码例

[编辑]

OCamlてきだい码片だん以通过键いれいた顶层REPLちゅうらい很容えきてきとぎ习。这是いち交互こうごしきてきOCamlかい话,它打しるし结果あるてい义的ひょう达式てき推论てき类型[17]。OCaml顶层以通过简单执ぎょうOCamlほどじょらい启动:

$ ocaml
        OCaml version 4.13.1

#

接着せっちゃくざい#提示ていじ处键いれだい码。れい如计さん1+2*3:

# 1 + 2 * 3;;
- : int = 7

OCaml推论这个ひょう达式てき类型intつくえ精度せいど整数せいすう)并给结果7

Hello World

[编辑]

下面かめんてきほどじょhello.ml:

print_endline "Hello World!"

以被编译なり节码行文こうぶんけん

$ ocamlc hello.ml -o hello

あるもの编译なり优化てきほん地代じだい码可执行文こうぶんけん

$ ocamlopt hello.ml -o hello

接着せっちゃく执行它:

$ ./hello
Hello World!

给ocamlcてきだいいち个实际参すうhello.ml指定していよう编译てきげんぶんけん-o hello标志指定していりょう输出ぶんけん[18]

阶乘函数かんすう

[编辑]

很多数学すうがく函数かんすう阶乘以很自然しぜんてき表示ひょうじ为纯いきてき函数かんすう形式けいしき

let rec fact n =
  if n=0 then 1 else n * fact(n - 1);;

这个函数かんすう使用しようしきひきはいとう价的うつし为:

let rec fact = function
  | 0 -> 1
  | n -> n * fact(n - 1);;

きさきしゃ形式けいしき阶乘さく递推关系てき数学すうがくてい义。

编译はた这个函数かんすうてき类型推论为int -> int意味いみ这个函数かんすうしょうintうついたintれい如,12!

# fact 12;;
- : int = 479001600

斐波ちぎり序列じょれつ

[编辑]

しも列代れつだい码计さん输入すうnてき斐波ちぎり数列すうれつ。它使ようりょう递归しきひきはい

let fib n =
  let rec fib_aux m a b =
    match m with
    | 0 -> a
    | _ -> fib_aux (m - 1) b (a + b)
  in fib_aux n 0 1;;

なまにち问题

[编辑]

しもれつほどじょ计算ざい一个屋子里面有完全唯一的生日概率小于50%てき最少さいしょう人数にんずうざいなまにち问题なか,对于1个人这个がいりつ365/365(ある100%),对于2个人364/365,对于3个人364/365 × 363/365,さい终答あん23个人:

let year_size = 365.
let rec birthday_paradox prob people =
  let prob = (year_size -. float people) /. year_size *. prob  in
  if prob < 0.5 then
    Printf.printf "answer = %d\n" (people+1)
  else
    birthday_paradox prob (people+1);;
# birthday_paradox 1.0 1;;
answer = 23
- : unit = ()

ごう计整数列すうれつひょう

[编辑]

れつひょうOCamlちゅうてきもと础数すえ类型いち下面かめんてきだい码例てい递归函数かんすうsum,它接受せつじゅいち个实际参すうintegers,而它假定かてい为整すうてきれつひょう注意ちゅうい关键rec指示しじりょう这个函数かんすう递归てき。这个函数かんすう递归てきざい给定整数せいすうれつひょううえ进行迭代,并提供ていきょう这些元素げんそてきいち个总match语句类似于CてきswitchえいSwitch statement语句,ただしようさら一般いっぱんせい

let rec sum integers =                   (* 关键rec含义为递归。 *)
  match integers with
  | [] -> 0                              (* 产生0,如果integers为空列くうれつひょう []。 *)
  | first :: rest -> first + sum rest;;  (* 递归调用,如果integers是非ぜひ空列くうれつひょう
                                            first这个れつひょうてきだいいち元素げんそ
                                            而restあまり元素げんそてきれつひょう可能かのう[]。 *)
# sum [1;2;3;4;5];;
- : int = 15

另一种方式是对列表使用标准的foldこう阶函すう:

let sum integers =
  List.fold_left (fun accumulator x -> accumulator + x) 0 integers;;
# sum [1;2;3;4;5];;
- : int = 15

いん匿名とくめい函数かんすう简单てき+さん应用,它可以简うつし为:

let sum integers =
  List.fold_left (+) 0 integers

いちてき,还可以通过采よう份应ようえいPartial application省略しょうりゃくれつひょう实际さんすう

let sum =
  List.fold_left (+) 0

快速かいそくはいじょ

[编辑]

OCaml自身じしん提供ていきょう对递归算法的ほうてき简介ひょう达。した列代れつだい码例实现りょう类似于以ますじょはいじょいち个列ひょうてきquicksortてきいち个算ほう

 let rec qsort = function
   | [] -> []
   | pivot :: rest ->
     let is_less x = x < pivot in
     let left, right = List.partition is_less rest in
     qsort left @ [pivot] @ qsort right;;

こう阶函すう

[编辑]

函数かんすう接受せつじゅ函数かんすうさく为参すう并且かえしかい函数かんすうさく为结はてれい如,应用twiceいた函数かんすうf产生应用fいた它的实际さんすう两次てきいち个函すう

let twice (f : 'a -> 'a) = fun (x : 'a) -> f (f x);;
let inc (x : int) : int = x + 1;;
let add2 = twice inc;;
let inc_str (x : string) : string = x ^ " " ^ x;;
let add_str = twice(inc_str);;
# add2 98;;
- : int = 100
# add_str "Test";;
- : string = "Test Test Test Test"

函数かんすうtwice使用しよう类型变量'aらい指示しじ它可以应よう于映いち个类がた'aいた自身じしんてきにんなにf,而非ただ应用于int->int函数かんすうとく别是,twice甚至以应よう自身じしん

# let fourtimes f = (twice twice) f;;
val fourtimes : ('a -> 'a) -> 'a -> 'a = <fun>
# let add4 = fourtimes inc;;
val add4 : int -> int = <fun>
# add4 98;;
- : int = 102

邱奇すう

[编辑]

しも列代れつだい码定义自然しぜんすうてき邱奇编码具有ぐゆうきさき继(succ)かず加法かほう(add)。邱奇すうn接受せつじゅいち个函すうfいち个值xてきいちこう阶函すう,它应ようfいたxせい确的nつぎ

let zero f x = x
let succ n f x = f (n f x)
let one = succ zero
let two = succ (succ zero)
let add n1 n2 f x = n1 f (n2 f x)
let to_string n = n (fun k -> "S" ^ k) "0";;

为了しょう一个邱奇数从函数值转换成一个字符串,这里它传递给こう其输にゅうかずつねりょうくし"0"ぜんおけじょうくし"S"てき函数かんすうto_string

# let _ = to_string (add (succ two) two);;
- : string = "SSSSS0"

对象れい

[编辑]

ざいOCamlちゅう对象つう过它们的方法ほうほうてき名字みょうじ类型,按结构来确定类型。对象直接ちょくせつ创建(たてそく对象),而不ようどおり过有名称めいしょうてき类。れい如:

# let x =
    object
      val mutable x = 5
      method get_x = x
      method set_x y = x <- y
    end;;
val x : < get_x : int; set_x : int -> unit > = <obj>

这里OCaml交互こうごしき运行时间けい统打しるし这个对象てき推论类型。它的类型< get_x : int; set_x : int -> unit >ただゆかり它的方法ほうほうてい义。换句话说,xてき类型よし方法ほうほう类型get_x : intset_x : int -> unit而非にんなん名字みょうじてい[19]ただ充当じゅうとう建立こんりゅう对象てき函数かんすうれい如上じょじょうれいちゅうてき对象以用类来てい义,并接着用ちゃくようnewさんらい建立こんりゅう

# class simple_cls =
    object (self)
      val mutable x = 5
      method get_x = x
      method set_x y = x <- y
    end;;
  let x = new simple_cls;;

ようてい义有しょうどうてき方法ほうほう方法ほうほう类型てき另一个对ぞう

# let y =
    object
      method get_x = 2
      method set_x y = Printf.printf "%d\n" y
    end;;
val y : < get_x : int; set_x : int -> unit > = <obj>

OCamlはた它们视为ゆうしょうどうてき类型。れい如,等式とうしきさん确定类型为只接受せつじゅゆうしょうどう类型てき两个值:

# x = y;;
- : bool = false

所有しょゆうつきかん它们ゆう不同ふどうてき值,却必定ひつじょうしょうどう类型てきいや则连类型检查かい做完。这展示てんじりょう类型とう价是结构せいてき以定义调よういち个方法的ほうてき函数かんすう

# let set_to_10 a = a#set_x 10;;
val set_to_10 : < set_x : int -> 'a; .. > -> 'a = <fun>

だい一个实际参数的推论类型< set_x : int -> 'a; .. >值得关注てき..意味いみだいいち个实际参すう以是ゆう接受せつじゅいちintさく为实际参すうてきset_x方法ほうほうてきにんなん对象。所以ゆえん它可以用ざい对象xこれじょう

# set_to_10 x;;
- : unit = ()

另一个对象可以碰巧有这个方法和方法类型;其他方法ほうほう无关紧要てき

# let z =
    object
      method blahblah = 2.5
      method set_x y = Printf.printf "%d\n" y
    end;;
val z : < blahblah : float; set_x : int -> unit > = <obj>

set_to_10函数かんすう对它也有效ゆうこう

# set_to_10 z;;
10
- : unit = ()

展示てんじりょう对于事物じぶつ如方ほう调用てきけんようせいよし结构らい确定てき下面かめん为只ゆういちget_x方法ほうほう而没ゆう其他方法ほうほうてき对象てい义一个类型同义词(synonym):

# type simpler_obj = < get_x : int >;;
type simpler_obj = < get_x : int >

对象x这个类型てきただしざい结构じょうx这个类型てきいち个子类型,いんx包含ほうがん它的方法ほうほうてきいち个超しゅう所以ゆえんx强制きょうせい(coerce)なり这个类型:

# (x :> simpler_obj);;
- : simpler_obj = <obj>
# (x :> simpler_obj)#get_x;;
- : int = 10

ただし对象zくだりいん为它一个结构子类型:

# (z :> simpler_obj);;
Error: Type < blahblah : float; set_x : int -> unit > is not a subtype of
         simpler_obj = < get_x : int > 
       The first object type has no method get_x

展示てんじりょうつぶせ强制きょうせいてきけんようせい结构せいてき

任意にんい精度せいど阶乘函数かんすう

[编辑]

以从OCaml访问かく种各样的库。如,OCamlゆうないけんてき任意にんい精度せいどさんよし于阶じょう函数かんすうぞう长得非常ひじょう迅速じんそくかい很快溢出つくえ精度せいどてき整数せいすうよし此阶じょう很适あい选用任意にんい精度せいどさん术。

ざいOCamlちゅうNumかたぎ块(现在ZArithところだい提供ていきょうりょう任意にんい精度せいどさん术,如在Ubuntu中安なかやすそう它:sudo apt install libnum-ocaml-dev,它可以如这样そう载到运行ちゅうてき顶层ちゅう

#use "topfind";;
#require "num";;
open Num;;

阶乘函数かんすう使用しよう任意にんい精度せいどさん=/*/-/うつし为:

let rec fact n =
  if n =/ Int 0 then Int 1 else n */ fact(n -/ Int 1);;

这个函数かんすう以计ざん非常ひじょうだいてき阶乘120!

# string_of_num (fact (Int 120));;
- : string =
"6689502913449127057588118054090372586752746333138029810295671352301633557244962989366874165271984981308157637893214090552534408589408121859898481114389650005964960521256960000000000000000000000000000"

绘制图形れい

[编辑]

しもれつほどじょsimple.ml使用しようOpenGLてい现一个缓慢旋转的2D三角形さんかっけい:

let () =
  ignore (Glut.init Sys.argv);
  Glut.initDisplayMode ~double_buffer:true ();
  ignore (Glut.createWindow ~title:"OpenGL Demo");
  let angle t = 10. *. t *. t in
  let render () =
    GlClear.clear [ `color ];
    GlMat.load_identity ();
    GlMat.rotate ~angle: (angle (Sys.time ())) ~z:1. ();
    GlDraw.begins `triangles;
    List.iter GlDraw.vertex2 [-1., -1.; 0., 1.; 1., -1.];
    GlDraw.ends ();
    Glut.swapBuffers () in
  GlMat.mode `modelview;
  Glut.displayFunc ~cb:render;
  Glut.idleFunc ~cb:(Some Glut.postRedisplay);
  Glut.mainLoop ()

需要じゅようごと先安さきやすそう负责绑定いたOpenGLてきLablGL,如在Ubuntu中安なかやすそう它:sudo apt install liblablgl-ocaml-dev,这个ほどじょ以如这样编译なり节码:

$ ocamlc -I +lablGL lablglut.cma lablgl.cma simple.ml -o simple

ある编译成本なりもとつくえだい码:

$ ocamlopt -I +lablGL lablglut.cmxa lablgl.cmxa simple.ml -o simple

あるもの简单てき使用しようocamlfind建造けんぞう命令めいれい

$ ocamlfind opt simple.ml -package lablgl.glut -linkpkg -o simple

しかきさき运行:

$ ./simple

使用しようOCaml开发非常ひじょう复杂、高性能こうせいのうてき2D3D图形ほどじょ使用しようOpenGLOCaml,结果てきほどじょ以跨平台ひらだい编译而在主要しゅよう平台ひらだいうえ无需あらため动。

ようOCamlうつしなりてきほどじょ

[编辑]

まいり

[编辑]

ゆう关书せき

[编辑]

引用いんよう

[编辑]
  1. ^ 1.0 1.1 1.2 Xavier Leroy. Manifest types, modules, and separate compilation (PDF). Principles of Programming Languages. 1994 [2021-09-06]. (原始げんし内容ないよう (PDF)そん档于2021-10-22). 
  2. ^ 2.0 2.1 Didier Rémy. Type inference for records in a natural extension of ML. Research Report RR-1431, INRIA. 1991 [2021-09-10]. (原始げんし内容ないようそん档于2022-04-06). 
    Didier Rémy, Jérôme Vouillon. Objective ML: a simple object-oriented extension of ML (PDF). 1997 [2021-09-06]. (原始げんし内容ないよう (PDF)そん档于2022-01-21). 
    Didier Rémy, Jérôme Vouillon. Objective ML: An effective object-oriented extension to ML (PDF). 1998 [2021-09-06]. (原始げんし内容ないよう (PDF)そん档于2022-01-20). 
  3. ^ OCaml 5.2.0 Release Notes. [2024ねん5がつ24にち]. 
  4. ^ MetaOCaml -- an OCaml dialect for multi-stage programming. [2021-08-28]. (原始げんし内容ないようそん档于2021-08-29). 
  5. ^ Xavier LeroyえいXavier Leroy. The Caml Light system Release 0.74, documentation and user's guide. 1997 [2021-09-02]. (原始げんし内容ないようそん档于2022-03-08). 
  6. ^ Xavier Leroy. The Objective Caml system release 1.07, Documentation and user's manual. 1997 [2021-09-02]. (原始げんし内容ないようそん档于2022-01-23). 
  7. ^ A History of Caml. [2021-09-02]. (原始げんし内容ないようそん档于2022-04-13). Our main reason for developing Caml was to use it for sofware development inside Formel. Indeed, it was used for developing the Coq system ……. We were reluctant to adopt a standard that could later prevent us from adapting the language to our programming needs. ……We did incorporate into Caml most of the improvements brought by Standard ML over Edinburgh ML. ……The first implementation of Caml appeared in 1987 and was further developed until 1992. It was created mainly by Ascander Suarez. ……
    In 1990 and 1991, Xavier Leroy designed a completely new implementation of Caml, based on a bytecode interpreter written in C. Damien Doligez provided an excellent memory management system. ……In 1995, Xavier Leroy released Caml Special Light, which improved over Caml Light in several ways. In 1995, Xavier Leroy released Caml Special Light, which improved over Caml Light in several ways. First, an optimizing native-code compiler was added to the bytecode compiler. ……Second, Caml Special Light offered a high-level module system, designed by Xavier Leroy and inspired by the module system of Standard ML. ……Didier Rémy, later joined by Jérôme Vouillon, designed an elegant and highly expressive type system for objects and classes. This design was integrated and implemented within Caml Special Light, leading to the Objective Caml language and implementation, first released in 1996 and renamed to OCaml in 2011.
     
  8. ^ G. Cousineau, P.-L. Curien, M. Mauny. The categorical abstract machine. 1985 [2021-09-03]. (原始げんし内容ないようそん档于2021-09-03).  LNCS, 201, Functional programming languages computer architecture, pp.~50-64.
    Michel Mauny, Ascánder Suárez. Implementing functional languages in the Categorical Abstract Machine (PDF). 1986 [2021-09-07]. (原始げんし内容ないよう (PDF)そん档于2022-01-28).  LFP '86: Proceedings of the 1986 ACM conference on LISP and functional programming, Pages 266–278.
  9. ^ G. Cousineau, M. Gordon, G. Huet, R. Milner, L. C. Paulson, C. Wadsworth. The ML Handbook, Version 6.2. Internal document. Project Formel, INRIA. July 1985. 
    Christoph Kreitz, Vincent Rahli. Introduction to Classic ML (PDF). 2011 [2021-09-11]. (原始げんし内容ないよう (PDF)そん档于2022-01-29). This handbook is a revised edition of Section 2 of ‘Edinburgh LCF’, by M. Gordon, R. Milner, and C. Wadsworth, published in 1979 as Springer Verlag Lecture Notes in Computer Science no 78. ……The language is somewhere in between the original ML from LCF and standard ML, since Guy Cousineau added the constructors and call by patterns. This is a LISP based implementation, compatible for Maclisp on Multics, Franzlisp on VAX under Unix, Zetalisp on Symbolics 3600, and Le Lisp on 68000, VAX, Multics, Perkin-Elmer, etc... Video interfaces have been implemented by Philippe Le Chenadec on Multics, and by Maurice Migeon on Symbolics 3600. The ML system is maintained and distributed jointly by INRIA and the University of Cambridge. 
  10. ^ Guy Cousineau, Gérard HuetえいGérard Huet. The CAML primer Version 2.6.1. 1990 [2021-09-07]. (原始げんし内容ないようそん档于2022-05-04).  RT-0122, INRIA. pp.78.
    Pierre Weis, Maria Virginia Aponte, Alain Laville, Michel Mauny, Ascander Suarez. The CAML reference manual Version 2.6.1. 1990 [2021-09-07]. (原始げんし内容ないようそん档于2022-04-06).  [Research Report] RT-0121, INRIA. pp.491.
  11. ^ Xavier Leroy. The ZINC experiment : an economical implementation of the ML language. 1990 [2021-09-06]. (原始げんし内容ないようそん档于2022-04-06).  RT-0117, INRIA.
  12. ^ Linux Weekly News页面そん档备份そん互联网档あん).
  13. ^ ocaml/asmcomp at trunk · ocaml/ocaml · GitHub. GitHub. [2 May 2015]. (原始げんし内容ないようそん档于2022-05-07). 
  14. ^ Archives of the Caml mailing list > Message from Xavier Leroy. [2021-09-10]. (原始げんし内容ないようそん档于2022-03-31). 
  15. ^ Functory. [2021-08-30]. (原始げんし内容ないようそん档于2022-01-20). 
  16. ^ ocamlnet/Plasma. [2021-08-30]. (原始げんし内容ないようそん档于2022-03-23). 
  17. ^ OCaml - The toplevel system or REPL (ocaml). ocaml.org. [2021-05-17]. (原始げんし内容ないようそん档于2021-09-11). 
  18. ^ Batch compilation (ocamlc)页面そん档备份そん互联网档あん).
  19. ^ Object types. [2021-09-10]. (原始げんし内容ないようそん档于2022-03-10). 
  20. ^ Coq页面そん档备份そん互联网档あん
  21. ^ Flow: A Static Type Checker for JavaScript. [2021-08-29]. (原始げんし内容ないようそん档于2022-04-08). 
  22. ^ Infer static analyzer. [2021-08-29]. (原始げんし内容ないようそん档于2022-05-12). 
  23. ^ GitHub - facebook/pyre-check: Performant type-checking for python.. 9 February 2019 [2021-08-29]. (原始げんし内容ないようそん档于2022-05-05) –どおり过GitHub. 
  24. ^ WebAssembly/spec: WebAssembly specification, reference interpreter, and test suite.. World Wide Web Consortium. 5 December 2019 [2021-05-14]. (原始げんし内容ないようそん档于2022-05-12) –どおり过GitHub. 
  25. ^ FFTW页面そん档备份そん互联网档あん
  26. ^ MirageOS. [2021-08-29]. (原始げんし内容ないようそん档于2022-04-20). 
  27. ^ Unison. [2021-08-28]. (原始げんし内容ないようそん档于2021-07-12). 

外部がいぶ链接

[编辑]