Системы типов в языке - что это такое и чем они отличаются | Журнал "Вольт"
Чт. Дек 3rd, 2020



В языках программирования любой фрагмент данных (переменная, константа, аргумент функции) имеет тип. Тип определяет набор возможных значений и операции, которые могут быть выполнены с ними. Например, в этом разделе псевдокода переменная age имеет тип «число»:

number age = 12 // Тип указан явно перед именем переменной

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

В общем, есть «бестиповые языки», где вся работа с типами возлагается на разработчика. Но таких языков немного, и они очень редки. Одним из примеров является ассемблер (язык программирования очень низкого уровня).

Сильный – Слабый

Прежде всего, системы типов разделяются по способу приведения типов.

Приведение типов – это преобразование данных одного типа в данные другого типа. Например, строку «12» довольно легко преобразовать в 12:

number age = toNumber("12")

Некоторые языки сами приводят типы, они делают это скрыто от программиста. Такое поведение обычно называют слабый (или небрежный) набор текста. Обычно это позволяет использовать переменные любого типа в одном выражении и не беспокоиться об их преобразовании. Это часто приводит к неожиданным последствиям.

print("12" + 13) // Выведет 1213
print(12 + "13") // Выведет 25

С другой стороны, есть языки, которые требуют, чтобы вы явно определяли, что следует делать с данными, чтобы преобразовать их в другой тип. Они полностью отдают эту работу программисту. Такое поведение называется сильный (или строгий) набор текста.

print("12" + 13) // Ошибка!

print("12" + toString(13)) // Выведет 1213
print(toNumber("12") + 13) // Выведет 25

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

Статический – динамический

Другая важная классификация делит языки на статически типизированные и динамически типизированные.

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

number age = 44

age = "Not so old" // Ошибка!

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

age = 44 // Тип перменной — число

age = "Not so old" // Тип переменной — строка

А что лучше?

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

На практике

Мир программирования разнообразен, в нем можно найти языки с абсолютно любой комбинацией систем типов, например:

  • C – слабая статика
  • Python очень динамичный
  • Java – сильная статика
  • JavaScript слабо динамичен

В то же время для многих языков существуют инструменты, позволяющие использовать лучшие практики всех систем набора текста. Например, в Python есть необязательные аннотации типов, которые добавляют немного статической типизации. Есть похожие проекты для JavaScript (TypeScript, Flow) и Ruby (Sorbet).

Читайте также

Как проверить типы данных в JavaScript с помощью JSDoc: подробное руководство.



Source link

от volt

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *