2010-02-01 24 views
5

Suponiendo que el intérprete para el idioma (Puede ser cualquier cosa de PHP a Ruby) está escrito en C. ¿Cómo son variables (o estructuras de datos más complejas no solo que contienen nombre y valor), que están definidas por el guión que se está ejecutado, almacenado y leído?¿Cómo los lenguajes de scripting establecen/modifican/leen variables?

Yo, con mi poco conocimiento de C, terminaría con la conclusión de que esto solo se puede hacer con una matriz.

// Variable type definition would go here 
var* variables; 

El tipo var contendría dos cadenas name y value.

Bien. Entonces un script define, por ejemplo: 30 variables. Ahora, si una de las variables tiene que ser leída, la función getVar (o algo similar) tendría que recorrer las 30 variables y comparar sus name s con el nombre de la variable solicitada. Imagine que con un ciclo que solicita

  • ¿Lo estoy entendiendo del todo? En caso afirmativo, ¿cómo manejan las variables (moderno?) Los lenguajes de scripting? ¿Cómo se almacenan y leen?

  • En los idiomas donde las variables están claramente definidas por la sintaxis (PHP: $myVar), el intérprete podría reemplazar todas las variables por valores numéricos durante el proceso de análisis. (¿Estoy en lo cierto con eso?) ¿Es este el caso?

+0

@lamas - Buena suerte con eso. Algunas veces querrás sacarte el pelo ... pero los compiladores e intérpretes son geniales. –

Respuesta

3

tablas hash, listas de ámbito relacionado, las referencias ... hay mucho a ella.

Lo que estás preguntando es medio abstracto, y la implementación es variable.

Dependiendo de la implementación:

  1. Los identificadores pueden ser compilados en las direcciones de memoria o direcciones de memoria relativos, o lugares sin nombre que hace referencia el código de bytes.
  2. Los identificadores pueden ser considerados-up dinámicamente en el ámbito de aplicación en tiempo de ejecución

En un lenguaje básico secuencias de comandos, los nombres de variables cuando encoutered se pondría en una estructura alcance tal como una lista enlazada que contiene una tabla hash implementación para buscar identificadores en ese alcance.

Cuando se hace referencia a una variable, el código de tiempo de ejecución lo busca en la tabla hash y obtiene algún valor (una dirección de memoria de una estructura, por ejemplo) que se relaciona con ese valor. Las estructuras se pueden utilizar para implementar escalares variables:

enum stype = { INT, STRING, FLOAT, BOOL }; 
struct scalar { 
    enum stype type; 
    generic_blob_t *heap_blob; 
}; 

o alguna variación de mi pobre fuente de ejemplo.

Algunos buenos libros son "Modern Compiler Implementation in C" y Dragon Book. Leer sobre este tema es una buena idea; Lo recomendaría a cualquier programador.

2

Casi con seguridad usan una estructura de datos más sofisticada.

struct Var 
{ 
    char *name; 
    int type; 
    union value; .... 
    }; 

y luego los almacena en un árbol (almohadilla o binario), de modo que puedan ser recuperados por su nombre

+1

Es probable que haya una tabla hash (en lugar de un árbol), ya que no es probable que se necesite acceder a las variables en orden ordenado. – caf

2

Normalmente, las implementaciones de lenguaje de scripting utilizarán estructuras de datos C bastante complejas para representar variables en el lenguaje de scripting. Para los idiomas en que están bien definidos extensiones C, la documentación está disponible:

[Así editores: no dude en añadir más referencias a la lista anterior]

+0

+1 Ejemplos de grietas de interacción C-to-type para unión. Me gusta el enfoque de Python. –

Cuestiones relacionadas