2012-07-10 4 views
14

Ich habe einen einfachen Lader für Haskell-Plugins zu meinem Main.hs-Modul implementiert. Die einzige Funktion, die ich gerade verwende, ist load von this siteWie reduziere ich den binären Fußabdruck bei der Verwendung von Haskell-Paket-Plugins?

Blick auf meine kompilierte Anwendungsgröße zeigt mir eine ausführbare Datei über 53 MB auf der x86-Architektur. Ich verstehe, dass große Teile von GHC verlinkt sind (aufgrund der Haskell-Source-to-Binary-Plugin-Funktion), aber das ist für meine Zwecke übertrieben.

Gibt es eine offiziell sanktionierte Möglichkeit, die zusätzlichen Funktionen zu entfernen und nur (dyn-)load zu behalten?

+2

mögliches Duplikat von [Kleines Haskell-Programm, kompiliert mit GHC in riesige Binärdatei] (http://stackoverflow.com/questions/6115459/small-haskell-program-compiled-with-ghc-into-huge-binary) –

+0

@ DanielWagner - das Erstellen einer '-dynamischen' Anwendung hätte immer noch auf die großen, gemeinsam genutzten Bibliotheken verwiesen, so dass sich das Bereitstellungsproblem nicht geändert hätte. – heisenbug

Antwort

1

Hängt von der Bedeutung von "offiziell sanktioniert" ab. plugins (früher bekannt als hs-plugins) wurde entwickelt, um eine allumfassende Lösung mit Codegenerierung und dynamischen Ladefunktionen zu sein. Es zielt nicht auf Minimalität ab.

Ein weniger komplexes Paket ist unter dem Namen direct-plugins verfügbar, das sich auf das dynamische Laden von Plugins konzentriert. Dieses Paket liest Haskell-Schnittstellen-Dateien (.hi), um die tatsächlichen Symboltypen zu erhalten, so dass Typensicherheit möglich ist, aber eine unsichere Variante wird ebenfalls bereitgestellt. Leider ist direct-plugins bitrotten und funktioniert nicht (a.t.m.) mit GHC v7.6.

Am untersten Ende des Spektrums gibt es die unix Paket, das eine dlopen/dlsym -ähnlichen Mechanismus zu bekommen halten Symbole bereitstellt, die von der gemeinsam benutzten Bibliotheken exportiert werden. Eine Convenience-Schicht wird ebenfalls bereitgestellt, um geöffnete Bibliotheken automatisch zu schließen, nachdem die Verarbeitung mit ihnen beendet wurde. Die Symbole werden jedoch als FFI Ptr s erhalten und sind nicht Haskell-aufrufbar.

Durch die Suche im Internet entdeckte ich eine verlassene-Paket, das im Mittelweg zu funktionieren scheint:

  • Laden von Symbolen mit Haskell-Aufrufkonvention vorgesehen ist
  • Abhängigkeiten und Paket/Modulhierarchie kann
  • deklariert werden
  • Abhängigkeitsumgebung wird auf thread-sichere Weise verwaltet.

Das Originalpaket wurde von Hampus Ram verfasst. Ich habe es nur für den neuesten veröffentlichten GHC vorbereitet und habe einige sehr oberflächliche Tests gemacht. Hier ist das Repository:

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

Das einzige fehlende Teil ist typsicher Symbol Zugriff (durch eine möglicherweise konfigurierbaren Mechanismus). Kommentare und Patches willkommen.

+0

Ab heute müssen alle Lade-Routinen, die polymorphe Ergebnisse zurückgeben, ein Argument erhalten, das verwendet wird, um eine Erwartungsüberprüfung für das geladene Symbol durch einige (offene) Kriterien durchzuführen. – heisenbug

Verwandte Themen