Телефон: 8-800-350-22-65
WhatsApp: 8-800-350-22-65
Telegram: sibac
Прием заявок круглосуточно
График работы офиса: с 9.00 до 18.00 Нск (5.00 - 14.00 Мск)

Статья опубликована в рамках: CXXVIII Международной научно-практической конференции «Научное сообщество студентов XXI столетия. ТЕХНИЧЕСКИЕ НАУКИ» (Россия, г. Новосибирск, 10 августа 2023 г.)

Наука: Информационные технологии

Скачать книгу(-и): Сборник статей конференции

Библиографическое описание:
Сивирилова М.К. ТИПЫ ТИПИЗАЦИИ В ЯЗЫКАХ ПРОГРАММИРОВАНИЯ // Научное сообщество студентов XXI столетия. ТЕХНИЧЕСКИЕ НАУКИ: сб. ст. по мат. CXXVIII междунар. студ. науч.-практ. конф. № 8(126). URL: https://sibac.info/archive/technic/8(126).pdf (дата обращения: 16.08.2024)
Проголосовать за статью
Конференция завершена
Эта статья набрала 11 голосов
Дипломы участников
Диплом Интернет-голосования

ТИПЫ ТИПИЗАЦИИ В ЯЗЫКАХ ПРОГРАММИРОВАНИЯ

Сивирилова Мария Константиновна

студент, кафедра вычислительной техники, Новосибирский государственный технический университет,

РФ, г. Новосибирск

TYPES OF TYPING IN PROGRAMMING LANGUAGES

 

Maria Sivirilova

Student, Department of Computer Technology, Novosibirsk state technical University,

Russia, Novosibirsk

 

АННОТАЦИЯ

В данной статье рассматривается одно из ключевых различий между разными языками программирования, а именно – типизация данных. Производится сравнение типов, инициализации, объявления, присваивания переменных и функций на примере языков Си, Javascript и Python. Приводится классификация систем типов с объяснением и примерами.

ABSTRACT

This article discusses one of the key differences between different programming languages, namely, data typing. The types, initialization, declaration, assignment of variables and functions are compared using the example of C, JavaScript and Python languages. The classification of type systems with an explanation and examples is given.

 

Ключевые слова: программирование, типизация, система типов.

Keywords: programming, typing, type system.

 

Несведущие в программировании люди или же новички, только-только решившие связать свою жизнь с написанием кода, не перестают удивляться количеству языков. Не пройдет и пары лет, а их количество вероятно перевалит за тысячу. У такого большого числа есть причина – каждый язык создавался с определенной целью, и пусть синтаксис во многом остается шаблонным, изменение мелких деталей создает сотни уникальных языков.

Одной из таких совсем не мелких деталей является система типов. Сколько будет 1 + 1? Спросите программиста, и без уточняющих вопросов он вряд ли сможет дать однозначный ответ. Гораздо чаще можно встретить термин «типизация», который, на деле, является характеристикой системы.

Система типов – гибко управляемый синтаксический метод доказательства отсутствия в программе определенных видов поведения при помощи классификации выражений языка по разновидностям вычисляемых ими значений. Особое внимание стоит уделить слову «классификация», поскольку именно она является основой различий между разными видами типизации.

Из очевидного: разные языки имеют разные наборы типов (классификаций) данных. Казалось бы, должна существовать некоторая переходящая от языка к языку база, но на деле все не так однозначно. Возьмем обычные числа. В языке Си они представлены в виде целочисленных (int), с плавающей точкой (float) и с плавающей точкой двойной точности (double), занимающие разное количество байтов в памяти. При этом существуют дополнительные спецификаторы short, long и unsigned, призванные изменять диапазон хранимых значений и занимаемую память. Запомним это, и сравним с числами в языке JavaScript. Изначально числа могли быть только типом number, который включал в себя и целочисленные значения, и числа с плавающей точкой. Современный JavaScript также имеет тип данных BigInt, позволяющий безопасно работать с числами произвольной длины в ущерб используемой памяти. На этом все. Там, где в Си сторонние библиотеки позволяют добавлять нестандартные числовые типы вроде size_t, int8_t, int16_t и других, имеющих бóльшие требования к хранимым внутри значениям, JS вводит BigInt в качестве попытки избавления от требований к данным вовсе.

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

Из краткого сравнения всего двух языков можно понять, что система типов во многом зависит от «философии» языка программирования и его направленности. Однако, несмотря на сотни существующих вариаций языков, типизацию в них можно почти однозначно разделить по нескольким критериям.

  1. Наличие системы типов

Низкоуровневые языки, например, ассемблер и FORTH, вообще не содержат заранее подготовленных типов данных. Все сущности рассматриваются как последовательность занятых бит. Подобный подход позволяет писать код без оглядки на компилятор или интерпретатор, производя любые операции над любыми ячейками памяти. Такой код обычно более эффективен и, при условии знания языка, легко читаем. Но в то же время представление сложных объектов, например, списков, является крайне неудобным, а вседозволенность программиста часто приводит к ошибкам из-за человеческого фактора.

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

  1. Статическая / динамическая типизация

