Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

HN в 2050 году - минимальность реализации

Идеи HN и HN0, как ни странно, возникли почти независимо. HN - это просто хороший язык с бескомпромиссной производительностью, а HN0 покоится на трёх китах - бескомпромиссной производительности, реализации малой кровью и человекочитаемости.

Дизайн HN0 происходил так:
1. Меня смутил размер типичного компилятора (см. vpri ometa)
2. Я придумал, как написать компилятор буквально в 20 строк (и написал на перле за выходные)
3. Я понял, что это слишком минималистично и надо писать более толстый компилятор в несколько тысяч строк, что тем не менее меньше типичного размера, измеряемого млоками
4. Меня смутил выходной код типичного компилятора в Си, и я придумал как генерировать без каши и бойлерплейта.
5. Я понял, что 3 и 4 можно совместить. Так родилась идея "буквальной компиляции" (на ней основан дизайн компилятора замыканий в HNC) и пресловутый FoldExample (на нём основан дизайн HN0 как языка).

Буквальная компиляция возникла из наивного понимания мной как сишником работы компилятора языка с произвольной (!) семантикой: если в исходном тексте написано x = 2, то это транслируется в сишное int x = 2; а далее уже понятно, как транслировать в машинный код. Соответственно, f x = let y = 5 in x + y должно транслироваться в int f(int x) { int y = 5; return x + y }, а не в чушь, выдаваемую типичным компилятором в Си. Почему, спрашивается, компиляторы так объёмны? Нельзя ли тупо вывести тип и дописать точку с запятой, а не городить море промежуточных языков и не выплевывать килобайты бойлерплейта с потерей всех идентификаторов вместо однострочника, столь же понятного, как и исходный текст.

Из этого примечания ("столь же понятного") родилась идея человекочитаемости, оказавшаяся ценной сама по себе.

Впоследствии я понял, что буквальная компиляция возможна, только если семантику почти не надо транслировать. Иначе транслятор семантики и приводит к каше в коде. Соответственно, получается, что для эффективной трансляции в Си наш язык должен быть тем же Си, но в профиль.

А раз мы делаем тот же Си, но в профиль, то не подойдет ли наш минималистичный компилятор в качестве хорошей замены Си? Так родилась идея о том, что HN0 можно рассматривать, как этап на пути к реализации HN.

Также я видел маленькие компиляторы (12 клок), написанные на Java. Я понял, что для дальнейшего сокращения размера мне нужно использовать весь имеющийся state of the art. Так я сразу нацелился на Haskell и атрибутные грамматики, реализованные сначала в виде обычных хаскелевских функций из структуры с унаследованными атрибутами в структуру с синтезированными атрибутами. Впоследствии, я нашел UUAG, и мне понравилось.

В случае парсера я сразу отказался от сканера, тем более Parsec предоставлял такую возможность.
Tags: fp, 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.
  • 8 comments