Подтвердить что ты не робот

Преобразование Ruby на языки низкого уровня?

У меня есть все виды скриптов с Ruby:

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

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

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

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

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

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

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

Существуют ли реализации для этого?

4b9b3361

Ответ 1

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

  • включить рубиновую среду выполнения
  • включает стандартную библиотеку (которая не была создана для производительности, но для удобства использования).
  • разрешить метапрограммирование
  • сделать динамическую отправку
  • и др.

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

Пример

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

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

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

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

Ответ 5

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

Ответ 6

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

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

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