Ce dont nous parlons en fin de compte ici, c'est le temps de compilation par rapport à l'exécution.
Si vous y réfléchissez, les erreurs de temps de compilation reviennent en fin de compte à ce que le compilateur puisse déterminer les problèmes que vous rencontrez dans votre programme avant même qu'il ne soit exécuté. Ce n'est évidemment pas un compilateur "langage arbitraire", mais j'y reviendrai sous peu. Le compilateur, dans toute sa sagesse infinie, ne répertorie cependant pas tous les problèmes qui peuvent être déterminés par le compilateur. Cela dépend en partie de la qualité de l'écriture du compilateur, mais la principale raison en est que de nombreuses choses sont déterminées au moment de l' exécution .
Les erreurs d'exécution, comme vous le savez bien, je suis sûr que je le suis, sont tout type d'erreur qui se produit lors de l'exécution du programme lui-même. Cela comprend la division par zéro, les exceptions de pointeur nul, les problèmes matériels et de nombreux autres facteurs.
La nature des erreurs d'exécution signifie que vous ne pouvez pas anticiper ces erreurs au moment de la compilation. Si vous le pouviez, ils seraient presque certainement vérifiés au moment de la compilation. Si vous pouviez garantir qu'un nombre est égal à zéro au moment de la compilation, alors vous pourriez effectuer certaines conclusions logiques, telles que la division d'un nombre par ce nombre entraînera une erreur arithmétique causée par la division par zéro.
En tant que tel, d'une manière très réelle, l'ennemi de garantir par programme le bon fonctionnement d'un programme effectue des vérifications d'exécution par opposition à des vérifications de temps de compilation. Un exemple de ceci pourrait être une conversion dynamique vers un autre type. Si cela est autorisé, vous, le programmeur, êtes en train de remplacer la capacité du compilateur à savoir si c'est une chose sûre à faire. Certains langages de programmation ont décidé que cela était acceptable tandis que d'autres vous avertiraient au moins lors de la compilation.
Un autre bon exemple pourrait être d'autoriser les null à faire partie du langage, car des exceptions de pointeur null pourraient se produire si vous autorisez les null. Certains langages ont complètement éliminé ce problème en empêchant les variables non explicitement déclarées de pouvoir contenir des valeurs nulles sans être immédiatement affectées (prendre Kotlin par exemple). Bien que vous ne puissiez pas éliminer une erreur d'exécution d'exception de pointeur nul, vous pouvez l'empêcher de se produire en supprimant la nature dynamique de la langue. Dans Kotlin, vous pouvez forcer la possibilité de conserver des valeurs nulles bien sûr, mais il va sans dire qu'il s'agit d'un "acheteurs avertis" métaphoriques car vous devez le déclarer explicitement comme tel.
Pourriez-vous conceptuellement avoir un compilateur qui pourrait vérifier les erreurs dans toutes les langues? Oui, mais ce serait probablement un compilateur maladroit et très instable dans lequel vous devrez nécessairement fournir le langage en cours de compilation au préalable. Il ne pouvait pas non plus savoir beaucoup de choses sur votre programme, pas plus que les compilateurs pour des langues spécifiques ne savent certaines choses à ce sujet, comme le problème d'arrêt comme vous l'avez mentionné. Il s'avère que de nombreuses informations qui pourraient être intéressantes à connaître sur un programme sont impossibles à glaner. Cela a été prouvé, il est donc peu probable qu'il change de sitôt.
Revenons à votre point principal. Les méthodes ne sont pas automatiquement thread-safe. Il y a une raison pratique à cela, qui est que les méthodes thread-safe sont également plus lentes même lorsque les threads ne sont pas utilisés. Rust décide qu'ils peuvent éliminer les problèmes d'exécution en rendant les méthodes de threads sécurisées par défaut, et c'est leur choix. Cela a cependant un coût.
Il peut être possible de prouver mathématiquement l'exactitude d'un programme, mais ce serait avec la mise en garde que vous n'auriez littéralement aucune fonctionnalité d'exécution dans le langage. Vous pourrez lire cette langue et savoir ce qu'elle fait sans aucune surprise. La langue serait probablement de nature très mathématique, et ce n'est probablement pas une coïncidence. La deuxième mise en garde est que des erreurs d'exécution se produisent toujours , ce qui peut n'avoir rien à voir avec le programme lui-même. Par conséquent, le programme peut être prouvé correct, en supposant une série d'hypothèses sur l'ordinateur , il est en cours d' exécution sur l' exactitude et ne changent, ce qui bien sûr toujours ne se produit de toute façon et souvent.