Такой компилятор был бы огромной частью работы. Даже если он работает, он все равно должен
- включает среду исполнения ruby
- включает стандартную библиотеку (которая была создана не для производительности, а для удобства использования)
- разрешить метапрограммирование
- сделать динамическую отправку
- и т.д.
Все это накладывает огромные штрафы во время выполнения, потому что компилятор C не может ни понять, ни оптимизировать такие абстракции. Ruby и другие динамические языки не только медленнее, потому что они интерпретируются (или компилируются в байт-код, который затем интерпретируется), но также , потому что они динамические.
Пример
В C ++ вызов метода может быть встроен в большинстве случаев, потому что компилятор знает точный тип this
. Если передан подтип, метод все равно не может измениться, если он не является виртуальным, и в этом случае используется все еще очень эффективная таблица поиска.
В Ruby классы и методы могут изменяться любым способом в любое время, поэтому каждый раз требуется (относительно дорогой) поиск.
Языки, такие как Ruby, Python или Perl, имеют много функций, которые просто стоят дорого, и большинство, если не все соответствующие программы в значительной степени полагаются на эти функции (конечно, они чрезвычайно полезны!), Поэтому они не могут быть удаленным или встроенным.
Проще говоря: динамические языки очень трудно оптимизировать, просто делать то, что делал бы интерпретатор, и компилировать это в машинный код - это не значит. Как доказывает V8, можно добиться невероятной скорости работы с динамическими языками, но вам приходится тратить на это огромные кучи денег и офисы, полные умных программистов.