OCaml
![]() | |
Парадигмы | Мультипарадигмальность : функциональная , императивная , модульная , [1] объектно-ориентированный |
---|---|
Семья | МЛ : Камл |
Разработано | Ксавье Лерой , Жером Вуйон, Дамьен Долигес , Дидье Реми, Аскандер Суарес |
Разработчик | Инрия |
Впервые появился | 1996 год [2] |
Стабильная версия | 5.2.0 [3] ![]() |
Дисциплина набора текста | Предполагаемый , статический , сильный , структурный. |
Язык реализации | ОКамл, 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- - əl ранее Objective Caml ) — это общего назначения , высокоуровневый многопарадигмальный KAM язык программирования который расширяет 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 может использовать неизменяемость множеств для повторного использования частей. входные данные устанавливают в выходные данные (см. постоянную структуру данных ).
История [ править ]
![](http://upload.wikimedia.org/wikipedia/commons/thumb/f/f5/Award_for_OCaml_at_POPL_2024.jpg/220px-Award_for_OCaml_at_POPL_2024.jpg)
Разработка 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:
$ окамл
Цель Caml версии 3.09.0
#
Затем код можно будет ввести в строке «#». Например, чтобы вычислить 1+2*3:
# 1 + 2 * 3 ;;
- : целое = 7
OCaml определяет тип выражения как «int» ( машинной точности целое число ) и выдает результат «7».
Привет, мир [ править ]
Следующая программа «hello.ml»:
print_endline «Привет, мир!»
можно скомпилировать в исполняемый файл с байт-кодом:
$ ocamlc hello.ml -о привет
или скомпилировать в оптимизированный исполняемый файл собственного кода:
$ ocamlopt hello.ml -o привет
и выполнил:
$ ./привет
Привет, мир!
$
Первый аргумент ocamlc, «hello.ml», указывает исходный файл для компиляции, а флаг «-o hello» указывает выходной файл. [22]
Вариант [ править ]
option
конструктор типа в OCaml, аналогичный Maybe
type в Haskell дополняет заданный тип данных для возврата Some
значение данного типа данных или вернуть None
. [23] Это используется для выражения того, что значение может присутствовать или отсутствовать.
# Около 42 ;;
- : int option = Some 42
# None ;;
- : ' опция = Нет
Это пример функции, которая либо извлекает int из опции, если она есть внутри, и преобразует ее в строку , либо, если нет, возвращает пустую строку:
пусть извлекает o =
сопоставляет o с
| Некоторые i -> string_of_int i
| Нет -> "" ;;
# экстракт ( около 42 );;
- : string = "42"
# извлечь Нет ;;
- : строка = ""
Суммирование списка целых чисел [ править ]
Списки — один из фундаментальных типов данных в OCaml. В следующем примере кода определяется рекурсивная функция sum , которая принимает один аргумент, целые числа , который должен быть списком целых чисел. Обратите внимание на ключевое слово rec
что означает, что функция рекурсивная. Функция рекурсивно перебирает заданный список целых чисел и вычисляет сумму элементов. Оператор match имеет сходство с , C элементом переключателя хотя он гораздо более общий.
пусть Rec sum целые числа = (* Ключевое слово Rec означает «рекурсивный». *)
сопоставляет целые числа с
| [] -> 0 (* Выход 0, если целые числа — это пустой
список []. *)
| first :: rest -> first + sum rest ;; (* Рекурсивный вызов, если целые числа — непустой
список; first — это первый
элемент списка, а rest —
список остальных элементов,
возможно []. *)
# сумма [ 1 ; 2 ; 3 ; 4 ; 5 ];;
- : целое = 15
Другой способ — использовать стандартную функцию сгиба , работающую со списками.
пусть суммируются целые числа =
List . fold_left ( веселья аккумулятор x -> аккумулятор + x ) 0 целых чисел ;;
# сумма [ 1 ; 2 ; 3 ; 4 ; 5 ];;
- : целое = 15
Поскольку анонимная функция — это просто применение оператора +, ее можно сократить до:
пусть суммируются целые числа =
List . fold_left (+) 0 целых чисел
Более того, аргумент списка можно опустить, воспользовавшись частичным применением :
пусть сумма =
Список . сгиб_влево (+) 0
Быстрая сортировка [ править ]
OCaml позволяет кратко выражать рекурсивные алгоритмы. В следующем примере кода реализуется алгоритм, аналогичный быстрой сортировке , который сортирует список по возрастанию.
пусть запись qsort = функция
| [] -> []
| Pivot :: Rest ->
let is_less x = x < Pivot in
let left , right = List . раздел is_less rest в
qsort left @ [ Pivot ] @ qsort right
Или используя частичное применение оператора >=.
пусть запись qsort = функция
| [] -> []
| поворот :: rest ->
let is_less = (>=) поворот в
let left , right = List . раздел is_less rest в
qsort left @ [ Pivot ] @ qsort right
Проблема с днем рождения [ править ]
Следующая программа вычисляет наименьшее количество людей в комнате, для которых вероятность совершенно уникальных дней рождения составляет менее 50% ( задача о днях рождения , где для 1 человека вероятность равна 365/365 (или 100%), для 2 364/365, для 3 это 364/365×363/365 и т. д.) (ответ = 23).
пусть год_размер = 365 .
пусть запись дня рождения_парадокса пробные люди =
пусть пробный = ( размер_года -. плавающие люди ) /. размер_года *. проблема ,
если проблема < 0 . 5, затем
Printf . printf "ответ = %d \n " ( люди + 1 )
else
Birthday_paradox prob ( люди + 1 )
;;
день рождения_парадокс 1 . 0 1
Церковные цифры [ править ]
Следующий код определяет кодировку Чёрча натуральных чисел с преемником (succ) и сложением (add). Чёрч-цифра n
— это функция высшего порядка , которая принимает функцию f
и значение x
и применяется f
к x
точно n
раз. Чтобы преобразовать число Чёрча из функционального значения в строку, мы передаем ему функцию, которая добавляет строку в начало. "S"
на его вход и константную строку "0"
.
пусть ноль f x = x
пусть succ n f x = f ( n f x )
пусть один = ноль успеха
пусть два = успех ( успеха ноль )
пусть добавляют n1 n2 f x = n1 f ( n2 f x )
пусть to_string n = n ( fun k -> "S" ^ k ) "0"
let _ = to_string ( добавьте ( succ два ) два )
Функция факториала произвольной точности (библиотеки) [ править ]
Множество библиотек доступны напрямую из OCaml. Например, в OCaml есть встроенная библиотека для арифметических операций произвольной точности . Поскольку функция факториала растет очень быстро, она быстро переполняет числа машинной точности (обычно 32- или 64-битные). Таким образом, факториал является подходящим кандидатом для арифметики произвольной точности.
В OCaml модуль Num (теперь замененный модулем ZArith) обеспечивает арифметику произвольной точности и может быть загружен в работающий верхний уровень с помощью:
# # используйте "topfind" ;;
# # требуется "номер" ;;
# открыть Num ;;
Затем функцию факториала можно записать с использованием числовых операторов произвольной точности. =/ , */ и -/ :
# let Rec fact n =
if n =/ Int 0 then Int 1 else n */ fact ( n -/ Int 1 );;
вал факт : Num . число -> Число . num = < весело >
Эта функция может вычислять гораздо большие факториалы, например 120!:
# string_of_num ( факт ( Int 120 ));;
- : string =
"6689502913449127057588118054090372586752746333138029810295671352301633
5572449629893668741652719849813081576378932140
9055253440858940812185989 848111438965000596496052125696000000000000000000000000000"
Треугольник (графика) [ править ]
Следующая программа визуализирует вращающийся треугольник в 2D с использованием OpenGL :
let () =
игнорировать ( Glut . init Sys . argv );
Перенасыщение . initDisplayMode ~ double_buffer : true () ;
игнорировать ( Glut . createWindow ~ title : «Демо OpenGL» );
пусть угол t = 10 . *. т *. t в
let render () =
GlClear . очистить [ ` цвет ];
ГлМат . load_identity () ;
ГлМат . поворот ~ угол : ( угол ( Sys . время () ) ~ z : 1 . () ;
GlDraw . начинается ` треугольники ;
Список . итер GlDraw . вершина2 [- 1 ., - 1 .; 0. , 1 .; 1 ., - 1 .];
GlDraw . заканчивается () ;
Перенасыщение . swapBuffers () в
GlMat . режим ` modelview ;
Перенасыщение . displayFunc ~ cb : рендеринг ;
Перенасыщение . IdleFunc ~ cb :( Некоторое перенасыщение . postRedisplay );
Перенасыщение . основной цикл ()
Требуются привязки 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
и запустите:
$ ./простой
В OCaml можно разрабатывать гораздо более сложные и высокопроизводительные 2D- и 3D-графические программы. Благодаря использованию OpenGL и OCaml полученные программы могут быть кроссплатформенными, компилируясь без каких-либо изменений на многих основных платформах.
Последовательность Фибоначчи [ править ]
Следующий код вычисляет последовательность Фибоначчи для введенного числа n . Он использует хвостовую рекурсию и сопоставление с образцом.
let fib n =
let Rec fib_aux m a b =
сопоставить m с
| 0 -> а
| _ -> fib_aux ( m - 1 ) b ( a + b )
в fib_aux n 0 1
Функции высшего порядка [ править ]
Функции могут принимать функции в качестве входных данных и возвращать функции в качестве результата. Например, если применить дважды к функции f, получится функция, которая применяет f дважды к своему аргументу.
пусть дважды ( f : ' a -> ' a ) = fun ( x : ' a ) -> f ( f x );;
пусть inc ( x : int ) : int = x + 1 ;;
пусть add2 = дважды вкл ;;
let inc_str ( x : string ) : string = x ^ " " ^ x ;;
пусть add_str = дважды ( inc_str );;
# add2 98 ;;
- : int = 100
# add_str "Тест" ;;
- : string = "Тест Тест Тест Тест"
Функция дважды использует переменную типа 'a, чтобы указать, что ее можно применить к любой функции f , отображающей тип 'a в себя, а не только к int->int функциям . В частности, дважды можно применить даже к самому себе.
# пусть четыре раза f = ( дважды дважды ) f ;;
val fourtimes : ( ' a -> ' a ) -> ' a -> ' a = < fun >
# let add4 = fourtimes inc ;;
val add4 : int -> int = < fun >
# add4 98 ;;
- : целое = 102
Производные языки [ править ]
МетаОКамл [ править ]
МетаОКамл [24] — это многоэтапное программное расширение OCaml, позволяющее инкрементально компилировать новый машинный код во время выполнения. В некоторых случаях значительное ускорение возможно при использовании многоэтапного программирования, поскольку более подробная информация о данных для обработки доступна во время выполнения, чем во время обычной компиляции, поэтому инкрементальный компилятор может оптимизировать многие случаи проверки условий и т. д.
Например: если во время компиляции известно, что некоторая степенная функция x -> x^n
требуется часто, но значение n
известно только во время выполнения, в MetaOCaml можно использовать двухступенчатую степенную функцию:
пусть записываемая мощность n x =
если n = 0
, то .< 1 >.
иначе
, если даже n
, то sqr ( power ( n / 2 ) x )
else .<.~ x *. .~( степень ( n - 1 ) x )>.
Как только n
известна во время выполнения, можно создать специализированную и очень быструю степенную функцию:
.< fun x -> .~( power 5 .< x >.)>.
Результат:
весело x_1 -> ( x_1 *
пусть y_3 =
пусть y_2 = ( x_1 * 1 )
в ( y_2 * y_2 )
в ( 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 г.
- ^ Перейти обратно: а б Кларксон, Майкл; и другие. «1.2. OCaml: функциональное программирование в OCaml» . курсы.cs.cornell.edu . Проверено 6 октября 2022 г.
- ^ Перейти обратно: а б с д Это ж г час я «Пролог — OCaml в реальном мире» . dev.realworldocaml.org . Проверено 6 октября 2022 г.
- ^ Перейти обратно: а б с д Это ж г «История 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.
Внешние ссылки [ править ]
![](http://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Wikibooks-logo-en-noslogan.svg/40px-Wikibooks-logo-en-noslogan.svg.png)
- Языки программирования высокого уровня
- Кроссплатформенное бесплатное программное обеспечение
- Языки программирования с расширяемым синтаксисом
- Бесплатные компиляторы и интерпретаторы
- Функциональные языки
- Объектно-ориентированные языки программирования
- Семейство языков программирования ML
- Семейство языков программирования OCaml
- Программное обеспечение OCaml
- Языки программирования сопоставления шаблонов
- Языки программирования, созданные в 1996 году.
- Статически типизированные языки программирования
- Программное обеспечение, использующее лицензию LGPL