Конвертировать Ruby в языки низкого уровня? - PullRequest
13 голосов
/ 22 августа 2010

У меня есть все виды сценариев на Ruby:

rails (symfony)
ruby (php, bash)
rb-appscript (applescript)

Можно ли заменить языки низкого уровня на Ruby?

Я пишу на Ruby, и он преобразует его в Java,c ++ или c.

Причина Люди говорят, что когда дело касается более критичных для производительности задач в Ruby, вы можете расширить его с помощью C. Но слово extends означает, что вы пишете C-файлы, которые вы просто вызываете в своем коде Ruby,Интересно, мог бы я вместо этого использовать Ruby и преобразовать его в исходный код C, который будет скомпилирован в машинный код.Тогда я мог бы «расширить» его с помощью C, но в коде Ruby.

Вот о чем этот пост.Пишите все на Ruby, но получите производительность C (или Java).

Второе преимущество заключается в том, что вам не нужно изучать другие языки.

Так же, как HipHop для PHP.

Есть ли реализации для этого?

Ответы [ 6 ]

13 голосов
/ 22 августа 2010

Такой компилятор был бы огромной частью работы. Даже если он работает, он все равно должен

  1. включает среду исполнения ruby ​​
  2. включает стандартную библиотеку (которая была создана не для производительности, а для удобства использования)
  3. разрешить метапрограммирование
  4. сделать динамическую отправку
  5. и т.д.

Все это накладывает огромные штрафы во время выполнения, потому что компилятор C не может ни понять, ни оптимизировать такие абстракции. Ruby и другие динамические языки не только медленнее, потому что они интерпретируются (или компилируются в байт-код, который затем интерпретируется), но также , потому что они динамические.

Пример

В C ++ вызов метода может быть встроен в большинстве случаев, потому что компилятор знает точный тип this. Если передан подтип, метод все равно не может измениться, если он не является виртуальным, и в этом случае используется все еще очень эффективная таблица поиска.

В Ruby классы и методы могут изменяться любым способом в любое время, поэтому каждый раз требуется (относительно дорогой) поиск.

Языки, такие как Ruby, Python или Perl, имеют много функций, которые просто стоят дорого, и большинство, если не все соответствующие программы в значительной степени полагаются на эти функции (конечно, они чрезвычайно полезны!), Поэтому они не могут быть удаленным или встроенным.

Проще говоря: динамические языки очень трудно оптимизировать, просто делать то, что делал бы интерпретатор, и компилировать это в машинный код - это не значит. Как доказывает V8, можно добиться невероятной скорости работы с динамическими языками, но вам приходится тратить на это огромные кучи денег и офисы, полные умных программистов.

10 голосов
/ 22 августа 2010

Существует https://github.com/seattlerb/ruby_to_c компилятор Ruby To C. Хотя на самом деле это только подмножество Ruby. Я считаю, что основная недостающая часть - это функции метапрограммирования

7 голосов
/ 09 февраля 2013

В недавнем интервью (16 ноября 2012 г.) Юкихиро "Matz" Мацумото (создатель Ruby) рассказал о компиляции Ruby для C

(...) в Токийском университете, студент-исследовательработает над академическим исследовательским проектом, который компилирует код Ruby в код C перед компиляцией двоичного кода.Процесс включает в себя такие методы, как вывод типа, и в оптимальных сценариях скорость может достигать до 90% типичного рукописного кода C.Пока что опубликована только статья, открытого исходного кода пока нет, но я надеюсь, что в следующем году все будет раскрыто ... ( из интервью )

Только одинСтудента не много, но это может быть интересный проект.Вероятно, долгий путь к полной поддержке Ruby.

5 голосов
/ 22 августа 2010

«Низкий уровень» очень субъективен. Многие люди рисуют линию по-разному, поэтому ради этого аргумента я просто собираюсь предположить, что вы имеете в виду компиляцию Ruby до промежуточной формы, которую затем можно превратить в машинный код для вашей конкретной платформы. То есть компилирование ruby ​​в C или LLVM IR или что-то в этом роде.

Короткий ответ: да, это возможно.

Более длинный ответ выглядит примерно так:

Несколько языков (особенно Objective-C) существуют в виде тонкого слоя над другими языками. Синтаксис ObjC на самом деле просто свободная оболочка для вызовов libjjj во время выполнения objc _ * () для всех практических целей.

Зная это, что делает компилятор? В общем, он работает как любой компилятор C, но также принимает специфичные для objc вещи и генерирует соответствующие вызовы функций C для взаимодействия со средой выполнения objc.

Компилятор ruby ​​может быть реализован в аналогичных терминах.

Следует также отметить, что простое преобразование одного языка в форму более низкого уровня не означает, что язык мгновенно будет работать лучше, хотя и не означает, что он будет работать хуже. Вы действительно должны спросить себя, почему вы хотите это сделать, и если это веская причина.

3 голосов
/ 23 августа 2010

Производительность не зависит только от "низкого уровня" скомпилированных языков.Кросс-компиляция вашей Ruby-программы в извилистый, автоматически сгенерированный C-код также не поможет.Скорее всего, это просто запутает, затянет время компиляции и т. Д. И есть гораздо лучшие способы.

Но сначала вы говорите «языки низкого уровня», а затем упоминаете Java.Ява не является языком низкого уровня.Это всего лишь один шаг ниже Ruby с точки зрения языков высокого или низкого уровня.Но если вы посмотрите на то, как работает Java, JVM, байт-код и компиляция точно в срок, вы увидите, насколько быстрыми могут быть языки высокого уровня.Руби в настоящее время делает нечто подобное.MRI 1.8 был интерпретированным языком, и у него были некоторые проблемы с производительностью.1.9 намного быстрее, он использует интерпретатор байт-кода.Я не уверен, случится ли это когда-нибудь на MRI, но Ruby находится всего в одном шаге от JIT на MRI.

Я не уверен насчет технологий, стоящих за jRuby и IronRuby, но они уже могут бытьделая это.Тем не менее, оба имеют свои преимущества и недостатки.Я склонен придерживаться МРТ, он достаточно быстрый и работает просто отлично.

3 голосов
/ 22 августа 2010

Существует также JRuby , если вы по-прежнему считаете Java языком низкого уровня. На самом деле сам язык здесь не имеет ничего общего: его можно компилировать в байт-код JVM, который не зависит от языка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...