2012-07-10 10 views
14

Wdrożyłem prosty program ładujący dla wtyczek haskell do mojego modułu Main.hs. Jedyną funkcją, której teraz używam, jest load z this siteJak zmniejszyć ślad binarny podczas korzystania z wtyczek pakietu Haskell?

Przeglądając mój skompilowany rozmiar aplikacji, wyświetlam plik wykonywalny o wielkości ponad 53 MB w architekturze x86. Rozumiem, że duża część GHC jest połączona (ze względu na funkcję źródła haskell-source-to-binary), ale jest to przesada dla moich celów.

Czy istnieje oficjalnie usankcjonowany sposób na zgolenie dodatkowych funkcji i zachowanie tylko (dyn-)load?

+2

możliwy duplikat programu [Small Haskell skompilowany z GHC do ogromnego pliku binarnego] (http://stackoverflow.com/questions/6115459/small-haskell-program-compiled-with-ghc-into-uge-binary) –

+0

@ DanielWagner - tworzenie aplikacji '-dynamicznej' wciąż odnosiłoby się do ogromnych bibliotek współdzielonych, więc problem z wdrożeniem nie zmieniłby się. – heisenbug

Odpowiedz

1

W zależności od znaczenia terminu "oficjalnie usankcjonowane". plugins (wcześniej znany jako hs-plugins) został zaprojektowany jako kompleksowe rozwiązanie z funkcjami generowania kodu i dynamicznego ładowania. Nie ma na celu minimalności.

Mniej złożony pakiet jest dostępny pod nazwą direct-plugins, który koncentruje się na dynamicznym ładowaniu wtyczek. Pakiet ten odczytuje pliki interfejsu Haskell (.hi) w celu uzyskania rzeczywistych typów symboli, tak aby zapewnić bezpieczeństwo typu, ale dostępny jest również wariant niebezpieczny. Niestety direct-plugins jest bitrotten i nie działa (a.t.m.) z GHC v6.6.

Na najniższym końcu widma znajduje się pakiet unix, który zapewnia podobny mechanizm do pobierania symboli eksportowanych z bibliotek współdzielonych. Zapewniona jest także warstwa wygody, aby automatycznie zamykać otwarte biblioteki po zakończeniu przetwarzania z nimi. Jednak symbole są otrzymywane jako FFI Ptr s i nie są wciągane przez Haskella.

przeszukując Internet odkryłem opuszczonej pakiet, który wydaje się działać na kompromis:

  • ładowanie symboli z Haskell konwencji wywołania jest
  • zależności i pakiet/moduł hierarchii może być uznana
  • środowisko zależności jest zarządzane w sposób bezpieczny dla wątków.

Oryginalny pakiet jest autorstwa Hampus Ram. Przygotowałem go tylko na najnowszą wersję GHC i wykonałem kilka bardzo płytkich testów. Oto repozytorium:

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

Jedyną brakującą część jest bezpieczny dostęp wpisać symbol (o możliwie konfigurowalnego mechanizmu). Zapraszamy i komentarze i poprawki.

+0

Na dzień dzisiejszy wszystkie procedury ładowania, które zwracają wyniki polimorficzne, muszą otrzymać argument, który jest używany do wykonania "sprawdzania oczekiwań" na załadowanym symbolu za pomocą niektórych (otwartych) kryteriów. – heisenbug

Powiązane problemy