Перед тем, как начать изучение любого языка программирования, стоит понять его характеристики и особенности. Одна из них — типизация языков программирования. В ней стоит разобраться с самого начала, чтобы понимать природу возникающих ошибок и знать, как их минимизировать в будущем.
В этой статье мы расскажем, что такое типизация, чем отличаются её разновидности и опишем их плюсы и минусы. В конце мы рассмотрим примеры языков с разными видами типизации и вы сможете грамотно выбрать язык для изучения: в зависимости от сферы разработки и решаемых задач.
Что такое типизация
Для любой информации в коде характерен какой-то тип: число, строка, логическое выражение, массив и др. Тип данных определяет их допустимые значения и операции, которые с ними можно проводить. Разделение на типы нужно, чтобы машина понимала, какие именно данные она обрабатывает, что с ними делать и какой объём памяти займёт эта операция.
При встрече с числовым типом данных машина приготовится проводить арифметические операции, с текстовым — выполнять поиск заданных слов и так далее
Типизация — это набор правил, по которым язык программирования классифицирует информацию в коде и различает переменные по типу. От вида типизации зависит, на каком этапе выполнения кода программа будет искать ошибки и нужно ли разработчику вручную прописывать тип вводимых данных или встроенные в язык алгоритмы сделают это автоматически.
Разные языки программирования справляются с типизацией по-разному. Так для JavaScript можно не указывать, какие именно данные мы используем: язык самостоятельно определит тип данных и скомпилирует их — преобразует код в понятные машине сигналы. Если же не указать информацию о типе данных для Java, код не будет выполнен
Понимание особенностей работы языков программирования позволяет выбрать язык, оптимальный для вашего уровня подготовки и решаемых задач.
Так как языков программирования много и у каждого из них разные типы данных и правила работы с ними, программисты договорились о системах типизации. Разделение позволяет разработчикам правильно и к месту использовать ту или иную технологи/ в зависимости от поставленных задач
Виды типизации
В программировании нет единого взгляда на разделение языков по признаку обработки данных. Это связано с тем, что языки программирования — сложные и неоднородные системы и типы данных у них хоть и похожи, но не одинаковы.
Но программисты смогли договорится об общих положениях типизации и различают языки по трём признакам:
- необходимости вручную задавать тип переменных — явная и неявная,
- моменту определения машиной типов данных — статическая и динамическая,
- возможности сочетать и преобразовывать типы данных — слабая и сильная типизация.
В каждом языке эти характеристики сочетаются по-разному. И типизация складывается из трёх компонентов, которые переплетаются между собой, образуя много вариантов.
Поговорим о каждом из видов подробней.
Явная и неявная типизация
Определение языка как явно или неявно типизированного зависит от необходимости объявлять типы переменных в коде.
Язык с явной типизацией — предполагает, что программист сразу пропишет типы вычисляемых переменных и значений, возвращаемых при выполнении кода.
В языке С переменную нужно записывать с указанием её типа:
int a = 7
Необходимость объявлять типы данных прямо в коде занимает время и требует от разработчика глубокого понимания архитектуры программы. Удобство такого заключается в том, что можно не запоминать тип значения определённой переменной, потому что он записан.
Язык с неявной типизацией — освобождает программиста от необходимости указывать тип переменных и функций, возлагая эту обязанность на компилятор — программу, которая переводит код в понятный машине вид.
Python сам определит значение переменной как целое число:
a = 7
Код на языке с неявной типизацией получается более коротким и устойчивым к изменению входных данных.
У некоторых языков с неявной типизацией есть опция указания типов значений, если это необходимо программисту. И наоборот — можно заставить компилятор определить тип переменной даже в языке с по умолчанию явной типизацией.
Статическая и динамическая типизация
Ключевое различие между этими типизациями — стадия, на которой компилятор определяет тип обрабатываемых данных и ищет ошибки:
- стадия компиляции — на этом этапе код переводится на язык машины и программа подготавливается к запуску,
- стадия исполнения — период выполнения кода с момента запуска.
Разница между статической и динамической типизацией — в моменте определения компилятором типов данных
Статическая типизация проверяет типы данных перед запуском программы, а динамическая — когда программа уже запущена.
Язык со статической типизацией — проверяет код перед запуском и присваивает переменным тип, который впоследствии не может быть изменён. Все выражения, в которых есть эта переменная, должны содержать операции, ориентированные именно на этот тип данных.
Статически типизированный язык считает некорректными любые программы, в которых тип данных не соответствует выполняемому выражению и просто не даёт им запуститься. Отсюда вытекает первый плюс — возможность выявить ошибку ещё до запуска программы.
Если программист включил переменную сначала в виде числа, а затем в виде строки — программа не запустится:
age = 27 — присваиваем переменной age значение 27, тип данных — число
age = “young” — ошибка, изменить тип «число» на тип «строка» нельзя
Ещё один плюс такого языка в отсутствии необходимости по ходу выполнения кода повторно проверять типы данных и их совместимость в выражениях. Поэтому программы на статически типизированных языках выполняются быстрее.
Язык с динамической типизацией — проверяет переменные и определяет их типы в момент совершения над ними операции. При этом одной и той же переменной в разных частях кода могут быть присвоены разные типы данных.
Если программист включил переменную сначала в виде числа, а затем в виде строки — программа всё равно будет выполняться:
age = 27 — присваиваем переменной age значение 27, тип данных — число
age = “young” — окей, воспринимаем переменную как строку
Динамическая типизация более гибкая — можно написать алгоритм, который автоматически подстроится под данные, полученные во время выполнения. Отсюда плюс динамически типизированных языков — на них можно писать многофункциональные программы.
Главный плюс динамической типизации — простота освоения языка. Начинать обучение без боязни ошибиться можно именно с таких языков.
Сильная и слабая типизация
Определение языка программирования как сильно или слабо типизированного зависит от того, допускает ли он:
- операции над разными типами данных,
- преобразования типов данных.
В некоторых языках типы данных определены более, в других — менее строго. Отсюда ещё одна пара названий для этого вида типизации — строгая и нестрогая.
Рассмотрим подробнее сценарии поведения языков сильной и слабой типизации при встрече с выражением, сочетающим несовместимые типы данных.
Язык с сильной типизацией — выдаст ошибку о несовместимости типов данных и невозможности скомпилировать код. При этом язык не станет выполнять никаких автоматических преобразований и оставит решение проблемы на программиста.
С одной стороны, это плюс: самостоятельно прописывая преобразования, разработчик контролирует все изменения в коде. С другой — этот ручной труд растягивает время написания программы.
Язык с сильной типизацией выдаст ошибку, если типы данных разные
Язык со слабой типизацией — допускает сочетание разных типов данных в одном выражении. При этом язык освободит программиста от необходимости совершать преобразования и самостоятельно изменит типы данных таким образом, чтобы выражение любой ценой было рассчитано.
Плюсом для разработчика является возможность применять смешанные выражения, концентрироваться на задаче и не думать об определении типов данных. А из-за отсутствия необходимости вручную прописывать типы данных код получается более лаконичным.
Язык со слабой типизацией самостоятельно преобразует тип данных и вычислит результат
Выбор между сильной и слабой типизацией — это выбор между скоростью написания кода и его качеством. На языках с сильной типизацией код пишется дольше, но результат получается более стабильным и прогнозируемым. Программировать на слабо типизированном языке быстрее, но стоит быть готовым к ошибкам и неточностям.
Разница между видами типизации условно сводится к следующему:
● явная и неявная — нужно ли определять типы данных
● статическая и динамическая — когда определять типы данных
● сильная и слабая — как строго определять типы данных
Мы рассмотрели основные виды типизаций в программировании. Каждая из систем разделения языков предназначена для решения разных задач и у каждой есть свои плюсы и минусы. Перейдём непосредственно к примерам.
Типизация популярных языков программирования
Мы решили взять примеры для каждой из разновидностей и воспользовались индексом Tiobe для оценки популярности языков программирования. Поэтому в наш мини-обзор попали Python, C/C++, Java и JavaScript.
Условное расположение языков программирования в зависимости от типизации
С/С++ — явная статическая слабая типизация. Есть возможность преобразования типов при полном их несогласовании, при этом если в коде есть ошибка — программа не запустится.
На языках С/С++ пишут высоконагруженное программное обеспечение, программы для роботов, игры и мощные приложения корпоративного уровня. Освоить его самостоятельно будет непросто, поэтому мы приготовили подборку курсов по С++-разработке, чтобы облегчить вам путь от новичка до профессионала
Java — явная статическая сильная типизация. Язык строго следит за совместимостью типов данных. Найдя выражение с несовместимыми данными самостоятельных решений по преобразованию данных не принимает — сигнализирует ошибками.
Java — один из самых востребованных языков программирования. Это основа большинства сетевых приложений, на нём пишут кроссплатформенные сайты и приложения. Как это делать — узнаете на одном из топ-13 курсов для JAVA-разработчиков
Python — неявная динамическая сильная типизация. Язык позволяет использовать несовместимые типы данных. При этом он более склонен выдать ошибку в конфликтной ситуации, чем дать какое-то автоматическое разрешение. Долго и упорно сохраняет информацию о типе переменной.
Гибкий и расширяемый за счёт библиотек Python универсален: веб-разработка, игровая индустрия, анализ данных и машинное обучение — вот неполный список сфер, где он применяется. У нас есть внушительная подборка курсов для Python-разработчиков, где вы освоите язык и сможете выбрать специализацию
JavaScript — неявная динамическая слабая типизация. Гибкий язык, в котором можно менять переменные по ходу кода. Поэтому он подходит для изучения начинающим разработчикам.
Кажущийся простым, JavaScript таит в себе подводные камни. Если для простых задач он интуитивно понятен, в крупных проектах с ним могут возникнуть трудности из-за минимального контроля со стороны программиста. Как их избежать — узнаете на одном из курсов по JavaScript
Для наглядности остановимся на JavaScript подробнее, как на самом гибком. Нам не понадобится никаких дополнительных программ: воспользуемся встроенной в браузер консолью JavaScript — она напоминает командную строку и поддерживает инструменты разработки в интерфейсе.
Запустить консоль разработки можно из панели управления в браузере
Для JavaScript характерны такие типы данных:
- number — числа целые или с плавающей точкой размером до 16 цифр;
- bigint — числа, лежащие в диапазоне от −253 до 253;
- string — строка, любые текстовые данные;
- булевый или логический — может быть определён как истинный или ложный, то есть отвечать на вопрос «да» или «нет»;
- null — специальный смысл «ничего» или «значение неизвестно»;
- undefined— специальный смысл «значение не присвоено»;
- symbol — символы;
- object — объекты, объявляют коллекции данных и более сложные сущности.
В JavaScript есть ограничение, которое позволяет проводить операции только между одинаковыми типами данных.
Если написать в командной строке браузера «1 + 2», внутренний алгоритм языка JavaScript определит тип этих данных как «число», увидит между числами знак сложения, выполнит операцию по правилам арифметики и выдаст сумму.
Результат сложения в JavaScript двух одинаковых типов данных — чисел
Если мы попробуем сложить разные типы данных — число и строку, сработает ограничение JavaScript. Язык сначала самостоятельно поменяет тип данных «числа» на «строку» и только потом выполнит операцию сложения.
Результат сложения в JavaScript разных типов данных — числа и строки
Это всё, что мы хотели рассказать о типизации данных в формате статьи. Этой информации должно хватить, чтобы вы могли учитывать вид типизации при выборе языка для изучения.
Подведём итоги
Мы выяснили, что такое типизация данных и как её разновидности проявляются в особенностях языка.
Мы узнали, что динамическая типизация легче и удобнее на начальных этапах разработки программ, а статическая гарантирует высокую надёжность кода по итогу.
В слабой типизации проще и быстрее писать код — не надо беспокоиться о преобразованиях типов, язык сам примет решение об изменениях. Сильная типизация позволяет детально управлять разработкой программы и обеспечивает корректность написанного.
Мы лишь поверхностно затронули тему типизации в программировании и попытались объяснить что это и как ей пользоваться при выборе языка программирования. Дальнейшее изучение темы требует более глубокого погружения в тему, желательно с опытным преподавателем.