Статьи

Введение в статическую и динамическую типизацию

Что такое статическая типизация? А что такое динамическая типизация? Я отвечу на оба вопроса в этой вводной статье, и мы обсудим дебаты вокруг самого определения этих понятий.

Вам не нужно знать какой-либо конкретный язык программирования, чтобы понять концепции; однако в этой статье я сделаю ссылки на язык программирования Perl, PHP и Python (в форме кодов). Те, кто не знает Python, должны думать о коде как о псевдокоде, и все будет хорошо. Статическая типизация и динамическая типизация являются проблемами проектирования языка программирования; таким образом, отсутствие знаний какого-либо конкретного типа не повредит вашему пониманию этих понятий. Во всех фрагментах кода в этой статье я явно упомянул язык программирования, на котором написан код, используя «/ * …… * /» (цитаты не включены).

Прежде всего, я должен отметить, что «типизация» в терминах статической и динамической типизации относится к «типу» как к типу данных, а не к процессу нажатия клавиш на клавиатуре. Хотя это могло показаться совершенно очевидным, но для некоторых это не так. «Статический» и «динамический» — это типы «печатания», которые мы увидим в следующих разделах. Языки, которые имеют статическую типизацию или динамическую типизацию, называются «статически типизированными» или «динамически типизированными».

Статическая печать

Языки программирования со статической типизацией — это те, в которых переменные не должны быть определены до их использования. Это подразумевает, что статическая типизация имеет отношение к явному объявлению (или инициализации) переменных перед их использованием. Java является примером статического типизированного языка; C и C ++ также являются статическими типизированными языками. Обратите внимание, что в C (и C ++ также) переменные могут быть преобразованы в другие типы, но они не преобразуются; Вы просто читаете их, предполагая, что они другого типа.

Статическая типизация не означает, что вы должны сначала объявить все переменные, прежде чем использовать их; переменные могут быть инициализированы где угодно, но разработчики должны сделать это, прежде чем использовать эти переменные в любом месте. Рассмотрим следующий пример:

/* C code */ static int num, sum; // explicit declaration num = 5; // now use the variables sum = 10; sum = sum + num; 

Приведенный выше фрагмент кода является примером того, как обычно выглядит объявление переменной в статических типизированных языках. Обратите внимание, что в приведенном выше коде static имеет ничего общего со статической типизацией; он использовался вместе с int только для инициализации num и суммирования до нуля.

Динамический набор текста

Динамически типизированные языки программирования — это те языки, в которых переменные должны быть обязательно определены перед их использованием. Это подразумевает, что динамически типизированные языки не требуют явного объявления переменных перед их использованием. Python является примером динамического типизированного языка программирования, как и PHP. Рассмотрим следующий пример:

 /* Python code */ num = 10 // directly using the variable 

В приведенном выше фрагменте кода мы непосредственно присвоили переменной num значение 10 перед его инициализацией. Это характерно для динамически типизированных языков программирования.

Другая аналогия

Многие люди определяют статическую типизацию и динамическую типизацию относительно точки, в которой проверяются типы переменных. Используя эту аналогию, статические типизированные языки — это те, в которых проверка типов выполняется во время компиляции, тогда как динамические типизированные языки — это те, в которых проверка типов выполняется во время выполнения.

Эта аналогия приводит к аналогии, которую мы использовали выше для определения статической и динамической типизации. Я считаю, что статическую и динамическую типизацию проще понимать с точки зрения необходимости явного объявления переменных, а не как проверки типов во время компиляции и во время выполнения.

Статическая и динамическая типизация в сравнении со строгой и слабой типизацией

Статическая и динамическая типизация, а также строгая и слабая типизация — это две совершенно разные концепции, которые, к сожалению, очень часто путают. Ошибочно утверждать, что язык со статической или динамической типизацией не может быть строгим или слабым типом. Статическая и динамическая типизация, а также строгая и слабая типизация являются различными формами классификации языков программирования, и один из каждого класса обязательно характеризует данный язык. Таким образом, необходимо обсудить строгую и слабую типизацию в сравнении со статической и динамической типизацией.

Языки программирования, которые демонстрируют «строгую типизацию», являются «строго типизированными», а те, которые демонстрируют «слабую типизацию», являются «слабой типизацией».

Сильный набор текста

Языки программирования, в которых переменные имеют определенные типы данных, строго типизированы. Это подразумевает, что в строго типизированных языках переменные обязательно связаны с конкретным типом данных. Python строго типизирован, как и Java. Различие между строгой типизацией и слабой типизацией является более тонким и, следовательно, более трудным для понимания, чем различие между статической типизацией и динамической типизацией. Рассмотрим следующий пример:

 /* Python code */ >>> foo = "x" >>> foo = foo + 2 Traceback (most recent call last): File "<pyshell#3>", line 1, in ?   foo = foo + 2 TypeError: cannot concatenate 'str' and 'int' objects >>> 

