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

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


person zamfir    schedule 27.11.2008    source источник
comment
См. Также: stackoverflow.com/questions/2351190/, stackoverflow.com/ questions / 2135066 /   -  person outis    schedule 18.04.2010
comment
Большинство ответов здесь неверны. См .: stackoverflow.com/questions/2351190/   -  person darksky    schedule 16.06.2016


Ответы (8)


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

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

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

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

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

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

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

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

person JoeBloggs    schedule 27.11.2008
comment
и Я могу красиво поместить это в строку. +1 за слабую сторону силы - person annakata; 27.11.2008
comment
Строгая типизация означает, что вы не можете использовать один тип переменных там, где ожидается другой. Сильный / слабый - это не переменные, а ценности. Я думаю, вам следует сказать: строгая типизация означает, что вы не можете использовать один тип value там, где ожидается другой. - person Paul Biggar; 06.08.2009
comment
Вы путаете статическую типизацию и строгую типизацию. Сообщение о назначении переменной - это статическая типизация. Излишняя языковая ерунда - это статическая типизация. Избежать ошибок можно в основном с помощью статической типизации, но строгая типизация здесь тоже помогает, так что это неважно. - person Paul Biggar; 06.08.2009
comment
@Paul: Я бы сказал, что сообщение цели переменной - это хорошее именование. Переменная с именем interest_rate (или interestRate или $interest_rate, или как вы хотите использовать заглавные буквы / пробел) довольно четко сообщает о своей цели, независимо от того, является ли она строго или слабо типизированной, статической или динамической. - person Dave Sherohman; 18.04.2010
comment
Java позволяет объединить число (или любой объект) со строкой, несмотря на то, что оно набрано довольно строго (см. Мой ответ о том, что это не имеет смысла). Я согласен с Полом в том, что вы, кажется, больше говорите о статической типизации, но даже тогда вы можете определить конкатенацию строк неявно (как это делает Java). Это все еще плохая идея ;-) Строковая интерполяция намного удобнее и управляемее: вы посетитель с номером $ {count} .. - person Peter Becker; 16.10.2011

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

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

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

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

person Peter Becker    schedule 27.11.2008

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

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

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

person Greg Sexton    schedule 27.11.2008

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

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

Спасибо.

person miksiii    schedule 08.02.2015

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

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

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

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

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

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

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

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

person gonz    schedule 31.03.2014
comment
Это место на высоте. - person pyon; 16.11.2019

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

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

person mehmet    schedule 30.11.2015

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

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

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

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

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

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

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

person Debiprasad    schedule 01.06.2016

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

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

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

person wvdschel    schedule 27.11.2008