Respuesta corta: no, porque la equivalencia de Turing.
Respuesta larga: Este tipo está siendo un troll. Si bien es cierto que los sistemas de tipos "lo restringen a un subconjunto", las cosas fuera de ese subconjunto son, por definición, cosas que no funcionan.
Cualquier cosa que pueda hacer en cualquier lenguaje de programación completo de Turing (que es un lenguaje diseñado para programación de propósito general, además de muchas cosas que no lo son; es una barra bastante baja para borrar y hay varios ejemplos de un sistema que se convierte en Turing- completa sin querer) que puede hacer en cualquier otro lenguaje de programación completo de Turing. Esto se llama "equivalencia de Turing" y solo significa exactamente lo que dice. Es importante destacar que no significa que pueda hacer la otra cosa con la misma facilidad en el otro idioma; algunos argumentarán que ese es el objetivo de crear un nuevo lenguaje de programación en primer lugar: brindarle una mejor manera de hacer ciertos cosas que los idiomas existentes apestan.
Un sistema de tipo dinámico, por ejemplo, se puede emular encima de un sistema de tipo OO estático simplemente declarando todas las variables, parámetros y valores de retorno como el Object
tipo base y luego usando la reflexión para acceder a los datos específicos, así que cuando se dé cuenta de esto ve que literalmente no hay nada que pueda hacer en un lenguaje dinámico que no pueda hacer en un lenguaje estático. Pero hacerlo de esa manera sería un gran desastre, por supuesto.
El tipo de la cita es correcto: los tipos estáticos restringen lo que puedes hacer, pero esa es una característica importante, no un problema. Las líneas en el camino restringen lo que puede hacer en su automóvil, pero ¿las encuentra restrictivas o útiles? (¡Sé que no me gustaría conducir en una carretera concurrida y compleja donde no hay nada que indique a los autos que van en la dirección opuesta para mantenerse a su lado y no venir a donde estoy conduciendo!) Al establecer reglas que delineen claramente lo que Si se considera un comportamiento no válido y se asegura de que no suceda, disminuye en gran medida las posibilidades de que ocurra un bloqueo desagradable.
Además, está describiendo mal el otro lado. No es que "todos los programas interesantes que desea escribir funcionen como tipos", sino que "todos los programas interesantes que desea escribir requerirán tipos". Una vez que superas un cierto nivel de complejidad, se vuelve muy difícil mantener la base de código sin un sistema de tipos para mantenerte en línea, por dos razones.
Primero, porque el código sin anotaciones de tipo es difícil de leer. Considere el siguiente Python:
def sendData(self, value):
self.connection.send(serialize(value.someProperty))
¿Cómo espera que se vean los datos que recibe el sistema en el otro extremo de la conexión? Y si está recibiendo algo que se ve completamente mal, ¿cómo se da cuenta de lo que está pasando?
Todo depende de la estructura de value.someProperty
. ¿Pero a qué se parece? ¡Buena pregunta! ¿Cuál es la llamada sendData()
? ¿Qué está pasando? ¿Cómo se ve esa variable? ¿De dónde vino? Si no es local, debe rastrear todo el historial de value
para rastrear lo que está sucediendo. ¿Quizás estás pasando algo más que también tiene una someProperty
propiedad, pero no hace lo que crees que hace?
Ahora veámoslo con anotaciones de tipo, como puede ver en el lenguaje Boo, que usa una sintaxis muy similar pero está estáticamente escrita:
def SendData(value as MyDataType):
self.Connection.Send(Serialize(value.SomeProperty))
Si algo sale mal, de repente su trabajo de depuración se vuelve más fácil: ¡busque la definición de MyDataType
! Además, la posibilidad de tener un mal comportamiento porque pasó algún tipo incompatible que también tiene una propiedad con el mismo nombre de repente se reduce a cero, porque el sistema de tipos no le permitirá cometer ese error.
La segunda razón se basa en la primera: en un proyecto grande y complejo, lo más probable es que tenga múltiples contribuyentes. (Y si no, lo está construyendo usted mismo durante mucho tiempo, que es esencialmente lo mismo. ¡Intente leer el código que escribió hace 3 años si no me cree!) Esto significa que no sabe lo que era pasar por la cabeza de la persona que escribió casi cualquier parte del código en el momento en que lo escribió, porque usted no estaba allí, o no recuerda si fue su propio código hace mucho tiempo. ¡Tener declaraciones de tipo realmente te ayuda a comprender cuál era la intención del código!
Las personas como el tipo en la cita con frecuencia describen erróneamente los beneficios de la escritura estática como "ayudar al compilador" o "todo sobre la eficiencia" en un mundo donde los recursos de hardware casi ilimitados hacen que esto sea cada vez menos relevante cada año que pasa. Pero como he demostrado, aunque esos beneficios ciertamente existen, el beneficio principal está en los factores humanos, particularmente la legibilidad y la facilidad de mantenimiento del código. (¡Sin embargo, la eficiencia adicional es ciertamente una buena ventaja!)