Как языки сценариев устанавливают / модифицируют / считывают переменные? - PullRequest
5 голосов
/ 02 февраля 2010

Предполагается, что интерпретатор языка (может быть что угодно, от PHP до Ruby) написан на C. Каким образом переменные (или более сложные структуры данных не только связаны с именем и значением), которые определяются сценарием, который в данный момент выполняется, хранится и считывается?

Я, с моим довольно слабым знанием C, пришел бы к выводу, что это можно сделать только с массивом.

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

Тип var будет содержать две строки name и value.

Хорошо. Таким образом, скрипт определяет, например: 30 переменных. Теперь, если нужно прочитать одну из переменных, функция getVar (или что-то подобное) должна будет пройти через все 30 переменных и сравнить их name с именем запрошенной переменной. Представьте, что с циклом, который запрашивает

  • Я правильно понял? Если да, как (современные?) Языки сценариев обрабатывают переменные? Как они хранятся и считываются?

  • В языках, где переменные четко определены синтаксисом (PHP: $myVar), интерпретатор может заменить все переменные числовыми значениями во время процесса синтаксического анализа. (Я прав с этим?) Это тот случай?

Ответы [ 3 ]

3 голосов
/ 02 февраля 2010

Хеш-таблицы, списки связанных областей, ссылки ... есть много всего.

То, что вы спрашиваете, является наполовину абстрактным, а реализация является переменной.

В зависимости от реализации:

  1. Идентификаторы могут быть скомпилированы в адреса памяти, или относительные адреса памяти, или безымянные местоположения, на которые ссылается байт-код.
  2. Идентификаторы могут динамически просматриваться в области во время выполнения

В базовом языке сценариев имена переменных при их вводе будут помещены в структуру области действия , такую ​​как связанный список, содержащий реализацию hashtable для поиска идентификаторов в этой области.

Когда на переменную ссылаются, код времени выполнения ищет ее в хеш-таблице и получает некоторое значение (например, адрес памяти структуры), которое относится к этому значению. Структуры могут использоваться для реализации скалярных переменных:

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

Или какой-то вариант моего плохого примера источника.

Вот некоторые хорошие книги: " Современная реализация компилятора в C " и Dragon Book . Читать эту тему - хорошая идея; Я бы порекомендовал это любому программисту.

2 голосов
/ 02 февраля 2010

Как правило, реализации языка сценариев используют довольно сложные структуры данных C для представления переменных в языке сценариев. Для языков, где расширения C четко определены, документация доступна:

[SO редакторы: не стесняйтесь добавлять больше ссылок в приведенный выше список]

2 голосов
/ 02 февраля 2010

Они почти наверняка используют более сложную структуру данных.

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

, а затем сохраните их в дереве (хэш или двоичный файл), чтобы их можно было получить по имени

...