В приведенном выше примере Python (запускается из оболочки Python), foo имеет тип str . Во второй строке мы пытаемся добавить 2 ( int ) к переменной типа str . Как мы видим, возвращается TypeError , указывающий, что объект str нельзя объединить с объектом int . Это то, что характеризует строго типизированные языки: переменные связаны с конкретным типом данных.

Слабый набор текста

В отличие от языков со строгой типизацией, языки со слабой типизацией — это те, в которых переменные не относятся к конкретному типу данных. Следует отметить, что это не означает, что переменные не имеют типов; это означает, что переменные не «привязаны» к определенному типу данных. PHP и C являются примерами слабо типизированных языков. Учтите следующее:

 /* PHP code */ <?php $foo = "x"; $foo = $foo + 2; // not an error echo $foo; ?> 

В этом примере foo изначально является строковым типом. Во второй строке мы добавляем эту строковую переменную к целому числу 2. Это разрешено в PHP и характерно для всех языков со слабой типизацией.

Теперь, когда мы знаем о двух понятиях, мы можем дополнить их оба для характеристики любого языка. Таким образом, Python динамически типизирован и строго типизирован; Java является статической и строгой типизацией; PHP динамически типизирован и слабо типизирован; C — статический тип и слабый тип (из-за его способности чтения).

Динамическая печать хороша

В динамически типизированном языке вам не нужно инициализировать переменные, что является большим бонусом для многих разработчиков. Программистам нравится тот факт, что вы можете использовать переменную по желанию, когда это необходимо (без необходимости ее инициализации). Динамическая типизация характерна для многих языков сценариев: Perl, PHP, Python и т. Д. Динамическая типизация фактически избавляет вас от написания нескольких «лишних» строк кода, что, в свою очередь, означает меньшее время, затрачиваемое на написание кода. ,

Или это?

Отличительная черта динамически типизированных языков, которая нравится многим разработчикам, также является ловушкой, и основной в этом. Рассмотрим следующий простой пример:

 /* Python code */ my_variable = 10 while my_variable > 0:       i = foo(my_variable)       if i < 100:               my_variable++       else               my_varaible = (my_variable + i) / 10 // spelling error intentional 

Как вы можете видеть в приведенном выше коде, my_varaible — это орфографическая ошибка, которую программист мог очень хорошо совершить. Проблема здесь в том, что, поскольку Python динамически типизирован, он не вернет ошибку, а вместо этого создаст новую переменную с именем my_varaible . Итак, теперь у нас есть две переменные: my_variable и my_varaible . Это, очевидно, серьезная проблема; некоторые предполагают, что принудительное объявление переменных является важным требованием в любом языке программирования.

Поведение со статическим типом в динамически типизированных языках

Perl — это динамический типизированный язык программирования. Тем не менее, он предоставляет средства для «имитации» статической типизации с помощью прагмы, называемой strict . Рассмотрим следующий пример Perl:

 /* Perl code */ $sum = 10; print $sum; 

Приведенный выше код будет работать без проблем и выведет 10 на консоль. Обратите внимание, что здесь мы не инициализировали переменную sum; это иллюстрирует динамическую типизацию Perl. Для обеспечения объявления переменных мы используем strict прагму следующим образом:

 /* Perl code */ use strict; $sum = 10; print $sum; 

Приведенный выше фрагмент кода вернет следующую ошибку при попытке его запустить:

 Global symbol "$num" requires explicit package name at perl.pl line 2. Execution of perl.pl aborted due to compilation errors. 

Чтобы исправить вышеуказанную ошибку, мы вынуждены объявить переменную num следующим образом:

 /* Perl code */ use strict; my $num; // forced declaration $sum = 10; print $sum; 

Приведенные выше коды относятся к Perl; не во всех языках программирования есть способ обеспечить объявление переменных: например, в Python нет способа обеспечить объявление переменных. Однако есть инструмент, называемый «pychecker» (доступен здесь ), который можно использовать для «обнаружения» случайных переменных; это, конечно, далеко от желаемого решения.

Типизированный или Динамический Типизированный?

Есть сторонники обеих форм печатания. Утверждение, что одно лучше другого, привело бы только к дискуссии без последствий.

Есть те, кто выступает за динамическую типизацию для простоты и экономии с точки зрения времени, которое она предлагает; они считают, что проверка типов не обязательно должна быть неотъемлемой частью разработки языка программирования как таковой, но вместо этого сторонние решения (такие как pychecker) могут быть использованы для обеспечения этой цели.

С другой стороны, есть сторонники статической типизации, которые считают, что статическая типизация (приводящая к принудительному объявлению переменных) является важным требованием при разработке языка программирования.

Вывод

Статическая типизация и динамическая типизация, а также строгая и слабая типизация являются темами проектирования языка программирования, которые не всегда четко определены и, как следствие, не очень хорошо поняты. Эта статья дала вам представление о понятиях статической и динамической типизации, а также сильной и слабой типизации.