¿Es Objective-C un lenguaje dinámico? Por qué
¿Qué es el “lenguaje dinámico”? En realidad, este concepto no tiene una definición clara. Básicamente es una medida de grado. Este nivel es la cantidad de datos de contabilidad que utiliza el tiempo de ejecución del lenguaje.
Quienes hayan leído "Diseño y evolución de C++" deben conocer el pervertido principio de contabilidad cero de C++. Cualquier concepto de alto nivel del lenguaje C++ se eliminó durante la etapa de compilación. Es difícil decir por el código objeto final que se trata de un lenguaje de alto nivel. El precio, por supuesto, es que el programador debe comprender por qué ciertas características no se pueden implementar en C++. Y debe entenderse desde la perspectiva de la máquina.
El lenguaje dinámico es en realidad un proceso de adición constante de contabilidad.
Por ejemplo, para lograr polimorfismo en C++, todavía tiene que haber un mecanismo intermedio, que es una tabla virtual. Pero difícilmente se puede decir que la mesa virtual sea una estructura de contabilidad. Porque es demasiado simple. Objective-C ha aumentado considerablemente el mecanismo de contabilidad para llamadas a funciones miembro. Debido a esto, la implementación de action-message en Objective-C es mucho más simple, porque puede determinar si existe una función miembro. Y también puede especificar un método como función de devolución de llamada sin conocer el tipo de objeto.
Otro problema con C++, la gestión de la memoria, es que sus referencias a objetos utilizan el mecanismo de puntero sin formato. Objective-C no mejora esto. Pero no está exento de mejoras. En Objective-C, un puntero casi siempre apunta a NSObject, y esto tiene una base de referencia. Por supuesto, no resuelve completamente el problema de la liberación excesiva o el uso después de la liberación. Cuando se trata de lenguajes como Java, Python y Lua, los punteros sin formato desaparecen por completo.
En cuanto a la gestión de memoria de C++, aparte del montón, solo hay una pila gestionada por la pila de la CPU. En los lenguajes dinámicos se debe considerar el desempeño del alcance léxico, lo que requiere más contabilidad. Objective-C tampoco implementa esto.
El procesamiento gramatical en C++ se realiza completamente antes del tiempo de ejecución. En lenguajes como Python, Lisp y Lua, existen mecanismos como eval.
Entonces, Objective-C es un lenguaje con características más dinámicas que C y C++, pero en comparación con Lua, Lisp carece de algunas características dinámicas. En cuanto a Python comparado en la pregunta, solo se puede decir que es un lenguaje que carece de características dinámicas. Python carece de alcance léxico y soporte para continuaciones. Su pila depende de la pila de CPU (por supuesto, existe un Python sin pila, pero no es oficial. Por el contrario, Lua mantiene su propia pila de VM para admitir la rutina y Lisp para admitir la continuación completa). La contabilidad de Python también es inadecuada en comparación con Lua y Lisp.