2012-07-10 19 views
14

He implementado un cargador simple para los complementos de Haskell en mi módulo Main.hs. La única función que uso ahora es load de this siteCómo reducir la huella binaria cuando se utilizan los 'complementos' del paquete Haskell?

Al mirar el tamaño de mi aplicación compilada, se muestra un archivo ejecutable de más de 53 MB en la arquitectura x86. Entiendo que grandes partes de GHC están vinculadas (debido a la función de complementos de haskell-fuente-a-binario) pero esto es excesivo para mis propósitos.

¿Existe alguna forma oficialmente aprobada de eliminar las características adicionales y solo conservar (dyn-)load?

+2

posible duplicado de [Pequeño programa Haskell compilado con GHC en binario enorme] (http://stackoverflow.com/questions/6115459/small-haskell-compiled-compiled-with-ghc-into-huge-binary) –

+0

@ DanielWagner: la creación de una aplicación '-dynamic' aún habría hecho referencia a las enormes bibliotecas compartidas, por lo que el problema de implementación no habría cambiado. – heisenbug

Respuesta

1

Depende del significado de 'oficialmente sancionado'. plugins (anteriormente conocido como hs-plugins) fue diseñado para ser una solución integral, con funciones de generación de código y carga dinámica. No apunta a la minimalidad.

Un paquete menos complejo está disponible con el nombre direct-plugins, que se centra en la carga dinámica de complementos. Este paquete lee los archivos de la interfaz Haskell (.hi) para obtener los tipos reales de símbolos, de modo que la seguridad de tipo es posible, pero también se proporciona una variante insegura. Desafortunadamente direct-plugins es bitrotten y no funciona (a.t.m.) con GHC v7.6.

En el extremo inferior del espectro está el paquete unix que proporciona un mecanismo similar al dlopen/dlsym para obtener símbolos que se exportan desde bibliotecas compartidas. También se proporciona una capa de conveniencia para cerrar automáticamente las bibliotecas abiertas después de que el procesamiento haya finalizado. Sin embargo, los símbolos se obtienen como FFI Ptr sy no son aptos para Haskell.

buscando en Internet he descubierto un paquete abandonado que parece estar operando en el punto medio:

  • carga de símbolos con Haskell convención de llamada se proporciona
  • dependencias y jerarquía de paquetes/módulo puede ser declarado
  • entorno de dependencia se gestiona de forma segura para subprocesos.

El paquete original es creado por Hampus Ram. Solo lo preparé para el último lanzamiento de GHC e hice algunas pruebas muy superficiales. Aquí está el repositorio:

https://github.com/ggreif/dynamic-loader

La única parte que falta es de tipo seguro el acceso de símbolos (por un mecanismo posiblemente configurable). Comentarios y parches de bienvenida.

+0

A partir de hoy, todas las rutinas de carga que devuelven resultados polimórficos deben tener un argumento que se usa para realizar 'comprobación de expectativas' en el símbolo cargado por algunos criterios (abiertos). – heisenbug

Cuestiones relacionadas