Многие программисты приравнивают статическую проверку типов к безопасности типов:
- язык A имеет статическую проверку типов, поэтому он является типобезопасным
- язык B имеет динамическую проверку типов, поэтому он небезопасен
К сожалению, не все так просто.
В реальном мире
Например, C и C ++ небезопасны по типам, потому что вы можете подорвать систему типов с помощью каламбура типа. Кроме того, спецификации языка C / C ++ в значительной степени разрешают неопределенное поведение (UB), а не явно обработки ошибок, и это стало источником уязвимостей безопасности, таких как эксплойт разбивания стека и атака строки формата. Такие эксплойты не должны быть возможны в типобезопасных языках. В ранних версиях Java была ошибка типа с его Generics, который доказал, что это не полностью типобезопасный.
Сегодня для таких языков программирования, как Python, Java, C ++, ... трудно показать, что эти языки полностью типобезопасны, потому что для этого требуется математическое доказательство. Эти языки массивны, и у компиляторов / интерпретаторов есть ошибки, о которых постоянно сообщают и получают фиксированный.
[Wikipedia] С другой стороны, многие языки слишком велики для доказательства безопасности типов, созданные человеком, так как они часто требуют проверки тысяч случаев. .... определенные ошибки могут возникать во время выполнения из-за ошибок в реализации или в связанных библиотеках, написанных на других языках; такие ошибки могут сделать данный тип реализации небезопасным при определенных обстоятельствах.
В Академии
Типовая безопасность и системы типов, хотя и применимы к реальному программированию, имеют свои корни и определения, взятые из академических кругов < / em> - и поэтому формальное определение того, что именно является безопасностью типов, сопряжено с трудностями, особенно когда речь идет о реальных языках программирования, используемых в реальном мире. Ученые любят математически (формально) определять крошечные языки программирования, называемые игрушечными языками. Только для этих языков можно формально показать, что они безопасны по типу (и доказать, что операции логически верны).
[Wikipedia] Типовая безопасность обычно является требованием для любого игрушечный язык, предложенный в академических исследованиях языков программирования
Например, ученые изо всех сил пытались доказать типобезопасность Java, поэтому они создали уменьшенную версию под названием Featherweight Java и доказали это в paper, что он является типобезопасным. Точно так же этот Ph.D. paper Кристофера Лайона Андерсон взял подмножество Javascript, назвал его JS0 и доказал, что он безопасен по типу.
Практически предполагается, что правильные языки, такие как python, java, c ++, не являются полностью типобезопасными, потому что они такие большие. Крошечный жучок так легко проскользнет сквозь трещины, которые подорвут систему типов.
Резюме
- Нет, Python вероятно, не полностью типобезопасен - это никто не доказал, это слишком сложно доказать. Вы с большей вероятностью найдете крошечную ошибку в языке, которая продемонстрирует, что он не является типобезопасным.
- Фактически, большинство языков программирования вероятно, не полностью типобезопасны - все по тем же причинам (доказано, что это только академические академические языки)
- Не стоит верить, что языки со статической типизацией обязательно типизированы. Обычно они безопаснее, чем языки с динамической типизацией, но утверждать, что они полностью типобезопасны с уверенностью, неправильно, поскольку для этого нет доказательств.
Ссылки: http://www.pl-enthusiast.net/2014/08/05/type-safety/ и https://en.wikipedia.org/wiki/Type_system
person
James Lawson
schedule
24.09.2017
'1' + 2
. Например, Javascript не является типобезопасным. - person Eric Duminil   schedule 24.09.2017a language is "type-safe" if it does not allow operations or conversions that violate the rules of the type system.
В вашем примере выполняется автоматическое преобразование. Попробуйте сделать это с объектами, определяемыми пользователем. Типобезопасность означает, что вы указываете типы переменных и не можете использовать их, если не переопределите явное значение. В python вы можете сделать это:s = 'this is string'; s = 1
но вы не можете сделать это в Java - person Chen A.   schedule 24.09.2017