2010-11-05 13 views
6

Como sé que en C, podemos usar el puntero de función y esto se llama durante el tiempo de ejecución (1).¿Por qué C no es un lenguaje dinámico?

Por definición de Wikipedia:

lenguaje de programación dinámica es un término utilizado ampliamente en informática a describir una clase de alto nivel lenguajes de programación que se ejecutan en tiempo de ejecución muchos comportamientos comunes que otra los lenguajes pueden realizarse durante la compilación , en todo caso ...

Así que mi pregunta es, ¿por qué C no es un lenguaje dinámico p ¿Cómo proporcionar la función en (1)?

Respuesta

5

Porque la función en su puntero de función todavía se compila en tiempo de compilación.

No se puede agregar una nueva función o modificar una función "sobre la marcha" en el tiempo de ejecución.

+1

Ooooh .. excelente punto +1. –

+0

Claro que puedes. Hay un código de auto modificación en la naturaleza. Sí, quiero decir que C. Code puede recompilarse a sí mismo y ejecutar un nuevo binario o modificar su binario actual. – samoz

+0

Puedes hacerlo con cualquier idioma. – winwaed

0

C no es un lenguaje de alto nivel, es de muy bajo nivel.

Carece de clases y otras características de alto nivel y, en su lugar, ofrece la posibilidad de manipular la memoria de forma directa.

Normalmente, los lenguajes dinámicos que se ejecutan en la parte superior de algunas VM, como la JVM o la CLR, se interpretan, a la Python, o usan una pila ejecutable, es decir, Haskell, para proporcionar funcionalidad. Por el contrario, C se compila directamente en el código de máquina.

Existen formas de hacer que C se auto-modifique, pero esa es una técnica muy difícil y no califica realmente como un "lenguaje dinámico".

+2

¿Dinámico no es lo mismo que alto nivel –

+0

Características? Más como distracciones. Direct bit-flipping en lugar de ... indirecta bitflipping? Todos los lenguajes manipulan la memoria, la mayoría de ellos mucho más que C, y mucho menos eficientemente. –

+0

¿Cómo es el cambio de bits una distracción? Para el trabajo de sistemas, este tipo de cosas es invaluable. – samoz

3

El comportamiento polimórfico no hace un lenguaje dinámico. En términos generales, alguien que se refiere a un "lenguaje dinámico" se refiere a su sistema de tipos. PHP es un lenguaje dinámico, porque cualquier variable puede contener cualquier clase de datos, y las conversiones entre tipos de datos se manejan implícitamente. La determinación de qué y cuándo convertir se realiza en tiempo de ejecución.

Además, creo que C falla la "clase de alto nivel lenguajes de programación" parte de la definición que cita.

+0

Sí, estos días C definitivamente no es de alto nivel, aunque pensé que era cuando lo aprendí por primera vez: después de BASIC, Pascal y Assembler; ¡Parecía que Pascal tenía una sintaxis divertida! – winwaed

1

Solo puede asignar un puntero a una función que existe en tiempo de compilación. No puede compilar una nueva función en medio de un programa C y asignar un puntero a esa función.

1

Un lenguaje generalmente se considera dinámico debido a su sistema de tipos. C está estáticamente estátipo. Esto significa que cada variable tiene un tipo asignado en la creación y ese tipo no puede cambiar. No puede poner datos flotantes en un puntero int *. En un lenguaje dinámico como Python, los datos tienen un tipo pero las variables no. Puedo asignar una cadena a la misma variable a la que asigno un entero.

La definición a la que se refiere también parece referirse a la programación dinámica, es decir, agregar código en tiempo de ejecución. En C es imposible, sin pensar en términos de ensamblaje, agregar un nuevo código después del tiempo de compilación. Su programa no puede decidir si necesita una nueva función mientras se está ejecutando. En un lenguaje como Scheme, puede.

* La conversión no cuenta porque está convirtiendo explícitamente el tipo.

Cuestiones relacionadas