2012-02-08 13 views
8

al importar un (gran) módulo en un módulo principal en una de las siguientes maneras:Haskell: el crecimiento binario innecesario con las importaciones de módulos

import Mymodule 
import qualified Mymodule as M 
import Mymodule (MyDatatype) 

el binario compilado crece la misma cantidad enorme en comparación a cuando i don No importa ese módulo. Esto sucede independientemente de si uso algo dentro de ese módulo o no en el módulo Principal. ¿No debería el compilador (estoy usando GHC en Debian Testing) solo agregar al binario lo que se necesita para ejecutarlo?

En mi caso específico, tengo un gran mapa en Mymodule que no uso en el módulo principal. Importación selectiva de lo que realmente necesito, no cambió el crecimiento del binario compilado.

Respuesta

17

En lo que respecta a GHC, las listas de importación solo están ahí para facilitar la lectura y evitar los conflictos de nombres; no afectan a lo que está vinculado en absoluto.

Además, incluso si solo importó algunas funciones de una biblioteca, aún podrían depender de la mayor parte de la biblioteca internamente, por lo que no debería esperar necesariamente ver una disminución de tamaño utilizando solo algunas de las disponibles. interfaz en general.

De forma predeterminada, los enlaces GHC en bibliotecas completas, en lugar de solo las piezas que utiliza; usted podría evitar esto mediante la construcción de bibliotecas con la opción -split-objs a GHC (o poner split-objs: True en el archivo de configuración Cabal a instalar (~/.cabal/config en Unix)), pero ralentiza la compilación, y aparentemente no es recomendado por los desarrolladores de GHC:

-split-objs

Informe a todo el enlazador para dividir el archivo único objeto que normalmente se genera en varios archivos de objetos, uno por cada nivel superior función de Haskell o escribe en el módulo. Esto solo tiene sentido para las bibliotecas, donde significa que los ejecutables vinculados a la biblioteca son más pequeños, ya que solo enlazan con los archivos objeto que necesitan. Sin embargo, ensamblar todas las secciones por separado es costoso, por lo que es más lento que compilar normalmente. Además, el tamaño de la biblioteca en sí (el archivo .a) puede ser un factor de 2 a 2,5 más grande. Usamos esta característica para construir bibliotecas de GHC.

- The GHC manual

Esto omitir partes no utilizadas de las bibliotecas que utiliza, independientemente de lo que se importa.

También te puede interesar usar shared Haskell libraries.

+0

Citando a ehird: "En lo que respecta a GHC, las listas de importación solo están ahí para facilitar la lectura y evitar los conflictos de nombres, ya que no afectan a lo que está vinculado en absoluto". Eso no puede ser cierto, ya que el crecimiento en tamaño ocurre incluso si solo pongo un "módulo de importación" en el módulo principal sin usar nada dentro de ese módulo. – Josephine

+1

"Lista de importación" se refiere a la lista de identificadores para importar entre paréntesis después del nombre del módulo, no la lista de declaraciones de importación en la parte superior de un módulo. – ehird

+0

Correcto, eso tiene sentido. Gracias por la aclaración y la respuesta muy informativa! – Josephine

Cuestiones relacionadas