Lo que finalmente estamos hablando aquí es el tiempo de compilación vs tiempo de ejecución.
Los errores de tiempo de compilación, si lo piensa, en última instancia equivalen a que el compilador pueda determinar qué problemas tiene en su programa incluso antes de que se ejecute. Obviamente no es un compilador de "lenguaje arbitrario", pero volveré sobre eso en breve. Sin embargo, el compilador, en toda su sabiduría infinita, no enumera todos los problemas que puede determinar el compilador. Esto depende en parte de qué tan bien esté escrito el compilador, pero la razón principal de esto es que muchas cosas se determinan en tiempo de ejecución .
Los errores de tiempo de ejecución, como ya conoce, estoy seguro, como yo, es cualquier tipo de error que ocurre durante la ejecución del programa en sí. Esto incluye dividir por cero, excepciones de puntero nulo, problemas de hardware y muchos otros factores.
La naturaleza de los errores de tiempo de ejecución significa que no puede anticipar dichos errores en tiempo de compilación. Si pudieras, casi seguramente se comprobarían en tiempo de compilación. Si pudiera garantizar que un número es cero en el momento de la compilación, podría realizar ciertas conclusiones lógicas, como dividir cualquier número por ese número dará como resultado un error aritmético causado por la división por cero.
Como tal, de una manera muy real, el enemigo de garantizar programáticamente el funcionamiento adecuado de un programa está realizando verificaciones de tiempo de ejecución en lugar de verificaciones de tiempo de compilación. Un ejemplo de esto podría ser realizar una conversión dinámica a otro tipo. Si esto está permitido, usted, el programador, esencialmente anula la capacidad del compilador de saber si es algo seguro. Algunos lenguajes de programación han decidido que esto es aceptable, mientras que otros al menos le avisarán en el momento de la compilación.
Otro buen ejemplo podría ser permitir que los nulos formen parte del lenguaje, ya que pueden producirse excepciones de puntero nulo si se permiten nulos. Algunos lenguajes han eliminado este problema por completo al evitar que las variables que no se declaran explícitamente puedan contener valores nulos para ser declarados sin que se les asigne inmediatamente un valor (tome Kotlin por ejemplo). Si bien no puede eliminar un error de tiempo de ejecución de excepción de puntero nulo, puede evitar que suceda eliminando la naturaleza dinámica del lenguaje. En Kotlin, puede forzar la posibilidad de mantener valores nulos, por supuesto, pero no hace falta decir que este es un "comprador cuidado" metafórico, ya que debe declararlo explícitamente como tal.
¿Podría conceptualmente tener un compilador que pueda verificar errores en todos los idiomas? Sí, pero probablemente sería un compilador torpe y altamente inestable en el que tendría que proporcionar necesariamente el idioma que se está compilando de antemano. Tampoco podía saber muchas cosas sobre su programa, más de lo que los compiladores para idiomas específicos saben ciertas cosas sobre él, como el problema de interrupción como mencionó. Resulta que es imposible obtener una gran cantidad de información que pueda ser interesante aprender sobre un programa. Esto ha sido probado, por lo que no es probable que cambie en el corto plazo.
Volviendo a su punto principal. Los métodos no son automáticamente seguros para subprocesos. Hay una razón práctica para esto, que es que los métodos seguros para subprocesos también son más lentos incluso cuando no se usan subprocesos. Rust decide que pueden eliminar los problemas de tiempo de ejecución al hacer que los métodos sean seguros para los subprocesos de forma predeterminada, y esa es su elección. Sin embargo, tiene un costo.
Puede ser posible demostrar matemáticamente la corrección de un programa, pero sería con la advertencia de que literalmente tendría cero funciones de tiempo de ejecución en el lenguaje. Podrías leer este idioma y saber lo que hace sin sorpresas. El lenguaje probablemente se vería de naturaleza muy matemática, y eso probablemente no sea una coincidencia allí. La segunda advertencia es que aún se producen errores de tiempo de ejecución , que pueden no tener nada que ver con el programa en sí. Por lo tanto, el programa puede ser probada correcta, asumiendo una serie de supuestos sobre el equipo que se está ejecutando en son precisos y no cambian, lo que por supuesto siempre no suceda de todos modos y frecuencia.