OCaml

2025-06-02 13:18
vak: (Знайка)
[personal profile] vak
Новая книжка на моей полке.



Свет не сошёлся клином на одном Rust. За последние годы появился ещё один значимый язык. В 2023 году OCaml получил престижную премию SIGPLAN Award. Когда-то в юности я фигел от Снобола-4, позже от Scheme. А здесь всё совсем удобно сделано.



Сижу разбираюсь, как устроен NQCC, компилятор Си из книжки, написанный на OCaml. И прихожу к выводу, что сделан он весьма неплохо, причём во многом благодаря OCaml. Если бы я сейчас начинал какую нибудь серьёзную разработку типа компилятора, возможно я бы делал его на OCaml вместо Rust или Golang.

Для примера, перепрём /bin/echo на OCaml.
let process_escapes str =
let len = String.length str in
let buf = Buffer.create len in
let rec loop i =
if i >= len then Buffer.contents buf
else if str.[i] <> '\\' then (
Buffer.add_char buf str.[i];
loop (i + 1)
) else if i + 1 < len then (
match str.[i + 1] with
| 'n' -> Buffer.add_char buf '\n'; loop (i + 2)
| 't' -> Buffer.add_char buf '\t'; loop (i + 2)
| '\\' -> Buffer.add_char buf '\\'; loop (i + 2)
| _ -> Buffer.add_char buf str.[i]; loop (i + 1)
) else (
Buffer.add_char buf str.[i];
loop (i + 1)
)
in
loop 0

let echo no_newline enable_escapes args =
let process = if enable_escapes then process_escapes else fun x -> x in
let output = String.concat " " (List.map process args) in
if no_newline then print_string output
else print_endline output

let main () =
let no_newline = ref false in
let enable_escapes = ref false in
let args = ref [] in
let speclist = [
("-n", Arg.Set no_newline, "do not output the trailing newline");
("-e", Arg.Set enable_escapes, "enable interpretation of backslash escapes");
] in
Arg.parse speclist (fun arg -> args := arg :: !args) "Usage: echo [-n] [-e] [string ...]";
echo !no_newline !enable_escapes (List.rev !args)

let () = main ()
Компилируем, запускаем:
$ ocamlopt -O2 -o echo echo.ml

$ ./echo --help
Usage: echo [-n] [-e] [string ...]
-n do not output the trailing newline
-e enable interpretation of backslash escapes
-help Display this list of options
--help Display this list of options

$ ./echo -e "Hello\nWorld"
Hello
World

Date: 2025-06-02 21:46 (UTC)
ufm: (Default)
From: [personal profile] ufm
Если уж упарываться - я-бы выбрал ponylang. Кстати, большинство фенечек раста потырено оттуда.

Date: 2025-06-02 21:49 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Вот у меня тоже в планах этот милый язычок. (Но скала такая зараза...)

Date: 2025-06-03 11:57 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Для энтепрайза привязанность ценна. Больше предсказуемости, больше возможностей использовать существующие библиотеки; ну и JIT - побивает native version только так.

Date: 2025-06-02 22:44 (UTC)
lev: (Default)
From: [personal profile] lev
F#

Date: 2025-06-03 03:36 (UTC)
lev: (Default)
From: [personal profile] lev
отличный рантайм, по мне

Date: 2025-06-03 01:09 (UTC)
x86128: (Default)
From: [personal profile] x86128
Говорят что Ocaml это питон из мира функциональщины.

Date: 2025-06-03 12:07 (UTC)
chaource: (Default)
From: [personal profile] chaource
Совершенно не python. OCaml это вообще почти что Haskell, только ему не повезло раньше родиться.

Date: 2025-06-03 01:10 (UTC)
x86128: (Default)
From: [personal profile] x86128
Да и вообще если что-то практическое начинать, то между окамл и хаскель нужно выбирать окамл

Date: 2025-06-03 05:08 (UTC)
vinsent_ru: (Default)
From: [personal profile] vinsent_ru

"появился" это сильно, ему 100 лет в обед, и да его часто юзают для компиляторов

