Найти в Дзене
IT - это просто

Что такое «типы данных»? Простыми словами

Возможно Вы много раз слышали о том, что компьютер знает только 0 и 1. Но при этом мы привыкли к тому, что на самом деле работаем с текстом, числами, изображениями, музыкой и т.д. Как так происходит? В статье «1+1=0! Как считает компьютер?» автор уже рассказывал, как работает вычислительное устройство с целыми числами. Но как устройство должно понять, что это не число, да и нужно ли ему это понимать? На самом деле, для того чтобы производить манипуляции с информацией, устройству не обязательно знать с чем он работает: строка, число или картинка. Все изменения - это различные арифметические операции и их комбинации. Все изменения - это различные арифметические операции и их комбинации. Но чтобы выбрать правильные операции, нужно понимать, с чем именно работаешь. И вот здесь на сцену выходит главный герой нашей сегодняшней истории — тип данных. Что это формально? Если заглянуть в учебник, то тип данных — это множество значений и набор операций, которые можно над этими значениями выполнят
Оглавление

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

В статье «1+1=0! Как считает компьютер?» автор уже рассказывал, как работает вычислительное устройство с целыми числами. Но как устройство должно понять, что это не число, да и нужно ли ему это понимать?

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

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

Что это формально?

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

Суть в другом. Тип данных — это метка, договорённость между программистом и компьютером. Программист говорит: «Эту последовательность битов интерпретируй как целое число», а компьютер отвечает: «Тогда я позволю тебе складывать её с другими числами, вычитать, но не стану искать в ней буквы». Это как ярлык, который определяет правила игры.

Склад и наклейки

Представьте огромный логистический склад — это оперативная память компьютера. На него постоянно привозят и увозят абсолютно одинаковые с виду коричневые коробки — это наши последовательности битов (0 и 1).

Если грузчик увидит просто коробку, он не знает, что с ней делать. Бросить на пол? Поставить на торец? Хранить в холоде?

Теперь наклеим на коробки стикеры: «ХРУПКОЕ. СТЕКЛО», «КНИГИ. БЕРЕЧЬ ОТ ВЛАГИ», «ОДЕЖДА». Это и есть типы данных. Наклейка-тип мгновенно диктует правила:

  • С коробкой «Стекло» можно делать только аккуратные перемещения (определённые арифметические операции).
  • Коробку «Книги» нельзя складывать во влажный угол (определённые условия хранения в памяти).
  • Коробку «Одежда» можно сжать (оптимизация), в отличие от коробки со стеклом.
Без наклейки-типа коробка-данные бесполезна. С ней — понятно, как с ней обращаться.
Без наклейки-типа коробка-данные бесполезна. С ней — понятно, как с ней обращаться.

Без типа данных (наклейки) коробка (данные) бесполезна и потенциально опасна.

«Матрица» и интерфейсы

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

Очки, куртка, пистолет, здание, противник — это и есть типы данных в мире Матрицы. Они переводят сырой, абстрактный код (биты) в конкретные, понятные сущности, с которыми можно выполнять конкретные действия. Пистолет (тип «оружие») можно «применить» к противнику (тип «персонаж»), но бессмысленно пытаться «надеть» его как одежду или «прочитать» как книгу. Без этих интерфейсов-типов Нео был бы беспомощен в потоке бессмысленного шума, хотя весь мир состоял бы из этого шума.

Интерфейсы-типы превращают поток битов в конкретные сущности, с которыми можно взаимодействовать.
Интерфейсы-типы превращают поток битов в конкретные сущности, с которыми можно взаимодействовать.

Какие подводные камни?

Когда договорённость о типах нарушается или трактуется слишком вольно, случаются классические компьютерные «чудеса».

Рубрика: Фарш наоборот

Самая распространённая ошибка — интерпретировать биты не по тому типу. Это как взять коробку с надписью «Стекло» и попробовать прочитать её содержимое как инструкцию. Вы получите бессмыслицу, кракозябры, а программа — фатальную ошибку.

Классический пример: программа ждёт от вас число возраста (int), а вы вводите своё имя (string). Компьютер честно попытается прочитать биты, кодирующие буквы, как число. Результат — либо сбой, либо абсолютно случайное, огромное число. Автор предлагает читателю представить, что вы складываете не 2 + 2, а "Вася" + 25. Для компьютера это не «Вася25», а дикая операция, как попытка сварить суп из наушников и кроссовок.

Ошибка типа: компьютер не знает, как «сварить суп» из текста и числа.
Ошибка типа: компьютер не знает, как «сварить суп» из текста и числа.

Рубрика: Строгий учитель vs. Свободный художник

Здесь мы сталкиваемся с философией языков программирования. Условно их можно разделить на два лагеря.

  • Строго типизированные языки (Строгий учитель): Как Java или C++. Они требуют объявить тип каждой переменной заранее и не позволят вам «сложить» строку с числом без явного преобразования. Это как работать с бухгалтером, который требует заполнить все графы по форме и никогда не примет отчёт на салфетке. Минус — нужно больше писать. Плюс — множество ошибок отлавливается сразу, на этапе написания кода.
  • Языки с динамической типизацией (Свободный художник): Как Python или JavaScript. Тип определяется в момент присваивания значения и может меняться. x = 10 (теперь x — число), а потом x = "десять" (теперь x — строка). Это удобно и быстро, как делать заметки в блокноте. Но здесь таится риск: можно по ошибке записать в переменную не тот тип, и ошибка проявится только в самый неожиданный момент, когда программа уже работает у пользователя.
Разная философия: безупречный порядок против гибкости, которая может привести к путанице.
Разная философия: безупречный порядок против гибкости, которая может привести к путанице.

Итог

Так что же такое тип данных? Это не про то, что хранится в памяти. Это про то, как понимать то, что хранится, и что с этим можно сделать. Это фундаментальный язык, на котором договариваются человек, дающий команды, и машина, исполняющая их. Без этого языка мы бы, как Нео до просветления, видели лишь бесконечный поток зелёных символов, не имея ни малейшей возможности им управлять.

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

Одна последовательность битов — три разных типа данных, три разных смысла и набора действий.
Одна последовательность битов — три разных типа данных, три разных смысла и набора действий.

UPD Я постарался максимально упростить терминологию и умышленно опустить довольно сложные для понимания термины и нюансы (например, статическую vs. динамическую проверку типов, указатели, пользовательские типы). Буду рад получить обратную связь.

Если вам интересно, как компьютер различает эти типы “на низком уровне”, или как он работает с дробными числами — подписывайтесь на канал. Скоро будет новая статья!

Наука
7 млн интересуются