Конференция "Прочее" » Свой ЯП
 
  • Игорь Шевченко © (10.02.17 13:51) [80]
    Сергей Суровцев ©   (10.02.17 11:27) [73]


    > В общем и целом да, до какого-то момента и вообще не отличаются.
    >  Но дальше "дьявол в деталях".


    Да какой там дьявол. Получив синтаксическое дерево, ты не генерацией кода занимаешься, а выполнением операций языка.
  • Сергей Суровцев © (10.02.17 14:18) [81]
    >Игорь Шевченко ©   (10.02.17 13:51) [80]
    >ты не генерацией кода занимаешься, а выполнением операций языка.

    Вот именно. "Занимаешься", "ты", пошагово, построчно, сам, лично, ручками. По каждой операции. И вопросы хранения, доступа, обработки переменных, массивов, совместимости типов, вызова функций, проверка параметров, анализ и сообщения об ошибках и т.д. это только твое личное дело. И все это хозяйство не в виде скомпилированного кода, а в виде исходного. И надо чтобы по времени все это обрабатывалось приемлемо шустро. Тут и возникают вопросы оптимальной реализации.
  • Игорь Шевченко © (10.02.17 14:34) [82]

    > И все это хозяйство не в виде скомпилированного кода, а
    > в виде исходного.


    Все это хозяйство в виде синтаксического дерева.


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


    Часть этих проблем решается на уровне анализа, часть на уровне исполняющей среды.

    Открой для себя Yacc.
  • Сергей Суровцев © (10.02.17 14:39) [83]
    >Юрий Зотов ©   (10.02.17 10:10) [66]
    >Я тоже не встречал.

    Вот это и странно. Большинство современных и популярных языков либо интерпретаторы, либо изначально были таковыми. А хорошей полноценной литературы, посвященной именно этой теме нет. Парадокс.
  • Pavia © (10.02.17 14:42) [84]

    > Сергей Суровцев ©   (10.02.17 13:30) [79]
    > >aka ©   (10.02.17 13:10) [77]Дело не в минусах. А в операциях.
    >  --х судя по Сишному синтаксису интерпретатора тоже предполагается.
    >  Как и ++х. Дело в том, чтобы не разрешать 2 и более подряд
    > унарных операций. Кому сильно надо, есть скобки.

    В Си++ знаки идущие рядом преобразуются в теги ещё на стадии препроцессинга.
    -----ap преобразуется в набор тегов '--' '--' '-' 'ap'
    А вот дальше грамматический анализ проверяет унарность операций. И в данном примере унарный минус тут только один. Но даже если каким-то чудом или за счёт использования пробела их было два. То компилятор бы начал ругаться.

    По поводу запретить две и более унарных знака поддерживаю. Хотя насколько знаю в Си это сделано из-за указателей (унарный оператор '*').
    '**' - это отдельный оператор.
  • Kerk © (10.02.17 14:51) [85]

    > aka ©   (09.02.17 23:31) [57]
    >
    > Ну так даже проще в реализации. Но это с родни бессмысленности
    > лишних символов, сюда же можно отнести пустые выражение
    > (когда можем наставить сколь угодно ;;;;;;;). А зачем?

    С одной стороны да. Но с другой никогда не знаешь каким боком тебе такие упрощения вылезут.

    Например, в Делфи в отличие от С не обязательно писать скобки при вызове функций. В C надо писать
    somefunc()

    ;, а в Делфи хватит и просто
    somefunc;

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

    Синтаксис должен быть простым, предсказуемым и единообразным. Действие операторов не должно зависеть от контекста.
  • Сергей Суровцев © (10.02.17 15:12) [86]
    >Игорь Шевченко ©   (10.02.17 14:34) [82]
    >Часть этих проблем решается на уровне анализа, часть на уровне исполняющей среды.

    Игорь, прости, какой "исполняющей среды"?
  • Pavia © (10.02.17 15:13) [87]

    > Сергей Суровцев ©   (10.02.17 14:18) [81]


    > Тут и возникают вопросы оптимальной реализации.

    Наверно такой литературы нет, так как проблема решается сведением до компилятора байт-кода?
    А во вторых многие заваливаются на парсере так как очень большая часть.


    > И вопросы хранения, доступа, обработки переменных,

    Это решается семантическим деревом.


    > совместимости типов

    Решается на этапе преобразование в триграммы вернее в IR (внутренее представление).  


    >  проверка параметров

    Статическая типизация?

    У меня половина компилятора или чуть больше занимает всё это, а парсер меньше половины.
  • Pavia © (10.02.17 15:48) [88]

    > Это решается семантическим деревом.

    Когда строишь это дерево дублирующие данные заменяешь на ссылки.
    Обращение по ссылкам уже оптимально O(1). Поэтому при исполнение всё будет быстро.

    У тебя есть синтаксическое дерево с тегами к примеру 'MyVar'. Ты не знаешь к кой переменной они относятся так как у разных переменных может быть одно имя.
    Надо обойти дерево и заменить теги ссылками на объявления переменных. Которое храниться в этом же дереве.

    Запретив вложенные функции такой поиск объявлений сводиться к просмотру 4-х списков. Поиск в которых можно свести к O(1) при желании (Хэш таблицы).
    А если не заморачиваться, то обход дерева с возвратом. Возврат нужен для поиска первого объявления так как бывают перекрывающиеся имена.  
    Так как я не запрещал вложенные пришлось много кода править. Но не так много как кодогенирация.
  • Игорь Шевченко © (10.02.17 15:49) [89]
    Сергей Суровцев ©   (10.02.17 15:12) [86]


    > Игорь, прости, какой "исполняющей среды"?


    Обычно выход интерпретатора - это набор инструкций для некоторой виртуальной исполняющей среды, которую тем или иным образом эмулируют на конкретном процессоре. Как Java, например.
  • Inovet © (10.02.17 16:07) [90]
    > [76] Сергей Суровцев ©   (10.02.17 12:31)
    > Если заранее известно что "не надо так делать", значит не
    > надо давать возможности "так делать".

    Значит ограничить в чём-то язык. Оно, может, и неплохо. НО, надо это определить в спецификации и без противоречий. А в парсере уже проблем не составит отловить унарный минус и декремент.
  • Inovet © (10.02.17 16:10) [91]
    > [81] Сергей Суровцев ©   (10.02.17 14:18)
    > И все это хозяйство не в виде скомпилированного кода, а
    > в виде исходного.

    Вообще-то "скомпилированного" в дерево.
  • Inovet © (10.02.17 16:12) [92]
    > [83] Сергей Суровцев ©   (10.02.17 14:39)
    > >Юрий Зотов ©   (10.02.17 10:10) [66]
    > >Я тоже не встречал.
    >
    > Вот это и странно. Большинство современных и популярных
    > языков либо интерпретаторы, либо изначально были таковыми.

    Я где-то видел интерпретатор Си. Не у того ли автора, что ИШ привёл?
  • Inovet © (10.02.17 16:13) [93]
    > [84] Pavia ©   (10.02.17 14:42)
    > В Си++ знаки идущие рядом преобразуются в теги ещё на стадии
    > препроцессинга.
    > -----ap преобразуется в набор тегов '--' '--' '-' 'ap'

    Круто.
  • Inovet © (10.02.17 16:15) [94]
    > [84] Pavia ©   (10.02.17 14:42)
    > в Си это сделано из-за указателей

    Вот! Я ждал указателей. Но мы пока про них не говорили, а то и примеры там выше с -(--x) и т.п. вполне рабочие могут оказаться - зависит от типа x.
  • Сергей Суровцев © (10.02.17 16:21) [95]
    >Игорь Шевченко ©   (10.02.17 15:49) [89]
    >Обычно выход интерпретатора - это набор инструкций для некоторой виртуальной исполняющей среды, которую тем или иным образом эмулируют на конкретном процессоре

    Интерпретатор это и есть та самая виртуальная исполняющая среда. На входе там текст исходного кода. На выходе результат его исполнения. В середине либо построчная обработка, либо байт-код, либо JIT-компиляция. Вот в этой середине самое интересное и есть.
  • Inovet © (10.02.17 16:33) [96]
    > [84] Pavia ©   (10.02.17 14:42)
    > '**' - это отдельный оператор.

    Нет - это две операции.
  • Inovet © (10.02.17 16:40) [97]
    > [95] Сергей Суровцев ©   (10.02.17 16:21)
    > В середине либо построчная обработка

    Язык Fort в этом смысле всех уел - и построчная и компиляция.:)
  • Игорь Шевченко © (10.02.17 17:43) [98]
    Сергей Суровцев ©   (10.02.17 16:21) [95]

    Я бы рекомендовал литературу почитать и поизучать примеры готовых продуктов, благо, навалом.
  • Inovet © (10.02.17 17:53) [99]
    > [96] Inovet ©   (10.02.17 16:33)
    > > [84] Pavia ©   (10.02.17 14:42)
    > > '**' - это отдельный оператор.
    >
    > Нет - это две операции.

    А в Фотртане, да.
 
Конференция "Прочее" » Свой ЯП
Есть новые Нет новых   [118672   +61][b:0][p:0.001]