![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Новая книжка на моей полке.

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

Сижу разбираюсь, как устроен NQCC, компилятор Си из книжки, написанный на OCaml. И прихожу к выводу, что сделан он весьма неплохо, причём во многом благодаря OCaml. Если бы я сейчас начинал какую нибудь серьёзную разработку типа компилятора, возможно я бы делал его на OCaml вместо Rust или Golang.
Для примера, перепрём /bin/echo на 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
no subject
Date: 2025-06-02 21:16 (UTC)Вот краткий обзор от Claude, чем отличается стандартная библиотека от Base: https://claude.ai/public/artifacts/08f12386-47cf-4dce-9a75-8faf0e7c58f0
no subject
Date: 2025-06-02 21:46 (UTC)no subject
Date: 2025-06-03 01:36 (UTC)no subject
Date: 2025-06-02 21:49 (UTC)no subject
Date: 2025-06-03 01:34 (UTC)no subject
Date: 2025-06-03 11:57 (UTC)no subject
Date: 2025-06-02 22:44 (UTC)no subject
Date: 2025-06-03 01:30 (UTC)Но не радует. 😀
Оно же для .NET.
no subject
Date: 2025-06-03 03:36 (UTC)no subject
Date: 2025-06-03 01:09 (UTC)no subject
Date: 2025-06-03 01:31 (UTC)no subject
Date: 2025-06-03 12:07 (UTC)no subject
Date: 2025-06-03 01:10 (UTC)no subject
Date: 2025-06-03 01:43 (UTC)no subject
Date: 2025-06-03 05:08 (UTC)"появился" это сильно, ему 100 лет в обед, и да его часто юзают для компиляторов
no subject
Date: 2025-06-03 08:35 (UTC)Но я смотрю начиная с 2022, когда полностью переписали весь рантайм.
no subject
Date: 2025-06-03 12:21 (UTC)Но вдругъ безъ предупрежден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!
Sivaramakrishnan
Date: 2025-06-03 16:48 (UTC)Індус Sivaramakrishnan зробив Multicore OCaml, а до цього він зробив альтернативну multicore для GHC, а до цього зробив multiMLton.
multiMLton - на жаль не прийняли в MLton, бо він лише для X86_64 Linux був (зробив красиво: на FreeBSD 64 та 32 бітной вдалося мені запустити і використовувати).
Re: Sivaramakrishnan
Date: 2025-06-03 19:14 (UTC)Ни въ коей мѣрѣ не умаляя заслугъ индусовъ и англичанъ, хочу сказать, что одно дѣло написать экспериментальную реализацiю рантайма, для одного выбраннаго CPU, - это могутъ потянуть какiе-то стороннiе люди, аспиранты, въ рамкахъ своихъ диссертацiй. А другое - вправить это въ основной компиляторъ со всѣми CPU-архитектурами и прочими деталями. Это огромная работа.
https://github.com/ocaml-multicore/ocaml-multicore/graphs/contributors - можно посмотрѣть на списокъ людей, сдѣлавшихъ вкладъ въ этотъ кодъ, отсортированныхъ по убыванiю объема вклада. Первые 3 мѣста занимаютъ французы. На первомъ мѣстѣ Xavier Leroy, съ большимъ отрывомъ. Это человѣкъ номеръ 1 во вселенной OCaml. Шиварамакришнанъ (главный авторъ всѣй вѣтки multicore OCaml) лишь на 8 мѣстѣ.
no subject
Date: 2025-06-06 19:57 (UTC)