Как такие инструменты, как Hiphop для PHP, работают с разнородными массивами?

Я думаю, что HipHop для PHP — интересный инструмент. По сути, он преобразует код PHP в код C++. Кросс-компиляция таким образом кажется отличной идеей, но я должен задаться вопросом, как они преодолевают фундаментальные различия между двумя системами типов? Одним из конкретных примеров моего общего вопроса являются гетерогенные структуры данных. Статически типизированные языки обычно не позволяют помещать произвольные типы в массив или другой контейнер, потому что они должны иметь возможность определять типы на другом конце. Если у меня есть такой массив PHP:

$mixedBag = array("cat", 42, 8.5, false);

Как это можно представить в коде C++? Одним из вариантов было бы использование указателей void (или улучшенная версия, boost::any), но тогда вам нужно выполнить приведение, когда вы берете что-то обратно из массива... и я совсем не уверен, что механизм вывода типа всегда можно понять, к чему лить на другом конце. Лучшим вариантом, возможно, было бы что-то более похожее на объединение (или boost::variant), но тогда вам нужно перечислить все возможные типы во время компиляции... возможно, но, конечно, беспорядочно, поскольку массивы могут содержать сколь угодно сложные сущности.

Кто-нибудь знает, как HipHop и подобные инструменты, которые переходят от дисциплины динамической типизации к дисциплине статической, справляются с такими проблемами?


person Derek Thurn    schedule 25.12.2010    source источник
comment
Кто сказал, что код C++, сгенерированный из PHP, не будет грязным?   -  person    schedule 25.12.2010


Ответы (1)


У них есть общий тип переменной, который может содержать любое значение PHP, и такой код, вероятно, будет использовать эти типы при компиляции из PHP. Это означает, что часть преимуществ, связанных с представлением значений PHP в виде типов C++, будет потеряна, но идея состоит в том, что код, который вы показали, встречается редко.

В PHP не так уж много типов, поэтому не проблема иметь структуру, объединяющую их все — это то, что делает фактический движок, стоящий за PHP, Zend Engine.

person StasM    schedule 25.12.2010