Тривиль — весь язык

Все конструкции языка компилируются и выполняются. Естественно, есть недоделки, но их немного и чистить буду по ходу. Собственно дальше или описание языка или проработка того, как сделать hash map, так как для само-компилятора hash map мне нужен. Или и то и другое одновременно. И далее уже тянем себя за шнурки.

Что можно посмотреть (все тексты в utf-8), так что смотреть в Notepad++ или в любом, кто правильно показывает):

Исходники лучше смотреть с подсветкой синтаксиса.

Статистика:

  • Компилятор: 9001 строк на Go в 8 пакетах и 51 файле.
  • Runtime: 767  на C.
  • Библиотеки на Тривиле (строки, вывод, юникод): 272 строки.

Написано, как я сейчас посмотрел, ровно за 2 месяца, первый коммит 02.12.2022.

Хочу обсудить несколько конструкций языка — в следующей записи.

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



  1. И всё-таки подсчёт ошибочный. Если говорить про Го, то 9001 строка — это честная характеристика, так как компилятор Го написан на Го. Но, сюда не входит выделенный подвал — мета-ассемблер Го (вполне самостоятельный язык) + аппаратный ассемблер. Именно в последний отображается текст любой программы.
    В Си точно также — сам язык отображается в аппаратный ассемблер. Причём в отличии от выделенного подвала Го — в Си подвал неявный, ещё и пересекается с реальным подвалом.
    В следующей статье по Тривилю есть некие намёки на выделенный явный подвал и это хорошо. Но в текущей статье я не вижу никаких намёков на подсчёт размера подвала и какую долю он занимает по отношению к Тривилю. А ведь это важнейшая характеристика (из двух: размер всего языка, и отношение языковой части к подвалу языка).

    Ответить

    1. Статистика показывает, сколько строк я написал для реализации компилятора и рантайма Тривиля. И ничего больше. Не понял, зачем мне считать «подвал», если он уже есть.

      Ответить

      1. Да, это я понял. И указал на то, что это «не совсем честная» характеристика. Проводя по аналогии с фразой «весь я не умещаюсь от шляпы до ботинок» — «язык не вмещается только в формальную грамматику». Подвал уже есть. Но отличной характеристикой (больше двух порядков) было бы отношение объёма семантики языка к объёму семантики подвала.

        Ответить

  2. Подвал — это часть языка, которая необходима для работы языка, но самим языком либо не декларируется явно, либо декларируется. Например, в Модуле/Оберон — это псевдомодуль SYSTEM. В Го — пакет unsafe. В Си — подвал не декларируется, хуже того — встроен в сам язык (главным образом, я говорю про адресную арифметику). Есть реализации языков (например, один из вариантов Лиспа или питон), где подвала нет вообще. Но по факту он есть — Си и ассемблер, которые лежат под ними. Это скрытый внешний подвал, что может потенциально являться ещё более плохим решением. Явное наличие подвала лучше, чем его неявное наличие. Но хуже, чем его отсутствие. Подвал позволяет выполнять опасные функции и в нормальной ситуации туда ходить не следует. Подвал перекрывает разрыв между абстракцией языка и реализацией аппаратуры. Абстракция языка, выраженная через реализацию аппаратуры образует семантическое пространство языка (с высокой вероятностью — с каким-то размером подвала). Или просто семантику языка.
    Чем хуже абстракции языка ложатся на реализацию аппаратуры — тем больше требуется подвал. Отношение объёма семантики языка к объёму подвала — я называю качеством реализации. Чем это отношение больше — тем лучше. Разумеется, чем объём семантики языка больше — тем хуже это отношение. Это причина того, что я предлагаю упрощать язык, например, за счёт вынесения обязательных функций в типы, а сложные структуры подключать опционально.
    Именно из-за неявного подвала в языке — такой язык как Си, или Раст, который без всяких сомнений декларирует небезопасный код — плохие языки. Работу компилятора они перекладывают на плечи программиста.

    Ответить

    1. Я более-менее понял то, что вы вкладывает в понятие «подвала». В Тривиле явный подвал содержит ровно одну операцию: осторожное приведение типа: х(:осторожно Т), или приведение без изменения битового образца.

      Разрешены приведения: 1) Слово64 < = => Цел64, Вещ64 2) Ссылочный тип => Слово64 и 3) Слово64 => Конкретный ссылочный тип. При этом, так как значения всех ссылочных типов тегированные, то преобразование, например, Слово64 => Строка, проходит с проверкой тега в рантайме. Если тег не совпал, то авария. Сломать все равно можно, но рантайм может много чего проверить и упасть управляемо.

      Неявный подвал — это рантайм, который сейчас написан на Си. Это временное явление. Он будет переписан на языке семейства ЯВД более низкого уровня, например, на L4 или, если будет удобнее, то ниже, на языке промежуточного представления. Как, например, рантайм Оберона в XDS был написан на Модуле-2. Тут как раз срабатывает преимущество семейства языков, создавая однородную среду исполнения с входами разного уровня (с разными уровнями абстракции).

      Ответить

  3. Строго говоря, у конкретной реализации ассемблера — нет подвала. Но и количество абстракций, предоставляемых ассемблером стремится к уровню, плохо отличимым от нуля. Чем меньше абстракций предоставляет язык — тем он более бесполезный для программиста. Если язык выполняет правило 80/20 — он практически достаточен. 95/5 — на грани избыточности. Отношение более высокое явно говорит о том, что язык избыточен и для конкретной цели 80% его возможностей просто не нужно.

    Ответить

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

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