1) Видимо, есть и другие: http://en.wikipedia.org/wiki/Type_system
2)
Dynamic
=> Проверка типа выполняется во время выполнения (выполнения программы), например Python.
Static
(в отличие от динамического) => Проверка типа выполняется во время компиляции, например, C ++
Strong
=> Как только система типов решает, что конкретный объект принадлежит к типу, она не позволяет использовать его в качестве другого типа. например Python
Weak
(в отличие от Strong) => Система типов позволяет типам объектов изменяться. например Perl позволяет читать число как строку, а затем снова использовать его как число
Type safety
=> Я могу лучше всего описать с помощью оператора 'C', например:
x = (int *) malloc (...);
malloc
возвращает (void *), и мы просто приводим его к типу (int *). Во время компиляции нет проверки того, что указатель, возвращаемый функцией malloc, на самом деле будет размером целого числа => Некоторые операции C не являются безопасными по типу.
Мне сказали, что некоторые «чисто функциональные» языки по своей природе безопасны по типу, но я не знаю ни одного из этих языков. Я думаю, что Standard ML или Haskell были бы безопасны для типов.
3) «Если язык позволяет вам изменять тип переменной во время выполнения (например, переменная, которая использовалась для хранения целого, позже используется для хранения строки), к какой категории это относится?»:
Это может быть динамический - переменные нетипизированы, значения могут содержать неявную или явную информацию о типе; альтернативно, система типов может справляться с переменными, которые изменяют тип, и может быть системой статических типов.
4) Python: он динамически и строго типизирован. Безопасность типов - это что-то Я не знаю Python (и сам тип безопасности) достаточно, чтобы что-то сказать.
5) «Есть ли что-то еще, что я должен знать о системах типов?»: Может быть, читаете книгу, которую предлагает @BasileStarynkevitch?