Size: a a a

Compiler Development

2020 June 08

AZ

Alexander Zalutskiy in Compiler Development
Ибо бегать по токенам в разы быстрее, чем по тексту. ибо токенов меньше в разы
источник

AZ

Alexander Zalutskiy in Compiler Development
А для определения токена редко нужно просматривать данные назад или вперёд
источник

AZ

Alexander Zalutskiy in Compiler Development
Суть в оптимизации по performance не сократить колличество циклов, а уменьшить работу. В вашем случае вы по большей части переместили работу, но не сильно её уменьшили
источник

YS

Yaroslav Schekin in Compiler Development
polunin.ai
Кто может объяснить или поделиться объяснением зачем нужен лексер? Почему бы сразу не парсить текст в базовое промежуточное представление, минуя AST? кмк это должно быть быстрее так как мы за один проход собираем всю информацию и избавляемся от ненужной сразу.
Я сразу предупрежу, что не очень в этом разбираюсь, но:

> зачем нужен лексер?

И

> Почему бы сразу не парсить текст в базовое промежуточное представление, минуя AST?

Не связаны друг с другом, нет? Lexer занимается преобразованием в поток токенов, а не построением AST.
Т.е. какой у Вас именно вопрос?
источник

p

polunin.ai in Compiler Development
Yaroslav Schekin
Я сразу предупрежу, что не очень в этом разбираюсь, но:

> зачем нужен лексер?

И

> Почему бы сразу не парсить текст в базовое промежуточное представление, минуя AST?

Не связаны друг с другом, нет? Lexer занимается преобразованием в поток токенов, а не построением AST.
Т.е. какой у Вас именно вопрос?
да, у меня вопрос зачем поток токенов если можно сразу текст парсить в IR
источник

AZ

Alexander Zalutskiy in Compiler Development
Поток токеноы быстрее обрабатывать, чем текст
источник

p

polunin.ai in Compiler Development
но его нужно тоже обрабатывать чтобы сформировать поток токенов. то есть выполняется больше работы. если у вас есть какие-то бенчмарки которые показывают что с лексером быстрее чем без него, я буду рад посмотреть.
источник

AD

Artyom Drozdov in Compiler Development
polunin.ai
но его нужно тоже обрабатывать чтобы сформировать поток токенов. то есть выполняется больше работы. если у вас есть какие-то бенчмарки которые показывают что с лексером быстрее чем без него, я буду рад посмотреть.
Можно даже на глаз увидеть, что этап парсинга просто слёзки по сравнению с остальными фазами компиляции
источник

p

polunin.ai in Compiler Development
Artyom Drozdov
Можно даже на глаз увидеть, что этап парсинга просто слёзки по сравнению с остальными фазами компиляции
мне тут доказывали ровно обратное :)
источник

AZ

Alexander Zalutskiy in Compiler Development
polunin.ai
но его нужно тоже обрабатывать чтобы сформировать поток токенов. то есть выполняется больше работы. если у вас есть какие-то бенчмарки которые показывают что с лексером быстрее чем без него, я буду рад посмотреть.
Создать токены - просто пройти по списку без возвращений назад.
Понять какие конструкции используются - куча логики со вложенными конструкциями, look ahead и прочее. Делать это на тексте, вместо токенов (а это сжатие в 5-6 раз объем данных) просто ну гораздо дольше)
источник

p

polunin.ai in Compiler Development
Alexander Zalutskiy
Создать токены - просто пройти по списку без возвращений назад.
Понять какие конструкции используются - куча логики со вложенными конструкциями, look ahead и прочее. Делать это на тексте, вместо токенов (а это сжатие в 5-6 раз объем данных) просто ну гораздо дольше)
есть бенчмарки?
источник

AZ

Alexander Zalutskiy in Compiler Development
polunin.ai
есть бенчмарки?
А у вас, что ваш вариант быстрее?)
источник

p

polunin.ai in Compiler Development
Alexander Zalutskiy
А у вас, что ваш вариант быстрее?)
я пришел не доказывать что-то а спрашивать.
источник

AZ

Alexander Zalutskiy in Compiler Development
polunin.ai
я пришел не доказывать что-то а спрашивать.
Вам тоже объясняют)
Бенчи писать за вас никто не будет)
источник

AZ

Alexander Zalutskiy in Compiler Development
Иногда достаточно представить
источник

YS

Yaroslav Schekin in Compiler Development
polunin.ai
да, у меня вопрос зачем поток токенов если можно сразу текст парсить в IR
Так есть методы lexerless parsing, если что.
И поток токенов почти никогда в явном виде всё равно не строится (разве что при отладке lexer).

По идее, с токенами удобнее работать, потому что:
1. Parsing разделяется на эти модули (lexer и parser), в которых традиционно применяются разные методы описания и обработки (чаще всего regexp-ы в lexer и CFG в parser, по идее).
2. Разработка грамматики, где не нужно учитывать комментарии, переводы строк и т.п., с чем может "разобраться" lexer, может быть проще.
3. Иногда в lexer, наоборот, можно специально распознавать "сложные" конструкции, чтобы упростить работу parser.
4. При таком разделении можно использовать существующие генераторы lexers и parser, чтобы ускорить их разработку.
источник

MM

Mikhail Maltsev in Compiler Development
polunin.ai
да, у меня вопрос зачем поток токенов если можно сразу текст парсить в IR
Тот два вопроса: 1. зачем нужен поток токенов и 2. зачем нужно AST
По поводу 1: грамматика у лексера обычно регулярная и поэтому её можно разбирать более простыми алгоритмами, чем грамматику парсера. Время и там и там O(N), но у парсера константа больше.
Бенчмарков у меня нет.
источник

AZ

Alexander Zalutskiy in Compiler Development
И от перемещения этих алгоритмов в парсер ничего не ускорится
источник

AZ

Alexander Zalutskiy in Compiler Development
Ибо понимать что где-то идентификатор, а где-то ключевое слово, а где-то ещё что-то все равно придется
источник

AT

Alexander Tchitchigi... in Compiler Development
Mikhail Maltsev
Тот два вопроса: 1. зачем нужен поток токенов и 2. зачем нужно AST
По поводу 1: грамматика у лексера обычно регулярная и поэтому её можно разбирать более простыми алгоритмами, чем грамматику парсера. Время и там и там O(N), но у парсера константа больше.
Бенчмарков у меня нет.
Это только очень простые и ограниченные парсеры работают за O(N)... По факту даже лексер не каждый линейно работает.
источник