Что касается разработки компилятора с языка, очень похожего на JavaScript на C++, мне нужен способ представления структур данных. Основными структурами данных JavaScript являются массивы и хэш-таблицы. Массивы более сложны: я могу использовать вектор нетипизированных указателей. Он должен быть вектором, потому что массивы JS являются динамическими и указателями, потому что массивы JS могут содержать любой объект, например:
var array = [1,2,[3,4],"test"];
Я не вижу способа представить это, кроме этого (есть?). Для хэшей я мог бы использовать что-то похожее, за исключением включения шага хеширования строки на доступ.
Проблема заключается в следующем: JavaScript-хэши JIT-компилируются в реальные C++ объекты, которые, вероятно, намного быстрее, чем хеши. Таким образом, я боюсь, что моя попытка сгенерировать C++, как это, приведет к более медленному коду, чем версия JavaScript!
Если это компилятор AOT, вы можете обрабатывать только хэш-ключи, которые вы видите во время компиляции. В этом случае вы можете изменять хеш-доступ к известным ключам к обращениям к массиву, предоставляя каждому известному ключу небольшое целое число как индекс.
function f(o) { return o.a; }; f({a: 1, b: 2}); f({a: 1, c: 2});
a
, b
и c
всегда будут доступны, и может преобразовать хеширование в простой смещенный доступ.