Материал взят из журнала ДотНетКарри посвященный технологиям на базе платформы .
NET. Дорогие читатели, Мы очень рады видеть Рика Липперта в этом выпуске журнала DNC. «Рик не нуждается в представлении людям, знакомым с C#, но всем остальным он известен своей работой в группе разработчиков компилятора языка C#.
Значительную часть своей карьеры он провёл в Microsoft, работая на различных должностях.
До прихода в Microsoft Рик работал в Watcom. Наши «старички» помнят Watcom как компанию, создавшую очень хорошие компиляторы для языков C++ и Fortran. В настоящее время Рик работает в Coverity, помогая создавать продукты для статического анализа кода.
Национальный комитет Демократической партии: Привет Рик, мы очень рады видеть тебя здесь с нами.
ЭЛ: Спасибо.
Я рад быть здесь.
Национальный комитет Демократической партии: Вы проработали в Microsoft долгих 16 лет. Опишите свой путь (если это можно так назвать) от стажировки до работы над VBScript, JScript, VSTO (инструменты Visual Studio для Office) и становления ведущим разработчиком группы компиляторов языка C#.
ЭЛ: Я вырос в Ватерлоо и с раннего возраста интересовался наукой и математикой, поэтому для меня было естественным поступить в Университет Ватерлоо.
Кроме того, у меня были родственники в штате, и я уже знал ряд профессоров, и, как вы сказали, будучи студентом, я работал в UW, который был дочерней компанией Watcom. В UW была отличная программа обучения, одна из крупнейших во всем мире, благодаря которой мне удалось пройти три стажировки в Microsoft в команде разработки языка VisualBasic. Они были рады продлить мое предложение о работе, когда я закончил стажировку, и я оставался в отделе инструментов на протяжении всей своей карьеры в Microsoft. Национальный комитет Демократической партии: Можно предположить, что до того, как вы начали стажировку в Microsoft, в первые годы вашей работы вы получили много хороших советов от старших инженеров.
Какой из этих советов был лучшим советом по программированию, который вы когда-либо получали? ЭЛ: На протяжении всей моей карьеры, а не только в начале, я получал много хороших советов от старших инженеров; Microsoft поощряет формальное и неформальное наставничество.
Где-то недавно я рассказывал о лучшем совете по карьере, который я получил от Microsoft: по сути, поскольку я стал экспертом в данной области, я отвечаю на столько вопросов пользователей, сколько могу.
Но не так-то просто сказать, какой совет по программированию был лучшим.
Я так многому научился в Microsoft, мировом эксперте в области проектирования языков программирования, анализа производительности и многого другого, что мне трудно назвать что-то одно.
Одна вещь запомнилась мне еще до того, как я пришел в Microsoft. Однажды, много лет назад, Брайан Керниган выступал с докладом о программировании в Университете Вашингтона.
На одном слайде был показан код, в котором что-то было не так.
Это было неправильно, поскольку комментарий к коду и сам код не соответствовали друг другу.
Керниган задал вопрос: что на самом деле работает — код или комментарии к нему? Я до сих пор задаю себе этот риторический вопрос, пытаясь понять код, содержащий ошибку; Часто комментарии вводят в заблуждение, потому что они устарели или просто плохо написаны, но также часто бывает так, что комментарии верны, и вам даже не нужно заглядывать в код, содержащий ошибку.
Доклад Кернигана полностью изменил мое отношение к комментированию кода.
С тех пор я пытаюсь писать комментарии, объясняющие назначение фрагмента кода, прежде чем пытаться объяснить, как он работает. Национальный комитет Демократической партии: Когда ваша команда приступила к разработке C#, каковы были ваши основные цели? Довольны ли вы тем, каким стал язык C#? ЭЛ: Честно говоря, я начал работать над C#, когда основные концепции C# 3.0 серьезно разрабатывались и развивались.
Я следил за C# с момента его создания более 10 лет назад, но не был частью команды C# 1.0 или C# 2.0. Когда мы говорим о целях, я стараюсь отличать «деловые» цели от «технических».
они тесно связаны, но различны.
С точки зрения бизнеса основной целью C# было и остается создание богатого языка, который бы в полной мере использовал преимущества платформы .
NET и еще больше улучшил современное представление экосистемы Windows в целом.
Лучшие инструменты ведут к более продуктивным разработчикам, более продуктивные разработчики создают лучшие приложения для своих пользователей, лучшие приложения делают платформу более привлекательной, и от этого выигрывают все.
С точки зрения языкового дизайна существует ряд основных принципов, к которым разработчики возвращаются снова и снова.
Язык должен быть современным, практичным языком общего назначения, который используется профессиональными программистами, разрабатывающими программное обеспечение.
C# 1.0 начинался как довольно простой современный язык программирования.
Очевидно, он чувствовал влияние языков C и C++; Команда разработчиков языка стремилась смягчить некоторые недостатки языков C/C++, в то же время предоставляя возможность доступа к небезопасному коду.
Но 10 лет спустя язык разросся, добавив такие функции, как универсальные типы, генераторы последовательностей, функциональные замыкания, выражения запросов, возможность взаимодействия с динамическими языками, а позже и значительные улучшения в поддержке написания асинхронного кода.
Я воодушевлен тем, как язык развивался за последние 12 лет, и для меня большая честь быть частью самых интересных изменений.
Я с нетерпением жду продолжения работы над экосистемой C#.
Национальный комитет Демократической партии: Какие беседы у вас, как члена языковой группы C#, были с командой разработчиков ОС Windows? На каком уровне находится операционная система при разработке определенных функций языка? Вы работаете в основном в одиночку или это скорее совместная работа? ЭЛ: Каждый раз все по-другому.
В далеком прошлом это обычно было первым; В разработке C# 5.0 активно участвовала группа Windows. Лично я мало взаимодействовал с командой Windows на протяжении всего проекта C# 5.0, но команда управления проектом языка C# почти постоянно была со своими коллегами из группы Windows на протяжении всей работы над Windows RT. Было несколько технических проблем, которые требовали особого внимания, чтобы обеспечить как можно меньшее несоответствие между разработчиками C# и моделью программирования Windows RT. В частности, было важно, чтобы async/await отвечал потребностям разработчиков Windows RT, использующих C#.
Однако это актуально сравнительно недавно.
C# исторически не имел прямого взаимодействия с командой Windows, поскольку он основан на управляемой среде CLR и использует библиотеку классов BCL для обеспечения доступа к функциям операционной системы.
Поскольку команда C# поняла, что команды CLR и BCL будут действовать как посредники между службами операционной системы, они смогли больше сосредоточиться на разработке языка, который бы в полной мере использовал возможности CLR и BCL и позволял этим командам взаимодействовать.
с операционной системой.
Национальный комитет Демократической партии: Мы слышали о вашем подкасте с командой StackExchange, в котором вы упомянули вещи, которые находятся в верхней части вашего списка — «если бы мне нужно было исправить Джин на C#…».
Мы говорили о небезопасной ковариации массивов.
Не могли бы вы рассказать об этом нашим читателям? ЭЛ: Конечно.
Для начала давайте определимся, что означает термин «ковариация».
Для правильного определения потребуется пройти курс теории категорий, но нам не нужно заходить так далеко, чтобы понять значение этого термина.
Идея ковариации, как следует из названия, заключается в том, что одно утверждение сводится к другому, истинность которого сохраняется при выполнении некоторого преобразования исходного утверждения.
В языке C# действует следующее правило: если T и U являются ссылочными типами и T конвертируется в U путем преобразования ссылок, то T[] конвертируется в U[] также путем преобразования ссылок.
Это правило называется ковариантным, поскольку утверждение «T сводимо к U» можно свести к утверждению «T[] сводимо к U[]», и истинность утверждения сохраняется.
Это верно не для всего; например, вы не можете заключить, что List сводится к списку только потому, что T сводимо к U. К сожалению, ковариация массивов ослабляет типобезопасность языка.
Язык является типобезопасным, когда компилятор обнаруживает ошибки, такие как присвоение целого числа переменной строкового типа.
Это означает, что программа не будет компилироваться, пока все ошибки несоответствия типов не будут исправлены.
Ковариация массива — это пример ситуации, когда несоответствия типов не могут быть обнаружены во время компиляции, а могут быть проверены только во время выполнения.
Поскольку преобразование массива является ковариантным, массив жирафов можно преобразовать в массив животных.static void M(Animal[] animals) { animals[0] = new Turtle(); } static void N(Giraffe[] giraffes) { M(giraffes); }
А поскольку черепаха — животное, мы можем поместить ее в массив животных.
Но на самом деле в этом массиве есть жирафы.
Такое несоответствие типов приведет к возникновению исключения во время выполнения.
Ковариация массива имеет два негативных последствия.
Во-первых, присвоение переменных всегда должно проверяться во время компиляции, но в данном случае это невозможно.
Во-вторых, это означает, что каждый раз, когда вы назначаете элемент массива (типа, который является незапечатанным ссылочным типом) ненулевому ссылочному значению, платформа проверяет фактический тип элементов массива на соответствие типу назначаемой ссылки.
.
Эта проверка требует времени! Чтобы ковариация массива работала, правильная программа должна работать медленнее каждый раз, когда она обращается к элементам массива.
// Если бы у меня был Джин, который мог бы исправить любой код, я бы полностью удалил небезопасную ковариацию массива.
Группа разработчиков языка C# добавила типобезопасную ковариацию в C# 4.0. Если вам интересно, как это делается, я написал большую серию статей, посвященных реализации этой функциональности; вы можете прочитать их здесь blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance Если бы у меня был Джин, который мог бы исправить любой код, я бы полностью удалил небезопасную ковариацию массива и исправил весь код, используя типобезопасную ковариацию, добавленную в C# 4.0. Национальный комитет Демократической партии: Прежде чем мы перейдем к вашей текущей работе, расскажите нам немного о том, что такое статический анализ кода.
ЭЛ: Статический анализ — это анализ программы, основанный только на ее исходном коде.
Он отличается от динамического анализа, который анализирует программу во время выполнения.
Компиляторы выполняют статический анализ, а профилировщики — динамический анализ.
Компиляторы используют статический анализ для трех целей: во-первых, чтобы определить, является ли программа правильной, и если нет, то для вывода соответствующих сообщений об ошибках.
Во-вторых, перевести правильную программу на какой-нибудь другой язык, обычно в байт-код или машинный язык, но это может быть любой другой язык высокого уровня.
И в-третьих, выявлять конструкции, которые допустимы, но использование которых сомнительно, и отображать соответствующие предупреждения.
В Coverity мы склонны проводить статический анализ третьего типа: мы предполагаем, что код синтаксически правильный; это будет проверено компилятором, и мы проведем гораздо более глубокий анализ, чтобы выявить сомнительные структуры и довести их до вашего сведения.
Чем раньше вы обнаружите ошибку, тем дешевле ее исправить.
// Я потратил около 15 тысяч часов на тщательное изучение конструкции и реализации компилятора языка C#.
Есть и другие вещи, которые вы можете сделать с помощью статического анализа, например, Coverity также производит продукт, который использует статический анализ для поиска изменений в коде, для которых нет соответствующих модульных тестов.
Национальный комитет Демократической партии: Какую пользу Coverity принесут ваши глубокие знания C#? ЭЛ: В основном двумя способами.
Во-первых, C# — огромный язык, его спецификация занимает около 800 страниц.
Обычным разработчикам, конечно, не обязательно знать весь язык в деталях, чтобы эффективно его использовать, но авторам компиляторов это определенно нужно.
Я потратил около 15 000 часов на тщательное изучение проектирования и реализации компилятора языка C#, а также учился у дизайнеров языков Андерса Хейлсберга, Нила Гафтера и Рика Мейера, поэтому у меня есть довольно четкое понимание того, что делает хороший C# статическим.
анализатор.
Во-вторых, я видел тысячи строк кода C#, содержащих ошибки.
Я знаю, какие ошибки допускают разработчики C#, и это помогает нам определить места, где нам нужно приложить дополнительные усилия при статическом анализе.
Национальный комитет Демократической партии: За время работы в Coverity сталкивались ли вы когда-нибудь с ситуацией, когда вы думали: «хм, это поможет сделать C# более статически типизированным (доказуемым)»? ЭЛ: Некоторые функциональные возможности языка усложняют статический анализ, но в то же время делают язык более мощным.
Например, виртуальные методы усложняют статический анализ, поскольку смысл виртуальных методов в том, что реальный метод будет выбран на основе фактического типа во время выполнения.
Как я уже говорил ранее, C# был разработан с учетом недостатков языков C/C++.
Разработчики C# 1.0 проделали хорошую работу; Ведь довольно сложно организовать переполнение буфера или создать утечку памяти, или использовать переменную до ее инициализации, или случайно использовать одно и то же имя для совершенно разных вещей.
Но что было действительно поучительно для меня после перехода на Coverity, так это то, что большинство ошибочных конструкций, которые Coverity проверяет в C/C++, одинаково хорошо применимы и к современным языкам, таким как Java и C#.
Национальный комитет Демократической партии: Мы слышали, что вы разработали одну из первых фан-страниц романа «Властелин колец».
Расскажите подробнее о том, как это произошло, а также о ваших интересах к книгам и кино.
ЭЛ: Мой отец читал мне «Хоббита», когда я был очень маленьким; с тех пор я начал интересоваться писателем Толкином; Я собирал его биографию, и это было моим хобби, когда я был подростком.
Когда я изучал математику в Университете Вашингтона в начале 1990-х годов, Всемирная паутина (WWW) была чем-то новым; Однажды я лазил по Интернету и нашел фан-страницу оригинального сериала «Звездный путь».
Я подумал, что было бы отличной идеей создать что-то подобное для Толкина.
Я обыскал весь Интернет, что не заняло у меня много времени в 1993 году, нашел все FTP-сайты, группы новостей и все такое, посвященное Толкину, и создал простую сеть.
страницу, которая представляла собой просто набор ссылок, и разместил ее на сервере GOPHER Computer Science Club. По мере роста сети все больше и больше людей, подключенных к ней, присылали мне адреса своих страниц.
Я продолжал добавлять все больше и больше ссылок, пока их не стало слишком много.
Я прекратил поддерживать эту страницу, и в конечном итоге мое членство подошло к концу.
Думаю, вы еще сможете найти его в интернет-архиве.
Дело в том, что в то время такие компании, как Open Text и Google, начали индексировать Интернет, и их алгоритмы поиска учитывали такие вещи, как: как долго существует страница, как часто она менялась с течением времени и сколько внешних ссылки на это были.
Даже после того, как я перестал ее активно поддерживать, работоспособность страницы оставалась на высоком уровне.
В результате на протяжении многих лет мое имя было первым при поиске Толкина.
Когда фильм вышел на экраны, многие так и сделали.
В результате я дал интервью нескольким газетам, получил электронное письмо от одного из внуков Толкина, Jeopardy (американское название программы Jeopardy), чтобы проверить факты, и однажды мне позвонили и спросили: «Кто такие? нт?" Мне было весело.
Однако в то время я читал очень мало научной фантастики и фэнтези.
Большую часть моего свободного времени я читаю научно-популярную литературу.
Я люблю смотреть фильмы и приглашать друзей посмотреть их, наш вечерний выбор фильмов сильно различается.
Один месяц мы смотрим фильмы, номинированные на «Оскар», другой месяц — фильмы ужасов.
// Один из способов узнать, когда язык действительно становится популярным, — это когда пользователи отправляют запрос на новую функцию, а она у вас уже есть.
Вот три небольшие особенности, о которых мало кто знает.
- Вы можете добавить префикс «global:» к имени пространства имен, чтобы заставить алгоритм разрешения имен начать просмотр пространства имен, отмеченного словом global. Это полезно в ситуации, когда возникает конфликт между глобальным пространством и локальным пространством или типом.
Например, если ваш код находится в плохо названном пространстве имен «Foo.Bar.System», то доступ к «String» в «Foo.Bar.System» приведет к ошибке.
Если вы добавите префикс «global:System.String», то строка будет искаться в глобальном пространстве имен System.
- C# запрещает «проваливание» из одного раздела оператора переключения в другой.
Чего люди не знают, так это того, что вам не обязательно использовать разрыв слова в каждом разделе.
Вы можете заставить утверждение переходить из одного раздела в другой, используя метки.
Вы также можете завершить раздел переключателя с помощью goto, return, throw, выходного прерывания, продолжения или даже бесконечного цикла.
- Еще одна умная особенность, о которой мало кто знает: вы можете комбинировать использование операторов объединения нулей, чтобы получить значение первого непустого элемента в последовательности выражений.
Что делать, если у вас есть переменные x, y и z типа int? тогда результатом выражения x?Эy?Эz ??-1 будет первое из x, y или z, которое не равно нулю, или -1, если все они равны нулю.
Теги: #c#.
net #Эрик Липперт #перевод #.
NET #C++
-
Размываем Ли Мы Собственную Прибыль...
19 Oct, 24 -
Совместимость С Блокчейном: Небольшая Помощь
19 Oct, 24 -
Отдельные Профили Для Фрилансеров И Клиентов
19 Oct, 24 -
Чтение Svg На C++
19 Oct, 24 -
Мввм: Новый Взгляд
19 Oct, 24