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

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

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Спасибо.

Ответ 5

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

Сильная и слабая печать:

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

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

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

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

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

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

Ответ 6

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

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

Ответ 7

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

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

Сильно типизированный язык программирования - это тот, в котором:

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

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

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

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

Ответ 8

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

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

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