Как языки сценариев устанавливают/изменяют/читают переменные?

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

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

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

var тип содержал бы две строки name и value.

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

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

  • На языках, где переменные ясно определяются синтаксисом (PHP: $myVar), интерпретатор мог заменить все переменные численными значениями во время процесса парсинга. (Действительно ли я прав с этим?) Имеет место это?

5
задан lamas 1 February 2010 в 23:49
поделиться

3 ответа

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

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

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

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

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

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

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

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

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

3
ответ дан 14 December 2019 в 08:50
поделиться

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

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

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

.
2
ответ дан 14 December 2019 в 08:50
поделиться

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

[Итак, редакторы: не стесняйтесь добавлять больше ссылок на список вышеуказанных]

2
ответ дан 14 December 2019 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: