I think HipHop for PHP is an interesting tool. It essentially converts PHP code into C++ code. Cross compiling in this manner seems like a great idea, but I have to wonder, how do they overcome the fundamental differences between the two type systems? One specific example of my general question is heterogeneous data structures. Statically typed languages don't tend to let you put arbitrary types into an array or other container because they need to be able to figure out the types on the other end. If I have a PHP array like this:
$mixedBag = array("cat", 42, 8.5, false);
How can this be represented in C++ code? One option would be to use void pointers (or the superior version, boost::any), but then you need to cast when you take stuff back out of the array... and I'm not at all convinced that the type inferencer can always figure out what to cast to at the other end. A better option, perhaps, would be something more like a union (or boost::variant), but then you need to enumerate all possible types at compile time... maybe possible, but certainly messy since arrays can contain arbitrarily complex entities.
Does anyone know how HipHop and similar tools which go from a dynamic typing discipline to a static discipline handle these types of problems?
They have generic variable type, that can contain any PHP value and such code would probably use these types when compiled from PHP. That means part of advantage that comes from representing PHP values as C++ types will be lost, but the idea is that code like you showed there is rare.
PHP doesn't have too many types, so it's not a problem having a structure that unites them all - that's what the actual engine behind PHP, Zend Engine, does.