Büyük ölçekli web uygulamaları için gerçek dünyada “güçlü” bir tür sistemi kullanmak mı?


29

Bunun çok geniş, belirsiz ve muhtemelen felsefi bir soru olduğunu biliyorum. Bir dereceye kadar, "güçlü" tip sistem - sorudaki en önemli anahtar kelimenin kendisinin kötü tanımlanmış olduğu bir ölçüde . Öyleyse ne demek istediğimi açıklamaya çalışayım.

Sorunun genel içeriği

Ruby on Rails'de çok büyük ölçekli bir web uygulaması oluşturduk ve yığınımızdan genel olarak memnunuz. İstediğimiz zaman, çok hızlı bir şekilde gönderebiliriz - "iş" davasının% 90'ında çalışan, yaklaşık% 10'luk son vakalardan endişe etmeden çalışan bir şey. Öte yandan, kod incelemeleri ve test kapsamı sayesinde, yavaş ve kasıtlı olabiliriz ve tüm üsleri kapattığımızdan emin olabiliriz - tekrar, sadece bu kadar yakından inceleme ve güvenliği gerektiren durumlarda.

Bununla birlikte, ekip büyüdükçe, yığına fırlamış bir "güvenlik ağı" olmamasından rahatsız olmaya başladım.

Geçenlerde Java’da bazı Android geliştirmeleri yapmaya başladık. Ve derlenmiş / statik / kuvvetle yazılmış bir dilin sağladığı güvenliği hatırlatıyordum.

  • Yanlış yazılan değişkenler, yanlış veri türleri, yanlış fonksiyon çağrıları ve bir çok önemli hata IDE'niz tarafından yakalanır. Bunun nedeni, IDE'nin derleyiciye bağlanabilmesi ve "doğruluk" programının bazı yönlerini doğrulayabilmesi.
  • Bir işlev imzasını değiştirmeniz mi gerekiyor? Kolay. Derleyici + IDE, TÜM arama sitelerini görmenize yardımcı olabilir.
  • Bazı istisnaların her zaman ele alındığından emin olmanız mı gerekiyor? Kurtarmanız için istisnalar kontrol edildi.

Şimdi, bu güvenlik özelliklerinin avantajları varken, dezavantajlarının da farkındayım. Dahası, "kazan ağır" Java dünyasında. Bu nedenle, Java yerine, insanların bugünlerde çalışmaya başladıkları modern, "güçlü şekilde yazılmış" dilleri aramaya başladım. Örneğin: Scala, Rust, Haskell, vb. Beni en çok ilgilendiren şey, tür sistemlerinin ve statik / derleme zamanı denetimlerinin gücüdür.

Şimdi soru

Bu güçlü tip sistemleri ve statik / derleme zamanı özelliklerini daha büyük uygulamalarda nasıl kullanırım?

Örneğin, bu güçlü özelliklerle ilgili standart "merhaba dünya" tanıtımı türünün ötesine nasıl geçebilirim? Bir işletme etki alanı sorununu modellemek için zengin bir tür sistemi kullanan biri mi? Tip sistemi, 30.000 LOC + bölgesinde bulunduğunuzda yardımcı oluyor mu veya engelliyor mu? Sisteminiz zayıf yazılmış dış dünyayla etkileşime girdiğinde, bu tip sistemler (ve derleme zamanı kontrolleri) tarafından sağlanan güvenlik ağına ne olur? JSON veya XML API'leri, çeşitli veri depoları, kullanıcı girişi vb.


12
Bu konu dışı çünkü gerçek bir cevap yok. Sorunun, tartışmaya açık bir açıklama değil, tartışmalı bir tartışma ("Statik türlerden hoşlanıyorum / sevmiyorum çünkü ..."), tartışmaya yol açması amaçlanıyor . Tavsiyem, “Sisteminiz zayıf yazılmış dış dünyayla etkileşime girdiğinde bu tip sistemler tarafından sağlanan güvenlik ağına ne olur?” Gibi sorunuzun daha özel parçalarından birini seçmek olacaktır. ve bununla ilgili soruyu tekrar yazın. Gelecekteki okuyucular için bu şekilde faydalı olacak kesin cevaplar alacaksınız.
Benjamin Hodgson

