Я бы сначала определил бы в грамматике нетерминал "блок операторов" ибо во многих местах пригодится, это то что обычно между {}. Потом не терминал цикл, т.е. лог выражение с блоком операторов и т.д.
VVV>Я так понимаю большинство интерпретаторов используют его?
Здравствуйте, VVVa, Вы писали:
VVV>Здравствуйте, Qulac, Вы писали:
VVV>>>Я так понимаю большинство интерпретаторов используют его?
Q>>Нет. VVV>а что тогда используют?
Интерпретатор — это ооп шаблон, а так конечные автоматы используются вроде бы.
Здравствуйте, VVVa, Вы писали:
VVV>Я так понимаю большинство интерпретаторов используют его?
Большинство каких интерпретаторов? Например, в интерпретаторах виртуальных машин точно нет, там в большинстве пишется на ассембелере или близко к нему.
Здравствуйте, koenjihyakkei, Вы писали:
K>Большинство каких интерпретаторов? Например, в интерпретаторах виртуальных машин точно нет, там в большинстве пишется на ассембелере или близко к нему.
Здравствуйте, VVVa, Вы писали:
VVV>Ну например Питон, Рубин, ЯваСкрипт
Этот паттерн, насколько я понимаю, для каких-то абстрактных высокоуровневых вещей в ООП. В интерпретаторах виртуальных машин все это нафиг не нужно, все что там нужно это скорость.
Поэтому серьезные конторы пишут сильно замороченные вещи:
Adroid ART(Java interpreter) написан на чистом ассемблере, но поддерживается в основном только х86 и Арм.
V8(JavaScript interpreter) написан на самописном языке Torque, бакендом которого выступает их же компилятор Turbofan. Иными словами тоже на ассемблере, но более грамотно и замороченно, поэтому поддерживается гораздо больше архитектур.
Webkit JavaScriptCore(JavaScript interpreter) — написан на собственном макроассемблере offlineasm (довольно уродливая вещь), но также позволяет легче поддерживать новые архитектуры.
И да, у них у всех были(есть) С/С++ интерпретаторы, но они медленнее процентов на 20%.
В питоне и руби вроде все еще Сишные интерпретаторы.
VVV>там действительно switch/case ... кто так мог написать? VVV>там же каждая инструкция по 100 раз проверяется каждым кейсом ...
У меня в курсовых по написанию интерпретатора VM было специальное требование — не писать switch/case...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, VVVa, Вы писали:
N>>Зачем? Это же не if/else. VVV>хоть тем хоть тем — всё равно код сгенерирует с множеством CMP последовательно...
Не согласен. В зависимости от значений, там может быть или просто таблица с переходами, или что-то типа бинарного поиска. Так делали компиляторы ещё лет 15 назад. Не думаю, что с тех пор что-то ухудшилось
Здравствуйте, Nuzhny, Вы писали:
N>Не согласен. В зависимости от значений, там может быть или просто таблица с переходами, или что-то типа бинарного поиска. Так делали компиляторы ещё лет 15 назад. Не думаю, что с тех пор что-то ухудшилось
Здравствуйте, VVVa, Вы писали:
VVV>там действительно switch/case ... кто так мог написать? VVV>там же каждая инструкция по 100 раз проверяется каждым кейсом ...
Ну опкоды обычно все плотные, то есть от 0 до какого-то значения без пропусков, поэтому там всегда jump table генерируется.