Date: 2025-06-03 12:21 (UTC)
chaource: (Default)
From: [personal profile] chaource
OCaml по счастью не стухъ и не пропалъ, какъ многiе другiе экспериментально-академическiе языки. Десять лѣтъ горстка французовъ сидѣли и пилили рантаймъ и компиляторъ OCaml, чтобы можно было поддерживать multicore CPU. Вcѣ смѣялись надъ ними. Говорили, вотъ, къ чему приводитъ академическiй языкъ программированiя. Теорiя очень красивая, система типовъ замѣчательноая, но нѣтъ ни библiотекъ, ни даже многопоточности нормальной для multicore CPU (которая на какой-нибудь Java была всегда).

Но вдругъ безъ предупрежденiя вышелъ релизъ OCaml 5.0 съ алгебраическими эффектами и multicore. Тутъ-то всѣ и опупѣли.

Еще OCaml это единственный языкъ, гдѣ есть полный полиморфизмъ по категорнымъ произведенiямъ и ко-произведенiямъ, одновременно и съ полной автоматической системой провѣрки и вывода типовъ. Съ объектно-орiентированными типами OCaml работаетъ именно съ помощью этого полиморфизма.

Когда-то давно я сравнивалъ Scala, OCaml, Haskell на предметъ automatic memory management. Я реализовалъ простую задачу изъ книжки - отсортированное бинарное дерево собрать-разобрать. Написалъ одинъ и тотъ же простой, короткiй и рекурсивный кодъ на трехъ языкахъ, никакихъ оптимизацiй, все какъ если бы студентъ по книжкѣ дѣлалъ. Прогналъ на размѣры дерева до 1 миллиона листьев. Я хотѣлъ узнать, какъ рантаймы будутъ справляться съ большими объемами памяти, которые надо постоянно распредѣлять и освобождать мелкими порцiями при сборкѣ-разборкѣ дерева.

Результаты были нѣсколько неожиданные.

ОCaml (native code) потребовалъ около 300МБ памяти.

Скала (JVM) отработала примѣрно въ 2-3 раза быстрѣе, чѣмъ OCaml. Но сожрала 1.5 ГБ памяти при этомъ.

А Haskell поглотилъ 6 ГБ памяти и загнулся въ корчахъ garbage collection. Онъ завершилъ работу еще въ разы медленнѣе, чѣмъ OCaml!
Edited Date: 2025-06-03 12:25 (UTC)

Sivaramakrishnan

Date: 2025-06-03 16:48 (UTC)
From: [personal profile] iamjaph
Французи?
Індус Sivaramakrishnan зробив Multicore OCaml, а до цього він зробив альтернативну multicore для GHC, а до цього зробив multiMLton.
multiMLton - на жаль не прийняли в MLton, бо він лише для X86_64 Linux був (зробив красиво: на FreeBSD 64 та 32 бітной вдалося мені запустити і використовувати).

Re: Sivaramakrishnan

Date: 2025-06-03 19:14 (UTC)
chaource: (Default)
From: [personal profile] chaource
OCaml пилятъ въ основномъ французы въ институтѣ INRIA. Xavier Leroy, Luc Maranget, Gabriel Scherer тамъ главные. Безъ нихъ ничего не произойдетъ, и кромѣ нихъ никто OCaml вообще не трогаетъ и не интересуется имъ.

Ни въ коей мѣрѣ не умаляя заслугъ индусовъ и англичанъ, хочу сказать, что одно дѣло написать экспериментальную реализацiю рантайма, для одного выбраннаго CPU, - это могутъ потянуть какiе-то стороннiе люди, аспиранты, въ рамкахъ своихъ диссертацiй. А другое - вправить это въ основной компиляторъ со всѣми CPU-архитектурами и прочими деталями. Это огромная работа.

https://github.com/ocaml-multicore/ocaml-multicore/graphs/contributors - можно посмотрѣть на списокъ людей, сдѣлавшихъ вкладъ въ этотъ кодъ, отсортированныхъ по убыванiю объема вклада. Первые 3 мѣста занимаютъ французы. На первомъ мѣстѣ Xavier Leroy, съ большимъ отрывомъ. Это человѣкъ номеръ 1 во вселенной OCaml. Шиварамакришнанъ (главный авторъ всѣй вѣтки multicore OCaml) лишь на 8 мѣстѣ.
Edited Date: 2025-06-03 19:22 (UTC)