OCaml
Парадигмы | Мультипарадигмальность : функциональная , императивная , модульная , [1] объектно-ориентированный |
---|---|
Семья | МЛ : Камл |
Разработано | Ксавье Лерой , Жером Вуйон, Дамьен Долигес , Дидье Реми, Аскандер Суарес |
Разработчик | Инрия |
Впервые появился | 1996 год [2] |
Стабильная версия | 5.2.0 [3]
/ 13 мая 2024 г |
Дисциплина набора текста | Предполагаемый , статический , сильный , структурный. |
Язык реализации | ОКамл, C |
Платформа | ИА-32 , x86-64 , мощность , SPARC , ARM 32-64 , RISC-V |
ТЫ | Кроссплатформенность : Linux , Unix , macOS , Windows. |
Лицензия | LGPLv2.1 |
Расширения имен файлов | .мл, .мли |
Веб-сайт | окамл |
Под влиянием | |
C , Caml , Модуль-3 , Паскаль , Стандартный ML | |
Под влиянием | |
ATS , Coq , Elm , F# , F* , Haxe , Опа , Ржавчина , [4] Скала | |
|
OCaml ( / oʊ ˈ k æ m əl / oh- KAM -əl , ранее Objective Caml это общего назначения высокоуровневый , многопарадигмальный ) — язык программирования который расширяет Caml диалект ML объектно -ориентированными функциями. OCaml был создан в 1996 году Ксавье Леруа и Жеромом Вуйоном. [5] , Дэмиен Долигез , Дидье Реми [6] , Аскандер Суарес и другие.
OCaml Набор инструментов включает в себя интерактивный интерпретатор верхнего уровня , байт-кода компилятор , оптимизирующий компилятор собственного кода , обратимый отладчик и менеджер пакетов (OPAM). OCaml изначально был разработан в контексте автоматического доказательства теорем и используется в программном обеспечении для статического анализа и формальных методов . Помимо этих областей, он нашел применение в системном программировании , веб-разработке и конкретных финансовых утилитах, а также в других областях приложений.
Аббревиатура CAML первоначально обозначала категориальный абстрактный машинный язык , но в OCaml эта абстрактная машина отсутствует . [7] OCaml — это бесплатный программный проект с открытым исходным кодом , управляемый и поддерживаемый Французским институтом исследований в области компьютерных наук и автоматизации (Inria). В начале 2000-х годов элементы OCaml были приняты во многих языках, особенно в F# и Scala .
Философия [ править ]
Языки, производные от машинного обучения , наиболее известны своими системами статических типов и компиляторами, определяющими типы . OCaml объединяет функциональное , императивное и объектно-ориентированное программирование в рамках системы типов, подобной ML. Таким образом, для использования OCaml программистам не обязательно хорошо разбираться в чисто функциональной парадигме языка.
, связанные с типами, Требуя от программиста работать в рамках ограничений своей системы статических типов, OCaml устраняет многие проблемы времени выполнения связанные с динамически типизированными языками. Кроме того, компилятор OCaml, определяющий тип, значительно снижает потребность в ручных аннотациях типов, которые требуются в большинстве статически типизированных языков. Например, типы данных переменных и сигнатуры функций обычно не нужно объявлять явно, как это делается в таких языках, как Java и C# , поскольку их можно вывести из операторов и других функций, которые применяются к переменным и другим значениям. в коде. Эффективное использование системы типов OCaml может потребовать от программиста некоторой искушенности, но эта дисциплина вознаграждается надежным и высокопроизводительным программным обеспечением.
OCaml, пожалуй, больше всего отличается от других языков, возникших в академических кругах, своим упором на производительность. Его система статических типов предотвращает несоответствие типов во время выполнения и, таким образом, устраняет проверки типов и безопасности во время выполнения, которые нагружают производительность динамически типизированных языков, в то же время гарантируя безопасность во время выполнения, за исключением случаев, когда проверка границ массива отключена или когда некоторые небезопасные по типам функции, такие как сериализация. используются . Они настолько редки, что на практике их вполне возможно избежать.
Помимо накладных расходов на проверку типов, функциональные языки программирования, как правило, сложно скомпилировать в эффективный код машинного языка из-за таких проблем, как проблема funarg . OCaml Наряду со стандартными оптимизациями циклов, регистров и инструкций, оптимизирующий компилятор использует методы статического анализа программы для оптимизации упаковки значений и распределения замыканий , помогая максимизировать производительность результирующего кода, даже если в нем широко используются конструкции функционального программирования.
Ксавье Лерой заявил, что «OCaml обеспечивает не менее 50% производительности приличного компилятора C». [8] хотя прямое сравнение невозможно. Некоторые функции стандартной библиотеки OCaml реализованы с использованием более быстрых алгоритмов, чем эквивалентные функции в стандартных библиотеках других языков. Например, реализация объединения множеств в стандартной библиотеке OCaml теоретически асимптотически быстрее, чем эквивалентная функция в стандартных библиотеках императивных языков (например, C++, Java), поскольку реализация OCaml может использовать неизменяемость множеств для повторного использования частей. входные данные задаются на выходе (см. постоянную структуру данных ).
История [ править ]
Разработка ML (мета-языка) [ править ]
В период с 1970-х по 1980-е годы Робин Милнер , британский ученый-компьютерщик и лауреат премии Тьюринга , работал в Эдинбургского университета Лаборатории основ компьютерных наук . [9] [10] Милнер и другие работали над средствами доказательства теорем , которые исторически были разработаны в таких языках, как Лисп . Милнер неоднократно сталкивался с проблемой, что лица, доказывающие теоремы, пытались утверждать, что доказательство действительно, путем объединения недоказательств. [10] В результате он продолжил разработку метаязыка для своей «Логики вычислимых функций» , языка, который позволял автору создавать действительные доказательства только с помощью своей полиморфной системы типов. [11] ML был превращен в компилятор для упрощения использования LCF на разных машинах, а к 1980-м годам превратился в полноценную собственную систему. [11] ML в конечном итоге послужит основой для создания OCaml.
В начале 1980-х годов произошли некоторые события, которые побудили команду Formel из INRIA заинтересоваться языком ML. Лука Карделли , профессор-исследователь Оксфордского университета , использовал свою функциональную абстрактную машину для разработки более быстрой реализации ML, а Робин Милнер предложил новое определение ML, чтобы избежать расхождений между различными реализациями. Одновременно Пьер-Луи Кюрьен, старший научный сотрудник Парижского университета Дидро , разработал исчисление категориальных комбинаторов и связал его с лямбда-исчислением , что привело к определению категориальной абстрактной машины (КАМ). Ги Кузино, исследователь из Парижского университета Дидро, признал, что это можно применить в качестве метода сбора данных для ОД. [12]
Первая реализация [ править ]
Первоначально Caml был спроектирован и разработан командой Formel компании INRIA под руководством Жерара Юэ . Первая реализация Caml была создана в 1987 году и развивалась до 1992 года. Хотя ее возглавляли Аскандер Суарес, Пьер Вайс и Мишель Мони продолжили разработку после его ухода в 1988 году. [12]
Цитируется Ги Кузино, вспоминающий, что его опыт реализации языков программирования изначально был очень ограниченным и что существовало множество недостатков, за которые он несет ответственность. Несмотря на это, он считает, что «Аскандер, Пьер и Мишель проделали неплохую работу». [12]
Камл Лайт [ править ]
Между 1990 и 1991 годами Ксавье Лерой разработал новую реализацию Caml на основе интерпретатора байт-кода, на C. написанного В дополнение к этому Дэмиен Долигез написал для этой реализации систему управления памятью, также известную как последовательный сборщик мусора . [11] Эта новая реализация, известная как Caml Light , заменила старую реализацию Caml и работала на небольших настольных компьютерах. [12] В последующие годы появились такие библиотеки, как инструменты манипулирования синтаксисом Мишеля Мони, которые помогли продвигать использование Caml в образовательных и исследовательских группах. [11]
Caml Special Light [ править ]
В 1995 году Ксавье Лерой выпустил Caml Special Light, который представлял собой улучшенную версию Caml. [12] оптимизирующий компилятор собственного кода К компилятору байт-кода был добавлен , что значительно повысило производительность до сопоставимых уровней с основными языками, такими как C++ . [11] [12] Кроме того, Лерой разработал систему модулей высокого уровня, вдохновленную системой модулей Standard ML, которая предоставляла мощные возможности для абстракции и параметризации и упрощала создание крупномасштабных программ. [11]
Цель Caml [ править ]
Дидье Реми и Жером Вуйон разработали выразительную систему типов для объектов и классов, которая была интегрирована в Caml Special Light. Это привело к появлению языка Objective Caml, впервые выпущенного в 1996 году и впоследствии переименованного в OCaml в 2011 году. Эта объектная система, в частности, поддерживала многие распространенные объектно-ориентированные идиомы статически типобезопасным способом, в то время как те же самые идиомы вызывали несостоятельность или требовали проверки времени выполнения на таких языках, как C++ или Java . В 2000 году Жак Гарриг расширил Objective Caml множеством новых функций, таких как полиморфные методы, варианты, а также помеченные и необязательные аргументы. [11] [12]
Постоянное развитие [ править ]
В течение последних двух десятилетий постепенно добавлялись языковые улучшения для поддержки растущих коммерческих и академических баз кода OCaml. [11] В выпуске OCaml 4.0 в 2012 году были добавлены обобщенные алгебраические типы данных (GADT) и первоклассные модули для повышения гибкости языка. [11] Выпуск OCaml 5.0.0 в 2022 г. [13] — это полная переписывание среды выполнения языка, удаление глобальной блокировки GC и добавление обработчиков эффектов через продолжения с разделителями . Эти изменения обеспечивают поддержку параллелизма с общей памятью и параллелизма с цветовой слепотой соответственно.
Разработка OCaml продолжалась внутри команды Cristal в INRIA до 2005 года, когда ее сменила команда Gallium. [14] Впоследствии в 2019 году на смену Gallium пришла команда Cambium. [15] [16] По состоянию на 2023 год насчитывается 23 основных разработчика дистрибутива компилятора из различных организаций. [17] и 41 разработчик для более широкой экосистемы инструментов и пакетов OCaml. [18]
Особенности [ править ]
OCaml имеет систему статических типов , вывод типов , параметрический полиморфизм , хвостовую рекурсию , сопоставление с образцом , первоклассные лексические замыкания , функторы (параметрические модули) , обработку исключений , обработку эффектов и инкрементную поколенческую автоматическую сборку мусора .
OCaml примечателен тем, что расширяет вывод типов в стиле ML на объектную систему на языке общего назначения. Это допускает структурное подтипирование , при котором типы объектов совместимы, если их сигнатуры методов совместимы, независимо от их объявленного наследования (необычная функция для статически типизированных языков).
массивов в форматах , совместимых как Предоставляется внешний интерфейс функций для связи с примитивами C, включая языковую поддержку эффективных числовых с C, так и с Fortran . OCaml также поддерживает создание библиотек функций OCaml, которые можно связать с основной программой на C, чтобы библиотеку OCaml можно было распространять среди программистов C, которые не имеют знаний или не имеют установки OCaml.
Дистрибутив OCaml содержит:
- Инструменты лексического анализа и синтаксического анализа, называемые ocamllex и ocamlyacc.
- Отладчик , поддерживающий возврат назад для исследования ошибок.
- Генератор документации
- Профилировщик – для измерения производительности
- общего назначения Множество библиотек
Компилятор собственного кода доступен для многих платформ, включая Unix , Microsoft Windows и Apple macOS . Переносимость достигается за счет встроенной поддержки генерации кода для основных архитектур:
- X86-64 (AMD64), RISC-V и ARM64 (в OCaml 5.0.0 и выше) [19]
- IBM Z (до OCaml 5.0.0 и обратно в OCaml 5.1.0)
- Мощность (до версии OCaml 5.0.0 и в связи с появлением в OCaml 5.2.0)
- IA-32 и ARM (до OCaml 5.0.0)
- SPARC (до OCaml 4.06.0)
- DEC Alpha , HPPA , IA64 и MIPS (до OCaml 4.00.0)
Компилятор байт-кода поддерживает работу на любой 32- или 64-битной архитектуре, когда генерация собственного кода недоступна, и требуется только компилятор C.
Программы с байт-кодом OCaml и собственным кодом могут быть написаны в многопоточном стиле с упреждающим переключением контекста. Потоки OCaml в том же домене [20] выполнять только с разделением времени. Однако программа OCaml может содержать несколько доменов.
Примеры кода [ править ]
Эта статья в значительной степени или полностью опирается на один источник . ( январь 2024 г. ) |
Фрагменты кода OCaml легче всего изучать, вводя их в верхнего уровня REPL . Это интерактивный сеанс OCaml, который печатает предполагаемые типы результирующих или определенных выражений. [21] Верхний уровень OCaml запускается простым выполнением программы OCaml:
$ ocaml
Objective Caml version 3.09.0
#
Затем код можно будет ввести в строке «#». Например, чтобы вычислить 1+2*3:
# 1 + 2 * 3;;
- : int = 7
OCaml определяет тип выражения как «int» ( машинной точности целое число ) и выдает результат «7».
Привет, мир [ править ]
Следующая программа «hello.ml»:
print_endline "Hello World!"
можно скомпилировать в исполняемый файл с байт-кодом:
$ ocamlc hello.ml -o hello
или скомпилировать в оптимизированный исполняемый файл собственного кода:
$ ocamlopt hello.ml -o hello
и выполнил:
$ ./hello
Hello World!
$
Первый аргумент ocamlc, «hello.ml», указывает исходный файл для компиляции, а флаг «-o hello» указывает выходной файл. [22]
Вариант [ править ]
option
конструктор типа в OCaml, аналогичный Maybe
type в Haskell дополняет заданный тип данных для возврата Some
значение данного типа данных или вернуть None
. [23] Это используется для выражения того, что значение может присутствовать или отсутствовать.
# Some 42;;
- : int option = Some 42
# None;;
- : 'a option = None
Это пример функции, которая либо извлекает int из опции, если она есть внутри, и преобразует ее в строку , либо, если нет, возвращает пустую строку:
let extract o =
match o with
| Some i -> string_of_int i
| None -> "";;
# extract (Some 42);;
- : string = "42"
# extract None;;
- : string = ""
Суммирование списка целых чисел [ править ]
Списки — один из фундаментальных типов данных в OCaml. В следующем примере кода определяется рекурсивная функция sum , которая принимает один аргумент, целые числа , который должен быть списком целых чисел. Обратите внимание на ключевое слово rec
что означает, что функция рекурсивная. Функция рекурсивно перебирает заданный список целых чисел и вычисляет сумму элементов. Оператор match имеет сходство с , C элементом переключателя хотя он гораздо более общий.
let rec sum integers = (* Keyword rec means 'recursive'. *)
match integers with
| [] -> 0 (* Yield 0 if integers is the empty
list []. *)
| first :: rest -> first + sum rest;; (* Recursive call if integers is a non-
empty list; first is the first
element of the list, and rest is a
list of the rest of the elements,
possibly []. *)
# sum [1;2;3;4;5];;
- : int = 15
Другой способ — использовать стандартную функцию сгиба , работающую со списками.
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
Более того, аргумент списка можно опустить, воспользовавшись частичным применением :
let sum =
List.fold_left (+) 0
Быстрая сортировка [ править ]
OCaml позволяет кратко выражать рекурсивные алгоритмы. В следующем примере кода реализуется алгоритм, аналогичный быстрой сортировке , который сортирует список по возрастанию.
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
Или используя частичное применение оператора >=.
let rec qsort = function
| [] -> []
| pivot :: rest ->
let is_less = (>=) pivot in
let left, right = List.partition is_less rest in
qsort left @ [pivot] @ qsort right
Проблема с днем рождения [ править ]
Следующая программа вычисляет наименьшее количество людей в комнате, для которых вероятность совершенно уникальных дней рождения составляет менее 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
Церковные цифры [ править ]
Следующий код определяет кодировку Чёрча натуральных чисел с преемником (succ) и сложением (add). Чёрч-цифра n
— это функция высшего порядка , которая принимает функцию f
и значение x
и применяется f
к x
точно n
раз. Чтобы преобразовать число Чёрча из функционального значения в строку, мы передаем ему функцию, которая добавляет строку в начало. "S"
на его вход и константную строку "0"
.
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"
let _ = to_string (add (succ two) two)
Функция факториала произвольной точности (библиотеки) [ править ]
Множество библиотек доступны напрямую из OCaml. Например, в OCaml есть встроенная библиотека для арифметики произвольной точности . Поскольку функция факториала растет очень быстро, она быстро переполняет числа машинной точности (обычно 32- или 64-битные). Таким образом, факториал является подходящим кандидатом для арифметики произвольной точности.
В OCaml модуль Num (теперь замененный модулем ZArith) обеспечивает арифметику произвольной точности и может быть загружен в работающий верхний уровень с помощью:
# #use "topfind";;
# #require "num";;
# open Num;;
Затем функцию факториала можно записать с использованием числовых операторов произвольной точности. =/ , */ и -/ :
# let rec fact n =
if n =/ Int 0 then Int 1 else n */ fact(n -/ Int 1);;
val fact : Num.num -> Num.num = <fun>
Эта функция может вычислять гораздо большие факториалы, например 120!:
# string_of_num (fact (Int 120));;
- : string =
"6689502913449127057588118054090372586752746333138029810295671352301633
55724496298936687416527198498130815763789321409055253440858940812185989
8481114389650005964960521256960000000000000000000000000000"
Треугольник (графика) [ править ]
Следующая программа визуализирует вращающийся треугольник в 2D с использованием OpenGL :
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 ()
Требуются привязки LablGL к OpenGL. Затем программу можно скомпилировать в байт-код с помощью:
$ 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 можно разрабатывать гораздо более сложные и высокопроизводительные 2D- и 3D-графические программы. Благодаря использованию OpenGL и OCaml полученные программы могут быть кроссплатформенными, компилируясь без каких-либо изменений на многих основных платформах.
Последовательность Фибоначчи [ править ]
Следующий код вычисляет последовательность Фибоначчи для введенного числа 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
Функции высшего порядка [ править ]
Функции могут принимать функции в качестве входных данных и возвращать функции в качестве результата. Например, если применить дважды к функции 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"
Функция дважды использует переменную типа 'a, чтобы указать, что ее можно применить к любой функции f, отображающей тип 'a в себя, а не только к int->int функциям . В частности, дважды можно применить даже к самому себе.
# 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
Производные языки [ править ]
МетаОКамл [ править ]
МетаОКамл [24] — это многоэтапное программное расширение OCaml, позволяющее инкрементально компилировать новый машинный код во время выполнения. В некоторых случаях значительное ускорение возможно при использовании многоэтапного программирования, поскольку более подробная информация о данных для обработки доступна во время выполнения, чем во время обычной компиляции, поэтому инкрементальный компилятор может оптимизировать многие случаи проверки условий и т. д.
Например: если во время компиляции известно, что некоторая степенная функция x -> x^n
требуется часто, но значение n
известно только во время выполнения, в MetaOCaml можно использовать двухступенчатую степенную функцию:
let rec power n x =
if n = 0
then .<1>.
else
if even n
then sqr (power (n/2) x)
else .<.~x *. .~(power (n - 1) x)>.
Как только n
известна во время выполнения, можно создать специализированную и очень быструю степенную функцию:
.<fun x -> .~(power 5 .<x>.)>.
Результат:
fun x_1 -> (x_1 *
let y_3 =
let y_2 = (x_1 * 1)
in (y_2 * y_2)
in (y_3 * y_3))
Новая функция автоматически компилируется.
производные языки Другие
- F# — это язык платформы .NET, основанный на OCaml.
- JoCaml объединяет конструкции для разработки параллельных и распределенных программ.
- Reason — это альтернативный синтаксис OCaml и набор инструментов для OCaml, созданный в Facebook , который может компилироваться как в собственный код, так и в JavaScript.
Программное обеспечение, написанное на OCaml [ править ]
- Alt-Ergo , решатель SMT.
- Astrée , статический анализатор
- Будь Спортом , социальная сеть
- Coccinelle — утилита для преобразования исходного кода на языке C. программ
- Coq — формальная система управления доказательствами .
- FFTW — библиотека для вычисления дискретных преобразований Фурье . Несколько подпрограмм C были созданы программой OCaml с именем
genfft
. - Веб-версия Facebook Messenger . [25]
- Flow — статический анализатор, созданный в Facebook , который выводит и проверяет статические типы на наличие JavaScript . [26]
- Ocsigen — клиент-серверная среда разработки веб-приложений и мобильных устройств.
- Owl Scientific Computing — специализированная система для научных и инженерных вычислений.
- Frama-C — платформа для анализа программ на языке C.
- GeneWeb — бесплатное многоплатформенное генеалогическое программное обеспечение с открытым исходным кодом.
- Компилятор языка программирования Hack , созданный в Facebook, расширяющий PHP статическими типами.
- Компилятор языка программирования Haxe .
- HOL Light , помощник по формальным доказательствам.
- Infer — статический анализатор, созданный в Facebook для Java , C, C++ и Objective-C , используемый для обнаружения ошибок в iOS и Android . приложениях [27]
- Liquidsoap — язык сценариев для генерации мультимедийных потоков.
- MirageOS — одноядерная среда программирования, написанная на чистом OCaml.
- MLdonkey — одноранговое приложение для обмена файлами, основанное на сети EDonkey .
- Opa — бесплатный язык программирования с открытым исходным кодом для веб-разработки.
- Tezos — самонастраивающаяся платформа смарт-контрактов, использующая XTZ в качестве собственной валюты.
- Unison — программа синхронизации файлов для синхронизации файлов между двумя каталогами.
- Эталонный интерпретатор WebAssembly — низкоуровневого байт-кода , предназначенного для выполнения внутри веб-браузеров . [28]
- Xen Cloud Platform (XCP) — готовое решение виртуализации для Xen гипервизора .
Пользователи [ править ]
По крайней мере, несколько десятков компаний в той или иной степени используют OCaml. [29] Яркие примеры включают:
- Bloomberg LP , которая создала BuckleScript , серверную часть компилятора OCaml, ориентированную на JavaScript. [30]
- Citrix Systems , которая использует OCaml в XenServer (в 2018 году переименована в Citrix Hypervisor). [31]
- Facebook , разработавший Flow, [32] Hack, Infer, Pfff и ReasonML в OCaml.
- Jane Street Capital , частная торговая фирма, которая на заре своего существования приняла OCaml в качестве предпочтительного языка. [33] и продолжает использовать его с 2023 года. [34] [35]
- Docker , который использует OCaml в настольных версиях для macOS и Windows . [36] [37]
Ссылки [ править ]
- ^ «Модули» . Проверено 22 февраля 2020 г. .
- ^ Лерой, Ксавье (1996). «Цель Caml 1.00» . список рассылки caml-list.
- ^ «Примечания к выпуску OCaml 5.2.0» . Проверено 24 мая 2024 г.
- ^ «Влияния — Справочник по ржавчине» . Справочник по ржавчине . Проверено 31 декабря 2023 г.
- ^ «Жером Вуйон» . www.irif.fr. Проверено 14 июня 2024 г.
- ^ «Дидье Реми» . pauillac.inria.fr . Проверено 14 июня 2024 г.
- ^ «История OCaml» . Проверено 24 декабря 2016 г.
- ^ Еженедельные новости Linux .
- ^ «Эй Джей Милнер — лауреат премии А. М. Тьюринга» . amturing.acm.org . Проверено 6 октября 2022 г.
- ^ Jump up to: а б Кларксон, Майкл; и др. «1.2. OCaml: функциональное программирование в OCaml» . курсы.cs.cornell.edu . Проверено 6 октября 2022 г.
- ^ Jump up to: а б с д и ж г час я «Пролог — OCaml в реальном мире» . dev.realworldocaml.org . Проверено 6 октября 2022 г.
- ^ Jump up to: а б с д и ж г «История OCaml – OCaml» . v2.ocaml.org . Проверено 7 октября 2022 г.
- ^ «Выпуск пакета OCaml 5.0.0 OCaml» . ОКамл . Проверено 16 декабря 2022 г.
- ^ «Проект Кристал» . cristal.inria.fr . Проверено 7 октября 2022 г.
- ^ «Команда Галлий — Домой» . Gallium.inria.fr . Проверено 7 октября 2022 г.
- ^ "Дом" . cambium.inria.fr . Проверено 7 октября 2022 г.
- ^ «Управление компилятором OCaml и членство» . 2023.
- ^ «Управление и проекты OCaml» . 2023.
- ^ «ocaml/asmcomp в магистрали · ocaml/ocaml · GitHub» . Гитхаб . Проверено 2 мая 2015 г.
- ^ Домен — это единица параллелизма в OCaml, домен обычно соответствует ядру ЦП.
- ^ «OCaml — Система верхнего уровня или REPL (ocaml)» . ocaml.org . Проверено 17 мая 2021 г.
- ^ «OCaml — Пакетная компиляция (Ocamlc)» .
- ^ «3.7. Параметры — Программирование OCaml: правильное + эффективное + красивое» . cs3110.github.io . Проверено 7 октября 2022 г.
- ^ oleg-at-okmij.org. «BER МетаОКамл» . okmij.org .
- ^ «Messenger.com теперь на 50% превращен в разум · Разум» . причинаml.github.io . Проверено 27 февраля 2018 г.
- ^ «Flow: средство проверки статического типа для JavaScript» . Поток . Архивировано из оригинала 8 апреля 2022 года . Проверено 10 февраля 2019 г.
- ^ «Вывод статического анализатора» . Сделайте вывод .
- ^ «WebAssembly/spec: спецификация WebAssembly, эталонный интерпретатор и набор тестов» . Консорциум Всемирной паутины . 5 декабря 2019 года . Проверено 14 мая 2021 г. - через GitHub.
- ^ «Компании, использующие OCaml» . OCaml.org . Проверено 14 мая 2021 г.
- ^ «BuckleScript: вышла версия 1.0! | Технологии в Bloomberg» . Технологии в Bloomberg . 8 сентября 2016 г. Проверено 21 мая 2017 г.
- ^ Скотт, Дэвид; Шарп, Ричард; Газаньер, Томас; Мадхавапедди, Анил (2010). Использование функционального программирования в группе промышленных продуктов: перспективы и представления . Международная конференция по функциональному программированию . Ассоциация вычислительной техники . дои : 10.1145/1863543.1863557 .
- ^ «Поток на GitHub» . Гитхаб . 2023.
- ^ Ярон Мински (1 ноября 2011 г.). «OCaml для масс» . Проверено 2 мая 2015 г.
- ^ Ярон Мински (2016). «Ключевой доклад — наблюдения функционального программиста» . ACM Коммерческое использование функционального программирования.
- ^ Ярон Мински (2023). «Сигналы и потоки» (Подкаст). Джейн Стрит Кэпитал .
- ^ Анил Мадхавапедди (2016). «Улучшение Docker с помощью Unikernels: представление HyperKit, VPNKit и DataKit» . Докер, Инк.
- ^ «VPNKit на GitHub» . Гитхаб . 2023.
Внешние ссылки [ править ]
- Языки программирования высокого уровня
- Кроссплатформенное бесплатное программное обеспечение
- Языки программирования с расширяемым синтаксисом
- Бесплатные компиляторы и интерпретаторы
- Функциональные языки
- Объектно-ориентированные языки программирования
- Семейство языков программирования ML
- Семейство языков программирования OCaml
- Программное обеспечение OCaml
- Языки программирования сопоставления шаблонов
- Языки программирования, созданные в 1996 году.
- Статически типизированные языки программирования
- Программное обеспечение, использующее лицензию LGPL