Bir programı çalıştırmak için en iyi Haskell kitaplıkları hangileridir? [kapalı]


115

Bir programı üretime sokacaksam, o programın "operasyonel" olduğunu düşünmek için yapmam gereken birkaç şey var - yani hem mühendisler hem de operasyon personeli tarafından ölçülebilir ve doğrulanabilir bir şekilde çalışıyor ve sürdürülebilir. Benim amaçlarım için, operasyonel hale getirilmiş bir programın:

  • Birden çok düzeyde oturum açabilme (ör: hata ayıklama, uyarı vb.).
  • Programın yaptığı iş türleri ve bu işin ne kadar sürdüğü ile ilgili ölçümleri / istatistikleri toplayıp paylaşın. İdeal olarak, toplanan ölçümler, Ganglia gibi yaygın olarak kullanılan izleme araçlarıyla uyumlu bir formatta mevcuttur veya bu şekilde kullanılabilir.
  • İdeal olarak, çalışan programlarda yapılandırılmış özelliklerin söz konusu programları yeniden başlatmadan güncellenmesine izin veren bir sistem aracılığıyla yapılandırılabilir olun.
  • Tekrarlanabilir bir şekilde uzak sunuculara konuşlandırılabilir olun.

Scala dünyasında, en azından ilk üç gereksinimi karşılayan iyi kütüphaneler vardır. Örnekler:

Dağıtıma gelince, Scala dünyasında benimsenen bir yaklaşım, bir kişinin programını oluşturan bayt kodunu ve kitaplıkları assembly-sbt gibi bir şeyle bir araya getirip ardından ortaya çıkan paketi (bir "şişman JAR") Capistrano gibi bir araçla uzak sunuculara göndermektir. SSH üzerinden paralel olarak komutları yürüten. Bu, dile özgü araçları gerektiren bir sorun değil, ancak Haskell topluluğunda böyle bir aracın var olup olmadığını merak ediyorum.

Muhtemelen yukarıda anlattığım özellikleri sağlayan Haskell kitaplıkları vardır. Mevcut kütüphanelerden hangilerinin "en iyi" olarak kabul edildiğini bilmek isterim; yani, en olgun, bakımlı, Haskell topluluğunda yaygın olarak kullanılan ve Haskell'in en iyi uygulamalarının bir örneğidir.

Haskell kodunu "üretime hazır" yapma konusunda başka kitaplıklar, araçlar veya uygulamalar varsa, bunları da bilmek isterim.


1
Haskell yerel olarak derlendiğinden, dördüncü mermi sorun yaratabilir. Çalışabilecek veya çalışmayabilecek statik olarak derlemeyi deneyebilirsiniz, ancak en iyisi üretim sunucusunda geliştirme sunucusundakine benzer bir ortama sahip olursunuz. Cabal-dev, diğer makinelere aktarım için uygun olabilecek korumalı ortamdır. O zaman bile en azından temel kitaplıkların hedef makineye yüklenmesi gerekir.
Masse

1
Diğer araçlar ve tekniklerle ilgili olarak, bu SO sorusu bir genel bakışa sahiptir: stackoverflow.com/questions/3077866/…
Don Stewart

1
Bir diğer şey - * nix sistemlerinde çok sayıda işlem istatistiklerine ve meta verilere doğrudan / proc dosya sistemi aracılığıyla erişebilirsiniz. Dolayısıyla, iç gözlem yapmak için birkaç rutin yazarsanız, çalışma zamanına doğrudan kancaların eksikliğini ikame etmeye yardımcı olur.
sclv

1
Aynı ortam üzerine kurduğunuz sürece bir ikiliyi dağıtmak kolaydır (bilgisayarınız farklı bir mimariyse bir hazırlama sunucunuz olmalıdır). Daha sonra ikili dosyayı ve herhangi bir harici dosyayı yeniden senkronize edebilirsiniz. Haskell için yeniden başlatma komutlarını otomatik olarak yürütmek için ssh kitaplığı yoktur, ancak capistrano'yu kullanabilirsiniz.
Greg Weber

