Буферизация файлов в лексерах: целесообразно ли теперь, когда ОС (и языковые библиотеки) уже реализуют буферы внутри? - PullRequest
0 голосов
/ 26 апреля 2018

Техника оптимизации лексера была упомянута в двух книгах: Разработка компилятора К.Купером и соавт.и Создание компилятора C.Fischer et al.Вот исключение из первой книги (стр. 69):

Несмотря на то, что посимвольный ввод-вывод приводит к чистым алгоритмическим формулировкам, накладные расходы на вызов процедуры на символ значительны по сравнению сстоимость моделирования DFA в сканере с настольным или прямым кодированием.Чтобы уменьшить стоимость ввода-вывода на символ, разработчик компилятора может использовать буферизованный ввод-вывод, где каждая операция чтения возвращает более длинную строку символов или буфер, а затем сканер индексирует через буфер.Сканер поддерживает указатель в буфер ...

У меня вопрос, каково значение этой техники?Теперь, когда буферизация памяти часто уже осуществляется операционной системой, почему авторы предложили нам реализовать буфер?(Кроме того, стандартные библиотеки, предоставляемые языками высокого уровня, обычно имеют буфер, поддерживаемый процедурами обработки файлового потока, например, std :: ifstream в C ++.

В некоторых приложениях, таких как системы баз данных, я знаю собственный механизм буферане только желательно (знает больше о шаблонах доступа), но иногда необходимо (восстановление, ведение журнала).Применимы ли аналогичные причины к лексерам в компиляторах?Если да, то как?

РЕДАКТИРОВАТЬ : Вот аналогичный вопрос: ссылка , но я хотел бы узнать больше об аргументах для пользовательского буфера (например,аргумент, поддерживающий буфер в системах баз данных), если таковой имеется.

Еще один пост здесь сравнил ручную буферизацию с буферизацией std :: fstream в C ++.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Применимы ли аналогичные причины к лексерам в компиляторах?

Иногда, конечно.Например, рассмотрим правило лексера, которое возвращает токен, указывающий «это имя переменной».Синтаксическому анализатору необходим не только сам токен «имя переменной», но и фактическое имя: бесполезно знать, что это имя, не зная, является ли это имя Фредом, или Вильмой, или Барни, или кем-то еще.

Если оно является именем, то где его хранить?Не могли бы вы предоставить парсеру доступ напрямую к байтовому потоку, содержащему само имя?(Если да, то как долго? Как долго это нужно парсеру?)

Или рассмотреть строковый литерал (с любым синтаксисом, который у них есть).Где хранятся символы, составляющие строку?Можете ли вы предоставить доступ непосредственно к исходному буферу?

Если вы владеете структурами данных, которые предоставляют эти буферы времени сканирования, вы можете предоставить ограниченный доступ к ним и точно знать, что именновремя жизни заимствованных строк может быть.Это может, в зависимости от многих других деталей, позволить вам избежать копирования (по крайней мере, иногда).Если вы используете некоторые предоставляемые библиотекой буферизованные процедуры ввода-вывода, которые обещают доставлять только один символ за раз, вы определенно не сможете предоставить такой доступ.

0 голосов
/ 26 апреля 2018

Как уже указывали другие, независимо от того, буферизует ли ОС (или нет), для вашего приложения очень дорого полагаться на него, поскольку эти буферы ОС / файловой системы не находятся в адресном пространстве ваших приложений.Зачем?Потому что для того, чтобы ваше приложение получало эти данные, оно обычно должно проходить через слои вызовов, чтобы добраться до буферов ОС.Если вы делаете это для 1 символа / байт за раз, это повлечет за собой дополнительные затраты.

Если вы используете библиотеку ввода-вывода: некоторые из них делают или будут читать «вперед» по соображениям производительности и сводят к минимуму количество вызовов ОС.

Если вы, с другой стороны,работают без использования библиотеки, поэтому настоятельно рекомендуется настроить возможность буферизованного ввода-вывода по той же причине, что и другие библиотеки.

Наконец, конечный результат вашей компиляции - это исполняемая вещь.Если вы не разрешаете ввод-вывод, вам может потребоваться время выполнения вашего языка (предположим, что он сам), чтобы обеспечить буферизованный ввод-вывод по тем же причинам.Если ваша среда выполнения основана на языке или серии библиотек, которые ее предоставляют, у вас все получится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...