C# – это строго типизированный или слабо типизированный язык?


Сегодняшний пост, как обычно будет представлен в виде диалога.

C# это строго типизированный или слабо типизированный язык программирования?

Да.

Ответ не очень-то полезный.

Я серьезно. Любопытно, что если вы перефразируете свой вопрос так, чтобы в нем было «И», то ответ будет таким же.

Что? Вы имеете в виду, что C# является и строго типизированным и слабо типизированным языком?

Да, C# является строго типизированным и слабо типизированным языком.

Я запутался.

Я тоже. Возможно, вам стоит точно определить, что означает для вас «строго типизированный» и «слабо типизированный».

Хм. Я не знаю точно, что я подразумеваю под этими понятиями,… возможно именно это я и хочу узнать. Что на самом деле значит, что язык является «слабо типизированным» или «строго типизированным»?

«Слабо типизированный» означает «язык использует систему проверки типов, которая мне не нравится» и «строго типизированный» означает «язык использует систему типов, которая мне нравится».

Ну уж нет!

Ну, правда.

Серьезно?

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

Но они явно значат что-то более конкретное, нежели «нравится» или «не нравится»!

Я специально преувеличил ради более показательного эффекта. Давайте скажем так: более строго типизированный язык содержит некоторые ограничения в его системе типов по сравнению с менее типизированным языком. Это все, что можно сказать без дополнительного контекста.

Тогда как можно конструктивно говорить о языках программирования и их системах типов?

Вы можете дать этот дополнительный контекст. Вместо того чтобы использовать «строго типизированный» и «слабо типизированный», можно просто описать те ограничения, которые вы имеете в виду. Например, язык C# в большинстве случаев является статически типизированным языком, поскольку компилятор определяет информацию о типах каждого выражения. Язык C# в большинстве случаев является типобезопасным языком, поскольку он запрещает хранение значений одного статического типа в переменных несовместимого типа (он также предотвращает и от других подобных ошибок типизации). И язык C# в большинстве случаев является безопасным с точки зрения памяти, поскольку он предотвращает случайный доступ к невалидной памяти.

Таким образом, если кто-то под «строго типизированным» языком подразумевает «язык, который поощряет статическую типизацию, типобезопасность и безопасное использование памяти в большинстве типовых случаях использования» может рассматривать язык C# как «строго типизированный». Язык C# явно более строго типизирован по сравнению с языками без таких ограничений системы типов.

Но здесь есть один момент: поскольку C# является прагматичным языком, существует возможность переопределить все эти три аспекта безопасности. Оператор преобразования типов и ключевое слово “dynamic” языка C# 4 «переопределяет» проверку типов времени компиляции и заменяет ее проверками времени исполнения, блоки “unsafe” позволяют, если нужно, отключить безопасность типов и памяти. Поэтому если кто-то считает, что «строго типизированный» означает «язык, который абсолютно во всех случаях гарантирует статическую типизацию, безопасность типов и памяти при любых условиях», то он вполне сможет отнести C# к «слабо типизированным» языкам. C# не настолько строго-типизированный по сравнению с языками, которые всегда налагают эти ограничения.

Так к какому типу относится C#: строго типизированному или слабо типизированному? На этот вопрос невозможно ответить, поскольку ответ зависит от точки зрения конкретного человека, от того, с чем сравнивать, и зависит от склонности конкретного человека к использованию различных возможностей языка. Поэтому проще всего избегать использования этих терминов и говорить более точно о возможностях системы типы языка.

Comments (3)

  1. Дмитрий says:

    Мне кажется, что Эрик все-таки говорил о статической и динамической типизации, а не о строгой или слабой. Исходя из определения строгой типизации на русской википедии (ru.wikipedia.org/…/%D0%A1%D1%82%D1%80%D0%BE%D0%B3%D0%B0%D1%8F_%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F) получается что С# это строго типизированный язык со статической или динамической динамической типизацией, которая как раз и зависит от того что вкладывается в понятие статической или динамической типизации (язык, который абсолютно во всех случаях гарантирует статическую типизацию (статическая типизация) либо язык, который большинстве случаев гарантирует статическую типизацию (динамическая типизация))

  2. "можно просто описать те ограничения, которые вы имеет в виду." – опечаточка.

  3. На самом деле, думаю этим всё сказано: "Так к какому типу относится C#: строго типизированному или слабо типизированному? На этот вопрос невозможно ответить, поскольку ответ зависит от точки зрения конкретного человека, от того, с чем сравнивать, и зависит от склонности конкретного человека к использованию различных возможностей языка.". Согласен полностью.