LINUX.ORG.RU

История изменений

Исправление hobbit, (текущая версия) :

Клубок беспорядочных связей - это инклуды в C/C++. Он вообще никем не контролируется, ведь это всего лишь директива препроцессора по включению одной простыни в другую. Это приводит к массе забавных последствий.

Например, забытый нужный модуль в uses автоматически приводит к ошибке компилятора. Поведение же компилятора в случае забытого #include в общем случае зависит от фазы Луны. Допустим мы ссылаемся на внешнюю библиотеку, а там один нужный заголовочник в одной версии включает другой, в другой нет. (Я не шучу, это реальная жизненная ситуация.) В итоге один и тот же вроде бы правильный код на одной платформе собирается, на другой нет, хотя используемая нами часть API не поменялась. А ещё есть стражи компилятора, которых тоже никто, кроме препроцессора не видит, и ошибки в которых тоже получаются довольно забавными...

uses, будучи элементом языка, а не сторонней нашлёпкой, в этом смысле куда строже.

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

И да, мы от темы немного отклонились. Модульность языка и сборочная система — немного разные вещи. Но наличие в языке нормальных модулей уже даёт необходимый минимум информации для сборочной системы (кроме внешних зависимостей, конечно).

Паскалевому линковщику вообще безразлично, он просто всё в кучу закидывает

Вот не надо тут про кучу. К тому моменту, как в паскале вступает в дело линковщик, компилятор уже выстроил зависимости. Причём не так, как в сях, а детально — уже расписано, какая функция/класс из какого модуля берётся. В линковке осталось только эти связи в коде расставить. В сях же каждый объектник просто содержит два списка — объекты, торчащие наружу и неразрешённые имена. И линкер должен эти вещи друг с другом связать. В общем случае — методом тыка. К чему это может привести — я как-то уже рассказывал замечательную историю.

Исходная версия hobbit, :

Клубок беспорядочных связей - это инклуды в C/C++. Он вообще никем не контролируется, ведь это всего лишь директива препроцессора по включению одной простыни в другую. Это приводит к массе забавных последствий.

Например, забытый нужный модуль в uses автоматически приводит к ошибке компилятора. Поведение же компилятора в случае забытого #include в общем случае зависит от фазы Луны. Допустим мы ссылаемся на внешнюю библиотеку, а там один нужный заголовочник в одной версии включает другой, в другой нет. (Я не шучу, это реальная жизненная ситуация.) В итоге один и тот же вроде бы правильный код на одной платформе собирается, на другой нет, хотя используемая нами часть API не поменялась. А ещё есть стражи компилятора, которых тоже никто, кроме препроцессора не видит, и ошибки в которых тоже получаются довольно забавными...

uses, будучи элементом языка, а не сторонней нашлёпкой, в этом смысле куда строже.

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

И да, мы от темы немного отклонились. Модульность языка и сборочная система — немного разные вещи. Но наличие в языке нормальных модулей уже даёт необходимый минимум информации для сборочной системы (кроме внешних зависимостей, конечно).