Решил таки посмотреть, какие изменения были введены в 20-ом стандарде и одно из первых изменений поставило меня в тупик: модули. Я долго пытался понять зачем их внедрили и как они должны работать (и я не про синтаксис и примеры использования).
Как я понял, модули могут послужить этакой альтернативой разделению кода на заголовочный и source файлы, однако! это разделение ведь возникло не просто так. Создали были вынуждены так сделать для того, чтобы сделать компилятор однопроходным. Компилятор при препроцессинге файла заменяет все директивы include на содержимое этих инклюдов, что является простой операцией и требует всего-то указать где эти инклюды искать (если они не в одном из стандартных местоположений). Но как компилятор обрабатывает модули? Вот он встречает директиву импорта модуля - его действия? Это не имя файла, он не знает где его искать если файл с этим модулем еще не встречался. Он должен перебрать исходники в поисках места где этот модуль экспортируется? Отложить текущий файл и заняться обработкой других пока не будет встречен нужный модуль? Как модули сказываются на производительности компилятора?
Вот в статье https://quuxplusone.github.io/blog/2019/11/07/modular-hello-world/ дается как раз ответ на такой вопрос. Суть в том, что вначале нужно сделать "прекомпиляцию" модулей и компилятор нагенерирует специальные файлы. А потом уже делается классическая компиляция в привычном виде.
Вот он встречает директиву импорта модуля - его действия?
найти в заданных путях имя файла модуля (да, теперь кроме инклудов, либ будет ещё один путь)
Это не имя файла, он не знает где его искать если файл с этим модулем еще не встречался.
это как раз имя файла (по крайней мере в случае clang) и Вы сами должны задать, где его искать. Даже если он лежит в этом же каталоге (ох ох).
Он должен перебрать исходники в поисках места где этот модуль экспортируется?
для этого программист должен запустить вначале компилятор в режиме генерации специально файла модуля.
Отложить текущий файл и заняться обработкой других пока не будет встречен нужный модуль?
нет, просто по классике сказать "не знаю, что это, не буду компилировать"
Как модули сказываются на производительности компилятора?
должны сказываться позитивно. Ведь теперь не нужно парсить миллионы строк кода хедеров.
Вот есть дока http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1441r1.pdf - где видно, что у них получилось в где то в пару раз сократить время компиляции
и еще чуточку на эту тему https://cor3ntin.github.io/posts/compiletime/
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
компилятор выдает ошибки: maincpp:34:21: error: expected ‘;’ before string constant cout « "\n x=" « x « " y=" « y « " a=" « a « " с=" « с « " U=" « U; ^~~~~~~ main
Подскажите как я могу компилировать проекты в Sublime Text 3Пытался настроить "Build System" файл, но безрезультатно
Подскажите пожалуйста по записи и чтению данных из ексель формата xlsx: