Как Microsoft переписала компилятор C# на C# и сделала его открытым

Автор оригинала: Mads Torgersen
  • Перевод
Автор статьи — Мэдс Торгерсен, ведущий архитектор C# в Microsoft

Проект Roslyn

Roslyn — это кодовое название, которое закрепилось за open-source компилятором для C# и Visual Basic.NET. Проект начинался в самой глубокой тьме последнего десятилетия корпоративной жизни Microsoft — и завершился как проект с открытым исходным кодом, кросс-платформенный, публичный универсальный движок для C# (и VB, что я приму как данность в остальной части статьи).

Первые разговоры о проекте, который впоследствии станет известен как Roslyn, уже шли, когда я пришёл на работу в Microsoft в 2005 году — незадолго до выпуска .NET 2.0. Шёл разговор о переписывании C# на C#. Это нормальная практика для языков программирования — доказательство зрелости языка. Но была и более практичная и важная мотивация: мы, создатели C#, сами не программировали на C#, мы программировали на C++! Если же ежедневно программировать на C#, то вы меняете своё мнение: великая сила работы на том инструменте, какой разрабатываете (dogfooding).

Пользователи зависят от поведения нового компилятора в точности как от старого. Написание нового компилятора для C# — это попытка найти соответствие баг-к-багу.

Трудность переписывания компилятора, который уже несколько лет находится в активном использовании, состоит в том, что пользователи зависят от поведения нового компилятора в точности как от старого. Написание нового компилятора для C# — это попытка найти соответствие баг-к-багу. И я говорю не только об известных багах, но также о неизвестных ошибках и нежелательных формах поведения, которые разработчики нашли и используют, часто неосознанно.

В течение многих лет масштабы этой проблемы не позволяли нам даже приступить к осуществлению проекта.

И хотя разработчики языковой группы в Microsoft получали много преимуществ от нового компилятора C#, написанного на C#, однако ценность для конечных пользователей была не так очевидна: чем новый компилятор будет им полезен? Возможно, единственные люди, которых волнует, что компилятор C# написан на C# — это сами разработчики компилятора.

В то же время всё больше проявляла себя ещё одна проблема: дублирование усилий между различными инструментами, работающими на коде C#. Кроме компилятора, другая команда работала над поддержкой IDE для C# в Visual Studio, и им тоже приходилось писать кучу кода (в то время тоже на C++), чтобы понять синтаксис и семантику C#.

Одновременно росло и количество инструментов от Microsoft и других компаний, таких как StyleCop, CodeRush и т.д.: все они должны реализовать осмысленную обработку кода C#. У каждой из этих программ свои чуть различные ошибки, разные уровни понимания, различные компромиссы и уступки. И все они потратили бы очень много усилий, чтобы прийти к единому пониманию кода.

И мы решились на важное предложение: сделать так, чтобы в мире была только одна кодовая база — единая база для всех инструментов, которые работают с кодом C#!

Ценность такого предложения вытекает из увеличения числа имеющихся инструментов, и особенно из повышения качества существующих инструментов. Все требования к правильности и производительности языка возлагаются на единую кодовую базу. Достаточно однократных усилий, чтобы сделать базу звёздного качества и огромной универсальности. Мы же создадим настоящий движок для языка! Унифицированный, открытый API для кода C#. Мы дадим новое определение понятию «компилятор».

Конечно, как только вы создаете API для широкого сообщества C#, то как бы само собой разумеется, что это должен быть .NET API, реализованный на C#. Итак, давняя мечта написания C# на C# осуществляется почти как случайный побочный эффект.

Таким образом, Roslyn родился из менталитета открытости: совместное использование внутренней работы C# для программного использования всем миром. Это само по себе было немного смелым предложением для ещё довольно закрытой корпоративной культуры Microsoft.

Мы будем делиться интеллектуальной собственностью бесплатно? Мы будем расширять возможности инструментов, которые конкурируют с нами?

В корпоративном обсуждении нам помогли выиграть аргументы об укреплении экосистемы и создании языка с лучшим инструментарием на планете. Речь шла о долгосрочном росте C# и .NET по сравнению с краткосрочной монетизацией и защитой активов Microsoft. Таким образом, даже не упоминая открытый исходный код, ставка на Roslyn стала большим и смелым шагом для Microsoft.

Конечно, разработка чего-то подобного не может оказаться простой. Перспективы Roslyn были очень амбициозными и чреватыми техническими проблемами, и нам потребовалось полдесятилетия, чтобы справиться со всем. Но это уже другая история.

В течение большей части первоначальной разработки Roslyn оставался проектом с закрытым исходным кодом.

С самого начала серьёзной работы над проектом в 2009 году у нас были идеи сделать компиляторы открытыми, но Microsoft просто ещё не была готова.

В Microsoft с 1970-х годов существовала культура закрытой разработки и защиты исходного кода патентами. И хотя изменения витали в воздухе, но происходили медленнее, чем надеялась наша команда.

На самом деле какое-то время казалось, что компания идёт в совершенно противоположном направлении.

Проект Windows 8 очень сильно повлиял на всю компанию. Благодаря новой модели программирования его щупальца проникли глубоко в команды разработчиков инструментов и языков, и всё было покрыто крайней секретностью, не только снаружи, но даже внутри компании. В качестве примера, функция async, которую мы разрабатывали в то время, была скоординирована и смешана с моделью программирования Windows 8, и я бы не осмелился публиковать заметки о её дизайне даже внутри компании, опасаясь случайной утечки информации о Windows 8 и проблем на свою голову! Это создавало ужасный климат для инноваций, и конечно, не позволяло нам надеяться на открытый исходный код компилятора C#.

Однако в итоге, когда Windows 8 пошла своей дорогой, компания начала трансформироваться и нашла новое направление, новое руководство и совсем иную философию — та Microsoft, которую мы знаем сегодня. Открытые исходники сейчас стремительно распространяются внутри Microsoft.

F# выпущен уже в 2010 году с открытой лицензией и собственной организацией — F# Software Foundation. Вокруг него сформировалось выдающееся сообщество, которое вскоре стало предметом зависти для всех нас. Наша команда упорно настаивала на том, чтобы получить свободную лицензию для Roslyn — и, наконец, корпоративная инфраструктура позволила осуществить это.

К 2012 году Microsoft создала организацию Microsoft Open Tech, специально ориентированную на проекты с открытым исходным кодом. Roslyn перешёл под её крыло и официально стал проектом open source. Roslyn вполне созрел для этого: все ресурсы разработки были внутренними и хорошо известными, и сам проект не страдал от большого количества зависимостей, которые могли бы породить лицензионные конфликты.

В апреле 2014 года на конференции разработчиков Build в Сан-Франциско Андерс Хейлсберг представил Roslyn как проект с открытым исходным кодом, а сами исходники опубликовали 3 апреля на CodePlex (бывшая платформа Microsoft для репозиториев) под лицензией Apache 2.0.



В то же время .NET Foundation объявили базой для .NET-проектов, включая Roslyn.

Это освобождение стало настоящим глотком свежего воздуха! Мы начали пожинать плоды открытости уже в CodePlex, а затем были устранены оставшиеся процедурные препятствия с открытым исходным кодом в Microsoft, так что сегодня open source является естественной и неотъемлемой частью того, как мы работаем во многих наших командах.

Мы уже не рассматриваем GitHub как место для публикации исходников — это просто место нашей работы.

На других фронтах компания тоже поняла, что необязательно стремиться всё контролировать. Стало ясно, что нет никаких веских причин для существования CodePlex — и Roslyn вместе с другими проектами мигрировал на GitHub, к тому времени де-факто основную площадку для проектов с открытым исходным кодом. Не только сам код, но и процесс его создания ведётся в GitHub: мы уже не рассматриваем GitHub как место для публикации исходников — это просто место нашей работы.



Дизайн языка C# и реализация компилятора — теперь полностью открытые процессы, со значительным участием сторонних разработчиков. Они создают в том числе целые языковые функции. Ценность C# просто зашкаливает не только за счёт масштабирования усилий при написании функций и исправлении ошибок, но и за счёт понимания и коррекции курса, которые мы производим благодаря мгновенному ежедневному циклу обратной связи с сообществом.

Это было долгое и сумасшедшее путешествие, и для меня оно символизирует огромные изменения, которые претерпела Microsoft в последнее десятилетие. Самородок Roslyn родился в темноте, но вырос на идеях открытости — и сегодня взорвался миллионом различных применений благодаря силе open source.

Изучайте Roslyn и дизайн языка C#:

Roslyn на GitHub
C# на GitHub

