]]> ]]>

Objective CAML

Реализация языка программирования ML

Objective CAML — универсальный язык программирования. Сочетает функциональный и объектно-ориентированный стиль. Также содержит императивные средства.

Это один из самых развитых языков группы ML. Особенности языка: строгая типизация, ориентация синтаксиса на написание безопасных программ. Поддерживается автоматический сборщик мусора, есть стандартный интерфейс к модулям, написанным на C. Один из наиболее практичных функциональных языков программирования. Его реализация содержит много возможностей, не имеющих прямого отношения к “великой функциональной идее”, но необходимых для практического языка программирования:

  • компилятор в байт-код (генерирует компактный и достаточно эффективный код)
  • компилятор в машинный код для многих платформ (в том числе x86, SPARC, Alpha etc.). Порождаемый транслятором код обладает эффективностью сравнимой с С (различие в скорости как правило от двукратного проигрыша до 3-кратного выигрыша — последнее имеет место за счет более эффективной работы с кучей)
  • текстовый отладчик (с функциональностью близкой к GDB)
  • Профилятор
  • генераторы лексических и синтаксических анализаторов (OCamlLex, OCamlYacc)
  • средство, обеспечивающее возможность расширения синтаксиса языка (так называемый Caml PreProcessor-Pretty-Printer = Caml4P), который позволяет описывать практически любые синтаксически модификации исходного языка (в том числе — позволяет полностью переопределить его синтаксис)

Это делает Objective CAML отличной базой для опытов с новыми языковыми конструкциями.

Примеры:

Hello, World!:

Пример для версий Objective Caml 3.10.2
print_endline "Hello, World!"

Числа Фибоначчи:

Пример для версий Objective Caml 3.10.2

Используется рекурсивный метод вычисления чисел Фибоначчи.

let rec fibonacci n =
  if n < 3 then
    1
  else
    fibonacci (n-1) + fibonacci (n-2)

let () =
  for n = 1 to 16 do
    Printf.printf "%d, " (fibonacci n)
  done;
  print_endline "..."

Факториал:

Пример для версий Objective Caml 3.10.2

Используется рекурсивное определение факториала. Значения факториалов, начиная с 13!, отрицательны из-за переполнения:

12! = 479001600
13! = -215430144
14! = -868538368
15! = -143173632
16! = -143294464
let rec factorial n =
    if n <= 1 then
      1
    else
      factorial (n-1) * n;;

let () =
  for n = 0 to 16 do
    Printf.printf "%d! = %d\n" n (factorial n)
  done;

Факториал:

Пример для версий Objective Caml 3.10.2

В этом примере используется вспомогательная функция fact, позволяющая реализовать хвостовую рекурсию.

let rec fact n accum =
    if n <= 1 then 
        accum
    else
        fact (n-1) (accum*n);;

let factorial n =
    fact n 1;;

let () =
    for n = 0 to 16 do
        Printf.printf "%d! = %d\n" n (factorial n)
    done;

Комментарии

]]>

blog comments powered by Disqus

]]>

Работа программистам