Найти в Дзене
Petr Tripolsky

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

Ассемблер как единственный нетипизированный язык Исторически сложилось так, что первые компьютеры использовали исключительно для математических расчетов в военном сегменте экономики. Как следствие, пользование компьютеров обычными гражданами не предполагалось. Однако, в ходе исторического развития компьютеры начали появляться в институтах, что породило спрос на многопользовательское исполнение программ и языки программирования, более приспособленные для командной работы Однако, архитектура вычислительных систем была спроектирована единожды и почти не обновлялась. Это так называемые “Принципы фон Неймана”, если упростить, единое хранение данных и программ в оперативной памяти вычислительной системы Вследствие исторического процесса, создание более сложных программ потребовало применения теории типов для организации работы вычислительной системы с различными видами данных разной природы. Рассмотрим примеры Процессор рассматривает память компьютера как пронумерованные ячейки. Это значит,
Оглавление

Ассемблер как единственный нетипизированный язык

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

Однако, архитектура вычислительных систем была спроектирована единожды и почти не обновлялась. Это так называемые “Принципы фон Неймана”, если упростить, единое хранение данных и программ в оперативной памяти вычислительной системы

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

Рассмотрим примеры

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

-2

Но, стоит добавить в такую таблицу еще одну колонку, произойдет коллизия. Вместо фамилии со следующей строки будет считан возраст с текущей. Данные, записанные на жесткий диск, придется заново считать и перезаписать.

Возникла потребность придумать более сложный, единый стандарт таблицы, которая будет исполнять роль сложного типа данных.

-3

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

-4

Разберемся, как работают строки из символов. Дело в том, что процессор обрабатывает буквы, используя порядковые номера их символов в алфавите.

Обратите внимание, число 42 помещается в одну ячейку памяти. Если мы захотим написать программу, которая склеит “привет” и “42” в “привет42”, нам потребуется сначала разбить 42 на несколько ячеек памяти, каждая из которых будет содержать порядковый номер символа текущей цифры. Эта операция называется приведение типов

-5

Иначе, могло бы получиться нечто похожее на пример выше. Я сложил 42 с порядковыми номерами букв (символов) в русском алфавите)

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

Рассмотренные выше особенности обработки данных изучает раздел математики теория типов

Языки со статической типизацией

Условно первым языком программирования с применением теории типов был язык программирования Си. Была реализована статическая типизация с сохранением поведения переменных как чисел, что нативно ассемблеру, как следствие, упрощало интеграцию. В последующем, подобное поведение было названо как слабая строгая типизация.

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

-6

Данный пример исходного кода складывает числа 2, 2 и выводит четыре. Объявление типа ячейки осуществляется заранее с использованием слова int.

-7

Аналогичный код объявляет строку из 10 символов, осуществляет вывод на экран. Однако, конструкция ниже приведет к ошибкам исполнения. Это связано с вышеупомянутой проблемой приведения типа. Данный язык программирования создавался, в том числе, для обеспечения командной работы, поэтому, ограничивает программиста от подобных неявных преобразований

-8

Другими языками программирования со строгой типизацией также являются языки C#, Java, C++. Они различаются наличием более сложных типов данных, но, принцип остается тот же, сделать поведение программы предсказуемым

Языки с динамической типизацией

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

Языки с динамической типизацией вычисляют тип ячейки памяти по значению внутри, что позволяет уменьшить размер кода. К таким языкам относятся JavaScript, Python, Ruby, Lua и другие.

Рассмотрим пример кода на Си, осуществляющий заполнение таблицы

-9

Тот же код, написанный на языке программирования JavaScript (динамически типизированный язык) займет значительно меньше строк, рассмотрим пример ниже

-10

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

-11

В первом случае, так как строки можно только склеивать и нельзя вычитать, они были преобразованы в числа. Во втором случае, произошло склеивание строк. При использовании статической типизации, подобная ошибка невозможна в принципе, но её вряд ли можно допустить при одиночной работе, поэтому, в случае с ней чаще используется динамическая типизация

О TypeScript

Язык программирования TypeScript повторил судьбу языка Си и Ассемблера. Изначально спроектированный с динамической типизацией JavaScript подразумевал, что он будет использоваться для мелкой работы на веб-странице, с которой вполне справится один разработчик. Однако, в последующем, так как в развитие интернета были вложены огромные суммы денег, язык стал преуспевать и на нем начали вести командную работу

-12

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

-13

Как следствие, если вы собираетесь разрабатывать приложение самостоятельно, возможно, вам стоит посмотреть в сторону JavaScript для уменьшения размера кода, но, если вы собираетесь работать в команде TypeScript - ваш выбор.

Итоги

Мы с вами:

— Разобрали нетривиальное поведение JavaScript при вычитании строк
— Изучили разные подходы к реализации типизации, статический и
динамический
— Изучили преимущества и недостатки применения TypeScript
— Изучили приведение типов языка программирования JavaScript

Контрольные вопросы:

  1. Чем отличается число и строка с числом внутри?
Число занимает одну ячейку памяти, а строка с числом несколько в зависимости от количества цифр внутри

2. Можно ли поделить строку с числом на число в JavaScript? (динамическая типизация)

Да, можно. Приведение типа произойдет автоматически

3. Можно ли поделить строку с числом на число в TypeScript? (статическая типизация)

Нет, если не сделать приведение типа вручную

4. Вы будете разрабатывать приложение следующую неделю в гордом одиночестве. Вы используете JavaScript или TypeScript?

JavaScript, сложные описания типов просто некому будет читать)

5. Вы организуете работу команды разработчиков из пяти человек на следующие полгода разработке. Вы используете JavaScript или TypeScript?

TypeScript, нужно исключить нетривиальное приведение типов

Спасибо за внимание)