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