vak: (Знайка)
Serge Vakulenko ([personal profile] vak) wrote2025-06-02 01:18 pm

OCaml

Новая книжка на моей полке.



Свет не сошёлся клином на одном 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
ufm: (Default)

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

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

[personal profile] lev 2025-06-02 10:44 pm (UTC)(link)
F#
x86128: (Default)

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

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

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

[personal profile] vinsent_ru 2025-06-03 05:08 am (UTC)(link)

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

juan_gandhi: (Default)

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

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

[personal profile] chaource 2025-06-03 12:21 pm (UTC)(link)
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 2025-06-03 12:25 (UTC)

Sivaramakrishnan

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

Re: Sivaramakrishnan

[personal profile] chaource 2025-06-03 07:14 pm (UTC)(link)
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 2025-06-03 19:22 (UTC)

[personal profile] flamedancerii 2025-06-20 04:05 pm (UTC)(link)
Возможно.
Но "в проде" OCaml с 2001, на нем https://en.wikipedia.org/wiki/MLDonkey написан