C ++ 20 — Как обрабатываются шаблоны в модульной системе C ++?

Я читаю газету Модульная система для C ++
для понимания модулей C ++, предлагаемой функции для C ++.

Я не могу полностью понять, как шаблоны будут экспортироваться этой архитектурой модуля.

Есть идеи?

21

Решение

В настоящее время реализации C ++ на самом деле имеют только две «вещи», которые соответствуют коду: исходный код, который мы пишем и редактируем, и сборку, которую компилятор выдает на основе исходного кода.

Поскольку шаблоны C ++ являются «усовершенствованными», для каждого экземпляра шаблона выделяется отдельная сборка. По этой причине сборка не может быть произведена там, где определены шаблоны, а только там, где они используются. Вот почему шаблоны должны быть в заголовочных файлах, чтобы их можно было копировать и вставлять в точку использования (на самом деле все это #include).

Идея состоит в том, чтобы иметь третье представление кода. Представьте, что внутренне компилятор имеет какое-то внутреннее представление после он проанализировал код, но до он начинает производить сборку. «Вещи», которые она производит, в конечном итоге представляют собой некое представление абстрактного синтаксического дерева (AST). По сути, это именно ваша программа, сопоставленная с формой, наиболее простой для человека, и формой, удобной для компьютеров.

Это очень приблизительная идея модулей (или, по крайней мере, их реализация). Вы берете свой код и выплевываете какой-то файл, представляющий AST. Этот AST является полным представлением вашей программы, поэтому он полностью без потерь. Он знает все о шаблонах, которые вы объявили, и так далее. Когда модуль загружается, он просто загружает этот файл, и компилятор может использовать его точно так же, как если бы у него был весь доступный источник. Но шаг превращения читаемого человеком источника в этот AST на самом деле довольно дорогой шаг. Начать с AST можно намного быстрее.

Если у вас есть только одна единица перевода, это будет медленнее. В конце концов, синтаксический анализ -> codegen все еще быстрее, чем синтаксический анализ -> serialize -> deserialize -> codegen. Но скажем, у вас есть 10 единиц перевода, которые включают в себя вектор #include. Вы будете разбирать код в векторе 10 раз. На этом этапе дополнительные затраты на сериализацию / десериализацию компенсируются тем фактом, что вам нужно выполнить только один раз анализ (и десериализацию можно выполнить намного быстрее, чем синтаксический анализ; этот формат данных будет разработан специально для быстрой десериализации, тогда как исходный код предназначен для чтения, обратной совместимости и т. д.).

Предварительно скомпилированные заголовки в некотором смысле являются предварительным просмотром модулей: https://clang.llvm.org/docs/PCHInternals.html

19

Другие решения

Других решений пока нет …