5
Kaynak önerileri de burada konu dışıdır (çünkü bu tür cevaplar hızlı bir şekilde eskiden kalıyor ve bu konuda Google’dan daha iyi değiliz). Benjamin’in dediği gibi, gönderinize gömülen bazı cevaplanabilir sorular var, ancak şu anki durumundaki bütün gönderi, temel olarak insanlardan Quora veya Reddit’e bir StackExchange’e göre daha iyi olan bu dilleri kullanarak deneyimlerini açıklamalarını istiyor. bir site. Aşağı oy kullanmıyorum, çünkü bu soru soruluyor, fakat sadece bir StackExchange sorusu değil.
Ixrec

4
Tip bir sistem bir araçtır ve diğer tüm aletler gibi, etkinliği de büyük ölçüde aletin kendisine değil koruyucuya bağlıdır. İş mantığınızla ilgili değişmezleri tür düzeyinde kodlamak için Haskell gibi bir dilin tür sistemini kaldırabilir ve bu değişmezlerin derleyici zamanında bir makine (derleyici) tarafından denetlenmesini sağlayabilirsiniz, ancak bunu yapabilmek için ... tip sistemi ve tip kontrolü. Doğru soru, "bu web siteleri için iyi bir araç" değil, "işte karşılaştığım bazı özel problemler; bunları çözmek için nasıl güçlü bir sistem kullanılabilir?"
user2407038 15

5
Tanımladığınız şeylerin çoğu tür sistemi ile ilgisi yoktur. Tamamen IDE özellikleri. İşaretli istisnalar hariç (amaçlanan hariç) istisna dışında, bahsettiğiniz tüm özellikler, statik olarak yazılmış diller için IDE'lerde görünmeden çok önce Smalltalk IDE'lerinde mevcuttu. Aslında, en yaygın kullanılan Java IDE'lerinden biri aslında değiştirilmiş bir Smalltalk IDE (Java kodunu anlamak için değiştirilmiş ancak yine de Smalltalk'ta yazılmış ve daha sonra Java'ya aktarılan VisualAge Java olarak yayımlanan IBM VisualAge Smalltalk olarak başladı) ve ... olarak yayınlandı
Jörg W Mittag

4
… VisualAge Java Micro Edition, daha sonra yeniden kullanılabilir bileşenlere bölündü ve Eclipse adı altında Açık Kaynak olarak yayınlandı). Bu soru bağlamında ironik bir şekilde, tam da Smalltalk sistemlerinin dinamik yapısından dolayı Smalltalk IDE'lerin bu kadar güçlü olmasından kaynaklanıyor. Otomatik Refactorings icat edildi ve ilk önce Smalltalk'ta uygulandı. Mantığınıza göre, Haskell sizin belirttiğiniz tüm dillerin en güçlü, en katı statik tip sistemine sahip olduğundan, en iyi IDE'lere sahip olmalıdır. Ama öyle değil. Ayrıca "derleyiciye takılmaktan" bahsettiniz. Bu…
Jörg W Mittag

Yanıtlar:


34

