Каковы ключевые аспекты строго типизированного языка?

Что делает язык строго типизированным? Я ищу наиболее важные аспекты строго типизированного языка.

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

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

Ответ 1

Термин "строго типизированный" не имеет согласованного определения.

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

Лучше просто не использовать этот термин, или, если вы его используете, строго определите его в первую очередь. Если вы видите, что кто-то еще использует его, попросите его определить термин.

У каждого свое определение. Некоторые из них я видел:

  • строго типизировано = статически типизировано
  • строго типизированный = явно введенный
  • строго типизировано = номинально типизировано
  • strong typed = typed
  • строго типизированный = не имеет неявных typecasts, только явный
  • строго типизированный = вообще не имеет типов типов
  • строго типизировано = что я понимаю/слабо типизировано = что я не понимаю
  • строго типизировано = С++/слабо типизировано = все остальное
  • строго типизировано = Java/слабо типизировано = все остальное
  • строго типизировано =.NET/слабо типизировано = все остальное
  • строго типизированный = мой язык программирования/слабо типизированный = ваш язык программирования

В Теории типов существует понятие одной системы типов, которая сильнее другой. В частности, если существует выражение e1 такое, что оно принимается системой типов T1, но отклоняется системой типов T2, то T2 называется более сильным, чем T1. Здесь есть две важные вещи:

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

Ответ 2

Согласно B.C. Пирс, парень, который написал "Типы и языки программирования и расширенные типы и языки программирования":

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

Так неудивительно, почему ваши коллеги не согласны.

Я бы попросил простейший ответ: если вы можете конкатенировать строку и int без кастинга, то она не будет строго типизирована.

EDIT: как указано в комментариях, Java просто делает это: - (

Ответ 3

Ключ должен помнить, что существует различие между статически типизированным и строго типизированным. Сильно типизированный язык просто означает, что после назначения данная переменная всегда будет вести себя как определенный тип, пока не будет переназначена. По определению статически типизированные языки, такие как Java и С#, строго типизированы, но так много популярных динамических языков, как Ruby и Python.

Итак, на строго типизированном языке

x = "5"

x всегда будет строкой и никогда не будет целым числом.

В некоторых слабо типизированных языках вы можете сделать что-то вроде

x = "5"
y = x + 3
// y is now 8

Ответ 4

Люди путают статически типизированные с строго типизированными. Статически типизированное означает: "Строка - это строка - это строка". Сильно напечатанное означает: "Как только вы сделаете эту строку, она будет рассматриваться как строка, пока она не будет переназначена как нечто иное".

edit: Я вижу, что кто-то еще указал это на все:)

Ответ 5

Я слышал, как кто-то сказал в интервью (я думаю, что это был Андерс Хейлсберг из С# и славы turbo pascal), что сильная типизация не является чем-то, что включено или выключено, некоторые языки имеют более сильную систему типов, чем другие.

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

Попробуйте wikipedia для получения дополнительной информации, но не ожидайте окончательного ответа: http://en.wikipedia.org/wiki/Strongly_typed_language

Ответ 6

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

Пример (в java mind you):

int i = 4;
char s = i; // Type mismatch: cannot convert from int to char

Ответ 7

Термин "сильно типизированный" полностью и совершенно бессмыслен. Он не имеет никакого значения и никогда не делал. Даже если некоторые из заявленных определений были точными, я не вижу никакой цели в отношении разницы; Почему важно знать, обсуждать или обсуждать, сильно ли напечатан язык (что бы это ни значило) или нет?

Это очень похоже на термины "Web 2.0" или "OEM", которые также не имеют реального смысла.

Что интересно, так это то, как эти фразы начинаются и внедряются в повседневную коммуникацию.

Ответ 8

Статически типизированный язык - это тот, где переменные должны быть объявлены до их использования. Хотя Динамически типизированный язык - это тот, где переменные можно использовать в любое время, даже если они не объявлены. Единственное условие состоит в том, что они должны быть инициализированы до их использования.

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

Пример: Java - это статически типизированный, а также строго типизированный язык. Это статически типизировано, потому что нужно объявить переменные до их использования. Он строго типизирован, потому что переменная определенного типа int всегда будет содержать целые значения. Вы не можете назначить им boolean.

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