В рекурсивном анализаторе спуска с обратным отсчетом это плохая идея, чтобы держать все токены в списке? Я читал, что это хороший подход, если у нас нет бесконечного количества токенов, но что, если есть большой файл, а количество токенов велико. Будет ли это иметь большое влияние на производительность?Разбор: держит ли все жетоны в списке плохую идею?
ответ
Я бы не стал слишком беспокоиться об этом. Если файл настолько велик, что хранение всех токенов сразу занимает значительную часть памяти, тогда абстрактное синтаксическое дерево также будет занимать слишком много памяти. В более общем плане, скорее всего, вам понадобится примерно представление всего файла в памяти раньше или позже. Однопроходные компиляторы даже не подходят для большинства современных языков, а языки, которые уходят с пути, чтобы включить однопроходный компилятор (например, C), платят за него с худшим опытом разработки.
Кроме того, если предположить, что мы не говорим о/++ модели стиля препроцессора C C, разумных файлов кода меньше мегабайта, а это означает, что даже с космосом неэффективного типа маркеров данных самим вы реально смотрите на не более нескольких десятков мегабайт. Любой более крупный файл является патологическим и проблема людей, пишущих такие большие файлы, а не вашу проблему.
Вам нужно учитывать предполагаемое использование вашего языка - люди не пишут миллиардные программы на линии C, но есть генераторы кода, которые генерируют миллиарды строк кода C из другого более компактного языка. –
@ChrisDodd C - странный пример, потому что компиляция файлов C и C++ разумного размера * часто включает в себя токенизацию 100k + строк кода из '# include'. Кроме того, современные компиляторы C уже не однопроходные, поэтому, если вы набросите на них буквально миллиард строк кода, они буквально будут потреблять гигабайты памяти. – delnan
@ delnan: и если вы ежедневно компилируете миллиардные программы на линии C, это не будет проблемой, потому что вы купили компьютер с десятками ГБ ОЗУ, чтобы сделать это, и ваша кредитная карта почти не заметила. (Я видел миллион строк исходных файлов C [да, машина сгенерирована], но я никогда не вижу ни одной миллиардной строки). –
Я в общем согласен с @Delnan. В любом случае большинство компиляторов работают на машинах с огромным объемом памяти по сравнению с размером скомпилированной программы, поэтому пространство не является проблемой.
Я бы сделал дополнительное наблюдение, что , если вы собираетесь хранить полный АСТ, вы по существу сохраняете список токенов в любом случае, как листья АСТ.
Это указывает на направление: не храните полный список токенов сам по себе. Просто планируйте использовать листья AST как его представление.
- 1. Использует ли оператор @ (at) плохую идею?
- 2. Устанавливает set_time_limit (0) плохую идею?
- 3. Использует PHP NuSOAP плохую идею?
- 4. Устанавливает ли свойство в пользовательском getter хорошую или плохую идею?
- 5. Использует CROSS JOIN здесь плохую идею?
- 6. Есть -fPIC всегда на плохую идею?
- 7. Использует хранимую процедуру, такую плохую идею?
- 8. Перенаправляет http на https плохую идею?
- 9. Имеет ли вспомогательные стили CSS-страницы плохую идею?
- 10. Python: Проводит ли основной класс другим классам плохую идею?
- 11. Увеличивает `max_hint_window_in_ms` до дней плохую идею?
- 12. Вложенные Try/Catch блокируют плохую идею?
- 13. Имеет ли несколько SQL db плохую идею для одного приложения?
- 14. Загружает динамические javascript и файлы CSS в плохую идею?
- 15. Использует несколько PHP включает в себя плохую идею?
- 16. В модели Rails ActiveRecord использует after_initialize callbacks очень плохую идею?
- 17. Использование слишком большого количества PHP включает в себя плохую идею?
- 18. Меняет корневое пространство имен в .net на плохую идею?
- 19. Устанавливает session.gc_probability и session.gc_divisor равным 100% плохую идею?
- 20. Когда эта блокировка-то-блокировка снова реорганизует плохую идею?
- 21. Добавляет индексы на SQL Server когда-либо плохую идею?
- 22. Почему логика и маршрутизация через catch блокируют плохую идею?
- 23. счетные жетоны и символы в списке
- 24. Имеет ли ведущий знания о деятельности/контексте плохую идею в шаблоне MVP?
- 25. antlr 4: Должны ли появляться все эти жетоны в AST?
- 26. Создает ли процессорное приложение C# для использования на Linux (через Mono) плохую идею?
- 27. Doorkeeper :: AccessToken + Mongoid: запросить все истекшие жетоны
- 28. Разбор целых чисел в списке
- 29. PyParsing: не все жетоны переданы setParseAction()
- 30. Конвертировать в нокаут, а затем преобразовать в Угловую, плохую идею или перейти прямо к Угловому
FWIW, обычно текстовое представление программы больше, чем список токенов, поэтому, если вы можете полностью загрузить исходный код в ОЗУ, список токенов должен быть сравнительно небольшим. Тем не менее, если код вряд ли подходит в ОЗУ, даже добавление одного байта может привести к взрыву памяти. Но пока это технически может быть проблемой, я бы не сказал, что это редко бывает на практике. Я бы подождал с этим, пока это не станет проблемой. – uliwitness