Şu anda zamanım olmadığı için kısa bir cevap vereceğim, ancak şu anda iki büyük proje üzerinde çalışıyorum (> Haskell'de> 100.000 LOC) - flowbox.io ve luna-lang.org. Programlama dilimizin arka ucu, derleyicisi ve hatta webGL tabanlı GUI dahil tüm parçalar için Haskell kullanıyoruz. Güçlü tip sistemin ve "bağımlı tip" benzeri makinelerin sizi yönlendirebileceğini ve sizi diğer dillerden bilinen yük ve güçlüklerden kurtarabileceğini itiraf etmeliyim. Türleri çok yoğun kullanıyoruz ve derleme zamanında kontrol edilebilecek her şey böyle yapılıyor. Aslında, son 3 yıllık gelişim boyunca, hiçbir zaman, herhangi bir çalışma zamanı hatası veya yığın taşması ile karşılaşmadık (ve bu gerçekten inanılmaz bir şey). Tek hata, programcılar tarafından yapılan açık mantık hatalarıdır. Pek çok insan, Haskell'de bir şey derlerse, sadece işe yaradığını ve bir gün yüzünüze patlamayacağından emin olmanız gerektiğini söyler.

Sorunun ilk bölümünü cevaplama: Şunun gibi harika blogları okuyan bu güçlü tip sistem özelliklerini öğrenebilirsiniz:

Aslında, dışarıda bir sürü hoş blog var ( gezegen Haskell gibi ). Her neyse, gelişmiş tip sistemleri gerçekten anlamak için en iyi yöntem, faydalı bir açık kaynak kitaplığı geliştirmektir. Biz (Flowbox & New Byte Order'ta) çok sayıda kütüphane yayınlıyoruz (onları Hackage'ta bulabilirsiniz), yani ne geliştireceğinizi bilmiyorsanız, projelerime dahil olabilirsiniz - sadece ne zaman bana e-posta gönderirseniz istiyorum (posta luna-lang.org adresinde mevcuttur ).


4
“Bir çok insan, Haskell'de bir şey derlerse, sadece işe yaradığını ve bir gün yüzünüze çarpmayacağından emin olmanız gerektiğini söylüyor.”: Haskell'i sadece küçük (önemsiz olmasa da) projeler için kullandım. , ancak bunu doğrulayabilirim: Haskell derleyicisi yerine geldiğinde, kalan hataları nadiren bulurum.
Giorgio,

1
Muhtemelen en çok türden nefret eden "Haskell" adamlarından biriyim (çoğu zaman Haskell'in kendi versiyonunu yazdım ) - hepsinden öte farklı nedenlerle. Yazılım mühendisliği söz konusu olduğunda, ben de, GHC mutlu olduğunda programınızın çalıştığını hissediyorum. Haskell benzeri tip sistemler sadece programlamada insancıl hataları tespit etmek için değil aynı zamanda devasa kod tabanlarını kontrolünüz altında tutmak için mükemmel bir araçtır. (Her ne zaman tip
hatalarını

Gabriel Gonzales'in blogu ile başlamak en iyisidir.
sam boosalis

@ danilo2 Şirket web sitenizdeki contact @ adresine bir e-posta gönderdiniz. Cevap vermeni istemek için. Teşekkürler!
Saurabh Nanda,

@ SaurabhNanda: Gelen kutumuzu iki kez kontrol ettim ve sizden hiçbir mesaj göremiyorum. <at> luna-lang.org adresine gönderdin mi? Lütfen doğrudan wojciech <dot> danilo <at> gmail <dot> com adresime yazarak bizimle iletişime geçin; bu sorunun nedenini araştıracağız :)
danilo2

17

Zayıf, güçlü ve güçlü yazım oldukça belirsizdir. Ayrıca, en yakın olanı 'güçlü tiplendirme' nin genel bir kullanımı olduğundan, tiplerin dökümünü zorlaştıran şeylere atıfta bulunmaktır, bu da daha güçlü tip sistemleri tanımlamak için hiçbir şey bırakmaz. 30 libreden az taşıyabiliyorsanız, zayıfsınız ve daha fazla kaldırabilecek herkes aynı “güçlü” kategoridedir - yanıltıcı bir ayrım.

Bu yüzden tanımı tanımıyorum:

  • Zayıf yazılmış sistemler, bazı şeyleri yapmanıza engel olmak için türler kullanır (hatalar gibi)
  • Kesinlikle yazılan sistemler , sizin için işleri yapmak için türleri kullanır

Senin için bir şeyler yaparak ne demek istiyorum? Pekala, bir görüntü dönüştürme API'sini Servant çerçevesinde yazmayı inceleyelim (Haskell'da, ancak bunu takip etmek için gerçekten bilmenize gerek yok, göreceksiniz ...)

