Конвертировать Ruby в языки низкого уровня?

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

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

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

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

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

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

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

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

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

13
задан Shoe 25 May 2013 в 22:25
поделиться

5 ответов

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

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

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

Пример

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

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

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

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

13
ответ дан 1 December 2019 в 18:49
поделиться

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

10
ответ дан 1 December 2019 в 18:49
поделиться

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

3
ответ дан 1 December 2019 в 18:49
поделиться

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

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

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

3
ответ дан 1 December 2019 в 18:49
поделиться

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

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

Более длинный ответ звучит примерно так:

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

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

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

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

5
ответ дан 1 December 2019 в 18:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: