Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Categories:

О проекте HN

Что такое HN

C 5 августа 2007 года я в очень медленном темпе пилю эту хреновину https://github.com/kayuri/HNC/ В разное время к проекту подключались kashnikov, inv2000 и zabivator, но в целом пилю я один.

В первом приближении - это будет гибрид Rust, Purescript и VPRI FoNC. Сильно типизированный язык системного программирования с контролем эффектов, компилирующийся в человекочитаемый Си, с компилятором очень маленького размера.

От Rust:

- zero-cost abstractions
- type inference
- minimal runtime
- efficient C bindings

От Purescript:

- extensible effects
- simple FFI
- human-readable output

От FoNC - попытка встать на плечах гигантов и за счёт прогрессивной архитектуры и максимального использования библиотек сократить объём кода. Цель - уложить минимально юзабельный релиз в 5к строк.

Зачем мне HN

Дискуссии, почему это не нужно никому, кроме меня, считаю непродуктивными. Собственно, единственный продуктивный вопрос - "зачем мне нужен HN, когда есть Х", с типичным моим ответом "в Х нет Y". Для меня HN - это возможность писать на сях или С++ более абстрактно и с меньшим синтаксическим и семантическим шумом. Хотя бы прототипы, или тесты, или какой некритичный код.

Важно, что я хочу писать именно на сях, и максимально заюзать как существующие библиотеки на сях и мой собственный сишный лигаси-код, так и возможности сишного оптимизатора. Важно, что сишный оптимизатор заточен под сишную семантику и типичные сишные программы. И с оптимизацией, скажем, программ в нетипичном для сей функциональном стиле с большим количеством аллокаций в куче и сложным динамическим диспатчем в рантайме, справляется довольно плохо. Поэтому энфорсить zero-cost abstraction должен сам компилятор HN, а не делегировать это сишному компилятору. Сишный компилятор должен видеть тот код, на который он заточен - с минимумом динамического диспатча, аллокаций в куче и абстракций управления. Так же, скажем, исключены рекурсия, каррирование, sum types/паттерны и первоклассный полиморфизм. О сборке мусора и решении funarg problem я уж и не говорю - verboten.

Мне будет достаточно некоего инкрементально лучшего решения - не надо решать сразу все проблемы, достаточно решить хотя бы одну.

Планы по HN0

Мне ещё до начала работ было ясно, что с полноценным решением я не справлюсь. Поэтому надо искать обходные пути. Их два: 1) снижение объема кода за счёт максимального использования научных достижений 10-летней давности и стабильных высокотехнологичных библиотек - никакого говна бизона и палок 40-летней давности 2) снижение скоупа, выработка абсолютно минимального каркаса и доведение этого каркаса если не до совершенства - то хотя бы до логического конца.

Так появился HN0 - проект минимально юзабельной версии HN, и альфа-версия его реализации.

За основу взято CBV-исчисление Хиндли-Милнера в минимальном виде - без классов типов, рекурсии, мутабельности, каррирования, эффектов, возможности определять пользовательские типы данных и возможности писать явные сигнатуры. Всё, что можно делать - это импортировать функции из сей через FFI и конструировать из них другие функции через let, абстракцию и аппликацию.

if, while и встроенные в си операторы представлены импортированными функциями, которые транслируются специальным образом. С целью человекочитаемости язык ограничивается таким образом, чтобы в выходном коде не надо было генерировать идентификаторы, которых нет во входном. Как следствие - нет анонимных лямбд и анонимных циклов.

См. тж.: https://github.com/kayuri/HNC/wiki https://code.google.com/p/inv/w/list
Tags: fp, hn0, programming
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 0 comments