Есть ли ruby obfuscator или "компилятор"?
Рубиновый обфускатор
Ответ 1
Есть несколько вариантов, например RubyScript2Exe или AllInOneRuby. Однако все обфускаторы интерпретируемых языков имеют серьезный недостаток: они обычно не понимают более сложные методы метапрограммирования.
То есть они не могут сказать, что что-то вроде foo.send(:bar, ...)
является вызовом метода bar
в совершенно другой библиотеке или что eval("require %w{abc def ghi}")
означает необходимость использования трех разных библиотек. Это тривиальные примеры - все становится намного сложнее, когда вы бросаете method_missing
и его ilk в микс.
Когда obfuscator встречает такой тип кода, он будет тщательно компилировать соответствующие инструкции, но он может и не знать, чтобы также включать определенные библиотеки или другой код из другого места. Это может вызвать серьезные проблемы, поскольку динамически include
d или require
d не будут доступны во время выполнения в статически связанном исполняемом файле.
К сожалению, многие драгоценные камни и библиотеки используют сложные методы метапрограммирования. Вероятно, вы столкнетесь с проблемой, если попытаетесь использовать обфускацию и ожидаете, что ваша программа будет иметь такое же поведение. Хуже того, потому что существует так много уровней косвенности, если в запутанной версии возникает ошибка, вы никогда не узнаете, что именно произошло или как ее воспроизвести.
Ответ 2
В зависимости от того, что вы пытаетесь сделать, есть Gem, который позволит вам создать расширение C из Ruby script, которое затем может использоваться как требование внутри вашего приложения Ruby. Его называют ruby2cext. Он будет запутывать весь ваш код на C, и вы можете потребовать .so в отдельном Ruby script, и он будет функционировать как обычный Ruby script.
Ответ 3
RubyScript2Exe - http://www.erikveen.dds.nl/rubyscript2exe/