Что именно означает отсутствие инкрементной компиляции в Rust?

Я посторонний, пытаюсь понять, подходит ли Rust для моих проектов.

Я читал, что в Rust отсутствует пошаговая компиляция (несмотря на бета-функции).

  1. Это похоже на то, как все реализовано в заголовках в C++ (как в большей части Boost)?

  2. Если вышеприведенное верно, ограничивает ли это Rust относительно небольшими проектами с небольшими зависимостями? (Если, скажем, Qt или KDE были библиотеками только для заголовков, то программы, использующие их, были бы чрезвычайно болезненными для разработки, поскольку вы бы эффективно перекомпилировали Qt/KDE каждый раз, когда захотите скомпилировать свой собственный код.)

1 ответ

Решение

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

В Rust ящик - это единица компиляции. (Ящик может быть приложением или библиотекой.) Rust не использует заголовочные файлы; вместо этого эквивалентная информация сохраняется в виде метаданных в скомпилированных ящиках (который быстрее анализируется и имеет тот же эффект, что и предварительно скомпилированные заголовки в C/C++). Ящик может быть дополнительно связан с другими ящиками. Это означает, что изменение любого исходного файла для ящика требует перекомпиляции всего ящика, а изменение ящика требует перекомпиляции всех ящиков, которые зависят от него (в настоящее время это означает перекомпиляцию из источника, даже если API-интерфейс не изменился).

Чтобы ответить на ваши вопросы, нет, Rust не перекомпилирует все зависимости каждый раз, когда вы перекомпилируете свой проект; Наоборот, на самом деле.

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

Другие вопросы по тегам