Может кто-нибудь сказать мне, что означает строгая и слабая типизация, а какая лучше? - PullRequest
37 голосов
/ 27 ноября 2008

Может кто-нибудь сказать мне, что означает строгая и слабая типизация, а какая лучше?

Ответы [ 8 ]

53 голосов
/ 27 ноября 2008

Это будут теоретические ответы, о которых позаботятся, но со стороны практики, похоже, пренебрегли ...

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

$message = "You are visitor number ".$count;

Если бы он был строго типизирован, вам пришлось бы конвертировать $ count из целого числа в строку, обычно с использованием либо приведения:

$message = "you are visitor number ".(string)$count;

... или функция:

$message = "you are visitor number ".strval($count);

Что касается того, что лучше, это субъективно. Сторонники строгой типизации скажут вам, что это поможет вам избежать некоторых ошибок и / или ошибок, а также сообщат назначение переменной и т. Д. Они также скажут, что сторонники слабой типизации будут вызывать строгую типизацию " ненужный языковой пух, который представляется бессмысленным здравым смыслом", или что-то подобное. Как член группы со слабым набором карточек, я должен был бы сказать, что у них есть мой номер ... но у меня тоже есть их, и I может поместить его в строку: )

14 голосов
/ 27 ноября 2008

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

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

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

Также важно понимать, что «строго типизированный» часто неправильно используется вместо «статически типизированного» или даже «манифестного типизированного». «Статически типизированный» означает, что есть проверки типов во время компиляции, «манифест типизированный» означает, что типы объявлены явно. Манифестная типизация - это, вероятно, самый известный способ сделать систему типов более сильной (например, Java), но вы можете добавить силу другими способами, такими как вывод типов.

5 голосов
/ 27 ноября 2008

Я хотел бы повторить, что слабая типизация не такая же, как динамическая типизация.

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

http://en.wikipedia.org/wiki/Type_system

4 голосов
/ 08 февраля 2015

Строгая типизация - самая распространенная модель типов в современных языках программирования. У этих языков есть одна простая особенность - знание значений типов во время выполнения. Можно сказать, что языки со строгой типизацией препятствуют операциям смешения между двумя или более типами разных типов. Вот пример на 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

Надеюсь, вы найдете это полезным,

Спасибо.

1 голос
/ 30 ноября 2015

Сильная / слабая типизация в языке связана с тем, насколько легко вы можете выполнять преобразования типов:

Например, в 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 (с этой точки зрения).

1 голос
/ 31 марта 2014

Эта статья отлично читается: http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html Я многое прояснил при поиске ответов на аналогичный вопрос, надеюсь, что другие найдут его полезным.

Сильный и слабый набор текста:

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

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

Это почти единственная распространенная классификация систем типов. это имеет реальное значение. На самом деле, это значение часто недооцениваемые [...] системы динамического и статического типа две совершенно разные вещи, чьи цели бывают частично пересекаться.

Статическая система типов - это механизм, с помощью которого компилятор проверяет исходный код и назначает метки (называемые «типы») на куски синтаксис, а затем использует их, чтобы вывести что-то о программе поведение. Система динамических типов - это механизм, с помощью которого компилятор генерирует код для отслеживания вида данных (по совпадению, также называется его "тип") используется программой. Использование одного и того же слова «тип» в каждой из этих двух систем, конечно, не совсем случайна; все же это лучше всего понимать как наличие своего рода слабого историческая значимость. Большая путаница возникает в результате попытки найти мировоззрение, в котором «тип» действительно означает одно и то же в обоих системы. Это не так.

Явные / неявные типы:

Когда эти термины используются, они относятся к степени, в которой Компилятор расскажет о статических типах частей программы. Все Языки программирования имеют некоторую форму рассуждений о типах. Немного иметь больше, чем другие. ML и Haskell имеют неявные типы, в которых нет (или очень мало, в зависимости от языка и используемых расширений) декларации нужны. Java и Ada имеют очень явные типы, и каждый постоянно объявляет типы вещей. Все вышеперечисленное есть (относительно, по сравнению с C и C ++, например) сильный статический тип системы.

0 голосов
/ 01 июня 2016

Может быть, это поможет вам понять сильный и слабый набор текста .......

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

Язык программирования со строгим типом - это язык, на котором:

  • Все переменные (или типы данных) известны во время компиляции
  • Существует строгое соблюдение правил набора текста (строка не может быть использована где ожидается целое число)
  • Все исключения из правил ввода приводят к ошибке времени компиляции

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

Язык программирования со слабой типизацией - это просто язык без строгой типизации.

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

0 голосов
/ 27 ноября 2008

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

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

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

...