Во-первых, я новичок в 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.
Есть два хороших подхода к этому.
Во-первых, обрабатывать локальные переменные как имя последовательности значений. Это позволяет вам работать с ценности, не переменные, а значения имеют типы, даже если переменные не имеют.
Менее эффективный способ справиться с этим — создать полиморфное хранилище, например boost::any
или же std::any
, В случае JS есть только несколько базовых типов, поэтому boost::variant
или же std::variant
более чем достаточно (Сложные объекты JS — это просто устаревшие карты ключ-значение).
variant
тип помеченного объединения. Структура данных имеет целое число или перечисление, в котором указывается тип хранилища, а затем блок хранилища, который можно рассматривать как любой из этих типов. Средства доступа проверяют тип, а затем взаимодействуют с данными, как если бы это был тот тип.
Помеченное объединение может заменить сохраненные данные данными другого типа, уничтожив их вручную (используя .~X()
синтаксис), затем вручную создайте новый тип в этом месте (используяnew
синтаксис). Выполнение этого в C в основном то же самое с немного меньшей языковой поддержкой.
Первый метод — выяснить, какой тип действительно существует и работать с ним — имеет тенденцию быть на порядок быстрее (в тех случаях, когда я видел его в профиле), поэтому умные движки сценариев работают очень усердно, чтобы это произошло , Но второе достаточно функционально.
Теперь я не знаю, если node.js
фактически перекомпилируется в код C / C ++. Но после слоев компиляции, синтаксического анализа и байт-кода, он будет интерпретирован C / C ++ или интерпретатором сборки, или он сам скомпилируется в машинный код без прохождения промежуточного этапа C / C ++. Решение этой проблемы в машинном коде эквивалентно C / C ++ в любом случае.
Других решений пока нет …