TL; DR: см. Последний абзац этого вопроса.
Я изучаю информатику, пытаюсь закончить текст своей магистерской диссертации о создании транспилятора (тематическое исследование).
Что касается магистерской диссертации, то часть моего текста посвящена сравнению задействованных языков. Один из языков - C ++.
Теперь я пытаюсь объяснить разницу в семантике импорта / включения и историческую причину, по которой C ++ сделал это именно так. Я знаю, как это работает на C / C ++, поэтому мне не нужны технические объяснения.
Тщательно исследуя Google и Stackoverflow, я пришел к нескольким объяснениям stackoverflow и другим ссылкам на эту тему:
Зачем нужны форвардные объявления?
Что такое форвардные объявления в C ++?
Зачем C ++ нужен отдельный файл заголовка?
http://en.wikipedia.org/wiki/Include_directive
http://www.cplusplus.com/forum/articles/10627/
https://softwareengineering.stackexchange.com/questions/180904/are-header-files-actually-good
http://en.wikipedia.org/wiki/One-pass_compiler
Зачем нужны файлы заголовков и файлы .cpp в C ++?
И наконец, что не менее важно, книга Бьярна Страуструпа «Дизайн и эволюция C ++ (1994)» (страницы 34 - 35).
Если я правильно понимаю, этот способ импорта / включения пришел из C и появился по следующим причинам:
Компьютеры были не такими быстрыми, поэтому предпочтительнее использовать однопроходный компилятор. Единственный способ, которым это было возможно, - это принудительное выполнение объявления перед использованием идиомы. Это связано с тем, что C и C ++ являются языками программирования с контекстно-зависимой грамматикой: им нужны правильные символы, которые должны быть определены в таблице символов, чтобы устранить неоднозначность некоторых правил. Это противоположно современным компиляторам: в настоящее время первый проход обычно выполняется для построения таблицы символов, а иногда (в случае, если язык имеет контекстно-свободную грамматику) таблица символов не требуется на этапе синтаксического анализа, потому что нет неоднозначностей для разрешения .
В то время память была очень ограниченной и дорогой. Поэтому на большинстве компьютеров было невозможно хранить всю таблицу символов в памяти. Вот почему C позволяет программистам напрямую объявлять прототипы функций и глобальные переменные, которые им действительно нужны. Заголовки были созданы для того, чтобы разработчики могли централизованно хранить эти объявления, чтобы их можно было легко повторно использовать в модулях, которым требуются эти символы.
Заголовочные файлы были полезным способом абстрагировать интерфейс от реализации.
C ++ пытался установить обратную совместимость с программным обеспечением и программными библиотеками, написанными на C. Что еще более важно: они фактически использовали для преобразования в C (CFront), а затем использовали компилятор C для компиляции кода в машинный код. Это также позволило им с самого начала компилироваться для множества различных платформ, поскольку каждая из этих платформ уже имела компилятор C и компоновщик C.
Вышеупомянутое было иллюстрацией того, что я обнаружил, сначала выполнив поиск;) Проблема в том, что я не могу найти подходящую ссылку на исторические причины этой стратегии включения, кроме как здесь, в Stackoverflow. И я очень сомневаюсь, что мой университет будет доволен ссылкой на stackoverflow. Ближайшее, что я нашел, - это справочник «Дизайн и эволюция C ++», но в нем не упоминаются аппаратные ограничения, являющиеся причиной для стратегии включения. Я думаю, этого следовало ожидать, потому что дизайн этой функции был разработан на C. Проблема в том, что я еще не нашел хорошего источника, описывающего это проектное решение на C, желательно с учетом аппаратных ограничений.
Может ли кто-нибудь указать мне в правильном направлении?
Спасибо!
static a;
, и это будет интерпретировано какstatic int a;
.) И я признаю, что здесь не так много вы могли бы процитировать в университетской статье - это более личные воспоминания. Спровоцировано в основном заявлениями о том, что это было связано с медленными машинами или чем-то еще; Это был просто более или менее стандартный способ делать что-то в то время (и правил даже в таких языках, как Паскаль, в которых не было никаких неявных деклараций). 09.06.2014