{-# LANGUAGE
    TypeOperators,
    DataKinds
    #-}

import Codec.Picture
import Data.Proxy
import Network.Wai.Handler.Warp (run)
import Servant
import Servant.JuicyPixels

main :: IO ()
main = run 8001 conversion

Bu, Servant paketini ve JuicyPixels eklentisini Servant'a ekleyen bazı modüller istediğimizi ve programın ana giriş noktasının, Warp arka ucunu kullanan sunucu olarak 8001 portundaki 'dönüşüm' işlevini çalıştırmak olduğunu söylüyor. Dil bitini yoksay.

conversion :: Application
conversion = serve (Proxy :: Proxy ConversionApi) handler

Bu, dönüşüm işlevinin API'nin 'ConversionApi' türüyle eşleşmesi ve isteklerin işlev tarafından işlendiği bir sunucu olduğunu söylüyor handler

type ConversionApi
     = ReqBody '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage
    :> Post '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] DynamicImage

Bu tür belirtiyor ConvesionApi. '[BMP, GIF, JPEG 50, PNG, TIFF, RADIANCE] listesi tarafından belirtilen gelen içerik türlerini kabul etmemiz ve bunları bir DynamicImage olarak ele almamız ve aynı içerik aralığına dönüştürülmüş bir DynamicImage döndürmemiz gerektiğini söylüyor. türleri. Tam olarak ne anlama geldiği konusunda endişelenmeyin:> şu an için mutlu sihir olarak düşünün.

Bu yüzden, tercih ettiğim tanımıma göre, zayıf yazılmış bir sistem artık aşağıdakileri sağlayabilir:

  • Yanlış giden içerik türünü döndürmüyorsunuz
  • Gelen isteği yanlış içerik türü olarak ayrıştırmazsınız
  • Sunucumuz daha karmaşık olsaydı, hatalı biçimlendirilmiş URI'lar oluşturmamızı önlerdi, ancak aslında bağlantıları içeren herhangi bir HTML sayfası döndürmüyoruz (ve tür yapamayız!)
  • Gerçekten iddialı ve zayıf bir yazma sistemi, gelen ve giden tüm içerik türlerini ayrıntılı bir şekilde ele aldığımızdan emin olarak kontrol edebilir ve bu da türün yalnızca bir kısıtlama yerine bir özellik belgesi olarak hareket etmesine izin verebilir.

Tüm yüce hedefler, ancak aslında tanımlanmış bir sistem olarak nitelendirilmek için yeterli değil, yukarıdaki tanım. Ve şimdi bu şartnameyi izleyen kod yazmanın zor kısmına gitmeliyiz . Gerçekten güçlü bir tip sistemde şunu yazıyoruz:

handler = return

Ve sonra bitti. İşte bu, yazacak başka kod yok . Bu tamamen işlevsel bir web sunucusudur (kaçırdığım herhangi bir yazım hatası modulo). Tür, derleyiciye web sunucumuzu oluşturmak için ihtiyaç duyduğumuz her şeyi anlattı ve içe aktardığımız türlerden ve paketlerden (teknik olarak modüller) söyledi.

Peki, bunu ana uygulama ölçeğinde yapmayı nasıl öğrendin? Aslında onları daha küçük ölçekli uygulamalarda kullanmaktan pek de farklı değil. Mutlak türler, bunlarla ilgili ne kadar kod yazıldığını önemsemez.

Çalışma zamanı türü denetimi muhtemelen kaçınmak isteyeceğiniz bir şeydir, çünkü bu büyük bir fayda sağlar ve türlerin işleri basitleştirmekten ziyade, projenizi çalışmak için daha karmaşık hale getirmesine olanak sağlar.

Gibi, çoğunlukla sadece türleri ile şeyler modelleme bir meseledir. Bir şeyleri modellemek için iki ana yol (veya genel olarak bir şeyler inşa etmek) aşağıdan yukarıya ve aşağıdan yukarıya doğrudur. Yukarıdan aşağıya, en üst düzeyde işlemlerle başlar ve modeli oluştururken modellemeyi ertelediğiniz kısımlara sahip olursunuz. Aşağıdan yukarıya modelleme, temel işlemlerle başladığınız gibi temel işlemlerle başladığınız ve ardından projenin işleyişini tamamen ele geçirene kadar daha büyük ve daha büyük modeller oluşturduğunuz anlamına gelir. Aşağıdan yukarıya daha somut ve inşa edilmesi daha hızlıdır, ancak yukarıdan aşağıya, düşük seviye modellerinizi gerçekte nasıl davranmaları gerektiği konusunda daha iyi bilgilendirebilir.

Türler, programların matematikle nasıl ilişkili olduğu anlamındadır; bu nedenle, ne kadar karmaşık hale gelebilecekleri ile ilgili bir üst sınır ya da onlar hakkında bilgi edinmenin 'yapılabileceği' bir nokta yoktur. Neredeyse üst düzey üniversite dersleri dışındaki kaynakların tümü, türlerin belirli bir dilde nasıl çalıştığına adanmıştır, bu yüzden buna da karar vermeniz gerekir.

Sunabildiğim kadarıyla, türler şöyle sınıflandırılabilir:

  • Çok zayıf yazılmış, JavaScript gibi şeyler [] + {} tanımlanmış
  • [] + {} Yapamadığınız Python gibi zayıf yazılan, ancak denemeden bu kontrol edilmez
  • Zayıf bir şekilde C veya Java gibi yazılır; [] + {} yapamazsınız, ancak bu derleme zamanında kontrol edilir, ancak daha gelişmiş tür özelliklerine sahip değilsiniz
  • C ++ şablon metaprogramming gibi türlerin sadece zorlayıcı özellikleri olduğu, zayıf ve güçlü şekilde yazılan sınır arasındaki sınırın aşılması.
  • Tamamen Güçlü olarak yazılmış, yukarıda gösterildiği gibi türlerin işleri yaptığı daha karmaşık Haskell programları gibi
  • Türleri ve değerlerin birbirleriyle etkileşime girebileceği ve birbirlerini sınırlayabileceği Agda veya Idris gibi çok yazılanlar. Bu, tür sistemlerinin aldığı kadar güçlüdür ve içlerinde programlama, programınızın ne yaptığı hakkında matematiksel kanıtlar yazmakla aynıdır. Not: Ağda'da kodlama, kelimenin tam anlamıyla matematiksel ispatlar yazmıyor, türler matematiksel teoriler ve bu tiplerle olan işlevler, bu teorileri ispatlayan yapıcı örneklerdir.

Genel olarak, bu listeden aşağıya indikçe, bu tipler sizin için daha fazlasını yapabilir, ancak en altta, stratosfere tırmanıyorsunuz ve hava biraz inceliyor - paket ekosistemi çok daha küçük ve İlgili bir kütüphaneyi bulmak için kendinize daha fazla şeyler yazmanız gerekecek. Giriş engeli, aşağı indikçe daha da artar, çünkü büyük ölçekli programlar yazmak için yeterince sistem türünü anlamanız gerekir.


Listedeki öğeden fazlası varsa, tür düzeyinde listeyi kesme işareti ile ön eklemeniz gerekmediğini unutmayın. Kesme işareti, yalnızca belirsiz olduklarından (sıradan liste türü yapıcılara atıfta bulunabilecekleri için) yalnızca 0- veya 1 öğeli tür düzeyinde listeler için gereklidir
Gabriel Gonzalez

1
Farkındayım, ancak kesme işareti genel olarak tanıtılan veri türleri için iyi bir form olduğu izlenimindeydim. EG Proxy :: Proxy Trueçalışır, ancak olarak yazmak daha iyidir Proxy :: Proxy 'True.
Steven Armstrong

1
Hangi tip sistemlerin sınıflandırılabileceğine göre çeşitli eksenleri çökmemesi daha iyi görünüyor. Barendregt'ın lambda küpü zaten üç içerir ve ayrıca tek zayıf kuvvetli eksen boyunca ayrıca statik ve dinamik ve parametrik ve geçici polimorfizm de içerir (ikincisi, hizmetçinin türlerini yapmak için hizmet tekniğine izin veren şeydir. ').
user2141650

