C# – это строго типизированный или слабо типизированный язык?
Сегодняшний пост, как обычно будет представлен в виде диалога.
C # – это строго типизированный или слабо типизированный язык программирования?
Да.
Ответ не очень-то полезный.
Я серьезно. Любопытно, что если вы перефразируете свой вопрос так, чтобы в нем было «И», то ответ будет таким же.
Что? Вы имеете в виду, что C # является и строго типизированным и слабо типизированным языком?
Да, C# является строго типизированным и слабо типизированным языком.
Я запутался.
Я тоже. Возможно, вам стоит точно определить, что означает для вас «строго типизированный» и «слабо типизированный».
Хм. Я не знаю точно, что я подразумеваю под этими понятиями,… возможно именно это я и хочу узнать. Что на самом деле значит, что язык является «слабо типизированным» или «строго типизированным»?
«Слабо типизированный» означает «язык использует систему проверки типов, которая мне не нравится» и «строго типизированный» означает «язык использует систему типов, которая мне нравится».
Ну уж нет!
Ну, правда.
Серьезно?
Эти понятия бессмысленны, и лучше их остерегаться. В Википедии есть одиннадцать разных значений понятия «строго типизированный», часть из которых противоречат друг другу. Каждый раз, как два человека в разговоре о языках программирования используют эти понятия, есть все шансы, что они подразумевают немного (или «много») разные вещи под этими терминами, что автоматически снижает конструктивность такого разговора.
Но они явно значат что-то более конкретное, нежели «нравится» или «не нравится»!
Я специально преувеличил ради более показательного эффекта. Давайте скажем так: более строго типизированный язык содержит некоторые ограничения в его системе типов по сравнению с менее типизированным языком. Это все, что можно сказать без дополнительного контекста.
Тогда как можно конструктивно говорить о языках программирования и их системах типов?
Вы можете дать этот дополнительный контекст. Вместо того чтобы использовать «строго типизированный» и «слабо типизированный», можно просто описать те ограничения, которые вы имеете в виду. Например, язык C# в большинстве случаев является статически типизированным языком, поскольку компилятор определяет информацию о типах каждого выражения. Язык C# в большинстве случаев является типобезопасным языком, поскольку он запрещает хранение значений одного статического типа в переменных несовместимого типа (он также предотвращает и от других подобных ошибок типизации). И язык C# в большинстве случаев является безопасным с точки зрения памяти, поскольку он предотвращает случайный доступ к невалидной памяти.
Таким образом, если кто-то под «строго типизированным» языком подразумевает «язык, который поощряет статическую типизацию, типобезопасность и безопасное использование памяти в большинстве типовых случаях использования» может рассматривать язык C# как «строго типизированный». Язык C# явно более строго типизирован по сравнению с языками без таких ограничений системы типов.
Но здесь есть один момент: поскольку C# является прагматичным языком, существует возможность переопределить все эти три аспекта безопасности. Оператор преобразования типов и ключевое слово “dynamic” языка C# 4 «переопределяет» проверку типов времени компиляции и заменяет ее проверками времени исполнения, блоки “unsafe” позволяют, если нужно, отключить безопасность типов и памяти. Поэтому если кто-то считает, что «строго типизированный» означает «язык, который абсолютно во всех случаях гарантирует статическую типизацию, безопасность типов и памяти при любых условиях», то он вполне сможет отнести C# к «слабо типизированным» языкам. C# не настолько строго-типизированный по сравнению с языками, которые всегда налагают эти ограничения.
Так к какому типу относится C#: строго типизированному или слабо типизированному? На этот вопрос невозможно ответить, поскольку ответ зависит от точки зрения конкретного человека, от того, с чем сравнивать, и зависит от склонности конкретного человека к использованию различных возможностей языка. Поэтому проще всего избегать использования этих терминов и говорить более точно о возможностях системы типы языка.