Ответ 1
Есть несколько вариантов, например RubyScript2Exe или AllInOneRuby. Однако все обфускаторы интерпретируемых языков имеют серьезный недостаток: они обычно не понимают более сложные методы метапрограммирования.
То есть они не могут сказать, что что-то вроде foo.send(:bar, ...)
является вызовом метода bar
в совершенно другой библиотеке или что eval("require %w{abc def ghi}")
означает необходимость использования трех разных библиотек. Это тривиальные примеры - все становится намного сложнее, когда вы бросаете method_missing
и его ilk в микс.
Когда obfuscator встречает такой тип кода, он будет тщательно компилировать соответствующие инструкции, но он может и не знать, чтобы также включать определенные библиотеки или другой код из другого места. Это может вызвать серьезные проблемы, поскольку динамически include
d или require
d не будут доступны во время выполнения в статически связанном исполняемом файле.
К сожалению, многие драгоценные камни и библиотеки используют сложные методы метапрограммирования. Вероятно, вы столкнетесь с проблемой, если попытаетесь использовать обфускацию и ожидаете, что ваша программа будет иметь такое же поведение. Хуже того, потому что существует так много уровней косвенности, если в запутанной версии возникает ошибка, вы никогда не узнаете, что именно произошло или как ее воспроизвести.