2010-01-23 30 views

Respuesta

25

Hay algunas opciones, como RubyScript2Exe o AllInOneRuby. Sin embargo, todos los ofuscadores de idiomas interpretados tienden a tener un defecto grave: por lo general no entienden las técnicas de metaprogramación más sofisticadas.

Es decir, que no necesariamente detecte a que algo como foo.send(:bar, ...) es una invocación del método bar en una biblioteca completamente diferente, o que eval("require %w{abc def ghi}") significa para requerir tres bibliotecas diferentes. Estos son ejemplos triviales: las cosas se vuelven mucho más complejas cuando lanzas method_missing y su estilo en la mezcla.

Cuando un ofuscador encuentra este tipo de código, diligentemente compilará las instrucciones apropiadas, pero puede que no sepa incluir también ciertas bibliotecas u otro código de otra parte. Eso puede causar problemas graves, ya que dinámicamente include d o require d no estará disponible en tiempo de ejecución en un archivo ejecutable enlazado estáticamente.

Desafortunadamente, muchas gemas y bibliotecas usan sofisticadas técnicas de metaprogramación. Es probable que se meta en problemas aquí si intenta usar la ofuscación y espera que su programa tenga el mismo comportamiento. Peor aún, debido a que hay tantos niveles de direccionamiento indirecto, si ocurre un error en la versión ofuscada, es posible que nunca sepas qué sucedió exactamente o cómo reproducirlo.

+7

Nota: Este no es un comentario sobre la capacidad de RubyScript2Exe o AllInOneRuby específicamente, solo comentarios generales sobre la inadecuación de ofuscadores en idiomas que tienen poderosas capacidades de reflexión/introspección. –

3

Dependiendo de lo que esté tratando de hacer, hay una Gema que le permitirá crear una extensión C a partir de un script de Ruby que luego se puede usar como un requerimiento dentro de su aplicación Ruby. Se llama ruby2cext. Ofuscará todo su código en C y podrá requerir .so en un script de Ruby separado y funcionará como un script de Ruby normal.

+1

este proyecto se ve bien ... es una pena que esté abandonado :(editar: https://github.com/rdp/crystalizer –