Действительно ли C со строгим контролем типов?

(если возможно) не использовать потоки, использовать актеры / активные объекты. Легко проверить.

77
задан Sydius 10 January 2009 в 19:49
поделиться

15 ответов

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

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

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

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

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

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

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

я записал больше о статическом контроле типов и динамическом контроле типов в why-interpreted-langs-are-mostly-ducktyped-while-compiled-have-strong-typing.

145
ответ дан Community 6 November 2019 в 03:31
поделиться

Я сказал бы, что это - сильно типы, поскольку каждое выражение имеет тип, который не является функцией, он - значение; e.i. это может быть известно перед временем выполнения.

OTOH я не уверен, что это - корректное описание со строгим контролем типов. Единственная более сильная претензия, которую я вижу причину языка для создания, была бы обеспечением, что Вы не можете ниспровергать систему типов во времени выполнения через, дают иное толкование броскам типа, объединениям, звонящим на другие языки, указатели, ассемблер, и т.д. Языки как это существуют, но так нанесены вред, что они, кажется, не очень интересны для программистов за пределами высокого обеспечения и академии. Как указано кем-то, чтобы действительно сделать то право Вы начинаете должными быть иметь типы как nonZeroInt и этажерка. Фу.

-3
ответ дан BCS 6 November 2019 в 03:31
поделиться

Я сказал бы, что C так же со строгим контролем типов как Ваш компилятор / платформа диктует. Например, при построении на строгой платформе разыменовывание типа каламбурило, указатель, вероятно, собирается повредиться:

void m_free(void **p)
{
        if (*p != NULL) {
                free(*p);
                *p = NULL;
        }
}

....
char *str = strdup("foo");
m_free((void **) &foo);

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

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

0
ответ дан Tim Post 6 November 2019 в 03:31
поделиться

Не со строгим контролем типов.

Рассматривают то, что следующий прототип функции говорит Вам о типах данных аргументов:

void func (int n, char ch, ...);

Ничто. Таким образом, я предполагаю, что строгий контроль типов не применяется здесь.

-1
ответ дан joel.neely 6 November 2019 в 03:31
поделиться

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

0
ответ дан Robert Gamble 6 November 2019 в 03:31
поделиться

Какова причина Вашего запроса? Причина, которую я спрашиваю, это - вид незначительных различий, и Ваше конкретное использование "со строгим контролем типов", возможно, нуждалось бы более или менее в разъяснении. Я определенно сказал бы, что Java и другие языки имеют более трудные ограничения на неявный разговор типа.

0
ответ дан BobbyShaftoe 6 November 2019 в 03:31
поделиться

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

полезно знать, что у многих сообществ языка есть свои собственные определения “strong type”. Тем не менее, мы будем говорить кратко и в общих чертах о понятии силы в системах типов.

(надрез)

фейерверки вокруг систем типов имеют свои корни на обычном английском языке, где люди присоединяют понятия значения к словам “weak” и “strong”: мы обычно думаем о силе как лучше, чем слабость. Намного больше программистов говорит на простом английском языке, чем академический жаргон, и довольно часто академики действительно бросают резкие замечания в любую систему типов, не удовлетворяет их воображению. Результат часто в том состоит что популярное интернет-времяпрепровождение, война пламени.

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

4
ответ дан slim 6 November 2019 в 03:31
поделиться

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

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

2
ответ дан mannicken 6 November 2019 в 03:31
поделиться

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

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

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

1
ответ дан yfeldblum 6 November 2019 в 03:31
поделиться

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

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

, Что 0? '\0', ЛОЖЬ, 0.0, и т.д.

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

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

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

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

4
ответ дан Cervo 6 November 2019 в 03:31
поделиться

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

11
ответ дан mipadi 6 November 2019 в 03:31
поделиться

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

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

Так:

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

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

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

9
ответ дан Jules 6 November 2019 в 03:31
поделиться

C более со строгим контролем типов, чем JavaScript и менее со строгим контролем типов, чем Ada.

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

, Как это для категорического?

7
ответ дан Michael Burr 6 November 2019 в 03:31
поделиться

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

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

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

2
ответ дан Jörg W Mittag 6 November 2019 в 03:31
поделиться

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

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

21
ответ дан Adam Rosenfield 6 November 2019 в 03:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: