Selon Wikipedia
Les informaticiens considèrent un langage "sûr pour le type" s'il ne permet pas des opérations ou des conversions qui violent les règles du système de type.
Étant donné que Python les contrôles d'exécution garantissent que les règles système de type sont satisfaites, nous devons considérer Python un langage de type sécurisé).
Le même argument est fait par Jason Orendorff et Jim Blandy dans Programmation Rust :
Notez que la sécurité de type est indépendante du fait qu'un langage vérifie les types au moment de la compilation ou au moment de l'exécution: C vérifie au moment de la compilation et n'est pas de type sécurisé; Python vérifie au moment de l'exécution et est sûr de type.
Les deux notions distinctes de vérification de type statique et de sécurité de type.
Est-ce exact?
De nombreux programmeurs assimileront la vérification de type statique à la sécurité de type:
Malheureusement, ce n'est pas si simple.
Par exemple, C et C++ ne sont pas sûrs pour le type car vous pouvez miner le système de type via type punning . De plus, les spécifications du langage C/C++ autorisent largement comportement indéfini (UB) plutôt que de gérer explicitement les erreurs, ce qui est devenu la source d'exploits de sécurité tels que l'exploit smashing de pile et attaque de chaîne de format . De tels exploits ne devraient pas être possibles dans les langages de type sécurisé. Les premières versions de Java avait un bug de type avec son Generics qui prouvait qu'il n'était pas complètement sûr pour le type.
Encore aujourd'hui, pour des langages de programmation comme Python, Java, C++, ... il est difficile de montrer que ces langages sont complètement sûrs pour le type car ils nécessitent une preuve mathématique. Ces langages sont massifs et les compilateurs/interprètes ont des bogues qui sont continuellement signalés et corrigés.
[ Wikipedia ] De nombreuses langues, en revanche, sont trop grandes pour les preuves de sécurité de type généré par l'homme, car elles nécessitent souvent de vérifier des milliers de cas. .... certaines erreurs peuvent survenir au moment de l'exécution en raison de bogues dans l'implémentation ou dans des bibliothèques liées écrites dans d'autres langues; de telles erreurs peuvent rendre un type d'implémentation donné dangereux dans certaines circonstances.
La sécurité des types et les systèmes de types, bien qu'applicables à la programmation du monde réel, ont leurs racines et leurs définitions provenant de universitaire - et donc une définition formelle de ce qui est exactement est "la sécurité du type" est difficile - surtout quand on parle de vrais langages de programmation utilisés dans le monde réel. Les universitaires aiment définir mathématiquement (formellement) de minuscules langages de programmation appelés langages jouets . Ce n'est que pour ces langues qu'il est possible de montrer formellement qu'elles sont de type sécurisé (et de prouver que les opérations sont logiquement correct ).
[ Wikipedia ] La sécurité de type est généralement une exigence pour tout langage jouet proposé dans la recherche sur le langage de programmation universitaire
Par exemple, les universitaires ont eu du mal à prouver Java est de type sécurisé, ils ont donc créé une version plus petite appelée Featherweight Java et prouvée dans un papier qu'il est type-safe. De même, ce article de doctorat par Christopher Lyon Anderson a pris un sous-ensemble de Javascript, l'a appelé JS0 et l'a prouvé type sûr.
Il est pratiquement supposé que les langages appropriés comme python, Java, c ++ ne sont pas complètement sûrs pour le type car ils sont si grands. Il est si facile pour un minuscule bogue de se faufiler entre les fissures, ce qui minerait le système de saisie.
Références: http://www.pl-enthusiast.net/2014/08/05/type-safety/ et https://en.wikipedia.org/wiki/Type_system
L'article de wikipedia associe le type sécurisé à la mémoire sûre, ce qui signifie que la même zone de mémoire n'est pas accessible, par exemple entier et chaîne. De cette façon Python est de type sécurisé. Vous ne pouvez pas changer implicitement le type d'un objet.
Parce que personne ne l'a encore dit, il convient également de souligner que Python est un langage fortement typé , qui ne devrait pas être confondu avec typé dynamiquement. Python diffère la vérification de type jusqu'au dernier moment possible, et entraîne généralement une exception levée. Cela explique le comportement mentionné par Mureinik. Cela étant dit, Python effectue également souvent une conversion automatique. Cela signifie qu'il tentera de convertir un entier en un flottant pour une opération arithmétique, par exemple.
Vous pouvez appliquer manuellement la sécurité des types dans vos programmes en vérifiant les types d'entrées. Parce que tout est un objet, vous pouvez toujours créer des classes dérivées des classes de base et utiliser la fonction isinstance
pour vérifier le type (au moment de l'exécution bien sûr). Python 3 a ajouté des indications de type, mais cela n'est pas appliqué. Et mypy a ajouté une vérification de type statique à la langue si vous voulez l'utiliser, mais cela ne le fait pas garantir la sécurité du type.
En Python, vous obtiendrez une erreur d'exécution si vous utilisez une variable du mauvais type dans le mauvais contexte. Par exemple.:
>>> 'a' + 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objects
Étant donné que cette vérification ne se produit que dans runtime , et pas avant d'exécuter le programme, Python n'est pas un langage de type sécurisé ( PEP-484 nonobstant).