~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ 1402452868B473C5CE508EB802CF9171__1718465460 ✰
Заголовок документа оригинал.:
✰ OCaml - Wikipedia ✰
Заголовок документа перевод.:
✰ OCaml — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/OCaml ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/14/71/1402452868b473c5ce508eb802cf9171.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/14/71/1402452868b473c5ce508eb802cf9171__translat.html ✰
Дата и время сохранения документа:
✰ 15.06.2024 22:40:14 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 15 June 2024, at 18:31 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

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

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

Команда разработчиков 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:

$  окамл 
    Цель 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  )) 

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

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

Программное обеспечение, написанное на 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. ^ Перейти обратно: а б Кларксон, Майкл; и другие. «1.2. OCaml: функциональное программирование в OCaml» . курсы.cs.cornell.edu . Проверено 6 октября 2022 г.
  11. ^ Перейти обратно: а б с д Это ж г час я «Пролог — OCaml в реальном мире» . dev.realworldocaml.org . Проверено 6 октября 2022 г.
  12. ^ Перейти обратно: а б с д Это ж г «История 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://en.wikipedia.org/wiki/OCaml
Заголовок, (Title) документа по адресу, URL1:
OCaml - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)