строгая типизация — считается ли C ++ слабо типизированным? Зачем?

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

По-видимому,

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

Имеет ли значение только приведение типов? Не имеет ли значение явность таких приведений?

В более общем смысле, действительно ли общепринято, что C ++ слабо типизирован? Зачем?

9

Решение

Эта статья сначала утверждает:

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

А потом утверждает:

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

Это кажется мне противоречием. В C и C ++ путаница типов, которая может возникнуть в результате приведений, не будет происходить молча — есть приведение! Это не демонстрирует, что какой-либо из этих языков является слабо типизированным, по крайней мере, не по определению в этой статье.

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

Для C (но не C ++) есть также более опасные неявные преобразования, о которых стоит упомянуть:

int main() {
int i = 0;
void *v = &i;
char *c = v;
return *c;
}

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

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

19

Другие решения

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

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

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

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

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

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

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

6

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

Ну, это может произойти в C ++, например:

#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
#include <limits>

void f(char n) { std::cout << "f(char)\n"; }
void f(int n) { std::cout << "f(int)\n"; }
void g(int n) { std::cout << "f(int)\n"; }

int main()
{
float fl = M_PI;   // silent conversion to float may lose precision

f(8 + '0'); // potentially unintended treatment as int

unsigned n = std::numeric_limits<unsigned>::max();
g(n);  // potentially unintended treatment as int
}

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

Хмммм … не посредством какого-либо неявного преобразования, так что это глупый аргумент. C ++ допускает явное приведение между типами, но это вряд ли «слабо» — это не происходит случайно / тихо, как того требует собственное определение сайта выше.

Имеет ли значение только приведение типов? Не имеет ли значение явность таких приведений?

Ясность является решающим фактором ИМХО. Позволить программисту переопределить знание типов компилятором — это одна из «мощных» возможностей C ++, а не некоторая слабость. Это не склонно к случайному использованию.

В более общем смысле, действительно ли общепринято, что C ++ слабо типизирован? Зачем?

Нет — я не думаю, что это принято. C ++ достаточно строго типизирован, и способы, которыми он был снисходительным, который исторически вызывал проблемы, были отменены, такие как неявное приведение из void* к другим типам указателей, и более точный контроль с explicit операторы и конструкторы.

1

Позвольте мне привести простой пример:

 if ( a + b )

C / C + = позволяет неявное преобразование из числа с плавающей точкой в ​​int в логическое значение.

Строго типизированный язык не допускает такого неявного преобразования.

-3
По вопросам рекламы [email protected]