¿Por qué no utiliza cabal install
la bandera --enable-shared por defecto? He notado que los programas triviales cuando se compilan sin esta bandera, se vuelven enormes en tamaño de archivo. ¿Hay una conexión? ¿Es esta una elección de diseño relacionada con cómo los programas Haskell se implementarán fácilmente en un solo binario autónomo?Haskell Static vs Dynamic Linking en Despliegue
Respuesta
Creo que tiene que ver con la falta de soporte. Sin embargo, no puedo obtener una respuesta directa sobre si GHC actualmente es compatible con enlaces dinámicos. La página wiki de GHC SharedLibraries/PlatformSupport tiene dos años.
En Windows, intenté crear un montón de paquetes con --enable-shared
, incluido un programa simple que escribí que usa http-enumerator para descargar desde una URL cada 30 segundos. Cuando ejecuté el programa (después de poner todos los archivos DLL en una carpeta con mi programa), segfaulted después de unos segundos. Cuando compilé con --threaded
, segregué inmediatamente.
Intenté esto en GHC 7.0.3. A documentation page for that version dice:
Hacer las bibliotecas de Haskell en DLL no funciona en Windows en este momento; esperamos volver a instalar esta instalación en el futuro (consulte la Sección 4.12, "Uso de bibliotecas compartidas"). ...
Este aviso no aparece en versiones posteriores.
Por cierto hay otra molestia para los binarios estáticos además del tamaño del código. GHC usa GMP para su gran soporte entero. GMP está licenciado bajo LGPL. Esto significa que si necesita distribuir un binario de propiedad, o si tiene una dependencia que no es compatible con GPL (por ejemplo, OpenSSL), tendrá que distribuir sus archivos de objeto para cumplir con la licencia de GMP. O eso, o encuentra una forma de hacer que libgmp se vincule dinámicamente. Me gustaría saber cómo hacer eso.
hace esta respuesta todavía se mantienen desde marzo de 2015? –
- 1. jQuery Linking vs. Descargar?
- 2. Const vs Static Const
- 3. PHP5: const vs static
- 4. Java Static vs Instance
- 5. Boost.Thread Linking - boost_thread vs. boost_thread-mt
- 6. C++, static vs. namespace vs. singleton
- 7. static vs extern "C"/"C++"
- 8. Static ViewModels vs installed ViewModels
- 9. public static vs static public - ¿hay alguna diferencia?
- 10. Dynamic Lang. Runtime vs Reflection
- 11. linking boost.asio
- 12. Android: enum vs static final ints?
- 13. Métodos de extensión vs Static Utility Class
- 14. Static Vs Instance Method Performance C#
- 15. HttpRuntime Caché vs. static dictionary/fields
- 16. C# Instance Constructor vs Static Constructor
- 17. Ajax deep linking?
- 18. Comprender xcode linking (ld)
- 19. CMake linking problem
- 20. Haskell: ascensor vs liftIO
- 21. Comparación Haskell vs. Prolog
- 22. Haskell: Listas vs Streams
- 23. Despliegue de VS 2010 sin implementación web
- 24. Weak Linking Foundation y UIKit?
- 25. CMake linking to boost. error LNK2005
- 26. Dynamic MemberExpression
- 27. Linking Server en SQL Server 2008 R2
- 28. Haskell vs. Python threading model
- 29. Haskell operador vs función precedencia
- 30. Haskell: datos algebraicos vs Tupla
ISTR el soporte de biblioteca compartida es bastante nuevo y no funciona en todas las plataformas, también dificulta la distribución de ejecutables. Y el espacio es barato, entonces, ¿a quién le importa? Sin embargo, habrá una mejor respuesta. – luqui
@luqui: El espacio puede ser barato, pero ¿qué pasa con el ancho de banda? ¿Qué pasa si necesita enviar actualizaciones para su programa de 20MB a través de Internet a clientes con conectividad menos que ideal? –
vea también [Documentos de GHC sobre "Uso de bibliotecas compartidas"] (http://downloads.haskell.org/~ghc/7.8.4/docs/html/users_guide/using-shared-libs.html) – mb21