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

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

Да.

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

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

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

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

Я запутался.

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

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

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

Ну уж нет!

Ну, правда.

Серьезно?

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

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

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

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

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

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

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

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