Телеграм-канал основателя Checkroi — Вани Буявца

Посмотреть →
Агрегатор онлайн-курсов Checkroi.ru Блог Статьи о программировании Типизация в программировании — подробно об особенностях языков разных видов

Типизация в программировании — подробно об особенностях языков разных видов

от Илья Насонов
Опубликовано: Страница обновлена: 2619 просмотров Время прочтения: 17 минут

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

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

Что такое типизация

Для любой информации в коде характерен какой-то тип: число, строка, логическое выражение, массив и др. Тип данных определяет их допустимые значения и операции, которые с ними можно проводить. Разделение на типы нужно, чтобы машина понимала, какие именно данные она обрабатывает, что с ними делать и какой объём памяти займёт эта операция.

При встрече с числовым типом данных машина приготовится проводить арифметические операции, с текстовым — выполнять поиск заданных слов и так далее

Типизация — это набор правил, по которым язык программирования классифицирует информацию в коде и различает переменные по типу. От вида типизации зависит, на каком этапе выполнения кода программа будет искать ошибки и нужно ли разработчику вручную прописывать тип вводимых данных или встроенные в язык алгоритмы сделают это автоматически.

Разные языки программирования справляются с типизацией по-разному. Так для 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. Язык сначала самостоятельно поменяет тип данных «числа» на «строку» и только потом выполнит операцию сложения.

Результат сложения в JavaScript разных типов данных — числа и строкиРезультат сложения в JavaScript разных типов данных — числа и строки

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

Подведём итоги

Мы выяснили, что такое типизация данных и как её разновидности проявляются в особенностях языка.

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

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

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

Телеграм-канал Вани Буявца, только внизу
0 Коментариев
1

Почитаем еще?

Оставьте комментарий

Мы иногда используем cookie-файлы, чтобы получше узнать вас и персонализировать контент :) Замечательно!