Может кто-нибудь сказать мне, что означает строгая и слабая типизация, а какая лучше?
Может кто-нибудь сказать мне, что означает строгая и слабая типизация, а какая лучше?
8 ответов
Это будут теоретические ответы, о которых позаботятся, но со стороны практики, похоже, пренебрегли...
Строгая типизация означает, что вы не можете использовать один тип переменной там, где ожидается другой (или иметь ограничения для этого). Слабая типизация означает, что вы можете смешивать разные типы. Например, в PHP вы можете смешивать числа и строки, и PHP не будет жаловаться, потому что это язык со слабой типизацией.
$message = "You are visitor number ".$count;
Если бы он был строго типизирован, вам пришлось бы конвертировать $ count из целого числа в строку, обычно с помощью casting:
$message = "you are visitor number ".(string)$count;
... или функция:
$message = "you are visitor number ".strval($count);
Что касается того, что лучше, это субъективно. Сторонники строгой типизации скажут вам, что это поможет вам избежать некоторых ошибок и / или ошибок, а также сообщат назначение переменной и т. Д. Они также скажут вам, что сторонники слабой типизации будут считать строгую типизацию "ненужной". языковой пух, который лишен смысла здравым смыслом", или что-то подобное. Как член группы слабых печатных носителей, я должен был бы сказать, что у них есть мой номер... но у меня тоже есть их, и я могу поставить его в строку:)
"Строгая типизация" и ее противоположность "слабой типизации" имеют довольно слабое значение, отчасти потому, что понятие того, что считается "сильным", может варьироваться в зависимости от того, кого вы спрашиваете. Например, C был назван разными авторами как "строго типизированный" и "слабо типизированный", это действительно зависит от того, с чем вы его сравниваете.
Обычно систему типов следует считать более сильной, если она может выражать те же ограничения, что и другие, и более. Довольно часто системы двух типов не могут быть сопоставимы, хотя одна может иметь особенности, которых нет у другой, и наоборот. Любое обсуждение относительных преимуществ зависит от личного вкуса.
Наличие более сильной системы типов означает, что либо компилятор, либо среда выполнения будут сообщать о большем количестве ошибок, что, как правило, хорошо, хотя это может быть связано с необходимостью предоставления большего количества информации о типах вручную, что может показаться бесполезным. Я бы сказал, что "строгая типизация", как правило, лучше, но вы должны посмотреть на стоимость.
Также важно понимать, что "строго типизированный" часто неправильно используется вместо "статически типизированного" или даже "манифестного типизированного". "Статически типизированный" означает, что есть проверки типов во время компиляции, "манифест типизированный" означает, что типы объявлены явно. Манифестная типизация - это, вероятно, самый известный способ сделать систему типов более сильной (например, Java), но вы можете добавить силу другими способами, такими как вывод типов.
Я хотел бы повторить, что слабая типизация - это не то же самое, что динамическая типизация.
Это довольно хорошо написанная статья на эту тему, и я определенно рекомендую прочитать ее, если вы не уверены в различиях между сильными, слабыми, статическими и динамическими системами типов. Он детализирует различия намного лучше, чем можно было ожидать в коротком ответе, и имеет несколько очень поучительных примеров.
Строгая типизация является наиболее распространенной моделью типов в современных языках программирования. У этих языков есть одна простая особенность - знание значений типов во время выполнения. Можно сказать, что языки со строгой типизацией препятствуют операциям смешения между двумя или более типами разных типов. Вот пример на Java:
String foo = "Hello, world!";
Object obj = foo;
String bar = (String) obj;
Date baz = (Date) obj; // This line will throw an error
Предыдущий пример будет работать отлично, пока программа не достигнет последней строки кода, в которую будет брошено ClassCastException, потому что Java - это строго типизированный язык программирования.
Когда мы говорим о слабо типизированных языках, Perl - один из них. В следующем примере показано, как в Perl не возникает проблем со смешиванием двух разных типов.
$a = 10;
$b = "a";
$c = $a . $b;
print $c; # returns 10a
Я надеюсь, что вы найдете это полезным,
Благодарю.
Эта статья отлично читается: http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html Для меня многое прояснилось при исследовании пытаясь ответить на аналогичный вопрос, надеюсь, что другие тоже найдут его полезным.
Сильный и слабый набор текста:
Вероятно, наиболее распространенным способом классификации систем типов является "сильный" или "слабый". Это прискорбно, поскольку эти слова почти не имеют никакого значения. В ограниченной степени возможно сравнить два языка с очень похожими системами типов и назначить один из них более сильным из этих двух систем. Кроме того, слова вообще ничего не значат.
Статический и Динамический Типы
Это почти единственная распространенная классификация систем типов, которая имеет реальное значение. На самом деле, его значение часто недооценивают [...] Динамические и статические системы типов - это две совершенно разные вещи, цели которых частично перекрываются.
Система статических типов - это механизм, с помощью которого компилятор проверяет исходный код и присваивает метки (называемые "типами") частям синтаксиса, а затем использует их, чтобы сделать выводы о поведении программы. Система динамических типов - это механизм, с помощью которого компилятор генерирует код для отслеживания вида данных (по совпадению, также называемого их "типом"), используемых программой. Использование одного и того же слова "тип" в каждой из этих двух систем, конечно, не совсем случайно; все же это лучше всего понято как имеющее своего рода слабое историческое значение. Большая путаница возникает в результате попытки найти мировоззрение, в котором "тип" действительно означает одно и то же в обеих системах. Это не так.
Явные / неявные типы:
Когда эти термины используются, они относятся к степени, в которой компилятор рассуждает о статических типах частей программы. Все языки программирования имеют некоторую форму рассуждений о типах. У некоторых есть больше чем у других. ML и Haskell имеют неявные типы, в которых не требуется (или очень мало, в зависимости от используемого языка и расширений) объявлений типов. Java и Ada имеют очень явные типы, и каждый постоянно объявляет типы вещей. Все вышеперечисленное имеет (относительно, например, по сравнению с C и C++) системы с сильным статическим типом.
Сильная / слабая типизация в языке связана с тем, насколько легко вы можете выполнять преобразования типов:
Например в Python:
str = 5 + 'a'
# would throw an error since it does not want to cast one type to the other implicitly.
Где как на языке C:
int a = 5;
a = 5 + 'c';
/* is fine, because C treats 'c' as an integer in this case */
Таким образом, Python более строго типизирован, чем C (с этой точки зрения).
Может быть, это поможет вам понять сильный и слабый набор текста.......
Строгая типизация: он проверяет тип переменных как можно скорее, обычно во время компиляции. Это предотвращает операции смешивания между несовпадающими типами.
Язык программирования со строгой типизацией - это язык, на котором:
- Все переменные (или типы данных) известны во время компиляции
- Существует строгое соблюдение правил ввода (нельзя использовать строку, где ожидается целое число)
- Все исключения из правил ввода приводят к ошибке времени компиляции
Слабая типизация: слабая типизация задерживает проверку типов системы как можно позже, обычно во время выполнения. В этом вы можете смешивать типы без явного преобразования.
Язык программирования со слабой типизацией - это просто язык, не имеющий строгой типизации.
что предпочтительнее, зависит от того, что вы хотите. для сценариев и других полезных вещей обычно требуется слабая типизация, потому что вы хотите написать как можно меньше кода. в больших программах строгая типизация может уменьшить количество ошибок во время компиляции.
Слабая типизация означает, что вы не указываете тип переменной, а строгая типизация означает, что вы присваиваете каждой переменной строгий тип.
У каждого есть свои преимущества: слабая типизация (или динамическая типизация, как ее часто называют) более гибкая и требует меньше кода от программиста. С другой стороны, строгая типизация требует больше работы от разработчика, но в свою очередь она может предупредить вас о многих ошибках при компиляции кода перед его запуском. Динамическая типизация может задержать обнаружение этих простых проблем до тех пор, пока код не будет выполнен.
В зависимости от поставленной задачи слабая типизация может быть лучше, чем строгая, или наоборот, но это в основном дело вкуса. Слабая типизация обычно используется в языках сценариев, в то время как строгая типизация используется в большинстве компилируемых языков.