1
@tchrist İlk paragrafın geri kalanını ve madde işaretli listeyi , anlamını düz bir İngilizce ile açıklayan operasyonelleştirilmiş sözcüğün hemen ardından harcıyor .
Will McCutchen

Yanıtlar:


54

Bu harika bir soru! İşte ilk kesik.

Birden çok düzeyde oturum açabilme (ör: hata ayıklama, uyarı vb.).

hslogger kolayca en popüler günlükleme çerçevesidir.

Programın yaptığı iş türleri ve bu işin ne kadar sürdüğü ile ilgili ölçümleri / istatistikleri toplayıp paylaşın. İdeal olarak, toplanan ölçümler, Ganglia gibi yaygın olarak kullanılan izleme araçlarıyla uyumlu bir formatta mevcuttur veya bu şekilde kullanılabilir.

Standartlaştırılmış herhangi bir raporlama aracından haberdar değilim, ancak +RTS -sakışlardan raporları çıkarmak (veya çıktı bayraklarını profil oluşturmak yoluyla) geçmişte yaptığım bir şeydi.

$ ./A +RTS -s
64,952 bytes allocated in the heap
1 MB total memory in use
 %GC time       0.0%  (6.1% elapsed)
 Productivity 100.0% of total user, 0.0% of total elapsed

Bunu makine tarafından okunabilir formatta da alabilirsiniz:

$ ./A +RTS -t --machine-readable

 [("bytes allocated", "64952")
 ,("num_GCs", "1")
 ,("average_bytes_used", "43784")
 ,("max_bytes_used", "43784")
 ,("num_byte_usage_samples", "1")
 ,("peak_megabytes_allocated", "1")
 ,("init_cpu_seconds", "0.00")
 ,("init_wall_seconds", "0.00")
 ,("mutator_cpu_seconds", "0.00")
 ,("mutator_wall_seconds", "0.00")
 ,("GC_cpu_seconds", "0.00")
 ,("GC_wall_seconds", "0.00")
 ]

İdeal olarak, bir soket üzerinden çalışan bir GHC çalışma zamanına bağlanabilir ve bu GC istatistiklerine etkileşimli olarak bakabilirsiniz, ancak şu anda bu çok kolay değildir ("rts / Stats.h" arabirimine bir FFI bağlanması gerekir). ThreadScopeGC'yi ve diş açma davranışını kullanarak bir işleme iliştirebilirsiniz .

İzleme için kullanılabilen artımlı, kayıtlı zaman ve alan profili oluşturma için benzer bayraklar mevcuttur (örneğin, bu grafikler artımlı olarak oluşturulabilir).

hpcTixtürü aracılığıyla programın yürütülmesi hakkında birçok istatistik toplar ve insanlar hangi kodun yürütüldüğünü zaman dilimine göre günlüğe kaydetmek için araçlar yazmıştır .

İdeal olarak, çalışan programlarda yapılandırılmış özelliklerin söz konusu programları yeniden başlatmadan güncellenmesine izin veren bir sistem aracılığıyla yapılandırılabilir olun.

Bunun için çeşitli araçlar mevcuttur, xmonad tarzı durum yeniden yükleme yapabilirsiniz; veya plugins* paketleri veya hint. Bunlardan bazıları diğerlerinden daha deneysel.

Yeniden üretilebilir dağıtımlar

cabal-devTekrarlanabilir yapılar yapmak için bir araç olan Galois kısa süre önce piyasaya sürüldü (yani bağımlılıklar kapsamlı ve kontrol edildi).


6
Dyre paketinin xmonad tarzı durum yeniden yüklemesini soyutlaması gerekiyor, bu yüzden özellikle belirtilmesi gerektiğini düşünüyorum. Bununla birlikte, yeniden derlemeyi ve yeniden konuşlandırmayı birbirine bağlar, bu nedenle gerçekten tüm araç zincirine sahip bir makinedeki değişikliklerle ilgilidir. Uzaktan yeniden dağıtımlar için, benim zevkime göre biraz ağır olsa da, asit hali gibi bir şey istersiniz. Daha zayıf garantileri olan bu kalıcı mvar soyutlamasına sahibim, ancak bir ikilinin her açılışında tuttuğu son verilerle sihirli bir şekilde doldurulan düz bir MVar gibi davranabilirsiniz.
sclv