При статической типизации проверки происходят на этапе компиляции, при динамической – на этапе выполнения.

Например, в любой среде разработки при программировании на Си создателей кода ждут десятки ошибок и предупреждений еще до запуска самой программы – код компилируется в моменте. В то же время ни один из «умных» блокнотов не подчеркнет заведомо неверную операцию с данными на JS, пока программист не запустит интерпретатор и не увидит неожиданный для себя результат. Из-за таких особенностей новичкам часто рекомендуют именно динамическую типизацию, мол, языки более гибкие, а компилятор не бьет по пальцам за неверный код, однако на этапе профессиональной разработки больше ценится тот факт, что при статической типизации происходит всего одна проверка на этапе компиляции, а это значительно увеличивает скорость выполнения программы по сравнению с динамической типизацией.

Однако не стоит думать, что динамическая типизация создана только для новичков. Самым важным аргументом в ее пользу служит возможность создания обобщенных алгоритмов. Там, где в Си придется создавать пять разных функций с, по факту, одним и тем же кодом для каждого типа данных, в JS достаточно всего одной. Справедливости ради, в младшем брате Си, С++, существует множество способов обобщенного программирования: шаблоны, макросы, перегрузки функций и полиморфизм. Но, вновь отсылаясь к тезису о новичках, об этих способах нужно знать, и ими необходимо правильно воспользоваться. А в динамике достаточно и обычного кода.

  1. Сильная / слабая типизация

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

Тот самый пункт, в котором Си и JS окажутся на одной стороне баррикад. В обоих языках можно спокойно сложить символ с числом и получить на выходе строку (для JS), символ или число (для Си). Именно здесь, имея 1 + 1, можно получить не только 2, но и 11, а еще 50 и 98.

В противовес им выступает Python, который, как ни странно, является магнум опусом для тех, кто только начинает свой путь в IT. В нем нельзя производить операции над разными типами данных. Взамен удобству приходит чистый прагматизм. Из-за отсутствия «скрытого» приведения типов данных друг к другу, программисту проще понимать чужой код и писать свой, но, что важнее, при таком подходе необходимо вручную преобразовывать типы, а значит все потенциально трудозатратные операции на виду в коде.

  1. Явная / неявная типизация

При явной типизации необходимо задавать типы вручную, при неявной – программа сделает это за вас.

Очевидно, что явная типизация делает код гораздо более читаемым. Программист может сразу увидеть, какая переменная (или функция) к какому типу относится. Также очевидно, что неявная типизация сильно сокращает запись и экономит много времени при написании кода.

Неочевидно, что многие языки с неявной типизацией имеют возможность все же указывать типы переменных. Это позволяет четко определять типы в узких местах и оставлять остальное на откуп компилятору. Еще более неочевидно, что некоторые языки с явной типизацией можно использовать как неявные. Например, в том же С++ есть «неопределенный» тип auto, который позволяет компилятору определить тип самому в зависимости от контекста.

  1. Структурная / номинативная / утиная типизация

Весь пункт про совместимость сложных типов. При номинативной типизации она устанавливается на основе наследования. Так, сущность будет совместима с другой, если та является ее предком. Из определения следует, что для номинативной типизации необходимо, чтобы система типов также была статической и явной. Ярким примером такого языка будет Java.

При структурной и утиной типизации совместимость определяется на основе внутренней структуры объектов. Т.е. сущности будут эквивалентны, если содержат одинаковые поля. При этом структурная типизация сравнивает объекты на этапе компиляции, требуя статическую типизацию от языка программирования, а утиная типизация – на этапе выполнения, что требует уже динамическую типизацию. Функциональные языки поголовно имеют структурную типизацию. К утиной относят, например, JS и Python.

 

Рисунок 1. Инфографика о видах типизации

 

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

 

Список литературы:

  1. Пирс Б. Типы в языках программирования / А. Махоткин, Г. Бронников – Добросвет, 2014 г. – 680 с.
  2. Островский А. Интерфейсы и типы данных (часть 2) / Физико-технический учебно-научный центр НАН Украины [Электронный ресурс]. – URL: https://lectures.ostrov.ski/assets/pdf/23-datatypes-2-beamer.pdf (дата обращения: 15.07.2023).
  3. Ликбез по типизации в языках программирования [Электронный ресурс]. – URL: https://habr.com/ru/articles/161205/ (дата обращения: 16.07.2023).
Проголосовать за статью
Конференция завершена
Эта статья набрала 11 голосов
Дипломы участников
Диплом Интернет-голосования

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

Форма обратной связи о взаимодействии с сайтом
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.