Разработка сайтов в Новодружеске, ДНР. Введение в типы данных: статические, динамические, сильные и слабые

 
 

В этой статье объясняется, что такое типы данных, что подразумевается под терминами «статический», «динамический», «сильный» или «слабый», когда мы говорим о типах данных, и почему нас это вообще должно волновать.

Что такое типы данных?

Если вы занимались программированием, вы наверняка видели переменные, параметры или значения, возвращаемые функциями. Они повсюду в мире программирования. Многие программисты начинают использовать их, даже не зная, что они указывают компьютеру под капотом. При определении этих значений программист указывает компьютеру, как будет называться переменная, а также сообщает компьютеру, к какому типу данных она относится. Это целое число? Это строка символов? Это один символ или сложный тип, такой как Point? Чтобы понять типы данных, нам может быть проще перевернуть этот термин и думать о нем как о «типе данных», с которым мы имеем дело.

Если вы просматривали информацию в Интернете, вы могли прочитать противоречивую информацию о «статических» и «динамических» типах данных, а также о «сильных» и «слабых» типах данных. Это не одно и то же. Когда мы рассмотрим различные термины ниже, имейте в виду, что язык может включать комбинацию статических/динамических и сильных/слабых типов данных. Они не эксклюзивны. Например, язык может быть статичным и сильным или статичным и слабым. Но прежде чем мы зайдем слишком далеко в определении этих терминов, почему нас это вообще должно волновать?

Почему мы должны заботиться о типах данных?

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

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

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

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

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

Статические и динамические системы типизации данных

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

Языки со статическими типизированными данными — это те языки, которые требуют от программиста явного определения типа данных при создании части данных (будь то переменная, параметр, возвращаемое значение и т. д.). Как правило, эти типы также фиксируются как тип на время существования программы и не меняют свой тип. Давайте рассмотрим пример:

int myNumber = 42; // integer data type

string name = «Rocky Balboa»; // string data type

final double PI = 3.141592; // double data type

// Function takes two integer data types, returns an integer data type

public int add (int a, int b) {

return a + b;

}

В приведенном выше примере показаны несколько определяемых переменных и пример функции, которая складывает два числа. Как видите, мы явно сообщаем языку (в данном случае Java), что имеем дело с целыми числами, строками и двойными числами. Без этих подсказок компилятору он не знал бы, как обрабатывать файлы myNumber. Это просто имя, которое имеет смысл для нас, а не для компьютера.

Некоторые языки со статической типизацией включают Java, C#, C++ и Go. Но это лишь некоторые из многих.

Давайте сравним это с языком с динамическими типами данных. Ниже приведен пример:

$myNumber = 42; // integer data type

$name = «Rocky Balboa»; // string data type

$PI = 3.141592; // float data type

// Function takes two integer data types, returns an integer data type

function add ($a, $b) {

return $a + $b;

}

Итак, куда делись все типы? В приведенном выше примере мы видим, что наши переменные в PHP, языке с динамической типизацией, не указывают явно, к каким типам данных они относятся. Если мы не сообщаем PHP типы данных, откуда он узнает? Ну, он угадывает, основываясь на присвоенном ему значении. Он может правильно предположить, что $myNumberэто целое число, потому что значение 42 является целым числом.

Что насчет функции? Он также делает предположение на основе переданных ему значений. Это означает, что add () он может принимать два целых числа и возвращать целое число или также может принимать два числа с плавающей запятой и возвращать число с плавающей запятой. Типы выводятся и могут даже изменяться во время выполнения. Позже в той же программе мы могли бы сказать, что $myNumberэто равно, Tomи это позволит нам переключить переменную на строку.

Некоторые из множества динамических языков включают JavaScript, PHP, Python и Ruby.

Почему вы предпочитаете статику динамической или наоборот?

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

Итак, статика — это правильный путь? Ну, компромисс в том, что вы должны явно определить все, прежде чем использовать это. Вы должны набирать больше кода, вы должны заранее знать тип данных, с которыми вы имеете дело (не всегда то, что вы знаете), и вы должны знать, что произойдет в ваших операциях. Вы должны знать, что 1 / 3это даст вам, 0а что нет. 33333и тому подобное.

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

JavaScript — это один из языков, который считается динамическим. С введением TypeScript, надмножества JavaScript, программисты представили идею явного объявления типов данных для переменных, чтобы сделать язык более статичным. По мере роста популярности JavaScript — даже за пределами браузера с такими инструментами, как Node.js — программисты захотели добавить преимущества статической типизации данных, чтобы избавиться от некоторых неверных предположений, которые JavaScript делает при работе с типами данных. JavaScript печально известен своими ошибочными догадкамипри работе с данными и их типами. Это пример превращения JavaScript, динамического языка, во что-то более похожее на язык со статической типизацией, чтобы раньше отлавливать ошибки и приводить к более здоровому коду. Это тем более важно, учитывая, что JavaScript проникает в серверные приложения с помощью Node.js.

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

Сильные и слабые системы типизации данных

Как вкратце упоминалось ранее, термины сильных и слабых типов данных часто путают со статическими и динамическими. Люди склонны путать статику с синонимом силы и динамичность со слабостью. Это не тот случай.

Сильные/слабые типы данных — это то, как язык обрабатывает значения, с которыми он работает. Будет ли язык спокойно делать какие-то предположения при работе с типами данных и помогать вам, или он просто остановится и пожалуется, что не знает, что делать? Давайте посмотрим на примере, как это работает:

int main () {

int a = 5;

std: string b = «5»;

// Houston, we have a problem!

std: cout << (a + b) ;

return 0;

}

В этом примере C++ мы пытаемся сложить вместе целое число и строку. Да, язык статически типизирован, но он не пытается прикрыть программиста, создавая bцелое число, чтобы он мог складывать два числа вместе. Он просто сразу отмечает проблему и сдается. Эта проверка выполняется, когда мы пытаемся скомпилировать программу (или иногда с помощью IDE, когда вы ее пишете). Здесь мы пытаемся использовать тип способом, противоречащим его определению как строки. К строго типизированным языкам относятся C#, Java, Go, Python и C++, и все они будут помечать что-то подобное.

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

Слабые языки с типизированными данными пытаются помочь программисту, когда он выполняет свои операции. Давайте взглянем на JavaScript и посмотрим, как он может выполнять операцию, аналогичную той, что мы сделали в нашем примере на C++ выше:

const a = 5;

const b = «5»;

console.log ((a + b));

Если вы что-нибудь знаете о JavaScript и его особенностях, вы знаете, что приведенный выше код будет работать без суеты. Это ничего не укажет программисту. Но он не выведет 10 на консоль, как можно было бы ожидать. Вы могли бы подумать, что он увидит целое число и строку и скажет: «Эй, подождите минутку, я не знаю, что с этим делать!» Вместо этого JavaScript пытается принудить или преобразовать одно из значений, чтобы оно было похоже на другое, выполнить расчет, выдать результат и двигаться дальше. Здесь результат будет таким, «55»поскольку он преобразует значение переменной aв строку, а затем объединяет их. Результатом будет строковый тип данных.

Как видите, сила языка заключается в том, насколько сильно он пытается использовать свои типы, чтобы понять намерения программиста и двигаться дальше.

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

Почему вы предпочитаете сильное слабому или наоборот?

Сильные языки — это строгие языки. Опять же, они должны быть уверены, что точно знают, что собирается делать программист. Если возникает ошибка, чаще всего это ошибка программиста, не понимающего операции. Эти ошибки также потенциально указывают путь к непониманию проблемы. Если вы пытаетесь добавить 5число к «5»строке, то, возможно, вы не понимаете, как это не будет иметь смысла для компьютера. Это заставляет вас прийти к истине об операции и заставляет вас явно говорить компьютеру, что вы хотите сделать (обычно с помощью некоторого механизма преобразования/приведения). Это, как правило, приводит к более сильному и менее подверженному ошибкам коду в рабочей среде, но добавляет время и обручи, которые нужно пройти во время разработки.

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

JavaScript, язык со слабой типизацией (который также оказался динамическим), снова был усилен TypeScript, чтобы сделать его сильнее. Обработка типов данных в TypeScript позволяет программисту писать JavaScript с использованием явных типов и получать преимущества строго типизированного языка. Он выявляет множество ошибок во время компиляции и помогает предотвратить попадание расплывчатых предположений JavaScript в рабочие системы. Но опять же, это происходит за счет более формального и строгого формата кодирования во время разработки. Даже редакторы кода, знающие TypeScript, могут помечать ошибки по мере их написания. VS Code — отличный пример, который делает это.

Степени прочности

