Size: a a a

Compiler Development

2020 December 02

BD

Berkus Decker in Compiler Development
hazer_hazer
Довольно прикладной вопрос: неужели c++ компиляторы не умеют в частичную компиляцию?
Например, изменил одну букву в стринг литерале, он не может понять, что только это нужно заменить? Или есть какие-то тонкости, которые эту возможность убивают? Или может тогда компиляция становится очень сложной и долгой, и быстрее будет почти всегда просто скомпилировать как обычно?
умеют в incremental compilation, но не все. посмотри в выхлоп препроцессора (это то что компилятор получает на вход) и ужаснись.
источник

BD

Berkus Decker in Compiler Development
обычно три строки превращаются в пару мегабайт текста
источник

E

EgorBo in Compiler Development
мы кстати тестили свой алгоритм валидации утф8 и он оказался быстрее :)
источник

M

MaxGraey in Compiler Development
Эта не та валидация)
источник

А⚙

Антон ⚙️ in Compiler Development
EgorBo
мы кстати тестили свой алгоритм валидации утф8 и он оказался быстрее :)
На каких строках вы сравнивали эти алгоритмы? По 4 байта?
источник

BD

Berkus Decker in Compiler Development
EgorBo
мы кстати тестили свой алгоритм валидации утф8 и он оказался быстрее :)
крутяк, а в чем разница?
источник

E

EgorBo in Compiler Development
Антон ⚙️
На каких строках вы сравнивали эти алгоритмы? По 4 байта?
на разных all-latin, mostly-latin, на других данных наш хуже
источник

h

hazer_hazer in Compiler Development
Кстати, ещё вопросек.

Когда такие большие япы, как плюсы, принтят кусок кода, где ворнинг/ошибка, они используют CST или кусок кода вырезают?
источник

BD

Berkus Decker in Compiler Development
MaxGraey
Эта не та валидация)
в компиле тебе не надо ничего большого валидировать - у тебя лексер читает входной утф-8 поток и сразу же расставляет спаны, отвалидировать что идентификатор в спане подходит под правила идентификатора - дешево (даже для идентификатора длиной под килобайт, и часто у вас такие попадаются в сорцах?)
источник

E

EgorBo in Compiler Development
но я не занимаюсь этим делом, там вроде говорилось что надо принимать за факт, что если ты встретил иероглиф то скорее всего следующий символ тоже будет иероглиф
источник

BD

Berkus Decker in Compiler Development
hazer_hazer
Кстати, ещё вопросек.

Когда такие большие япы, как плюсы, принтят кусок кода, где ворнинг/ошибка, они используют CST или кусок кода вырезают?
LLVM использует Source buffer - это весь исходник в памяти + спаны
источник

h

hazer_hazer in Compiler Development
Berkus Decker
LLVM использует Source buffer - это весь исходник в памяти + спаны
То есть и clang соответственно...
А что насчет g++ не знаете? 😳
источник

BD

Berkus Decker in Compiler Development
hazer_hazer
То есть и clang соответственно...
А что насчет g++ не знаете? 😳
не знаю, туда не закапывался, до совсем недавних версий он не был эталоном по репортингу ошибок
источник

M

MaxGraey in Compiler Development
Berkus Decker
в компиле тебе не надо ничего большого валидировать - у тебя лексер читает входной утф-8 поток и сразу же расставляет спаны, отвалидировать что идентификатор в спане подходит под правила идентификатора - дешево (даже для идентификатора длиной под килобайт, и часто у вас такие попадаются в сорцах?)
Недёшево, вообще недешего. Дело в том что там используется разряженная интервальная таблица которую проходят либо quick search ам или пакуют в в префиксное дерево. В любом случае нужно брать каждый codepoint для идентификатора и искать по этой таблице. При чем таблицы две - одна используется для первого символа, остальная для оставшейся части.
источник

BD

Berkus Decker in Compiler Development
MaxGraey
Недёшево, вообще недешего. Дело в том что там используется разряженная интервальная таблица которую проходят либо quick search ам или пакуют в в префиксное дерево. В любом случае нужно брать каждый codepoint для идентификатора и искать по этой таблице. При чем таблицы две - одна используется для первого символа, остальная для оставшейся части.
но поскольку иденты короткие - итоговая стоимость невелика. пока оно не начнет у меня в профайлере занимать первые строчки, вообще не буду париться. особенно для пробного ЯП - вы не забывайте что тут не все пишут industrial grade compilers. и контекст дискуссии тоже.
источник

M

MaxGraey in Compiler Development
Berkus Decker
но поскольку иденты короткие - итоговая стоимость невелика. пока оно не начнет у меня в профайлере занимать первые строчки, вообще не буду париться. особенно для пробного ЯП - вы не забывайте что тут не все пишут industrial grade compilers. и контекст дискуссии тоже.
Ну да, порой забываю. В любом случае для toy language можно всем этим пренебречь и спользовать стандартные строки везде
источник

BD

Berkus Decker in Compiler Development
так то я согласен что все эти копошения со строками в итоге сжирают кучу памяти и времени - не даром LLVM утыкан всякими SmallVec, SmallString etc
источник

M

MaxGraey in Compiler Development
Berkus Decker
так то я согласен что все эти копошения со строками в итоге сжирают кучу памяти и времени - не даром LLVM утыкан всякими SmallVec, SmallString etc
Ну SmallVec сделан дял экономии памяти, а для ускорения доступа и добавления элементов маленькие массивы, там просто используется статический фиксированный массив для всех элементов мень 16 скажем (обычно граница через шаблонный параметр задается)
источник

M

MaxGraey in Compiler Development
MaxGraey
Ну SmallVec сделан дял экономии памяти, а для ускорения доступа и добавления элементов маленькие массивы, там просто используется статический фиксированный массив для всех элементов мень 16 скажем (обычно граница через шаблонный параметр задается)
И это как раз пример того, как жертвуют памятью в угоду скорости)
источник

PS

Peter Sovietov in Compiler Development
«Ужасы нашего городка» :)

BEAM/C generated a single C function for each Erlang module. Local calls within the module were made by explicitly pushing the return address to the Erlang stack followed by a goto to the label of the called function. (Strictly speaking, the calling function stores the return address to BEAM register and the called function pushes that register to the stack.)

Calls to other modules were done similarly by using the GCC extension that makes it possible to take the address of a label and later jumping to it. Thus an external call was made by pushing the return address to the stack followed by a goto to the address of a label in another C function.


Отсюда: http://blog.erlang.org/the-road-to-the-jit/
источник