Тривиль компилятор на Тривиле компилирует сам себя

Maurits Esher reptilies

Главное написано в заголовке и, наверно, на этом можно было бы остановится…

Тривиль компилятор на Тривиле — это 10.5К строк. Вместе с библиотеками на Тривиле написано 12.5К, и это уже достаточно много для того, чтобы убедится в качестве дизайна языка. Тривиль показал себя удобным и вполне достаточным языкам. В паре мест немного жмет, но это я буду улучшать уже в следующих языках.

Скорость компиляции компилятора и первым компилятором (на Го) и вторым (на Тривиле) мгновенная, после этого примерно 5 секунд работает clang, что дает приемлемую общую скорость компиляции.

Оба компилятора выдают полностью одинаковый Си код, так что проверка нового компилятора тривиальна — сравнение сгенерированных файлов.

Любопытно, что размер исполняемого файла компилятора на Го (3123К) примерно в три раза больше, чем компилятора на Тривиле (1122К). Но к Тривилю еще не подключена сборка мусора, которая добавит существенно к размеру файла, но явно меньше, чем 2М.

Статистика, сравнение с прошлым замером:

  • 2023.06.04
    • compiler: 11128 lines in 57 files (Go)
    • runtime: 1530 lines (C)
    • библиотеки: 10/1818 lines (Тривиль)
    • компилятор: 4352 lines (Тривиль)
  • 2023.06.25
    • compiler: 11172 lines in 57 files (Go)
    • runtime: 1776 lines (C) (+250 строк)
    • библиотеки: 11/2321 lines (Тривиль) (+500 строк)
    • компилятор: 10455 lines (Тривиль) (+6100 строк)

Да, чтобы не было удивления от скорости разработки (прибавилось 6К строк на три недели) — перевод с Го в Тривиль делался полуавтоматически, с помощью инструмента, который делал черновой перевод, которые надо было дочистить. И я старался сохранить соответствие между исходниками, а если хотелось что-то улучшить, то улучшал в обоих компиляторах.

Что дальше?

  • Перенести/сделать модульные тесты — разница в 700 строк между размерами компиляторов как раз и объясняется тем, что на Го есть модульные тесты примерно такого размера.
  • А дальше есть техническая работа — добавить несколько файловых операций, подключить сборку мусора, доработать runtime на Линуксе, еще что-то…
  • Но главное, можно начинать думать о следующем языке (или следующих языках).

 

7 комментариев


  1. > компилятора на Тривиле (1122К)
    Так много, видимо, потому что размер раздут из-за отсутствия каких-либо оптимизаций. С ключом для сс -O1 размер будет ближе к 421К.

    > Но к Тривилю еще не подключена сборка мусора
    Я пропустил или забыл момент, когда от простейшего, даже не автоматического подсчёта ссылок было решено отказаться в пользу сборщика мусора?

    Ответить

    1. Размер не проверял.

      Сборка мусора — писал, когда не помню. Основная причина — уменьшение затрат на разработку.

      Ответить

          1. Для транслятора является нормальной ситуация, что всё что он выделяет во время работы, он сохраняет с собой почти до самого конца. При условии, что он не мусорит без нужды. Поэтому транслятор в командной строке может даже быть более эффективным по памяти с простейшим выделителем по принципу стека за счёт отсутствия потребности в обслуживании сложного алгоритма выделения. Типичный сборщик мусора в таких условиях часто даже не срабатывает, потому что по его настройкам не превышается порог включения.


          2. Согласен. Прямо сейчас компилятор ничего не освобождает, за отсутствием сборщика.
            Можно было бы собрать статистику использования памяти, но лень.


          3. В GNU/linux можно проверить память запустив транслятор с префиксом `time -f «%M KiB»`, что покажет максимальный расход всей памяти в течении работы. Этого может быть достаточно для грубой оценки.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *