c ++ 11 — Как реализованы динамические переменные для Node.JS в переполнении стека

Во-первых, я новичок в C / C ++, будь милостив.

В Node.JS все переменные являются динамическими, и мы можем привести переменную любого типа. Итак, Node.JS написан на C ++, а в C ++ или C нет динамических переменных. Так как же реализованы динамические переменные?

В JS:

var A;
A = 5; //Integer
A = "Hello world!"; //String
A = 2.5; //Float
A = 5 * "Hello world!"; // I do not sure about this one.

2

Решение

Есть два хороших подхода к этому.

Во-первых, обрабатывать локальные переменные как имя последовательности значений. Это позволяет вам работать с ценности, не переменные, а значения имеют типы, даже если переменные не имеют.

Менее эффективный способ справиться с этим — создать полиморфное хранилище, например boost::any или же std::any, В случае JS есть только несколько базовых типов, поэтому boost::variant или же std::variant более чем достаточно (Сложные объекты JS — это просто устаревшие карты ключ-значение).

variant тип помеченного объединения. Структура данных имеет целое число или перечисление, в котором указывается тип хранилища, а затем блок хранилища, который можно рассматривать как любой из этих типов. Средства доступа проверяют тип, а затем взаимодействуют с данными, как если бы это был тот тип.

Помеченное объединение может заменить сохраненные данные данными другого типа, уничтожив их вручную (используя .~X() синтаксис), затем вручную создайте новый тип в этом месте (используяnew синтаксис). Выполнение этого в C в основном то же самое с немного меньшей языковой поддержкой.

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

Теперь я не знаю, если node.js фактически перекомпилируется в код C / C ++. Но после слоев компиляции, синтаксического анализа и байт-кода, он будет интерпретирован C / C ++ или интерпретатором сборки, или он сам скомпилируется в машинный код без прохождения промежуточного этапа C / C ++. Решение этой проблемы в машинном коде эквивалентно C / C ++ в любом случае.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector