Ответ 1
Если это не было сделано, для этого есть только одна причина: попытки сделать это выше возможных выгод.
Microsoft, безусловно, не сделает этого, потому что затраты слишком высоки:.net-код живет в сборках, и никто не изменит его. И да, сборки предотвращают поэтапную компиляцию по классам. Никто не остановит использование сборок.
И вот мой ответ, почему никто не нуждается в этом. Вы можете распространять свои классы, составляющие единый проект, между несколькими сборками и составлять их один за другим. Это фактически инкрементная компиляция, но не такая мелкозернистая, как поэтапная компиляция по классу. И когда ваша архитектура правильно спроектирована, требуется инкрементная компиляция уровня сборки.
Изменить: Хорошо, я загрузил компилятор Mono С#, чтобы посмотреть, что можно сделать его инкрементальным. Я думаю, что это не очень сложно. В основном он выполняет следующие шаги: 1) файлы парсинга 2) компиляция 3) сборка. Вы можете зацепиться где-нибудь после скомпилирования типов и сохранения в виде промежуточных файлов. Затем перекомпилируйте только измененные. Так что это возможно, но похоже, что для команды Mono это не является приоритетной задачей.
Изменить 2. Я нашел этот интересный нить, где люди обсуждают инкрементную компиляцию для компилятора Mono С#. Он довольно старый, но ключевое объяснение может оставаться актуальным:
Лексинг и синтаксический анализ обычно очень быстро и зависит только от размера анализируемый код. семантический анализ, как правило, самый раз шаг потребления при загрузке сборок и просеивания вокруг огромного метаданные для разрешения символов и типов на самом деле это мясо компилятора, Кроме того, новый "скомпилированный" код "прилагается" к этим метаданным /AST, что увеличивает сложность решения символы с течением времени. Излучение кода сначала сделанный в памяти, так что это быстро. Сохранение на диск происходит медленно, но зависит от испускаемого кода.
Для инкрементной компиляции, кэширования метаданных, сделает все очень быстро, так как обычно очень мало было бы изменено с одной компиляции на Другие. Но gmcs придется аннулировать только часть метаданные /AST, какой он не был построен для.
Изменить 3: у компилятора С# была опция /incremental
в версиях 1.0 и v1.1, но она была удалена:
Флаг/incremental, найденный в версии компилятора С# 1.0 и 1.1, теперь считается устаревшим.
Изменить 4: Мигель де Икаса дает ясный ответ (1, 2), почему Mono Compiler не будет инкрементным:
Есть много и много других мест, где GMCS просто не предназначен для работы сценарий редактирования и продолжения.
Если кто-то хочет сделать это тема тезисов, это прекрасно со мной, но количество изменений тоже большой в слишком многих областях. я не даже захотите перечислить их.
Причина, по которой я не перечислял вещи, потому что они будут повсюду в компилятор. Уверен, что вы столкнетесь с их, как только вы их попробуете; -)
Поэтому он считает, что это задача более сложная, чем для одного человека. И Mono имеет гораздо более выдающиеся и актуальные задачи.