Jump to content

OCaml

OCaml
Парадигмы Мультипарадигмальность : функциональная , императивная , модульная , [1] объектно-ориентированный
Семья МЛ : Камл
Разработано Ксавье Лерой , Жером Вуйон, Дамьен Долигес , Дидье Реми, Аскандер Суарес
Разработчик Инрия
Впервые появился 1996 год ; 28 лет назад ( 1996 ) [2]
Стабильная версия
5.2.0 [3]  Отредактируйте это в Викиданных / 13 мая 2024 г .; 33 дня назад ( 13 мая 2024 г. )
Дисциплина набора текста Предполагаемый , статический , сильный , структурный.
Язык реализации ОКамл, C
Платформа ИА-32 , x86-64 , мощность , SPARC , ARM 32-64 , RISC-V
ТЫ Кроссплатформенность : Linux , Unix , macOS , Windows.
Лицензия LGPLv2.1
Расширения имен файлов .мл, .мли
Веб-сайт окамл .org
Под влиянием
C , Caml , Модуль-3 , Паскаль , Стандартный ML
Под влиянием
ATS , Coq , Elm , F# , F* , Haxe , Опа , Ржавчина , [4] Скала

OCaml ( / ˈ 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 может использовать неизменяемость множеств для повторного использования частей. входные данные задаются на выходе (см. постоянную структуру данных ).

История [ править ]

Команда разработчиков OCaml получает награду на Симпозиуме по принципам языков программирования (POPL) 2024

Разработка 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 содержит:

Компилятор собственного кода доступен для многих платформ, включая Unix , Microsoft Windows и Apple macOS . Переносимость достигается за счет встроенной поддержки генерации кода для основных архитектур:

Компилятор байт-кода поддерживает работу на любой 32- или 64-битной архитектуре, когда генерация собственного кода недоступна, и требуется только компилятор C.

Программы с байт-кодом OCaml и собственным кодом могут быть написаны в многопоточном стиле с упреждающим переключением контекста. Потоки OCaml в том же домене [20] выполнять только с разделением времени. Однако программа OCaml может содержать несколько доменов.

Примеры кода [ править ]

Фрагменты кода 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))

Новая функция автоматически компилируется.

производные языки Другие

Программное обеспечение, написанное на OCaml [ править ]

Пользователи [ править ]

По крайней мере, несколько десятков компаний в той или иной степени используют OCaml. [29] Яркие примеры включают:

Ссылки [ править ]

  1. ^ «Модули» . Проверено 22 февраля 2020 г. .
  2. ^ Лерой, Ксавье (1996). «Цель Caml 1.00» . список рассылки caml-list.
  3. ^ «Примечания к выпуску OCaml 5.2.0» . Проверено 24 мая 2024 г.
  4. ^ «Влияния — Справочник по ржавчине» . Справочник по ржавчине . Проверено 31 декабря 2023 г.
  5. ^ «Жером Вуйон» . www.irif.fr. ​Проверено 14 июня 2024 г.
  6. ^ «Дидье Реми» . pauillac.inria.fr . Проверено 14 июня 2024 г.
  7. ^ «История OCaml» . Проверено 24 декабря 2016 г.
  8. ^ Еженедельные новости Linux .
  9. ^ «Эй Джей Милнер — лауреат премии А. М. Тьюринга» . amturing.acm.org . Проверено 6 октября 2022 г.
  10. ^ Jump up to: а б Кларксон, Майкл; и др. «1.2. OCaml: функциональное программирование в OCaml» . курсы.cs.cornell.edu . Проверено 6 октября 2022 г.
  11. ^ Jump up to: а б с д и ж г час я «Пролог — OCaml в реальном мире» . dev.realworldocaml.org . Проверено 6 октября 2022 г.
  12. ^ Jump up to: а б с д и ж г «История OCaml – OCaml» . v2.ocaml.org . Проверено 7 октября 2022 г.
  13. ^ «Выпуск пакета OCaml 5.0.0 OCaml» . ОКамл . Проверено 16 декабря 2022 г.
  14. ^ «Проект Кристал» . cristal.inria.fr . Проверено 7 октября 2022 г.
  15. ^ «Команда Галлий — Домой» . Gallium.inria.fr . Проверено 7 октября 2022 г.
  16. ^ "Дом" . cambium.inria.fr . Проверено 7 октября 2022 г.
  17. ^ «Управление компилятором OCaml и членство» . 2023.
  18. ^ «Управление и проекты OCaml» . 2023.
  19. ^ «ocaml/asmcomp в магистрали · ocaml/ocaml · GitHub» . Гитхаб . Проверено 2 мая 2015 г.
  20. ^ Домен — это единица параллелизма в OCaml, домен обычно соответствует ядру ЦП.
  21. ^ «OCaml — Система верхнего уровня или REPL (ocaml)» . ocaml.org . Проверено 17 мая 2021 г.
  22. ^ «OCaml — Пакетная компиляция (Ocamlc)» .
  23. ^ «3.7. Параметры — Программирование OCaml: правильное + эффективное + красивое» . cs3110.github.io . Проверено 7 октября 2022 г.
  24. ^ oleg-at-okmij.org. «BER МетаОКамл» . okmij.org .
  25. ^ «Messenger.com теперь на 50% превращен в разум · Разум» . причинаml.github.io . Проверено 27 февраля 2018 г.
  26. ^ «Flow: средство проверки статического типа для JavaScript» . Поток . Архивировано из оригинала 8 апреля 2022 года . Проверено 10 февраля 2019 г.
  27. ^ «Вывод статического анализатора» . Сделайте вывод .
  28. ^ «WebAssembly/spec: спецификация WebAssembly, эталонный интерпретатор и набор тестов» . Консорциум Всемирной паутины . 5 декабря 2019 года . Проверено 14 мая 2021 г. - через GitHub.
  29. ^ «Компании, использующие OCaml» . OCaml.org . Проверено 14 мая 2021 г.
  30. ^ «BuckleScript: вышла версия 1.0! | Технологии в Bloomberg» . Технологии в Bloomberg . 8 сентября 2016 г. Проверено 21 мая 2017 г.
  31. ^ Скотт, Дэвид; Шарп, Ричард; Газаньер, Томас; Мадхавапедди, Анил (2010). Использование функционального программирования в группе промышленных продуктов: перспективы и представления . Международная конференция по функциональному программированию . Ассоциация вычислительной техники . дои : 10.1145/1863543.1863557 .
  32. ^ «Поток на GitHub» . Гитхаб . 2023.
  33. ^ Ярон Мински (1 ноября 2011 г.). «OCaml для масс» . Проверено 2 мая 2015 г.
  34. ^ Ярон Мински (2016). «Ключевой доклад — наблюдения функционального программиста» . ACM Коммерческое использование функционального программирования.
  35. ^ Ярон Мински (2023). «Сигналы и потоки» (Подкаст). Джейн Стрит Кэпитал .
  36. ^ Анил Мадхавапедди (2016). «Улучшение Docker с помощью Unikernels: представление HyperKit, VPNKit и DataKit» . Докер, Инк.
  37. ^ «VPNKit на GitHub» . Гитхаб . 2023.

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 1402452868b473c5ce508eb802cf9171__1718465460
URL1:https://arc.ask3.ru/arc/aa/14/71/1402452868b473c5ce508eb802cf9171.html
Заголовок, (Title) документа по адресу, URL1:
OCaml - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)