Комментарии 19

    +29
    И ни строчки про то, как же она его «переписала». Статья о том как она размышляла, как хотела, как думала где опубликовать. И главное по больше «эффективных» слов:
    open-source, баг, ошибка, пользователи, компилятор, сообщество, качество, универсальность, открытость, кодо-база… Блокчейна не хватает.

    Выражу исключительно свое мнение, на хабр стали постить переводы американских статей, это хорошо. Качество перевода — нормальное. А вот выбор статей периодически сильно огорчает. Заголовки громкие, интересные, а под катом дикий бред и вода, читаешь не понимаешь о чем, все ждешь когда начнется конкретика, а она не начинается… Для западных изданий это нормально, они там все какие-то сильно «об эмоциях». А мне с моей культурой, да на русском языке, это вообще не заходит. Как-будто политика прочитал.

    Я бы эту статью перевел так:
    Мы хотели, но не надеялись, но у нас в итоге получилось. Исходники тут:
    Roslyn на GitHub
    C# на GitHub
      0
      Ну а что вы хотели когда примерно у 70% постов есть тег «Блог компании %companyname%» а в конце текста состоящего на 80-100% из воды зачастую прямо предлагается попользоваться сервисами этой самой компании?
      Огромное количество статей сейчас де-факто являются рекламой с предисловием, а не познавательным материалом.
      За качественным контентом надо перенестись в прошлое лет на 5.
        0
        В том то и дело, что это не блог микрософт, это сотрудник хабра перевел статью на свое усмотрение.
      –28
      А вообще хитрый мелкософт, не взлетел вижуалбейсик, давайте его немного поправим и назовем сишарп.
        +10
        «Немного»?
          +2

          visual basic, который "не вслетел"(на самом деле еще как взлетел) и visual basic .Net — вещи совершенно разные.

            +3

            Действительно, VB6 был хитом своего времени.

              +2
              VBA у многих не IT компаний — очень важный инструмент.
              Я в банке работаю, никак с IT не связан, но на VBA у меня очень много всего написано.
            +1

            Вообще-то создатель C# Андерс Хейлсберг — еще и "отец" Delphi, не gjvy., родилась ли идея C# у него, когда он ещё в Борланде работал над Дельфи, или для работы над C# его переманили, но, как бы то ни было, родства с Дельфи, ИМХО, прослеживается больше, чем со старым VB.

            +3
            Мы уже не рассматриваем GitHub как место для публикации исходников — это просто место нашей работы.

            Думаю теперь это стоит воспринимать буквально

              0
              Microsoft переписала компилятор C# на C#

              Давным давно, на лекции по языкам программирования преподаватель произнес фразу «Компилятор Паскаля написан на Паскале» и продолжил лекцию. А у меня эта фраза в голове вызвала дикую рекурсию и переполнение стека. Я не понимал как это возможно.
                0
                Все просто же: перевести код на Паскале в машинные коды можно не только с помощью компилятора, но и вручную. А потом уже скомпилировать им этот код, чтобы убедиться что при «ручной компиляции» ничего не пропущено.

                Ну а для Microsoft тут все было еще проще: у них уже был старый компилятор, которым можно скомпилировать новый.
                  +3
                  Нет, ну конечно я эту проблему просто так не оставил и узнал правильный ответ, еще в студенчестве. Я про эмоции от фразы.
                  0
                  И как это возможно? Я тоже не понимаю.

                  Сейчас-то понятно, что Roslyn скомпилировали на старом компиляторе, написанном на C++.
                  А вот на чем был написан первый компилятор паскаля — это очень хороший вопрос. Как бы то ни было, в начале пищевой цепочки должен был быть некий компилятор ассемблера в машинный код, и этот компилятор написан на машинном коде.
                    0
                    «Компилятор ассемблера» называется «Ассемблер» :-)
                      0
                      Где то читал, что для этого Вирт использовал лаборантов, которые работали компилятором паскаля вручную.
                        0
                        Мне кажется, преподаватель специально опустил эти подробности для придания фразе загадочности. Вот такое предложение: «компилятор Паскаля, конечно, написан на Паскале, но сам компилятор скомпилировали лаборанты руками» гораздо более прозаичное, скучное и не цепляющее.
                    +2
                    Стало ясно, что нет никаких веских причин для существования CodePlex — и Roslyn вместе с другими проектами мигрировал на GitHub

                    Уже тогда они что-то знали.
                      –1
                      Скорее всего это было все запланировано изначально в умах, строишь что то из маленьких блоков, потом из этих получившихся строишь дальше. Если конкретнее: написали первые версии компилятора на с++, потом дальше уже на c#. Но какой то минимум все таки должен поддерживаться на c++.

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое