Comments 15
Тогда уж не «лексинг» и не «токенизация», а «лексический разбор». Не «токены», а «лексемы». «Парсинг» — тоже жаргонизм для «синтаксического разбора», хотя он более-менее устоялся.
С перепугу, конечно, можно сделать такую программу, что будет час компилироваться. Но кто в здравом уме будет держать проект в десятки-сотни тысяч строк в одном файле? Проект будет разбит на мелкие логические куски и при минимальных усилиях, потраченных на дизайн, перекомпилирован будет только измененный кусок. А это — секунды. В крайнем случае, десятки секунд.
Я согласен считать слова про почти час риторическим приемом, но тогда было бы уместно как-то более явно это указать.
P.S. а что вы имеет в виду под «Си с его повсеместными иерархическими макроподстановками»? И как это связано с определениями типов?
Про “часто” никто не писал. В цитате, которую Вы комментируете, написано “могут”.
вы путаете макроподстановки и определения типов. макроподстановки — это не си, а препроцессор. а перекомиляция всех исходных модулей из-за изменения в одном заголовчнике — это, как я выше говорил, вопрос дизайна.
если не «часто», а могут без всяких численных оценок, то это довольно бессмысленное утверждение. если я один раз на 1000 перекомпиляций буду вынужден ждать десять минут вместо десяти секунд это не затормозит процесс разработки сколько-нибудь заметно.
В языках, реализующих управление модулями (Ада, Модула, Delphi) эта проблема перекомпиляции носит более ограниченный характер, так как перекомпилируются только модули, непосредственно включающие изменённый модуль или включающие зависящие от него интерфейсы. А в языках с динамической типизацией, вроде Smalltalk, вообще изменение типа используемого объекта – не повод что-либо перекомпилировать, кроме его собственной реализации.
Не только поэтому. Хороший JIT предварительно собирает профиль выполнения и оптимизирует горячие пути. Например, вы делаете виртуальный вызов, но профилирование показало, что у вас всегда в данном месте был объект одного и того же типа. Тогда вы можете выборку по таблице виртуальных методов заменить на проверку типа и статический вызов, что будет гораздо быстрее, плюс статический вызов можно будет синлайнить. Обычный компилятор можно тоже запустить в режиме профилирования, но это надо специально заморачиваться и профиль всё равно всегда одинаковый будет, а для JIT профиль зависит от способа использования программы и могут включиться разные оптимизации, если вы используете программу по-разному.
Впрочем, в реальной жизни выигрыш (если он возникает) будет более вероятно за счет умной профилировки по данным. Надо бы JVM'щиков спросить…
Закрыл для себя кусок знаний, о котором давно хотел почитать.
Введение в компиляторы, интерпретаторы и JIT’ы