1
Adil nokta, ama cevap zaten çok uzun sürdü ve lambda küpü gerçekten mantıklı olmaya başlamadan önce tip teorisini incelemeye doğru gidiyor olmalısınız. Dahası, çok niş dışında (ve zaten Haskell ve hatta Agda'yı dahil ettiğimden beri, gerçekten de oldukça niş demek istiyorum ) dilleri, örneğin bağımlı türlere sahip olan ancak tür operatörleri olmayan bir dil bulamayacaksınız. .
Steven Armstrong,

'[xs]Sözdizimini kısaca açıklayabilir misiniz ? Bu açıkça bir şey değildir Char, ancak alternatif bir sözdizimini nasıl ya TypeOperatorsda DataKindsetkinleştirdiğini göremiyorum . Bir çeşit yer değiştiriyor mu?
wchargin

10

Scala'da yazılmış büyük bir platformun çekirdek ekibi üzerinde çalışmaya başladım. Dinamik veri formatları ile etkileşimler hakkındaki daha ayrıntılı sorularınızı nasıl ele aldıklarını görmek için Scalatra, Play veya Slick gibi başarılı açık kaynaklı uygulamalara bakabilirsiniz.

Scala'nın güçlü tiplemesinde bulduğumuz en büyük avantajlardan biri kullanıcı eğitimidir. Çekirdek ekip kararlar verebilir ve bu kararları tip sisteminde uygulayabilir; bu nedenle tasarım ilkelerine daha az aşina olan diğer ekiplerin sistemle etkileşime girmesi gerektiğinde, derleyici bunları düzeltir ve çekirdek ekip sürekli olarak bunları düzeltir. istekleri çekin. Bu büyük bir sistemde büyük bir avantajdır.

Tabii ki, tüm tasarım prensipleri bir tip sistemde zorlanabilir, ancak tip sisteminiz ne kadar güçlüyse, derleyicide o kadar fazla tasarım prensibi uygulayabilirsiniz.

Kullanıcıları daha kolay hale getirebiliriz. Genellikle onlar sadece düzenli koleksiyonlar veya vaka sınıfları ile çalışıyorlar ve biz onu JSON'a ya da ağ nakliyesi için gerektiği şekilde otomatik olarak dönüştürüyoruz.

Güçlü yazım aynı zamanda, güvenliğe yardımcı olabilecek, sterilize edilmemiş ve sterilize edilmiş girdi gibi şeyler arasında ayrım yapılmasına yardımcı olur.

Güçlü yazım , yalnızca türlerinizi sınamak için bir sürü sınava ihtiyaç duymak yerine, sınamalarınızın gerçek davranışınıza daha fazla odaklanmasına yardımcı olur . Testleri çok daha keyifli, daha odaklı ve bu nedenle daha etkili kılar.

Ana dezavantaj, dil ve dil paradigması ile ilgili bilinmeyenliktir ve zamanla düzeltilebilir. Bunun dışında çabaya değer bulduk.


8

Direkt bir cevap olmasa da (+30.000 LOC kod üssünde henüz haskell'de çalışmadım çünkü:), https://www.fpcomplete.com/business/resources/case-studies adresini kontrol etmenizi rica ediyorum / hangi gerçek endüstri ortamlarında haskell vaka çalışmaları bir çok özelliği bulunmaktadır.

Bir diğer güzel makale de, IMCU’dur, deneyimlerini haskell’e değiştirmeyi tarif eder - http://engineering.imvu.com/2014/03/24/what-its-like-to-use-haskell/ .

Daha büyük uygulamalarda kişisel deneyim, tip-sistem çok fazla türlerinde olabildiğince sen kadar kodlamak için denemek, özellikle eğer size yardımcı olur. Gerçek güç, bazı şeyleri yeniden düzenlemeye gelince gerçekten açıktır - bakım anlamına gelir ve daha az endişe verici bir iş haline gelir.

Bir seferde çok fazla soru sorduğunuz için önerdiğim kaynaklara birkaç bağlantı bırakacağım:

Kapanış notu olarak, dış dünyayla başa çıkma ile ilgili birkaç şekilde yapılır. Uçunuzdaki şeylerin güvenli olduğundan emin olmak için kütüphaneler var, JSON için Aeson , SQL için Esqueleto ve diğerleri gibi.


1
Cevabınız için teşekkürler, ancak, fpcomplete.com/business/resources/case-studies konusundaki örnek çalışmalar artık mevcut değil.
Saurabh Nanda


3

Ne Gördüm:

Birkaç büyük Ruby web uygulaması (Rails), bir büyük Haskell web uygulaması ve daha küçük uygulamalar yaptım. Bu deneyim ile Haskell uygulamaları üzerinde çalışan yaşamın bakım ve düşük öğrenme eğrisi gibi konularda Rails'te olduğundan çok daha kolay olduğunu söylemeliyim. Bu faydaların hem Haskell tip sisteminden hem de fonksiyonel programlama stilinden kaynaklandığını düşünüyorum. Bununla birlikte, pek çoğunun aksine, tip sisteminin "statik" bölümünün, dinamik sözleşmeler kullanılırken hâlâ fayda sağlamasının büyük bir kolaylık olduğuna inanıyorum.

İnandığım

Haskell projelerinin daha iyi bakım özellikleri elde etmesine yardımcı olduğumu düşündüğüm bazı temel özellikleri sağlamada yol alan Kontratlar Ruby adında hoş bir paket var . Sözleşmeler Ruby kontrollerini çalışma zamanında gerçekleştirir, bu nedenle yüksek test yakınsama ile eşleştirildiğinde en iyisidir, ancak Haskell gibi dillerde tip açıklamaları kullanmakla aynı çevrimiçi dokümantasyon ve niyet ve anlam ifadesi sağlar.

Soruya Cevap

Yukarıda sorulan soruları cevaplamak için, Haskell'e ve ileri tip sistemlere sahip diğer dillere aşina olabileceğiniz pek çok yer var. Ancak, tamamen dürüst olmak gerekirse, bu belgelendirme kaynakları kendi başlarına mükemmel olmakla birlikte, Ruby, Python, Java ve diğer dillerde bulunan dokümantasyon ve pratik önerilerle karşılaştırıldığında hepsi biraz zor görünmektedir. Her durumda, Gerçek Dünya Haskell yaşlanıyor, ancak hala iyi bir kaynak.

Kategori Teorisi

Haskell'i seçerseniz, Kategori teorisini tartışan çok miktarda literatüre rastlayacaksınız. IMHO kategori teorisi faydalıdır ancak gerekli değildir. Haskell topluluğunda yaygınlığı göz önüne alındığında, profesyonellerin ve türlerin eksilerini Kategori teorisinin uygulanabilirliği ile ilgili hislerle karıştırmak kolaydır. Bunların iki farklı şey olduğunu hatırlamakta fayda var, yani Kategori teorisi tarafından yönlendirilen uygulamaların sadece statik olduğu kadar dinamik olarak yazılmış dillerde de yapılabildiğini söylemek (tip sisteminin sağladığı faydaları modulo). Genel olarak gelişmiş tip sistemler Kategori teorisine bağlı değildir ve Kategori teorisi tip sistemlere bağlı değildir.

Türleri hakkında daha fazla

Türlerle programlama ve oradaki teknikler hakkında daha fazla şey öğrendikçe (bu eğlenceli olduğu için oldukça hızlı bir şekilde gerçekleşir) tür sistemiyle daha fazla ifade etmek isteyeceksiniz. Bu durumda, aşağıdaki kaynaklardan bazılarına göz atacağım ve takım üreticilerinin, bu özelliklerle endüstriyel kalitede araçların sadece kullanımı kolay bir arayüz ortaya koyan bir şeye (Paketler Yakut gibi) açıklanmasını istediğimizi) bilmesini sağlamaya katılırdım:


2

Birincisi, zayıf yazılmış ve güçlü yazılmış, dinamik ve dinamik yazılmış olanlar arasında bir karışıklık olduğunu hissediyorum. Açıkça sağlanan OP bağlantısını açıkça ayırt eder:

Güçlü bir tür sistemi, çekici bulduğunuz bir derleme zamanı kısıtlaması veya çalışma zamanı özelliği olan bir tür sistemidir.

Zayıf tip bir sistem, bu kısıtlama veya özelliğe sahip olmayan bir tip sistemdir.

Örneğin, değişkenler derleme zamanında yazıldığından C, C ++ ve Java statik olarak yazılmıştır. Yine de, C ve C ++ yazımları zayıf yazılmış sayılabilir çünkü dil, void *işaretçiler ve yayınlar kullanılarak yapılan kısıtlamaları atlamayı sağlar. Bu konuda daha fazlası.

Bu ayrım üzerine, güçlü yazma sadece daha iyi olabilir. Başarısızlık ne kadar erken olursa o kadar iyidir.

Ancak, büyük programlar yazarken, tip sisteminin önemli bir rol oynadığını sanmıyorum. Linux çekirdeği on milyon LOC C ve montaj ile yazılmış ve çok sağlam bir program olarak kabul edilir, muhtemelen güvenlik delikleriyle dolu 200 Java hattımdan mil uzakta. Benzer şekilde, dinamik olarak yazılmış "komut dosyası dilleri" büyük programlar yazarken kötü bir üne sahip olsa da, zaman zaman hak edilmediğinin kanıtı vardır (Python Django, 70k LOC'nin üzerinde)

Bence her şey kalite standartı ile ilgili. Büyük uygulamaların ölçeklenebilirlik sorumluluğu yalnızca programcılar ve mimarlar tarafından yapılmalı ve uygulamanın temiz, test edilmiş, iyi belgelendirilmiş olması vb.


-1

Bu güçlü tip sistemlerin ve statik / derleme zamanı özelliklerinin daha büyük uygulamalarda nasıl kullanılacağı hakkında bir şey nereden okunabilir?

önceki yanıtdan https://www.fpcomplete.com/business/resources/case-studies/

Bu güçlü özelliklerin standart "merhaba dünya" gibi tanıtımlarının ötesine nasıl geçilir?

gücü arttırmak gerçekten başka bir dil gibi

Bir işletme alanı sorununu modellemek için zengin türdeki bir sistem nasıl kullanılır?

Soyut Veri Tiplerini veya daha genel olarak polimorfizm kullanarak

Tip sistemi, 30.000 LOC + bölgesinde bulunduğunuzda yardımcı oluyor mu veya engelliyor mu?

Tüm yol boyunca yardımcı olur. type sistemi, sahip olmak istediğiniz sonucun şeklini söylerken kodu yazmanıza yardımcı olur. Aslında Agda sizin için kod yazıyor.

Not: Bir tip sisteme sahip olmanın ve kendi türlerini kendiniz yazmak zorunda kalmayın, ki bu çok aptalca: bilgisayar sizin için yapabilir.

Sisteminiz zayıf yazılmış dış dünyayla etkileşime girdiğinde, bu tip sistemler (ve derleme zamanı kontrolleri) tarafından sağlanan güvenlik ağına ne olur? JSON veya XML API'leri, çeşitli veri depoları, kullanıcı girişi vb.

Değerlerin yapısını türler aracılığıyla bilmek, bilgisayarın sizin için serileştirici yazmanın (de) yolunu bulabileceği anlamına gelir.

Türleri ve soyutlamayı gerçekten bilmek istiyorsanız, en iyi giriş, Türleri Anlamak, Veri Soyutlama ve Polimorfizmdir.

Bu bir kağıt, güzel resimler içeren bir vaka çalışması değil, ama aydınlatıcı


-2

Web uygulamalarında çok çalışan bir .net programcısı olarak, hem C # hem de yazılmamış Javascript öğelerini görüyorum.

İstediğiniz sorularla ilgili herhangi bir literatür gördüğümden emin değilim. Yazılan bir dille, tüm bunları verilen için alırsınız. Türlenmemiş bir tane ile türleri gereksiz ek yük olarak tanımlıyorsunuz.

Şahsen, güçlü bir şekilde yazılmış bir dilin, tarif ettiğiniz faydaları çok düşük bir maliyetle (eşdeğer birim testleri yazmaya kıyasla) sunduğunu inkar edeceğinizi sanmıyorum. Zayıf yazılan sistemlerle etkileşime girmek, genellikle DataReader gibi Diziler veya Nesnelerin Sözlükleri gibi genel türler veya dizgenin veya yeni dinamik sınıfın yaratıcı bir şekilde kullanılmasını içerir. Esasen hepsi işe yarıyor, derleme zamanı yerine bir çalışma zamanı hatası alıyorsunuz.

Çok kısa bir program yazmak istiyorsanız, belki de daha büyük bir uygulama ile çalışmak için birkaç satırda bir işlev tanımlamak istiyorsanız, o zaman sadece sınıfları ilan edecek yeriniz yoktur. Tabi ki bu JS gibi yazılmamış dillerin işgal ettiği yer.


Yazılan / yazılmayan veya statik olarak yazılan / dinamik olarak yazılan mı? JavaScript yazılmamış, ancak dinamik olarak yazılmıştır.
Giorgio,

2
türlerini tanımlamanız gerekmez. herhangi bir iyi dil sizin için türlerini çıkartacaktır: haskell, ocaml, sml, F # ...
nicolas

1
güçlü bir şekilde yazılmış bir dile alışkın olduğunuzda, diğer her şey çözülmez, türlerini tanımladığımda 'sınıfları yarat' demek istediğimde var veya her neyi kullanabildiğinizden emin olun, ancak bu sadece bir derleyici numarasıdır
Ewan
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.