Мы рассмотрели сильную и слабую типизацию. Важно отметить, что, в отличие от четкой границы, которая существует при статической/динамической типизации, языки могут проявлять разную степень силы или слабости. Это помещает языки в спектр. Вот почему в одних статьях говорится, что C++ слаб, а в других — что он силен. Это относительно. Что делает его спектром, так это то, что некоторые языки предлагают инструменты, помогающие с преобразованиями и изменением типов на лету. Некоторые используют такие вещи, как указатели. Вот почему вы можете слышать, как люди говорят, что Java более строго типизирован, чем C или C++, тогда как очевидно, что C++ строго типизирован по сравнению с JavaScript.

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

Выбор стиля, подходящего для вашего проекта

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

язык, который наиболее удобен для разработчика

какой язык предлагает больше функций, соответствующих объему проекта

доступные инструменты для более быстрой разработки

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

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

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

Заключение

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

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

3D-печать5GABC-анализAndroidAppleAppStoreAsusCall-центрChatGPTCRMDellDNSDrupalExcelFacebookFMCGGoogleHuaweiInstagramiPhoneLinkedInLinuxMagentoMicrosoftNvidiaOpenCartPlayStationPOS материалPPC-специалистRuTubeSamsungSEO-услугиSMMSnapchatSonyStarlinkTikTokTwitterUbuntuUp-saleViasatVPNWhatsAppWindowsWordPressXiaomiYouTubeZoomАвдеевкаАктивные продажиАкцияАлександровск ЛНРАлмазнаяАлчевскАмвросиевкаАнализ конкурентовАнализ продажАнтимерчандайзингАнтрацитАртемовскАртемовск ЛНРАссортиментная политикаБелгородБелицкоеБелозерскоеБердянскБизнес-идеи (стартапы)БрендБрянкаБукингВахрушевоВендорВидеоВикипедияВирусная рекламаВирусный маркетингВладивостокВнутренние продажиВнутренний маркетингВолгоградВолновахаВоронежГорловкаГорнякГорскоеДебальцевоДебиторкаДебиторская задолженностьДезинтермедитацияДзержинскДивизионная система управленияДизайнДимитровДирект-маркетингДисконтДистрибьюторДистрибьюцияДобропольеДокучаевскДоменДружковкаЕкатеринбургЕнакиевоЖдановкаЗапорожьеЗимогорьеЗолотоеЗоринскЗугрэсИжевскИловайскИрминоКазаньКалининградКировскКировскоеКомсомольскоеКонстантиновкаКонтент-маркетингКонтент-планКопирайтингКраматорскКрасноармейскКрасногоровкаКраснодарКраснодонКраснопартизанскКрасный ЛиманКрасный ЛучКременнаяКураховоКурскЛисичанскЛуганскЛутугиноМакеевкаМариупольМаркетингМаркетинговая информацияМаркетинговые исследованияМаркетинговый каналМаркетинг услугМаркетологМарьинкаМедиаМелекиноМелитопольМенеджментМерчандайзерМерчандайзингМиусинскМолодогвардейскМоскваМоспиноНижний НовгородНиколаевНиколаевкаНишевой маркетингНовоазовскНовогродовкаНоводружескНовосибирскНумерическая дистрибьюцияОдессаОмскОтдел маркетингаПартизанский маркетингПервомайскПеревальскПетровскоеПлата за кликПоисковая оптимизацияПопаснаяПравило ПаретоПривольеПрогнозирование продажПродвижение сайтов в ДонецкеПроизводство видеоПромоПромоушнПрямой маркетингРабота для маркетологаРабота для студентаРазработка приложенийРаспродажаРегиональные продажиРекламаРеклама на асфальтеРемаркетингРетро-бонусРибейтРитейлРовенькиРодинскоеРостов-на-ДонуРубежноеСамараСанкт-ПетербургСаратовСватовоСвердловскСветлодарскСвятогорскСевастопольСеверодонецкСеверскСедовоСейлз промоушнСелидовоСимферопольСинергияСколковоСлавянскСнежноеСоздание сайтов в ДонецкеСоледарСоциальные сетиСочиСтаробельскСтаробешевоСтахановСтимулирование сбытаСуходольскСчастьеТелемаркетингТельмановоТираспольТорговый представительТорезТрейд маркетингТрейд промоушнТюменьУглегорскУгледарУкраинскХабаровскХарцызскХерсонХостингЦелевая аудиторияЦифровой маркетингЧасов ЯрЧелябинскШахтерскЮжно-СахалинскЮнокоммунаровскЯндексЯсиноватая