-
Notifications
You must be signed in to change notification settings - Fork 46
Типизация
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/