Как кто-то может сделать aC# инкрементный компилятор, как Java?
Несколько лет назад кто-то спросил, почему C# не позволяет инкрементную компиляцию, как Java. Эль Скит сказал, что это связано с тем, что Java выводит файлы.class, а не сборки.
Теперь, когда были выпущены его 2011 и такие классные вещи, как Mono compiler-as-a-service, что нужно сделать, чтобы сделать инкрементный компилятор для C#?
редактировать: всем, кто хочет узнать, что это не проблема, вот цитата Джона Скита из темы, с которой я связан:
Вы предлагаете никогда не ждать, пока не соберетесь? Ещё 15 секунд? Если сборка занимает 15 секунд, а вы хотите собрать 20 раз в час (что, конечно, я делаю с TDD), это означает, что я теряю 5 минут. Делать 5-минутный перерыв - это одна вещь - это хороший способ расслабиться и т. Д. - но задержка на 15 секунд 20 раз может быть очень неприятной. Это не достаточно долго, чтобы сделать что-нибудь полезное (кроме того, чтобы выпить глоток), но это достаточно долго, чтобы раздражать.
Я подозреваю, что на уровень раздражения влияют два фактора, которых другие, по-видимому, не испытывают: 1) TDD действительно полагается на более быстрое решение проблемы 2) При работе с Java в Eclipse такие задержки очень редки
1 ответ
Если это не было сделано, то для этого есть только одна причина: усилия сделать это выше, чем возможные выгоды.
Microsoft определенно не сделает этого, потому что затраты слишком высоки: код.net живет в сборках, и никто не изменит его. И да, сборки предотвращают поэтапную компиляцию. Никто не перестанет использовать сборки.
И вот мой ответ, почему это никому не нужно. Вы можете распределить ваши классы, которые составляют один проект, по нескольким сборкам и скомпилировать их одну за другой. Это на самом деле инкрементная компиляция, но не такая детальная, как поэтапная компиляция. И когда ваша архитектура правильно спроектирована на уровне сборки, инкрементной компиляции достаточно.
Редактировать: Хорошо, я скачал Mono C# компилятор, чтобы посмотреть, возможно ли сделать его инкрементным. Я думаю, что это не очень сложно. В основном это делает следующие шаги: 1) Разбор файлов 2) Компиляция 3) Создание сборки. Вы можете подключиться где-нибудь после того, как типы скомпилированы, и затем сохранить их в виде промежуточных файлов. Затем перекомпилируйте только измененные. Так что это возможно, но, похоже, это не является первоочередной задачей для команды Mono.
Редактировать 2: Я нашел эту интересную ветку, где люди обсуждают инкрементную компиляцию для компилятора Mono C#. Это довольно старое, но ключевое объяснение все еще может быть действительным:
Лексирование и синтаксический анализ обычно очень быстрые и зависят только от размера анализируемого кода. Семантический анализ обычно является наиболее трудоемким этапом, поскольку загрузка ссылочных сборок и выборка огромных метаданных для разрешения символов и типов на самом деле является основным компонентом компилятора. Кроме того, новый "скомпилированный" код "добавляется" к этим метаданным /AST, что увеличивает сложность разрешения символов с течением времени. Передача кода выполняется в память в первую очередь, поэтому это быстро. Сохранение на диск выполняется медленно, но зависит от размера испускаемого кода.
При инкрементной компиляции кэширование метаданных сделает все очень быстро, так как обычно очень мало будет изменено от одной компиляции к другой. Но gmcs должен был бы сделать недействительной только часть метаданных /AST, для чего он не был создан.
Редактировать 3: компилятор C# имел /incremental
опция в v1.0 и v1.1, но она была удалена:
Флаг /incremental, найденный в версии 1.0 и 1.1 компилятора C#, теперь считается устаревшим.
Изменить 4: Мигель де Иказа дает четкий ответ ( 1, 2), почему моно-компилятор не будет инкрементным:
Есть много, много других мест, где GMCS просто не был спроектирован для работы в сценарии редактирования и продолжения.
Если кто-то хочет сделать это темой своей диссертации, это хорошо для меня, но количество изменений слишком велико во многих областях. Я даже не хочу их перечислять.
Причина, по которой я не перечислял вещи, заключается в том, что они будут везде в компиляторе. Я уверен, что вы столкнетесь с ними, как только попробуете;-)
Поэтому он считает, что это задача гораздо сложнее, чем для диссертации одного человека. И у Mono гораздо больше актуальных и актуальных задач.