Принятие интерпретатора для языка (Может быть что-либо от PHP до Ruby) записано в C. Как переменные (или более сложные структуры данных не только containg имя и значение), которые определяются сценарием, который в настоящее время выполняется, хранится и считывается?
Я, с моим довольно плохим знанием C, закончил бы с заключением, что это может только быть сделано с массивом.
// Variable type definition would go here
var* variables;
var
тип содержал бы две строки name
и value
.
Хорошо. Таким образом, сценарий определяет, например: 30 переменных. Теперь, если одна из переменных должна быть считана, функция getVar
(или что-то подобное), должен был бы идти через все 30 переменных и сравнить их name
s с названием требуемой переменной. Предположите, что с циклом, который запрашивает
Я получаю его полностью неправильно? Если да, как делают (современный?) языки сценариев обрабатывают переменные? Как они хранятся и считываются?
На языках, где переменные ясно определяются синтаксисом (PHP: $myVar
), интерпретатор мог заменить все переменные численными значениями во время процесса парсинга. (Действительно ли я прав с этим?) Имеет место это?
Хеш-таблицы, связанные списки областей видимости, ссылки ... в этом есть много смысла.
То, что вы спрашиваете, является наполовину абстрактным, а реализация варьируется.
В зависимости от реализации:
В базовом языке сценариев имена переменных при использовании будут помещены в структуру области , такую как связанный список, содержащий реализация хэш-таблицы для поиска идентификаторов в этой области.
При обращении к переменной исполняемый код просматривает ее в хэш-таблице и получает некоторое значение (например, адрес в памяти структуры), которое относится к этому значению. Структуры могут использоваться для реализации скалярных переменных:
enum stype = { INT, STRING, FLOAT, BOOL };
struct scalar {
enum stype type;
generic_blob_t *heap_blob;
};
Или какой-то вариант моего плохого исходного кода.
Некоторые хорошие книги: « Современная реализация компилятора на C » и Dragon Book . Прочитать эту тему - хорошая идея; Я бы рекомендовал его любому программисту.
Они почти наверняка используют более сложную структуру данных.
struct Var
{
char *name;
int type;
union value; ....
};
, а затем сохраняют их в дереве (хэш или двоичном), чтобы их можно было получить по имени
.Как правило, реализования языка сценариев будут использоваться довольно сложные структуры данных C данных для представления переменных в языке сценариев. Для языков, где C, четко определены расширения C, документация легко доступна:
[Итак, редакторы: не стесняйтесь добавлять больше ссылок на список вышеуказанных]