Типизация языков программирования
Типизация - назначения типа информационным сущностям.
Наиболее распространённые примитивные типы данных:
- Числовой
- Символьный
- Логический
Основные функции системы типов данных:
- Обеспечение безопасности
Проверяется каждая операция на получение аргументов именно тех типов, для которых она имеет предназначена; - Оптимизация
На основе типа выбирается способ эффективного хранения и алгоритмов его обработки; - Документация
Подчеркивается намерения программиста; - Абстракция
Использование типов данных высокого уровня позволяет программисту думать о значениях как о высокоуровневых сущностях, а не как о наборе битов.
Классификация
Есть множество классификаций типизаций языков программирования, но основные только 3:
Статическая / динамическая типизация
Статическая - назначение и проверка согласования типов осуществляется на этапе компиляции. Типы данных ассоциируются с переменными, а не с конкретными значениями. Статическая типизация позволяет находить ошибки типизации, допущенные в редко используемых ветвях логики программы, на этапе компиляции.
Динамическая типизация является противоположностью статической типизации. В динамической типизации все типы выясняются во время выполнения программы.
Динамическая типизация позволяет создавать более гибкое программное обеспечение, хотя и ценой большей вероятности ошибок типизации. Модульное тестирование приобретает особое значение при разработке программного обеспечения на языках программирования с динамической типизацией, так как оно является единственным способом нахождения ошибок типизации, допущенных в редко используемых ветвях логики программы.
Динамическая типизация
var luckyNumber = 777;
var siteName = 'Tyapk';
// подразумеваем число, записываем строку
var wrongNumber = '999';
Статическая типизация
let luckyNumber: number = 777;
let siteName: string = 'Tyapk';
// вызовет ошибку
let wrongNumber: number = '999';
Примеры:
- Статическая: Java, C#, TypeScript.
- Динамическая: Python, Ruby, JavaScript.
Явная / неявная типизация.
Явно-типизированные языки отличаются тем, что тип новых переменных / функций / их аргументов нужно задавать явно. Соответственно языки с неявной типизацией перекладывают эту задачу на компилятор / интерпретатор. Явная типизация является противоположностью неявной типизации.
Явная типизация требует явного объявления типа для каждой используемой переменной. Этот вид типизации является частным случаем статической типизации, т.к. тип каждой переменной определен на этапе компиляции.
Неявная типизация
let stringVar = '777' + 99;
// получим '77799'
Явная типизация (вымышленный язык похожий на JS)
let wrongStringVar = '777' + 99;
// вызовет ошибку
let stringVar = '777' + String(99);
// получим '77799'
Строгая / нестрогая типизация
Также называется сильная / слабая типизация. При строгой типизации типы назначаются «раз и навсегда», при нестрогой могут изменяться в процессе выполнения программы.
В языках со строгой типизацией запрещены изменения типа данных переменной и разрешены только явные преобразования типов данных. Строгая типизация выделяется тем, что язык не позволяет смешивать в выражениях различные типы и не выполняет автоматические неявные преобразования, например нельзя вычесть из строки число. Языки со слабой типизацией выполняют множество неявных преобразований автоматически, даже если может произойти потеря точности или преобразование неоднозначно.
Строгая типизация (вымышленный язык похожий на JS)
let wrongNumber = 777;
wrongNumber = wrongNumber + '99';
// получим ошибку, что к числовой переменной wrongNumber прибавляется строка
let trueNumber = 777 + Number('99');
// получим 876
Нестрогая типизация (как есть в js)
let wrongNumber = 777;
wrongNumber = wrongNumber + '99';
// получили строку '77799'
Примеры:
- Строгая: Java, Python, Haskell, Lisp.
- Нестрогая: C, JavaScript, Visual Basic, PHP.