Я думаю, что понимаю строгую типизацию, но каждый раз, когда я ищу примеры того, что такое слабая типизация, я в конечном итоге нахожу примеры языков программирования, которые просто автоматически принуждают/преобразуют типы.
Например, в этой статье под названием Typing: Strong vs. Weak, Static vs. Dynamicговорится, что Python строго типизирован, потому что вы получите исключение, если попытаетесь:
Python
1 + "1"
Traceback (most recent call last):
File "", line 1, in ?
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Однако такое возможно и в Java, и в C#, и мы не считаем их слаботипизированными только за это.
Java
int a = 10;
String b = "b";
String result = a + b;
System.out.println(result);
C#
int a = 10;
string b = "b";
string c = a + b;
Console.WriteLine(c);
В этой другой статье под названием Языки слабого типаавтор говорит, что Perl слабо типизирован просто потому, что я могу объединить строку в число и наоборот без какого-либо явного преобразования.
Perl
$a=10;
$b="a";
$c=$a.$b;
print $c; #10a
Таким образом, тот же самый пример делает Perl слабо типизированным, но не Java и C#?.
Боже, это сбивает с толку
Авторы, похоже, подразумевают, что язык, который предотвращает применение определенных операций над значениями разных типов, является строго типизированным, а наоборот означает слабо типизированным.
Таким образом, в какой-то момент я почувствовал побуждение поверить, что если язык предоставляет много автоматических преобразований или принуждения между типами (как perl), он может в конечном итоге считаться слабо типизированным, в то время как другие языки, которые обеспечивают только несколько преобразований, могут в конечном итоге считаются строго типизированными.
Однако я склонен полагать, что я должен ошибаться в этой интерпретации, я просто не знаю, почему и как это объяснить.
Итак, мои вопросы: