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

Возможно ли скомпилировать Ruby в байтовый код, как с Python?

В Python, если я хочу выдать приложение без источников, я могу скомпилировать его в байт-код .pyc, есть ли способ сделать что-то подобное в Ruby?

4b9b3361

Ответ 1

Я написал гораздо более подробный ответ на этот вопрос в вопросе "Может ли Ruby, PHP или Perl создать предварительно скомпилированный файл для кода, такого как Python?

Ответ: это зависит. Язык Ruby не имеет положений для компиляции в байт-код и/или запуск байт-кода. Он также не имеет спецификации формата байт-кода. Причина этого проста: она слишком ограничивала бы разработчиков языка, если бы они были вынуждены использовать конкретный формат байт-кода или даже байт-коды вообще. Например, XRuby и JRuby компилируются в байт-код JVM, Ruby.NET и IronRuby, компилируются в байт-код CIL, кардинал компилируется в PAST, SmallRuby компилируется в байт-код Smalltalk/X, MagLev компилируется в байт-код GemStone/S. Для всех этих реализаций было бы глупо использовать любой другой формат байт-кода, чем тот, который они используют в настоящее время, поскольку все их точки взаимодействуют с другими языковыми реализациями, которые используют один и тот же формат байт-кода.

Simlar для MacRuby: он компилируется в собственный код, а не в байт-код. Опять же, использование байт-кода было бы глупо, так как одной из целей является запуск Ruby на iPhone, который в значительной степени требует родного кода.

И, конечно же, существует МРТ, которая является чистым интерпретатором AST-walk script и, следовательно, не имеет формата байт-кода.

При этом есть некоторые Ruby-реализации, которые позволяют компилировать и загружать из байт-кода. Рубиний позволяет это, например. (Действительно, он должен иметь такую ​​функциональность, поскольку его Ruby-компилятор написан в Ruby, и поэтому компилятор должен быть скомпилирован для байт-кода Rubinius во-первых, чтобы решить Catch-22.)

YARV также может сохранять и загружать байт-код, хотя функциональность загрузки в настоящее время отключена до тех пор, пока не будет реализован верификатор байт-кода, который запрещает пользователям загружать управляемый байт-код, который может сбой или иным образом подорвать интерпретатор.

Но, конечно, оба они имеют свои собственные форматы байткода и не понимают друг друга (ни tinyrb, ни RubyGoLightly, ни...) Кроме того, ни один из этих форматов не понимается JVM или CLR и наоборот.

Однако весь смысл не имеет значения, потому что, как указывает Марк, вы всегда можете полностью перепроектировать байтовый код, особенно в таких случаях, как CPython, PyPy, Rubinius, YARV, tinyrb, RubyGoLightly, где формат байт-кода был специально разработан чтобы быть очень близким к исходному языку.

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

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

Единственное реальное решение не является техническим, а социальным: как только вы написали свой код, он автоматически полностью защищен законом об авторском праве, без необходимости делать что-то одно. Это. Ваш код защищен.

Ответ 3

Хотя Ruby 1.9 YARV VM является компилятором байтового кода, я не верю, что он может выгрузить байт-код на диск. Возможно, вам захочется взглянуть на альтернативный компилятор, Rubinius, я считаю, что у него есть эта способность. Следует отметить, что файлы pic-байтового кода (и я представляю себе эквивалент ruby) можно легко "декомпилировать".

Ответ 4

Не с интерпретатором MRI, нет.

Некоторые новые VM обрабатываются там, где это находится в таблице, но в настоящее время они не широко используются (или даже готовы к использованию).

Ответ 5

Если вы используете Jruby, вы можете скомпилировать свой Ruby-код в файлы Java.class(включая Rails-материал), чтобы выполнить их с помощью (open) jdk из коробки!

Вы даже можете скомпилировать свой полный материал в файл .war, чтобы развернуть его на Apache Tomcat или Jboss с помощью инструмента под названием "warbler"

https://rubygems.org/gems/warbler/