Подтвердить что ты не робот

Как мог кто-то сделать инкрементный компилятор С#, такой как Java?

Несколько лет назад кто-то спросил почему С# не позволяет инкрементную компиляцию, такую ​​как Java. El Skeet сказал, что это связано с тем, что Java выводит файлы .class, а не сборки.

Теперь, когда были выпущены его 2011 и groovy такие вещи, как Mono-компилятор как услуга, что нужно сделать, чтобы сделать инкрементный компилятор для С#?

edit: всем, кто беспокоится о том, как это не проблема, вот цитата из Jon Skeet из потока, с которым я связан:

Вы предлагаете, чтобы вы никогда не ждали сборки? Даже 15 секунд? Если сборка занимает 15 секунд, и вы хотите построить 20 раз в час (что я, конечно, делаю с TDD), что означает, что я трачу 5 минут. Взятие 5-минутного перерыва - одно дело - хороший способ расслабление и т.д. - но удерживание в течение 15 секунд 20 раз может быть очень расстраивает. Это не так много, чтобы сделать что-нибудь полезное (кроме возможно, выпить напиток), но это достаточно долго, чтобы раздражать.

Я подозреваю, что два фактора влияют на уровень раздражения, который я чувствую, другие, по-видимому, не делают: 1) TDD действительно полагается на более быстрый поворот 2) При работе с Java в Eclipse такие задержки очень редки

4b9b3361

Ответ 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 имеет гораздо более выдающиеся и актуальные задачи.