Тривиль — описание языка (черновик)

Выкладываю черновое описание языка. Написано почти все, кроме двух маленьких глав. Текст не вычитан, так что орфографических ошибок должно быть много, заранее извиняюсь. Чукча был, в основном, писатель…

Тем не менее, хочу выложить, чтобы закончить этот этап работы. Описание заняло изрядное время, примерно треть от времени разработки компилятора.

Буду благодарен за замечания и предложения.

 

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


  1. Извините, что не по сути, но каждый раз, когда видишь pdf, хочется сказать — имитация бумажных книг на электронных устройствах не нужна и только мешает.

    Ответить

    1. Слова понимаю, а суть не понимаю. При чем здесь имитация? Описание языка должно быть с перекрестными ссылками, так как описание существенно рекурсивно.
      Вот оно и есть. А какой при этом формат — а кого это волнует?

      Сделан в латехе (спасибо Д. Кнуту и Л. Лампорту за счастливое детство), поэтому можно получить хоть pdf, хоть html, наверное и fb2 или еще какой-нибудь формат эл. книг можно получить, я не интересовался.

      Одним движением можно превратить А4 в А5, изменить стили и т.д. С точки зрения оформления документ еще не доработан. Нет закладок (bookmarks), нет подсветки исходника. И то, и другое оказалось не просто сделать в документе на русском.

      Про счастливое детство почти не шутка. Первый раз я писал книжку (руководство по компилятору) в латехе в 1993 году, в пригороде Лондона. Тогда же и там же была встреча, из которой получились Oakwood guidelines. Почти 30 лет прошло, и все еще ничего лучше нет. Могу сказать уверенно, так как искали для того, чтобы на работе спеку языка сделать и все равно остановились на латехе.

      Вот так надо софт продумывать и писать. Лет на 50.

      Ответить

      1. Латех — спору нет, классика. Его возможности просто поражают при первом же знакомстве. Но, имхо. это как РВСН. Сейчас даже в маркдауне приличные книги пишут. Но. ещё раз — Латех — да, зачёт!))

        Ответить

  2. PDF на электронных устройствах всё-таки не надо делать формата А4. Максимум А5 и поля поменьше. Не слушайте Константина — он вас плохому научит)) Книжечку смотрю.
    Как хорошая альтернатива прямому PDF (на этапе редактирования/рецензирования) — гугель докс. Но, по сути, это всё-тот же документ, плюсом с минимально достаточным интерактивом.

    Ответить

  3. > • как следствие: язык должен быть русскоязычным.
    Предлагаю без шовинизма. И украинский пойдёт, и немецкий и как минимум — все языки с европейской письменностью.
    >Тривиль является языком программирования общего назначения,
    >пригодным для решения широкого круга задач
    Очень скромное предложение. Предлагаю более чётко определить назначение языка: системный, серверный, прикладной, мобильный и т.п.
    > Получившийся язык (и экосистема) обладает существенными
    >достоинствами для использования в качестве полигона для обучения
    > студентов разработке компиляторов, библиотек,
    > алгоритмов оптимизации и так далее,
    А для профессионального применения? А для любительского применения?
    > в := 1
    И всё-таки я за то ,чтобы такую форму оставить для определения на месте и инициализации одновременно.
    По аналогии с «прм в:целое=1»
    А для простого присвоения использовать «=». Вирт использовал «:=» для явного знака «присвоение», чтобы не путать с математическим «присвоение». Вариантов для дифтонга у меня нет. Все варианты для присвоения получаются двусмысленными. С другой стороны, совершенно понятно, что программирование достаточно посредственно стыкуется с математикой и тащить математическую нотацию в программирование в буквальном виде — больно, странно и контрпродуктивно.
    > Идентификатор — это последовательность Слов
    Может быть, лучше использовать слово «сущность»? Раз уж мы говорим про программирование на русском языке?
    > Каждое слово состоит из Букв и Цифр, и начинается с Буквы
    Нет. Буква — это буква (графическое отображение элементов алфавита). Следует исправить на «литера».
    > Знаки операций и знаки препинания
    Ну вот несколько лучше. Литеры и цифры — это «знаки». А «знаки операций» — это операторы.
    > Целочисленные литералы
    Просто целые числа
    > Вещественные литералы
    Просто дробные числа.
    > Строковые литералы
    Просто строки.
    > Символьные литералы
    Просто руна.

    Модификаторы сложно сделаны. Можно проще. Например, как это сделано в vlang. Или питоне.

    Предлагаю типы сделать как и остальные имена с маленькой буквы. Нет сакрального смысла давить шифт каждый раз при необходимости указать тип.

    Как упростить определение констант — описал выше, как для определения переменной на месте с инициализацией.

    Слово «класс» предлагаю заменить на «запись» (если уместно).
    Надо поработать, не дочитал.

    Ответить

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

      Практика покажет, цепляется ли взгляд или понимание за шероховатости или нет. Вот я на чем только не писал, где сравнения ‘==’/’!=’ — и мысль у меня часто цепляется за эту шероховатость. Вообще, интересно, кто это придумал? В каком языке впервые появилось?

      Про шероховатости:

      Почему, например, вещественные числа? Так устоялось давно, привычно, гладко. Беру с полки книгу «Автокод Эльбрус» черт знает какого года, и там вещественные числа. И смысл отражает правильно, а «дробные» смысл не отражает, потому что можно решить, что это рациональные. А таких зацепок не должно быть,

      Или «запись» — у записи вполне определенная семантика — это value type, см. Оберон, и она совпадает со struct в Го или Swift. А класс — это reference type, во всех языках, и это устоялось.

      И так далее… Например, зачем мне немецкий? Я не собираюсь на нем писать. Я провел часы, перебирая синонимы, благо такого в сети сейчас много, например, чтобы подобрать ‘надо’ или ‘авария’. Хорошо хоть, ‘если’ и ‘иначе’ не пришлось подбирать… За каждым слово стоит исследование. Лучшее ли я решение выбрал? — может и нет, но десятки вариантов я отбросил.

      Так что хотите поспорить — обосновывайте. Я спокойно принимаю свое несовершенство. А еще лучше, сделайте fork компилятора (я скоро открою репозиторий), назовите по своему и сделайте все свои правки, это же совсем просто. И напишите тысячу-другую строк. Вот тогда будет над чем поурчать. А пока есть только слова на ветер. Скучно-с.

      Ответить

      1. Компилятор сделать можно. Но это ящик Пандоры: открыл и не закроешь. Поэтому, прежде чем ящик открыть я всегда пытаюсь зайти со стороны тех, кто будет его использовать. Есть примеры с 50летним стажем.
        Замечания нельзя писать серьёзно.
        1) Часто они не имеют смысла. Некие абстрактные размышления.
        2) Жизнь и так не очень весёлая штука, давайте её делать вообще абсурдной (это иногда смешно).
        3) Когда пишешь с юмором человеку, которого уважаешь — сложнее такого человека задеть.

        Да, употребление вещественных чисел устоялось. Но, имхо, оно совершенно бессмысленно. Целые числа ещё более вещественные, чем дробные. И дроби как раз включают в себя и целое представление, и дробное, и иррациональное. А ещё есть комплексные числа, которые вполне можно отобразить по модулю на ось Х. Энергетика — это сплошные комплексные числа, она на них стоит. По-совести — они вещественные. И писать короче дробные, а не вещественные. И не факт, что в будущем гегемония бинарного счисления сохранится. Дробное как-то мягче намекает на фракцию к мантиссе, чем «вещественное». Ну, в любом случае слово «вещественное» в обсуждаемом контексте неудачно, имхо.

        Запись, к слову, в Го — это структура доступная по ссылке. В Обероне ровно также. В сущности, класс — это запись с методами (т.е. функции некоторого модуля, где на первой позиции передаётся скрытым образом ссылка на себя). Я полностью согласен с Виртом, что в сущности класс в таком рассмотрении превращается в избыточную сущность: модуль является единицей компиляции, он же органично принимает функцию класса — он экспортирует структуру и функции, которые эту структуру обрабатывают. А если штаны выглядят одинаково, зачем платить больше?

        Немецкий нужен! Я прям горой за! На нём говорили Карл Маркс и Эрнст Тельман! И за французский! На нём говорили Сент Экзюпери и Мерей Матье! Я, очевидно, не раскрыл посыл: словарь ключевых слов для языка должен лежать _рядом_, что позволит любому адаптировать язык программирования под свой разговорный язык. Это будет способствовать распространению языка. как лесному пожару. Правда, в данном случае — исключительно с положительными последствиями.

        Я не хочу спорить, я пытаюсь дать взгляд со стороны. Чтобы я принял, использовал и тратил своё время на поддержку и распространение влияния. К слову, ранее упомянутый родственник голанг — vlang мне очень даже симпатичен. Но из-за откровенно непонятых идиом из голанг у него шаткое будущее. Но, я буду только рад. если он потеснит своего старшего брата. Но опять же: как я часто говорю: Голанг — испорченный Оберон. vlang — попытка исправить голанг без его ясного понимания, с ещё большим ухудшением ситуации. Вместо того. чтобы просто вернуться к Оберону.

        Ответить

          1. На самом деле — именно про это речь с самого начала и шла.


          2. Идея «диалектов» язык не нова и была реализована в AppleScript. В нём была реализована поддержка английского, японского и французского языков в виде таблиц лексера и парсера + процедур печати. Чем всё закончилось, можно прочитать в HOPL 2007, статья William R. Cook.


        1. Запись/класс — на мой взгляд, из тройки: запись, класс, указатель действительно одно лишнее — и это указатель. В Тривиле есть только классы, в не-тривиле должны быть типы-значения, скорее всего это структуры, массивы и кортежи. Хотя кортежи, скорее всего лишние, или они должны слиться со структурами.

          Про немецкий — мне фиолетово. Если кто-то сделает, пусть будет. Сам я ничего для этого делать не буду.

          vlang — это забавно, спасибо за упоминание, раньше не видел. Посмотрел мельком, еще одно подтверждение того, что языки идут к некому общему ядру.
          Например:

          • «In V, variables are immutable by default. »
          • Kotlin: val/var — с рекомендацией использовать val везде где можно
          • Тривиль: пусть а = 1; пусть б := 1
          Ответить

      2. По поводу знаков «==» и «!=» — это хорошая удачная практика. Я как-то сразу принял для себя подобную нотацию и никакой другой ассоциации, кроме как «две половинки моста» эти знаки не вызывают. В одной случае мост сведён .во втором разведён. Имхо, удобно. Поскольку знак «=» встречается гораздо чаще, чем «==», вполне логично использовать нотацию:
        «прм а:целое=1», «а:=1» для объявления типа с одновременно инициализацией
        «а=2» для присвоения
        «а==2» для сравнения
        Писать меньше, семантика более чёткая, визуальное различие более сильное.

        Ответить

        1. Мы можем приводить аргументы в пользу остроконечников или тупоконечников, и часть из них будет умными, значимыми, а часть на уровне — «мне так нравится». В итоге можно написать собрание сочинений «как понять женщину», с известным выводом в конце 12-го тома.

          Собственно, мы уже обменялись аргументами и остались при своих. Мне нравится дихотомия: пусть а = 1; пусть б := 1. Синтаксис подталкивает писать assign once переменные.

          Кстати, а какая семантику вкладывают в vlang в понятие «immutable» — это глубокая неизменяемость или как везде? Если глубокая, то это интересно, стоит поучиться.

          Ответить

          1. Не готов сказать. Там больше говориться про иммутабельность переменных по умолчанию. Изменяемая переменная должна быть объявлена явно. Про переменные: иммутабельная переменная высчитывает при создании (на этапе исполнения), и далее в области видимости она неизменна (в отличии от констант, которые вычисляются на этапе компиляции). Других видов иммутабельности в vlang нет, но это не точно.


  4. Что касается указателей, то что они «кажется» лишние — они не кажется. Они на самом деле лишние, так как программист предоставляется абстрактная языковая машина. И программисту должно быть вообще до лампочки, какие механизмы работают в этом языковом зазеркалье. Указатель — понятие машинное. Оно не входит в (не должно входить ) в аппарат языка. Максимум, что может быть в языке — это ссылка. Ссылка — это аппарат косвенной адресации сущностей, который защищает машинную память. Некое абстрактное число, порядковый номер объекта в таблице объектов, запись из которой (номер такой записи — как раз и есть ссылка на запись) содержит тип, количество ссылок на объект, указатель на адрес в физической памяти, размер объекта, его тип, имя по необходимости, родителя, признак удалённости из области видимости — в-общем все необходимые данные для обеспечения инвариантов памяти.
    Такой подход легко позволяет реализовать сборщик мусора хоть с поколениями, оптимизировать выделение памяти, уплотнение — хоть чёрта лысого. А управляемая среда ещё и позволит без особой боли переносить код с платформы на платформу. Это зло неизбежного рантайма, как часть подвала, но это то зло, которое лишь на добро способно.

    Ответить

    1. Вот надо же — полностью согласен.

      Отмечу только, что я говорил про ненужность типа «указатель» в языке. Оберон и Го в пролете.

      Ответить

      1. В этом смысле, да. Я прекрасно понимаю, что льщу себе, но похоже преподобный Вирт как-то не осмыслил этого простого факт: «Указатели — зло». А создателям Го до Вирта — как до Кибартая — -отсюда не видно))

        Ответить

Добавить комментарий для AN Отменить ответ

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