Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Category:

Новости об HN0

У меня не поворачивается язык назвать этот пост "HN0 Report", т.к. точное описание статуса писать некогда, но тем не менее, это какие-то новости о проекте после почти полугода затишья.

Я очень медленно делал свой HN0 на Хаскеле, когда в августе с сообщением "похоже что задача ~ одна. но только синтаксис разный" ко мне в аську постучался inv2004. Оказалось, что он еще более медленным темпом уже несколько лет делает подозрительно схожий проект SPL. Мы объединили усилия, и буквально пару дней назад прототипный компилятор родил наконец первый exe.

Текущая версия компилятора HN поддерживает язык, слегка отличающийся от предыдущего отчета. Пока не сделаны if, :=, while и FFI, но зато благодаря заимствованному из SPL модулю вывода типов декларации типов стали не нужны.

Все вызовы компиляторов HN и C++ и линкера в процессе компиляции .HN -> .CPP -> .OBJ -> .EXE обеспечивает модуль для Boost.Build. Таким образом, сразу поддерживаются все платформы и компиляторы С++, под которые есть Boost, и не надо писать тупые мейкфайлы, и будет отличная интеграция с моими проектами, которые я пишу на С++ и собираю с помощью Boost.Build.

Из компиляторов Хаскеля мы используем в разработке GHC 6.8.3 и HUGS. Проблем с GHC 6.10.1 не должно быть, но мы не тестировали. Интерпретатор SPL (с выводом типов само собой) работает как под HUGS, так и под GHC. Компилятор HN пока не запускается под HUGS - не работает парсер HN0, т.к. inv2004 не удалось установить Parsec 3 под HUGS. Для парсинга SPL inv2004 написал доморощенную библиотеку парсинга, но я не хочу отказываться от промышленного решения в виде парсека до релиза.

Кода у нас 1500 строк (компилятор HN, интерпретатор SPL, тесты на доморощенных фреймворках, доморощенный парсер, модуль Boost.Build и зачатки рантайм-библиотек для С++ и интерпретатора). И код еще больше ужмется после причесывания, так что пока проект соответствует моим ожиданиям о минималистичности. Однако генератор кода на С++ структурно оказался сложнее, чем я ожидал, так что я подумаю о разделении языка на два уровня - HN0 и HN1. Еще наверное можно ужать за счет переписывания выводильщика типов на монады, но inv2004 пока упирается, в основном по идейным соображениям.

Процесс компиляции выглядит примерно так:

текст на HN > парсинг во внутреннее представление HN > вывод типов и преобразование кода во внутреннее представление для С++ > красивая печать внутреннего представления

Вывод типов пока сделан через зад - мало того что код выводильщика рыхлый, так еще я сначала перевожу ASG из своего формата в формат SPL, а потом выведенные типы обратно конвертирую из системы типов SPL в систему типов C++. Унифицировав форматы и устранив преобразования, можно наверное еще ужать код.

Я не лучше inv - самый большой мой модуль тоже ужасно рыхлый и запутанный - так, я полагаюсь на ленивость для топологической сортировки атрибутов в ужасной пародии на атрибутную грамматику, и упростить и сократить код можно разными способами - от переписывания на UUAG до простого перепроектирования структур данных и перемещения атрибутов между узлами для увеличения cohesion и уменьшения coupling.

Да, все в стадии глубокой альфы - пока у нас не возникало трудностей придумать контрпример который поломает выводильщик или генератор. Работаем в режиме "придумали тест - починили - придумали следующий". Но свет уже виден. Сейчас даже накопилось черновой работы, и ищем третьего одержимого, готового тратить пару часов в день. Нужно на С++ написать/дописать библиотеку (местами серьезный шаблонный код) и на Хаскеле попричесывать юнит-тесты и запустить парсер HN под HUGS путем переписывания парсера на говнобиблиотеке inv2004 либо путем починки парсека чтобы он заработал на хагсе. В процессе разберетесь с кишками, там тысяча строк всего относительно сложных, и навесим новые таски. Думаю в 2000 хаскелевских строк уложим релиз - осталось всего 500 строк, немного.
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.
  • 5 comments