Я бы пока не соглашался с ответами.
Основная проблема, которую нужно понять, заключается в том, что компилятор C ++ создает код, подходящий для очень тупой среды. Даже современный процессор не знает о виртуальных функциях, черт возьми, даже функции растягиваются. Процессору действительно все равно, например, что код обработки исключений для разматывания стека находится вне какой-либо функции. Работа процессора в последовательностях команд, с переходами и возвратами. Функции, конечно же, не имеют имен в отношении процессора.
Следовательно, все, что необходимо для поддержки концепции функции, помещается компилятором. Например. vtables - это просто массивы правильного размера с правильными значениями с точки зрения CPU. __func__
заканчивается как последовательность байтов в таблице строк, последний из которых равен 00.
Теперь нет ничего, что говорило бы, что целевое окружение должно быть немым . Вы могли определенно предназначаться для JVM. Опять же, компилятор должен заполнить то, что не предлагается изначально. Нет сырой памяти? Затем выделите большой байтовый массив и используйте его вместо этого. Нет сырых указателей? Просто используйте целочисленные индексы в этом массиве больших байтов.
Основная проблема заключается в том, что программа C ++ выглядит совершенно неузнаваемой из среды хостинга. JVM не глупая, она знает о функциях, но ожидает, что они будут членами класса. Он не ожидает, что в их имени будут <
и >
. Вы можете обойти это, но то, что вы в конечном итоге, это в основном искажение имени. И в отличие от сегодняшнего искажения имени, этот вид искажения имени предназначен не для линкеров C, а для интеллектуальных сред. Таким образом, его механизм отражения может быть убежден, что существует класс c__plus__plus
с функцией-членом __namespace_std__for_each__arguments_int_pointer_int_pointer_function_address
, и это все еще хороший пример. Я не хочу знать, что произойдет, если у вас есть std::map
строк для обращения итераторов.
В действительности, наоборот, намного проще. Практически все абстракции других языков могут быть удалены в C ++. Вывоз мусора? Это уже разрешено в C ++ сегодня, так что вы можете поддерживать это даже для void*
.
Одна вещь, о которой я еще не говорил, это производительность. Эмуляция необработанной памяти в большом байтовом массиве? Это не будет быстрым, особенно если вы положите в них двойные. Вы можете сыграть много трюков, чтобы сделать это быстрее, но по какой цене? Вы, вероятно, не собираетесь получать коммерчески жизнеспособный продукт. На самом деле, вы можете использовать язык, который сочетает в себе худшие части C ++ (множество необычного поведения, зависящего от реализации) с худшими частями виртуальной машины (медленный).