Skip to content

Типизация

Sᴛѧʀʟɪɴɢ edited this page Feb 11, 2019 · 3 revisions

Общие сведения

Языки программирования по типизации принято делить на типизированные и нетипизированные (бестиповые). К первому например относятся C, Python, а ко второму — язык ассемблера.
JavaScript является типизированным языком и имеет динамическую, слабую, неявную типизацию.

Типизированные языки разделяются на несколько пересекающихся категорий:

  • Статическая / динамическая типизация. Статическая определяется тем, что конечные типы переменных и функций устанавливаются на этапе компиляции. Т.е. уже компилятор на 100% уверен, какой тип где находится. В динамической типизации все типы выясняются уже во время выполнения программы.

Статическая: Java, C#
Динамическая: Python, JavaScript

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

Сильная: Java, Python
Слабая: JavaScript

  • Явная / неявная типизация. Явно-типизированные языки отличаются тем, что тип новых переменных / функций / их аргументов нужно задавать явно. Соответственно языки с неявной типизацией перекладывают эту задачу на компилятор / интерпретатор.

Явная: C#
Неявная: JavaScript

Бестиповая типизация

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

Бестиповая типизация обычно присуща низкоуровневым (ассемблер) и эзотерическим (Brainfuck) языкам.

Преимущества:

  • Позволяет писать на предельно низком уровне, причем компилятор / интерпретатор не будет мешать какими-либо проверками типов. Вы вольны производить любые операции над любыми видами данных.
  • Получаемый код обычно более эффективен.
  • Прозрачность инструкций. При знании языка обычно нет сомнений, что из себя представляет тот или иной код.

Недостатки:

  • Сложность. (усложняется работа со списками, строкамиЮ структурами).
  • Отсутствие проверок. Любые бессмысленные действия, например вычитание указателя на массив из символа будут считаться совершенно нормальными, что чревато трудноуловимыми ошибками.
  • Низкий уровень абстракции. Работа с любым сложным типом данных ничем не отличается от работы с числами, что создаёт много трудностей.

подробнее: https://habr.com/ru/post/161205/