The use of an intermediate language during compilation or interpretation can provide more opportunities for optimisation.
Differences in how programming languages handle de-allocation of memory is another issue when trying create interoperability.
This requires that each object will have to manually be de-allocated, in order for the garbage collector to release the memory safely.
Mutability becomes an issue when trying to create interoperability between pure functional and procedural languages.
Languages like Haskell have no mutable types, whereas C++ does not provide such rigorous guarantees.