Size: a a a

Compiler Development

2021 February 13

VK

Vladimir Kazanov in Compiler Development
ID:0
https://grosskurth.ca/bib/1997/cardelli.pdf
"Program Fragments, Linking, and Modularization" Luca Cardelli.

Статья поднимает вопрос корректности раздельной компиляции и линковки, и потому — я считаю — обязательна к прочтению для всех авторов языков программирования! 😃

Уже во введении на простейшем примере создания воображаемой программы, состоящей всего из двух модулей, разрабатываемых независимо, автор иллюстрирует, наверное, все проблемы, при этом возникающие. Между делом Карделли упоминает публичные репозитории артефактов (типа Maven Central или Nuget. Напомню, что статья опубликована в 1996 году!). Многие из обозначенных проблем линковки раздельно скомпилированных модулей до сих пор не решены ни в мейнстримных, ни в исследовательских языках.

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

Однако, в качестве related work и дальнейшего чтения могу указать на работы по формализации (и доказательству корректности) раздельной компиляции для языка C в рамках проекта CompCert.

#separatecompilation #linking #modules #stlc
А какая проблема самая очевидная? Скажем, на примере современных языков?
источник

AT

Alexander Tchitchigi... in Compiler Development
Vladimir Kazanov
А какая проблема самая очевидная? Скажем, на примере современных языков?
Довольно распространены фичи, которые по факту требуют если не анализа всей программы, то более, чем одного файла/модуля и/или более одного раза (квадратичная сложность). Некоторые варианты/расширения наследования и переопределения методов этого требуют.
источник

AT

Alexander Tchitchigi... in Compiler Development
Vladimir Kazanov
А какая проблема самая очевидная? Скажем, на примере современных языков?
Кроме того, в качестве идеала Карделли использует "вышла новая версия библиотеки, мы ничего не меняли, просто перелинковались с ней, и всё работает как раньше", а такого не гарантирует ничто и нигде! 😂
источник

AT

Alexander Tchitchigi... in Compiler Development
SemVer как бы как раз про это, но мы все знаем, что "работает" он постольку поскольку. Поскольку это просто договорённость.
источник

VK

Vladimir Kazanov in Compiler Development
Alexander Tchitchigin
Кроме того, в качестве идеала Карделли использует "вышла новая версия библиотеки, мы ничего не меняли, просто перелинковались с ней, и всё работает как раньше", а такого не гарантирует ничто и нигде! 😂
Гарантирует язык? Потому что приличные библиотеки бинарную совместимость обычно все же сохраняют - на уровне соглашений
источник

AT

Alexander Tchitchigi... in Compiler Development
Vladimir Kazanov
Гарантирует язык? Потому что приличные библиотеки бинарную совместимость обычно все же сохраняют - на уровне соглашений
Так хотелось бы сохранения не только бинарной совместимости, но и функциональной корректности итоговой программы. 😉
источник

VK

Vladimir Kazanov in Compiler Development
Alexander Tchitchigin
Так хотелось бы сохранения не только бинарной совместимости, но и функциональной корректности итоговой программы. 😉
А возможно ли это в общем случае? :-)
источник

AT

Alexander Tchitchigi... in Compiler Development
Vladimir Kazanov
А возможно ли это в общем случае? :-)
Хороший вопрос. Но я там ссылался на работы по CompCert — люди пытаются этого добиться.
источник

P

Pavel in Compiler Development
Alexander Tchitchigin
Кроме того, в качестве идеала Карделли использует "вышла новая версия библиотеки, мы ничего не меняли, просто перелинковались с ней, и всё работает как раньше", а такого не гарантирует ничто и нигде! 😂
гарантировать после обновления функциональную корректность итоговой программы, мне кажется невозможно в принципе. ибо как вы правильно заметили - совместимость изменения в новой версии обусловлена "просто договрённостью". к примеру если автор исправил багу, а кто-то уже на эту багу завязался, то у него сломается поведение..  и  тп и тд
источник

P

Pavel in Compiler Development
то есть гарантии тут чисто "слово пацана")
источник

AT

Alexander Tchitchigi... in Compiler Development
Но интересные противоречия начинаются уже на уровне банального переопределения методов в ООП: если мы девиртуализируем вызов благодаря whole program analysis в случае компиляции приложения вместе с библиотекой, то добавление подклассов в новой версии библиотеки уже ни на что не повлияет без перекомпиляции всего вместе снова. А если не девиртуализируем, то добавление подкласса в библиотеке в будущем сможет что-то сломать в нашем коде. Что правильно — я вообще не знаю. 😃
источник

AT

Alexander Tchitchigi... in Compiler Development
Pavel
то есть гарантии тут чисто "слово пацана")
Dependent Types, Proof-Carrying Code... 😉
источник

P

Pavel in Compiler Development
Alexander Tchitchigin
Dependent Types, Proof-Carrying Code... 😉
да, подумал об этом, но это пока скорее экзотика и для редких кейсов
источник

AK

Andrei Kurosh in Compiler Development
Pavel
гарантировать после обновления функциональную корректность итоговой программы, мне кажется невозможно в принципе. ибо как вы правильно заметили - совместимость изменения в новой версии обусловлена "просто договрённостью". к примеру если автор исправил багу, а кто-то уже на эту багу завязался, то у него сломается поведение..  и  тп и тд
Банальное покрытие тестами, не?
источник

P

Pavel in Compiler Development
Andrei Kurosh
Банальное покрытие тестами, не?
это существенно повышает вероятность, но не гарантирует 100%. хотя разумное использование тестов, может дать достаточно высокую и практически достаточную гарантию
источник

AK

Andrei Kurosh in Compiler Development
Так-то 100% гарантии никто не дает - баги в железе, ионизирующее излучение и тому подобное :)
источник

AT

Alexander Tchitchigi... in Compiler Development
Andrei Kurosh
Банальное покрытие тестами, не?
Так тесты — это уже после линковки. 😉
источник

P

Pavel in Compiler Development
Alexander Tchitchigin
Но интересные противоречия начинаются уже на уровне банального переопределения методов в ООП: если мы девиртуализируем вызов благодаря whole program analysis в случае компиляции приложения вместе с библиотекой, то добавление подклассов в новой версии библиотеки уже ни на что не повлияет без перекомпиляции всего вместе снова. А если не девиртуализируем, то добавление подкласса в библиотеке в будущем сможет что-то сломать в нашем коде. Что правильно — я вообще не знаю. 😃
в таких случаях JIT рулит
источник

AT

Alexander Tchitchigi... in Compiler Development
Pavel
в таких случаях JIT рулит
JIT не указывает какой вариант правильный — это раз. JIT не модульный по построению — это два. 😊
источник

AT

Alexander Tchitchigi... in Compiler Development
Вопрос же не про производительность, а про корректность.
источник