Разработка компиляторов

       

Простота C#


Многие существующие языки программирования обладают весьма запутанным синтаксисом и конструкциями с неочевидной семантикой - достаточно вспомнить сверхперегруженную значениями открывающую фигурную скобку в С++, использование ключевых слов в качестве идентификаторов в PL/I или проблемы отличия описателей видов от операций в Алголе 68. Все эти языковые особенности затрудняют написание компиляторов и служат источником труднонаходимых ошибок при создании программ. На другом полюсе этой проблемы находится язык Паскаль, в котором в целях упрощения было решено пожертвовать даже очевидно удобными для программиста свойствами.

C# занимает некоторую промежуточную позицию: из стандарта языка убраны наиболее неприятные и неоднозначные особенности С++, но в то же время язык сохранил мощные выразительные возможности, присущие для таких языков, как С++, Java или VB.

Укажем некоторые особенности языка С++, которые не поддерживаются C#:

  • По умолчанию, С# запрещает прямое манипулирование памятью, предоставляя взамен богатую систему типов и сборку мусора. Непосредственная работа с памятью по-прежнему доступна в специальном режиме "опасного" кода (об этом см. ниже), но требует явного декларирования. Как следствие, в C# активно используется всего один оператор доступа "."
  • Преобразования типов в C# значительно строже, чем в С++, в частности, большинство преобразований может быть совершено только явным образом. Кроме того, все приведения должны быть безопасными (т.е. запрещены неявные преобразования с переполнением, использование целых переменных как указателей и т.п.). Естественно, это заметно упрощает анализ типов при компиляции
  • Одной из типичных ошибок в С++ было отсутствие оператора break при обработке одной из веток оператора switch . Проблема "провала" (fall-through) в C# решена кардинальным образом: компилятор требует наличия явного оператора перехода ( break или goto case <name>) в любой ветке
  • В C#, как и в Java, нет множественного наследования, вместо него предлагается использовать реализацию нескольких интерфейсов. Несмотря на то, что мнения по поводу множественного наследования сильно разнятся, отсутствие этого механизма в C# должно по крайней мере облегчить разработку компилятора



Содержание раздела