185 похожих чатов

Кстати, что за генератор, какие мотивы его реализации были?

28 ответов

39 просмотров

У меня конструктор инкрементальных парсеров. Примерно как Tree-Sitter. Он получился значительно быстрее Tree-Sitter при инкрементальном разборе, и значительно быстрее Tree-Sitter при неинкрементальном разборе. Но он несколько медленнее, чем обычный не-инкрементальный парсер рекурсивного спуска. Я провёл множество улучшений и оптимизаций, и бенчмарков. И в целом выжал из системы довольно много. Так что она получилась не сильно медленнее, чем неинкрементальная. Но тем не менее она медленная(процентов на 40-50). Это проблема в частности потому, что я позиционирую свой фреймворк не только в качестве инструмента инкрементальной, но и в качестве инструмента для организации обычной неинкрементальной фронт-энд компиляции. Собственно бенчмарки на текущий момент показывают, что всё упирается в лексер. Вот поэтому и заморочился. Сейчас у меня лексер сделан довольно наивно. Он просто объединяет все регулярки в один гигантский автомат, минимизирует его, и затем делает кодогенерацию(без таблиц перехода, просто джампы в коде). И он делает это по нормализованным UTF-32 символам, что тоже скорее-всего не улучшает парсинг Ascii.

Ilya Lakhin
У меня конструктор инкрементальных парсеров. Приме...

VVM}} Идея: идёте по файлу. VVM}} Все встреченные символы в таблицу. Нумеруем. VVM}} Перекодируем в эти номера. VVM}} В итоге с 21 бита получаем 6 / 7 / 11 битов ( скорее всего - 7) Так как насчёт идеи сперва вычислять набор используемых символов? Т.е. м.б. уже проверялась и не давала выигрыша в скорости? Какова статистика на тестовом корпусе ( он же есть?) исходных кодов на ЯП из поддерживаемого набора?

Ilya Lakhin
У меня конструктор инкрементальных парсеров. Приме...

То есть сгенерированный лексер медленнее аналогичного написанного вручную?

Andrey
То есть сгенерированный лексер медленнее аналогичн...

Да, медленнее. Не на порядок. Но процентов на 30-40.

Victor Miasnikov
VVM}} Идея: идёте по файлу. VVM}} Все встреченные...

Минусы этой идеи следующие. Во-первых, так не получится предварительно закодировать большие классы символов. Например, все алфавитные символы Unicode. Даже их некоторое подмножество будет довольно большим. По причинам, описанным здесь. Ну, теоретически можно, но компиляция лексера на типичной грамматике языка с разными кейвордами и unicode-идентификаторами займёт минуты (я это проверял). Во-вторых, декодирование utf-8 в utf-16 на каждый символ, это не бесплатные рантайм-издержки. Хотя может и не такие уж дорогие. В конце-концов декодирование будет происходить в рамках одного машинного слова.

Ilya Lakhin
Минусы этой идеи следующие. Во-первых, так не полу...

Мне почему-то кажется, что в реальных исходных кодах будет: — Globish ( он же английский); — родная мова ( 1шт.) — греческий и прочие математические символы т.е. весь 2^21 мы не встретим никогда. Можно сделать штук 100 вариантов, зашить их, выбирать нужный в самом начале P.S. utf-16 — не ко мне... Я склоняюсь к "21-битному". Можно в 1 символ (?) в 24 битах, можно 3 с-ла в 64 битах

Victor Miasnikov
Мне почему-то кажется, что в реальных исходных код...

В реальных исходниках у вас может быть один-два комментария на родном языке, но если вы в принципе его поддерживаете, то лексер должен быть готов их встретить где угодно. А их полный алфавит довольно объёмный. Про 24-бита. Вы так формально сэкономите память, но вряд ли вы выиграете в производительности. По этому значению ведь как-то нужно будет перемещаться в таблице переходов(или в коде). Соответственно процессору всё равно придётся копировать это значение в своё машинное слово(32 или 64 бита).

Ilya Lakhin
Минусы этой идеи следующие. Во-первых, так не полу...

Очередная идея: Считать символами всё кроме: — 0123456789 — точек, запятых, амперсандов т.е. ~!@#$%^&*()_+ — прочего, что имеет свою роль в грамматике контретного ЯП или набора ЯП Можно ещё таиладские цифры и наборы символов для математики, функциональных ЯП.

Ilya Lakhin
В реальных исходниках у вас может быть один-два ко...

Ok Ж-) Согласен: идеи - материал для мозгового штурма

Ilya Lakhin
Минусы этой идеи следующие. Во-первых, так не полу...

Очередная идея: Считать символами-буквами всё кроме: — 0123456789 — точек, запятых, амперсандов т.е. ~!@#$%^&*()_+ — прочего, что имеет свою роль в грамматике контретного ЯП или набора ЯП Можно ещё таиладские цифры и наборы символов для математики, функциональных ЯП.

Очередная идея: Считать символами-буквами всё кроме: — 0123456789 — точек, запятых, амперсандов, т.е. ~!@#$%^&*()_+ и тому подобного — прочего, что имеет свою роль в грамматике конкретного ЯП или набора ЯП Можно ещё таиландские цифры и наборы символов для математики, функциональных ЯП включить в соответствующие категории.

Victor Miasnikov
Очередная идея: Считать символами-буквами всё кр...

Not bad. We did that* (exclusion) in MPL grammar — and we have no problem with it. Letter ::= [^+0123456789!@.:;{}()«#x22#x23#x5B#x5D #x9#xA#xD-]

Ilya Lakhin
У меня конструктор инкрементальных парсеров. Приме...

А Вы пробовали re2c посмотреть (содрать оттуда идеи), в таком случае?

a
Not bad. We did that* (exclusion) in MPL grammar —...

I hope 😉. I going to try this "cm3" compiler of Modula-3 language. ( May it's happend not in near time.)

Ilya Lakhin
Это может и неплохая идея, кстати.

Попробуйте ( "на досуге") — м.б. будет выигрыш по скорости на "существующей аппаратуре"

Yaroslav Schekin
А Вы пробовали re2c посмотреть (содрать оттуда иде...

Не пробовал, но сейчас посмотрю. Спасибо. Собственно, в документации написано: > It compiles regular expression specifications to deterministic finite automata and encodes them in the form of conditional jumps in the target language Это буквально то, что я сейчас и делаю. И мне казалось, что это плохая идея.

Ilya Lakhin
Не пробовал, но сейчас посмотрю. Спасибо. Собствен...

Адекватные benchmarks вообще трудно найти, насколько я помню. :( Ну вот что-то, например (см. и ссылки оттуда): https://github.com/Genivia/RE-flex/issues/86

Yaroslav Schekin
Адекватные benchmarks вообще трудно найти, насколь...

Автор Re/Flex пишет: > I suspect that your transition function average asymptotic execution time is O(m) for m out-edges on average per DFA state, making your TDFA matching cost O(nm) on average instead of the linear time O(n). The m will quickly grow in TDFA and staDFA (perhaps even more) for practical regex patterns that are typically large. I already collected experimental stats some time ago to compare DFAs, which both grow larger when markers are used, depending on the pattern). The m originates from the conditional jump logic for direct-coded DFAs with if-then-else (rather than jump tables). That is why the (academic) community rejects the idea that direct-coded DFAs are (generally) faster than table-driven DFAs. Собственно, у меня те же соображения были. Тем не менее, re2c почему-то показал результаты лучше, чем re/flex.

Ilya Lakhin
Автор Re/Flex пишет: > I suspect that your trans...

Потому что это про сравнение submatch extraction (что к "обычным" случаям lexing совсем не относится), разве нет?

Yaroslav Schekin
Потому что это про сравнение submatch extraction (...

Я не очень понял, что там у них происходит, но я полагаю, что если мы говорим о сканнере, то сканнер может быть представлен, как один большой regex с кучей submatch.

Ilya Lakhin
Я не очень понял, что там у них происходит, но я п...

Подождите. Обычный scanner — это DFA с кучей final states, и всё. Зачем там submatch?

Ilya Lakhin
Автор Re/Flex пишет: > I suspect that your trans...

Так re2c генерирует здоровенный switch, который потом компилятором оптимизируется до jump table

Andrey
Так re2c генерирует здоровенный switch, который по...

А я вот не уверен, что компилятор его именно так оптимизирует. В смысле, вы уверены, что он его именно так оптимизирует? Если, например, llvm решит, что ветвление слишком объёмное, он ведь может и не оптимизировать в джампы, разве нет?

Ilya Lakhin
А я вот не уверен, что компилятор его именно так о...

Уверен. Даже интерпретатор байткода со здоровенным switch так оптимизируется. Проверял сравнением генерируемого кода и бенчмарками для наивного switch и диспатча через gccшный computed goto

Ivan-Kochurkin Автор вопроса
Ilya Lakhin
А я вот не уверен, что компилятор его именно так о...

Компилятор может оптимизировать по-разному - если ветвлений слишком много, то может заюзать тот же бинарный поиск.

Ivan-Kochurkin Автор вопроса

Кстати, а как у вас реализована инкрементальность?

Похожие вопросы

Обсуждают сегодня

Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
> Копаем глубже > Следующий момент был, когда я спросил его, знает ли он JavaScript. Он ответил, что его учили работать с C#. Я тоже в университете писал на C#, но даже там мн...
Oleg Volkov
4
Гляньте, че бывает: Сегодня по одному проекту одной вебстудии делал проект небольшой, на их хостинге. На Modx revo. В определенный момент , работая в админке, вдруг перестал р...
Artem
7
И никого не интересует какие пакеты кто использует. ((% Заходишь на сайт симфони и видишь поддержку Украины - по законам РФ это ж экстремизм. Только никто не отказывается от с...
Am Ambrion
11
Чтобы перехватить все нажимания буков на форме, надо хук ставить? Пробовал на форме ОнКейДаун, оно ловит клаву если фокус не на компоненте с вводом текста
Serjone
15
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
8
Народ! Впервые клиенту пришло письмо от РКН, у вас, дескать, есть яндекс метрика, а нигде не написано, что вы ее юзаете. Никто не сталкивался?
Sasha Beep
14
Карта сайта