Оригинальный твитер здесь. :)
Прежде всего, я несколько удивлен / шокирован тем, что мой твит воспринимается так серьезно! Если бы я знал, что это будет широко распространено, я бы потратил бы больше 30 секунд на его написание!
Тиаго Сильва справедливо указывает на то, что «статические» и «динамические» более точно описывают проверку типов , а не системы типов . На самом деле, не совсем точно сказать, что язык статически или динамически типизирован. Скорее, язык имеет систему типов, и реализация этого языка может принудительно применять систему типов с использованием статической проверки, или динамической проверки, или обоих, или ни того, ни другого (хотя это не было бы очень привлекательной реализацией языка!).
Как это бывает, существуют определенные системы типов (или особенности систем типов), которые более поддаются статической проверке, и есть определенные системы типов (или особенности систем типов), которые более поддаются динамической проверке. Например, если ваш язык позволяет вам указать в тексте программы, что конкретное значение всегда должно быть массивом целых чисел, тогда довольно просто написать статическую проверку для проверки этого свойства. И наоборот, если в вашем языке есть подтипы, и если он допускает понижение версии, тогда достаточно просто проверить достоверность понижения во время выполнения, но это чрезвычайно сложно сделать во время компиляции.
Что я действительно имел в виду под своим твитом, так это то, что подавляющее большинство языковых реализаций выполняет некоторую динамическую проверку типов. Или, что то же самое, подавляющее большинство языков имеют некоторые особенности, которые сложно (если не невозможно) проверить статически. Даункинг является одним из примеров. Другие примеры включают арифметическое переполнение, проверку границ массива и проверку нуля. Некоторые из них могут быть статически проверены при некоторых обстоятельствах, но в целом вам будет сложно найти языковую реализацию, которая не выполняет никакой проверки во время выполнения.
Это неплохая вещь. Это просто наблюдение, что есть много интересных свойств, которые мы бы хотели, чтобы наши языки применяли, и что мы не знаем, как проверять статически. И это напоминание о том, что различия, такие как «статические типы» и «динамические типы», далеко не так очевидны, как некоторые люди могут поверить. :)
Последнее замечание: термины «сильный» и «слабый» на самом деле не используются в сообществе исследователей языка программирования, и они не имеют постоянного значения. В общем, я обнаружил, что когда кто-то говорит, что у языка есть «строгая типизация», а у какого-то другого языка есть «слабая типизация», они действительно говорят, что их любимый язык (язык с «строгой типизацией») не позволяет им делая некоторую ошибку, что другой язык (язык со «слабой типизацией») не делает - или наоборот, что их любимый язык (язык со «слабой типизацией») позволяет им делать что-то классное, что другой язык ( один с "строгой типизацией") нет.