2
Ayrıca, GHC'nin yeni EventLoggünlükleme çerçevesi ( +RTS -lçalışma zamanında kullanılarak) akışlar , olay günlüğü formatını okuyan herhangi bir araçla görselleştirilebilen bir dosyaya çıktı.
Don Stewart

2
Bir program böyle kendi olayların günlüklerini, yayacaktır: galois.com/~dons/tmp/A.event.log - olarak görüntülenmiştir olabilir - i.imgur.com/QAe6r.png . Bu formatın üzerine başka izleme araçları oluşturmayı hayal edebiliyorum.
Don Stewart

2
Ayrıca, birçok profil oluşturma aracının test için harika olduğunu, ancak üretim kodu için çok fazla olmadığını unutmayın. Ek yükü bir yana bırakırsak, örneğin -prof sadece tek bir işlemci ile kullanılabilir.
sclv

9
  • Yapılandırma ile ilgili olarak, ConfigFile'ı projelerim için yararlı buldum. Üretimdeki tüm artalan süreçlerim için kullanıyorum. Otomatik olarak güncellenmez.
  • Cabal-dev'i ortamlarda (yerel, dev, meslektaş-yerel) yeniden üretilebilir yapılar oluşturmak için kullanıyorum. Gerçekten de cabal-dev, özellikle proje dizini içindeki kütüphanelerin yerel, yamalı sürümlerini destekleyebilmesi için vazgeçilmezdir.
  • Değeri ne olursa olsun, xmonad tarzı durum yeniden yüklemesiyle giderdim. Haskell'in saflığı bunu önemsiz kılıyor; göç bir sorun ama yine de öyle. IRCd'm için hsplugins ve ipucu ile deneyler yaptım ve ilk durumda bir GHC çalışma zamanı sorunu vardı ve ikincisinde bir segmentasyon hatası vardı. Daha sonra postmortem için Github'daki şubeleri bıraktım: https://github.com/chrisdone/hulk

ConfigFile Örneği:

# Default options
[DEFAULT]
hostname: localhost
# Options for the first file
[file1]
location: /usr/local
user: Fred

9

Don'un söylediği her şeyi tekrar eder ve birkaç genel tavsiye eklerdim.

Örneğin, göz önünde bulundurmak isteyebileceğiniz iki ek araç ve kitaplık:

  • Özellik tabanlı test için QuickCheck
  • genişletilmiş bir sürümü olarak hlint-Wall

Bunların her ikisi de kod kalitesini hedefliyor.

Bir kodlama uygulaması olarak Lazy IO'dan kaçının. Akış IO'ya ihtiyacınız varsa, numaralandırıcı gibi yinelenen kitaplıklardan biriyle gidin . Hackage'a bakarsanız, http istekleri için numaralandırıcı stili kullanan http-numaralandırıcı gibi kitaplıklar görürsünüz.

Hackage ile ilgili kitaplıkları seçmeye gelince, bazen kaç paketin bir şeye bağlı olduğuna bakmak yardımcı olabilir. Hackage'ı yansıtan bu web sitesini kullanabileceğiniz bir paketin ters bağımlılıklarını kolayca görün:

Uygulamanız, birçok isteği işleyen bir web sunucusu gibi sıkı döngülerle sonuçlanırsa, tembellik alan sızıntıları şeklinde bir sorun olabilir. Genellikle bu, doğru yerlere kesinlik ek açıklamaları ekleme meselesidir. Profil çıkarma, deneyim ve okuma özü, bu tür şeylerle savaşmak için bildiğim ana teknikler. Bildiğim en iyi profil referanstır Bölüm 25 arasında Gerçek Dünya Haskell .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.