С сильно типизирован? - PullRequest
       76

С сильно типизирован?

73 голосов
/ 10 января 2009

Цитировать Википедия :

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

Есть ли более точный ответ?

Ответы [ 17 ]

139 голосов
/ 10 января 2009

«Сильно типизированный» и «слабо типизированный» - это термины, которые не имеют общепринятого технического значения. Термины, которые имеют четко определенное значение:

  • Динамически типизированный означает, что типы присоединяются к значениям во время выполнения, и попытка смешать значения различных типов может вызвать «ошибку типа времени выполнения». Например, если в Схеме вы попытаетесь добавить один к истине, написав (+ 1 #t), это вызовет ошибку. Вы столкнетесь с ошибкой, только если попытаетесь выполнить код, вызывающий сбой.

  • Статически типизированный означает, что типы проверяются во время компиляции, а программа, которая не имеет статического типа, отклоняется компилятором. Например, если в ML вы пытаетесь добавить значение true, написав 1 + true, программа будет отклонена с (возможно, загадочным) сообщением об ошибке. Вы всегда получаете ошибку, даже если код никогда не будет выполнен.

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

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

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

Если вы хотите говорить именно о языках программирования, лучше избегать терминов «строго типизированный» и «слабо типизированный». Я бы сказал, что C - это язык, который статически типизирован, но в нем много лазеек. Одна из лазеек заключается в том, что вы можете свободно приводить любой тип указателя к любому другому типу указателя. Вы также можете создать лазейку между любыми двумя типами по вашему выбору, объявив объединение C с двумя членами, по одному для каждого из рассматриваемых типов.

Я написал больше о статической и динамической типизации на почему-интерпретируемые-langs-в-основном-ducktyped-while-compiled-have-strong-typing .

21 голосов
/ 10 января 2009

Трудно классифицировать каждый язык на «слабо» или «строго» типизированный - это скорее континуум. Но, по сравнению с другими языками, C довольно сильно типизирован. Каждый объект имеет тип времени компиляции, и компилятор сообщит вам (громко), если вы делаете что-то с объектом, который его тип не позволяет вам сделать. Например, вы не можете вызывать функции с неверными типами параметров, обращаться к несуществующим элементам структуры / объединения и т. Д.

Но есть несколько слабых мест. Один из основных недостатков - типы типов - по сути, они говорят, что вы будете возиться с типами объектов, и компилятор должен быть тихим (когда это возможно). void* также является еще одним недостатком - это общий указатель на неизвестный тип, и когда вы используете их, вы должны быть особенно осторожны, чтобы делать правильные вещи. Компилятор не может статически проверять большинство случаев использования void*. void* также можно преобразовать в указатель на любой тип без приведения (только в C, а не в C ++), что является еще одним недостатком.

11 голосов
/ 10 января 2009

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

9 голосов
/ 10 января 2009

В литературе не ясно об этом. Я думаю, что строгий тип - это не да / нет, есть разные степени строгого набора.

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

Итак:

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

Значит, Java статически типизирована? Да, потому что его система типов запрещает вычитать строку из числа. Нет, потому что это позволяет делить на ноль. Вы можете предотвратить деление на ноль во время компиляции с помощью системы типов. Например, создавая числовой тип, который не может быть нулевым (например, NonZeroInt), и позволяет делить только на числа, имеющие этот тип.

Значит, C строго типизирован или слабо типизирован? C строго типизирован, потому что система типов запрещает некоторые ошибки типов. Но он слабо типизирован в других случаях, когда не определено, что происходит (а система типов не защищает вас).

7 голосов
/ 10 января 2009

C более строго типизировано, чем Javascript, и менее строго типизировано, чем Ada.

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

Как это окончательно?

4 голосов
/ 10 января 2009

C считается статически типизированным (вы не можете изменить переменную с int на float). Как только переменная объявлена, она застревает таким образом.

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

Что такое 0? '\ 0', ЛОЖЬ, 0.0 и т. Д.

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

в основном c имеет два основных простых типа данных, целые числа и числа с плавающей запятой (хотя и с разной точностью). Все остальные логические значения, перечисления (не простые, но подходящие) и т. Д. Реализованы как одно из них. Даже символы в основном целые.

Сравните с другими языками, в которых есть строковые типы, перечислимые типы, которые могут быть назначены только определенным значениям, логические типы, в которых могут использоваться только выражения, генерирующие логические значения или true / false.

Но вы можете утверждать, что по сравнению с Perl C строго типизирован. Так что это один из тех известных аргументов (vi против emacs, linux против windows и т. Д.). C # печатается сильнее, чем C. В принципе, вы можете спорить в любом случае. И ваши ответы, вероятно, будут идти обоими путями :) Также некоторые учебники / веб-страницы скажут, что C слабо типизирован, а некоторые скажут, что C строго типизирован. Если вы идете в википедию, то в записи C написано «частично слабая типизация». Я бы сказал, что по сравнению с Python C слабо типизирован. Итак, Python / C #, C, Perl на континууме.

4 голосов
/ 10 января 2009

Здесь много хороших ответов. Я хочу поднять важный момент из Real World Haskell :

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

(надрез)

Фейерверк вокруг систем типов уходит своими корнями в обычный английский, где люди придают понятиям ценность слов «слабый» и «сильный»: мы обычно думаем о силе лучше, чем о слабости. Гораздо больше программистов говорят на простом английском, чем на академическом жаргоне, и довольно часто ученые действительно бросают кирпичную биту в любую систему типов, которая не соответствует их фантазии. Результатом этого часто является популярное времяпрепровождение в Интернете - пламенная война.

Итак, посмотрите на ответы о C и C ++, но помните, что «сильные» и «слабые» не соответствуют «хорошим» и «плохим».

2 голосов
/ 08 сентября 2017

По словам Денниса Ритчи ( создатель C ) и Брайана Кернигана, C не является строго типизированным языком. Следующие строки взяты из книги Язык программирования C стр. 3, абзац 5

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

2 голосов
/ 10 января 2009

На мой взгляд, C / C ++ строго типизированы. Типы хаков, которые позволяют преобразовывать типы (void *), существуют из-за близости C к машине. Другими словами, вы можете вызывать команды ассемблера из Pascal и манипулировать указателями, а Pascal по-прежнему считается строго типизированным языком. Вы можете вызывать исполняемые файлы ассемблера и C из Java через JNI, но это не делает Java слабо типизированным.

C только что «встроил» в него ассемблер с необработанными указателями и тому подобное.

2 голосов
/ 10 января 2009

Термин строго типизированный не имеет согласованного определения. Поэтому, если вы не определите, что вы имеете в виду как «строго типизированный», невозможно ответить на ваш вопрос.

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

Возможно, вы также захотите взглянуть на Каковы ключевые аспекты строго типизированного языка? здесь, в StackOverflow.

...