OCaml

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Objective Caml
Caml.128x58.gif
Семантика:

мультипарадигменный: функциональный, объектно-ориентированный, императивный

Автор(ы):

INRIA

Выпуск:

4.01 (12 сентября 2013)

Система типов:

строгая, статическая

Диалекты:

F#, JoCaml, MetaOCaml, OcamlP3l

Испытал влияние:

Standard ML, Caml Light

Лицензия:

публичная лицензия Q

Сайт:

ocaml.org

OCaml (Objective Caml) — современный объектно-ориентированный язык функционального программирования общего назначения, который был разработан с учётом безопасности исполнения и надёжности программ. Этот язык имеет высокую степень выразительности, что позволяет его легко выучить и использовать. Язык CaML поддерживает функциональную, императивную и объектно-ориентированную парадигмы программирования. Был разработан в 1985 году во французском институте INRIA, который занимается исследованиями в области информатики. Самый распространённый в практической работе диалект языка ML.

Инструментарий OCaml включает в себя интерпретатор, компилятор в байткод и оптимизирующий компилятор в машинный код, сравнимый по эффективности с Java и лишь немного уступающий по быстродействию C и C++[1].

На языке OCaml, в частности, написан рендеринг формул Википедии, использующих тег <math>, файлообменный клиент MLDonkey, стек управления гипервизором Xen xapi (является частью Xen Server/Xen Cloud Platform), язык программирования HaXe.

О языке[править | править вики-текст]

Место и роль в информатике[править | править вики-текст]

Язык OCaml является языком программирования общего назначения, но при этом имеет свои сложившиеся области применения[2].

Во-первых, это — создание «безопасных» (не только в смысле информационной безопасности) приложений. В языке используется сборка мусора, а большинство типов данных поставлено в рамки (англ. boxed), что означает предотвращение переполнения буферов во время исполнения программы. Кроме того, статическая типизация и проверки времени компиляции делают невозможными некоторые другие классы ошибок, такие как ошибки приведения типов, в силу отсутствия автоматического приведения типов. Кроме того, код может быть формально верифицирован. Имеются утилиты автоматического доказательства типовой корректности кода, превосходящие таковые для большинства языков программирования. И, что немаловажно, меры безопасности не влияют на эффективность исполняемого кода[2].

Другой областью успешного применения OCaml являются приложения, управляемые данными (data-driven), программирование потоком данных. К этой области относится обработка текста, а также написание компиляторов. OCaml имеет не только средства для текстовой обработки (какими славится, например, Perl или AWK), но и инструменты для глубокого семантического анализа и преобразования текста, делая OCaml применимым в задачах интеллектуального анализа данных (англ. data mining)[2].

Разумеется, OCaml, как и другие диалекты ML, используются в исследовательских задачах и задачах верефикации, при котором основной код пишется на некотором языке программирования, а затем формально верифицируется и анализируется программой на OCaml[2]. Например, на OCaml написана система интерактивного доказательства теорем Coq.

Основные свойства[править | править вики-текст]

OCaml занимает особое место среди языков программирования благодаря сочетанию эффективности, выразительности и практичности. Среди особенностей языка, развивавшихся в течение более чем 40 лет, со времени создания ML, можно выделить[3]:

История[править | править вики-текст]

OCaml ведёт своё происхождение от ML (англ. meta language), который был реализован на диалекте Лиспа Робином Милнером в 1972 году в качестве программного средства для доказательства теорем, как метаязык логики вычислимых функций (LCF, англ. logic for computable functions). Поздее был сделан компилятор, а к 1980 году ML стал полноценной системой программирования[4].

Ги Кузино (Guy Cousineau) добавил в язык алгебраические типы данных и сопоставление с образцом и определил ML в виде категориальной абстрактной машины (CAM). Таким образом, CAM-ML мог быть описан, верифицирован и оптимизирован, что явилось шагом вперёд для ML[5].

Дальнейшим развитием был созданный к 1987 году Аскандером Суарецом (Ascánder Suárez) и продолженный Пьером Вейсом (Pierre Weis) и Мичелом Мони (Michel Mauny) язык Caml (переигранное CAM-ML)[4][5].

В 1990 году Ксавье Лерой (Xavier Leroy) и Дамьен Догигез (Damien Doligez) выпустили новую реализацию, названную Caml Light. В этой реализации на Си использовался интерпретатор байт-кода и быстрый сборщик мусора. С написанием библиотек, язык стал использоваться в образовании и исследовательских институтах[4][5].

В 1995 году увидел свет Caml Special Light, развиваемый К. Лероем. Система программирования получила компилятор в машинные коды, что поставило эффективность исполняемого кода в один ряд с другими компилируемыми языками. В то же время была разработана система модулей, идея которой была заимствована из Standard ML[4].

В современном виде OCaml появился в 1996 году, когда когда Дидье Реми (Didier Rémy) и Джером Вуйон (Jérôme Vouillon) реализовали для языка стройную и эффективную поддержку объектов. Эта объектная система позволяет на этапе компиляции в типобезопасной манере использовать идиомы объектно-ориентированного программирования, без свойственным C++ и Java проверок времени выполнения[4].

В 2000-х годах язык плавно развивался, одновременно получая всё большее признание в коммерческих проектах и образовании. Среди разработанного в это время можно отметить полиморфные методы и вариантный типы, именованные и необязательные параметры, модули первого класса, обобщённые алгебраические типы данных (GADT). Язык стал поддерживать несколько аппаратных платформ (X86, ARM, SPARC, PowerPC)[4][5].

Примеры программ[править | править вики-текст]

Запуск интерпретатора OCaml[править | править вики-текст]

Для запуска интерпретатора языка OCaml необходимо в консоли ввести следующую команду:

$ ocaml
       Objective Caml version 3.09.0
#

Теперь можно вводить различные выражения, которые интерпретатор будет считывать, вычислять и выводить результат на экран:

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

Hello world[править | править вики-текст]

Следующая программа «hello.ml»:

print_endline "Hello World!"

может быть скомпилирована либо в байт-код:

$ ocamlc hello.ml -o hello

либо в оптимизированный машинный код:

$ ocamlopt hello.ml -o hello

и запущена:

$ ./hello
Hello World!
$

Вычисление суммы элементов списка[править | править вики-текст]

Список является одним из основных типов данных в OCaml. Следующий пример кода определяет рекурсивную (обратите внимание на ключевое слово rec) функцию, которая перебирает элементы данного списка и возвращает их сумму.

let rec sum xs =
  match xs with
    | []       -> 0
    | x :: xs' -> x + sum xs'
 # sum [1;2;3;4;5];;
 - : int = 15

Другой способ подсчета суммы заключается в использовании функции свёртки:

let sum xs =
    List.fold_left (+) 0 xs
 
 
  # sum [1;2;3;4;5];;
  - : int = 15

Быстрая сортировка[править | править вики-текст]

В следующем примере приведен алгоритм быстрой сортировки, который сортирует список в порядке возрастания:

 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 fib_aux n a b =
  match n with
  | 0 -> a
  | _ -> fib_aux (n - 1) (a + b) a
let fib n = fib_aux n 0 1

См. также[править | править вики-текст]

Примечания[править | править вики-текст]

Литература[править | править вики-текст]

Список книг, доступных онлайн

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