Слабый против сильного набора текста? Свифт против питона
Почему мы можем указать переменную на значение другого типа в течение жизни программы на python, но не в swift? это работает в Python:
x = 0
x = "zero"
ошибка быстрого броска:
var x = 0;
x = "zero";
это поведение связано с концепцией сильной / слабой типизации или статической / динамической концепцией?
1 ответ
И Python, и Swift строго типизированы по сравнению с такими языками, как C и Lisp. Каждый тип, который может иметь значение, выражен в языке, и нет никакого способа интерпретировать значение как другой тип, не делая что-то явно помеченное как "небезопасное".
И Python, и Swift слабо типизированы по сравнению с такими языками, как Haskell, Rust и большинством вариантов ML. Есть много вещей, которые можно было бы с пользой выразить в системе типов, но это, скорее всего, не мутация потоков ввода-вывода - файл, в который вы записали, - это тот же файл, что и до того, как вы в него записали.
Что касается статического и динамического, это сильно перегруженные термины. Вы можете поспорить о том, какое определение "динамическая типизация" является лучшим, но это никуда вас не приведет; в чем разница между языками, которые существуют независимо от того, как вы их называете.
В обоих языках значения (строго) типизированы. Но в Python переменные являются нетипизированными именами; в Swift переменные являются типизированными местоположениями, которые содержат значения.
В Python не только возможно, но идиоматично делать специальный полиморфизм во время выполнения, то есть "типизацию утки"; это не так в Swift.
Оба языка имеют аннотации типов и правила для вывода типов. В Swift компилятор применяет эти правила и отклоняет ваш код, если не может проверить тип для всего. В Python компилятор игнорирует аннотации и ничего не выводит, и вы должны использовать дополнительный инструмент, такой как Mypy, если вы хотите проверить тип кода.
Python и Swift поддерживают хотя бы некоторую форму ОО с динамической диспетчеризацией. То есть даже в Свифте Base
переменная может содержать Derived
значение (игнорируя вопросы о семантике значение-ссылка-здесь). Однако Python делает это в стиле Smalltalk, эффективно просматривая его с помощью отражения, тогда как Swift делает это в стиле C++, используя статически скомпилированную таблицу для поиска вызовов методов во время выполнения. За исключением того, что у Swift есть маршрут эвакуации для объектов Objective C, которые обрабатывают стиль Smalltalk.
Отчасти как следствие некоторых из вышеуказанных различий, система типов во время исполнения Swift точно так же сильна, как и ее статическая система типов, но Python сильнее. Во время выполнения в Python могут существовать различия типов, которые не могут быть выражены в языке статической типизации. Значит ли это, что Python более выразителен, чем Swift, или Swift безопаснее, чем Python, - это интересный вопрос для дебатов. (Конечно, многие из этих различий можно выразить в системе типов, скажем, Haskell, поэтому вы можете сказать, что Haskell является более выразительным, чем Swift, и безопаснее, чем Python.)
Другое важное отличие, которое на самом деле не касается сильных против слабых или статических против динамических, заключается в том, что Swift поощряет некоторый уровень программирования на основе типов - например, идиоматично делать такие вещи, как сопоставление с образцом в алгебраических типах. В Python, с другой стороны, переключение типов всех видов не рекомендуется. Дело не в том, что вы не можете этого сделать (хотя у него нет хорошего синтаксического сахара, такого как Swift), а в том, что почти всегда считается более Pythonic делать что-то еще (будь то OO, @singledispatch
, так далее.).