Programlama dillerinin dinamikleri: Clojure çok esnektir, onu nasıl yöneteceğiz?

Yazar He Jingyu

Düzenle Xiaozhi

Programlama dilinin cihadı, dil türünün yanı sıra dinamik ve statik mezhepler de vardır. Statik diller yazdığımızda, genellikle dinamik dillerin esnekliğini düşünürüz.Dinamik diller yazarken, statik dillerin kararlılığı ve güvenilirliği hakkında düşünme eğilimindeyiz. İnsanların Clojure'un gerçekten güzel olduğunu söylediklerini duyuyorum, ancak dinamik diller gerçekten kontrol edilemez, ne yapmalıyım?

Not: Bu makale, Morgan Stanley VP He Jingyu'nun QCon 2017 Beijing İstasyonu'nda yaptığı bir konuşmadan derlenmiştir. Asıl başlık: "The Virgin of the Rabbit-I like Clojure, ama ya dinamik dil çok esnekse".

Önüne yaz

Eski bir deyişe göre, bir bakire kadar sessiz ve hareket halindeki bir tavşan gibi. Dinamik ve durağan diller arasındaki farkı anlatmak için çok uygun olduğunu düşünüyorum Statik diller tip sistemi sayesinde her zaman çok kararlı ve güvenilir olmuştur, ancak bir dereceye kadar güvenilir olduklarında sertleşir ve bir hapishane veya tuzak haline gelirler. İş dünyasında gerekli olan esneklik genellikle birçok soyutlama katmanı ve birçok yapıştırıcı kod katmanı gerektirir.Kod çok belirsiz ve anlaşılması zor hale gelirken, dinamik diller tamamen bunun tersidir.

İnsanların Clojure'un gerçekten güzel olduğunu söylediğini sık sık duyuyorum, ancak dinamik diller gerçekten kontrol edilemez! Türlerin yardımı olmadan, karmaşık veri yapıları dahil edildikten sonra mevcut programların anlayışını kaybetmek kolaydır ve okunabilirlik de hızla düşecektir ve bu gerçekten de dinamik bir dil olarak Clojure'un neden olduğu bir sorundur. Ancak bu soruna her zaman kısmi bir çözüm vardır. İki çekirdek kitaplık core.typed ve core.spec, dinamik dillerin çok vahşi ve sınırsız olduğu sorununu hafifletmemize yardımcı olabilir.Bu dersin görevi bu iki kitaplığı herkese tanıtmaktır ve bu iki kitaplık bu sorunu çözer. Sorunun farklı açıları.

Statik dil VS dinamik dil

Tip sistemi nedeniyle, statik diller her zaman çok kararlı ve güvenilir olmuştur, ancak belirli bir dereceye kadar güvenilir olduklarında, katı hale gelirler, hapishane haline gelirler veya iş dünyasında gereken esnekliği tuzağa düşürürler, bu nedenle çoğu zaman çok fazla Soyutlama katmanları, birçok yapıştırıcı kod katmanı, kod çok belirsiz hale gelir, anlaşılması çok zor olur. Dinamik diller tamamen tersidir.Her şey türler açısından.Örnek olarak fonksiyonları alın.Esneklik yeterlidir, ancak yazarken genellikle verilerin neye benzediğini unutuyoruz.Bugün bir fonksiyon yazmış olabilirsiniz. Diyelim ki, bir fonksiyonun verilerini girin ve bir hafta sonra verilerin ne olduğunu tamamen unuttum, çünkü üretim ortamında tip sistemi temelde bir derleyicinin yardımı olmadan bir defalıktır. Sorun kullanıcılar için oldukça zahmetli.

Uzun zamandır, iki grup özel bir seviyeye itiraz etmedi. Statik dil gülüyor ve dinamik diller büyük bir sistem yapamaz. Dinamik dil gülüyor statik dil çok yavaş ve çok fazla saçma yazıyor. Elbette bugünün konusu bu anlaşmazlığı çözemez. Ancak Clojure'un size daha az bilinen fikirler vermesini umuyoruz. Hemen birisi sordu. Bu tür içeriklerden kaçınmak için sisteme Clojure yazdım. Çok esnek ve kullanımı kolay. İstediğim her şeyi yazıyorum. Hızlı prototipleme buna dayanıyor. Buna çok katılıyorum.

Basit örnek

Clojure'da bir json vardır, çünkü dinamik diller arasındaki ilişki oldukça basittir ve hiçbir anlam ifade etmez. Clojure'da yazılmasa bile bu işlevin okunabilir olması gerektiğini düşünüyorum. Öncelikle bir Java Reader, FileReader var Bu Reader, json işlevine geçirilir, dosyanın içeriğini okur ve haritaya okur, ancak okuduktan sonra verilerin neye benzediğini biliyor musunuz? Bilmiyorum, bir dahaki sefere bir json dosyasını değiştirdiğinizde, aynı işlev aynı şekilde okunabilir, ancak ne okuduğunu bilmiyorsunuz. Bundan bahsetmişken, zaten içinde biraz zorluk var.

Şimdi bir göz atalım. Şimdi işleyeceğim. İşledikten sonra herhangi bir işlev yazacağım. Bu işlevin ne yazdığına bakmazsanız, işlendikten sonra nasıl göründüğünü biliyor musunuz? Bilmiyorum, bu json verisinin nasıl olmasını istediğini biliyor musun? bilmemek. Kodu şimdi okuduktan sonra, içinde Yaş, İsim, Meslek ve Adres olacağını söyleyebilirim.

Age'e bir bakın, tamsayı olması gereken Int'i kullanabilmesi gerekir, ancak bu bilinmesi gereken koda bağlıdır ve aşağıdakiler hala basittir, o zaman Ad'ın değeri nedir sizce? Hiç kullanılmıyor Bu bir String, Soyadı ve adı bir arada mı? Yine de bir Vector içine koyun, belki soyadı ve adı ayrılır, yani, bilmiyorum, koda bağlıdır.

Kodu gördükten sonra bunun böyle olduğunu düşünüyorsunuz.Vektör ya da Liste olmalı.Soyadı ve adı ayrı.Sistem olduğu için boşlukları kullanıyor.Bu çok basit bir örnek, zaten Clojure'un çok dinamik ve esnek olduğunu gösteriyor, ancak aynı zamanda verilerin açıklayıcı işaretini çok net değil.

Önceki makale çok basit bir örnek, şimdi daha spesifik bir makaleye bakalım. Birkaç gündür bu konu hakkında düşünüyorum ve ne hakkında konuşmak istediğimi göstermek için küçük bir proje yazmam gerektiğini hissediyorum. Ne yazmalıyım? Bunu birkaç gün düşündüm, şimdiden teşekkür ederim Lianjia. Bu nedenle Pekin'e geldiğiniz için konut fiyatlarına dikkat etmeniz gerekiyor. İkinci el konut bilgilerini okumak için internete gittim ama sayfa sayfa çevirmek çok yorucuydu, el ile özet yazamadım, bu yüzden onu almak için bazı programlar yazdım. Tabii ki, burada gerçekten bir tarayıcı yazmadım. Sadece birkaç sayfa aldım ve bunu yaptım. Lianjia hizmetine zarar vermedi. Lütfen emin olun.

Ad alanının temelde yaptığı şey, html'yi bir kitaplık aracılığıyla okumak ve sıralanan verileri bir EDN dosyasına yazmak için bazı basit işlemler gerçekleştirmektir. Örneğin, ilk makalede, 11,5 milyonluk bu topluluğu, üç yatak odası, iki oturma odası, bir mutfak ve iki banyoyu, alan ve diğer şeyler dahil görebilirsiniz. Veri dönüştürme işlevine tekrar bakıldığında, bir Sayfa parametresi alır, ancak bu Sayfanın neye benzediğini bilmiyorum. Kitaplıkta okudum. Okuduktan sonra neye benzediğini bilmiyorum. Gelecekte genişletilmesi gerekirse ne tür veriler döndüreceğini bilmek zor. Ya da gelecekte başka bir kişi için kullanacağım ya da başka bir kişinin bazı uzantılar yapmasına yardımcı olacağım, biraz bakım yapmak zor.

Bu, daha önce bahsedilen dinamik bir dil olarak Clojure'un eksikliğidir - çok esnek. Bu eksiklik, genellikle işlevin parametrelerinin neye benzediğini unutmaya neden olur ve bu küçük bir projedir ve büyük bir proje daha zahmetlidir. Bazı insanlar, belge bunu yapmıyor mu? Belge ve test yakından entegre edilmemiştir, belgenin kodu çıkarılmıştır ve ilgili kodun kendisinde herhangi bir kısıtlama yoktur. Örneğin, yukarıda çok sayıda kod yazılacaktır, ancak aslında kodda yoktur ve olası etkileri bir şekilde sınırlıdır.

Çekirdek. Tipli

Core.typed bir tip sistemdir. Hala diğer dillerin yazı sisteminden biraz farklıdır, fark, dilin bir parçası değil, kontrol edilen ve kullanılan bir kitaplık olmasıdır. Lisp'in esnekliği, bir dil çekirdeği yerine doğrudan bir kitaplık olarak eklenmesine izin verir. Makroları olduğu için, büyük tip bir sistem doğrudan makrolar aracılığıyla eklenebilir ve bu tip sistem genel sistemlerden çok daha esnektir, özellikle şu yönlerden:

  • İlk olarak, kullanılan kitaplıkta yazılmış, işaretlenmemiş veya işaretlenmemiş işlevlere doğrudan türler ekleyebilir;

  • İkincisi, tüm işlevlere tür eklemenize gerek yoktur, istemiyorsanız ihtiyacınız yoktur;

  • Üçüncüsü, ekleseniz bile, tür denetimi gerekli değildir, bu yüzden çok seçici bir şeydir. Clojure gibi dillerle işbirliği yapabilmektir.

O halde neyi desteklediğine bir göz atalım:

OptionType şimdi çok popüler ve bu popüler dil artık bu yapıya sahip.

Sıralı Kesişim Tipi hakkında konuşmayacağım. Bu bir fonksiyondur. Örneğin, iki parametre formu vardır. İki parametre tipi farklı olabilir. Tip kontrolü yaptığınızda, bu parametreyi yukarıdan aşağıya koyacaktır. Sırayla bir maç yapın. UnionType, Haskell hakkında yazan herkesin bildiği gibi, bu çok basit, tamsayılar veya dizeler gibi, eğer onu birleştirirseniz, bu türdeki şeylerin dizeler veya işlevler olabileceği anlamına gelir.

Kimlik çok basit bir işlevdir, size tam olarak aynı şeyi verir, türü nedir? Bu işlevin türü nedir? Core.type'ın beni aramasına izin verin. Temel olarak, her şeyin önünde olduğunu görebilirsiniz Burada, X'in elde edebileceği tüm türler için, Polimorfizmin en basit uygulaması olan bir X döndürür. Durum Yazma nadiren görülüyor. Nedir? If veya switch gibi kodda yazılı kontrol akışını kontrol ederek tip çıkarımı yapabilir.

Örneğin, önce bu Formu A ismine bağla, değer 1, ama ben onu herhangi bir şekilde işaretledim, yani A, sadece 1 olsa bile ve sonra A'ya dön, burada ne döneceğini düşünüyorsun? Bir türü kontrol ediyorsa, sonunda A döndürür.Ne tür? Herhangi biri, zaten işaretlediğim için A Herhangi Biridir dedim, bu yüzden A'nın Herhangi olduğuna inanıyor, ama bunu yazarsam bu ne geri dönecek? Hala A'yı döndürdüğünü görebilirsiniz, bu A veya bu da A'dır ve diğer durumlarda Nil'i döndürür, bu şeyin şimdi ne olduğunu sanıyor? Hala Hiç değil, çünkü artık burada kontrol akışınız var ve kod yazılmıştır, bu nedenle yalnızca sayı, dize veya sıfır olabileceğinizi bilir, bu nedenle sonunda A birleşim dizesi / sayı / sıfırdır . Bu şey işlev açısından çok güçlü, bu aynı zamanda teşvik etmeye zorladığım bir şey, gerçekten kullandığınızda gerçekten kullanışlı.

Sonuncusu, makronun genişletileceği ve ardından türün çıkarılacağıdır.Makro, biraz önce bildiğiniz anahtara benzer, ancak zaten çok basittir.Herkese, türü belirlemek için bu makronun genişletilebileceğini söyleyin. Yaptığım Demo'nun Demo tipleri, yeni yaptığım küçük projeye tip sistemini eklemektir.Şimdi ürettiği sonucun türünü tanımlıyorum ama aslında nedir? Bu bir Haritadır.

Core.spec özeti

  • Bir kitaplık tak ve çalıştır yoluyla dinamik bir dile bir tür sistemi ekleyin

  • Yazılmış veya yazılmamış kitaplıklar kullanılmış işlevler için türlere açıklama ekleyebilirsiniz.

  • İsteğe bağlı olarak tip ekleyebilirsiniz

  • Tip kontrolü eklemek gerekli değildir

  • Destek Seçeneği Tipi, Sıralı Kavşak Tipleri, Rakor Tipleri

  • Heterojen Haritaları ve Sıraları Destekleyin

  • Polimorfizmi (Tümü, Bağlam Sınırları), Daha Yüksek Türleri Destekleyin

  • Olay Yazmayı Destekleyin! (Kontrol akışını kontrol ederek çıkarımı yazın)

  • Makro, türü çıkarılmadan önce de genişletilecektir.

Core.spec

Ben şahsen bunu yazmayı çok seviyorum, fonksiyonlara tür eklemek çok zevkli ama problemler var başka bir yolu var mı? Evet Core.spec, şimdi bu şey Clojure'un özü ve çok zor tanıtılıyor. Yöntemler veya işlevler, artı ön koşullar açısından, işlevler daha güçlü olmalıdır Güç nerede?

Örneğin, üretim ortamında Çalışma Zamanı etkilenmeyecek ve performansı etkilenmeyecektir. Çünkü her zaman kontrol ederseniz, performansı etkilenecektir, bu nedenle varsayılan doğrulama kapatılır.Eğer bir şeyin daha önemli olabileceğini düşünüyorsanız, ekleyebilirsiniz. Spec çok esnektir.Belirli bir liste gibi normal şekilde kurallar yazabilir.Başlangıçta en az bir dize olduğunu, ardından en az 0 tamsayı olduğunu düşünüyorum. Kullanabilirsiniz. Normaldeki artı işareti ve yıldız işareti bu kuralı doğrudan tanımlar. Ve tek bir parametreye sahip tüm yüklem fonksiyonları, onunla sorunsuz bir şekilde bağlanabilir ve bunu spesifikasyona dönüştürmek için ek sözdizimi gerekmez. Pek çok doğrulama yöntemi var, pek çok doğrulama yönteminin şu anda konuşacak vakti olmayabilir, bu yüzden onlardan bahsetmeyeceğim.Genel olarak, veriler çok esnek bir modele konulabilir.

Core.spec özeti

  • Çalışma zamanı performansı etkilenmeyecektir (varsayılan özellik doğrulaması kapalıdır)

  • Harita türü, anahtarın türü ve karşılık gelen değeri olmalıdır! (anahtarlar)

  • Sıra, birçok şekilde kısıtlanabilir (kedi, alt, normal ifade stili eşleştirme, kolaj)

  • Yalnızca bir parametresi olan ve boole değerleri döndüren işlevlerin tümü otomatik olarak yüklem haline gelir

  • İhtiyaçlarınızı karşılamak için çeşitli doğrulama yöntemleri (uygunluk, açıklama, geçerli?)

  • çoklu özellik, daha karmaşık veri yapılarını destekler

Core.type ve Core.spec

Sonuna yaz

Core.typed veya core.spec hangisini önerirsiniz?

Aklım, olasılıklar nedeniyle core.spec'i seviyor. Kalbimde yazılan özü seviyorum, çünkü şeylere türler eklemek gerçekten keyifli.

"Programcı Uygulamasına Giden Yol" u yazan ustalar Andy Hunt ve David Thomas, yazılım geliştirme endüstrisinde yenilmez olmak için kişinin "her yıl yeni bir dil öğrenmesi" gerektiğini söylemişlerdi. Ekim QCon Shanghai İstasyonu üzerinde, C ++ Bjarne Stroustrup'un babası C ++ dilinin geliştirilmesi ve gelecekteki programlama dili modelinin yanı sıra JP Morgan Kıdemli Programcı Zhao Jie (Eski Zhao), Ali Merkez Direktörü Yang Guanbao (Yalnız), PingCAP Baş Mimarı Tang Liu, Ele.me Kıdemli Android Mühendisi Zhang Tao , Hujiang kıdemli Android mühendisi He Liangwei, Movoto ön uç mühendisi Wu Mingyang, vb. Kotlin, Rust, TypeScript, .Net ile ilgili dil uygulamalarını paylaşmak için ve ayrıca bizimle sitede iletişim kurabilirsiniz.

Tıklamak Orijinal metni okuyun QCon Küresel Yazılım Geliştirme Konferansına gelin ve 2017'de öğrenmek istediğiniz yeni dili öğrenin. Herhangi bir sorunuz varsa, lütfen bilet müdürü Hanna ile iletişime geçin, Tel: 15110019061, WeChat: qcon-0410.

yazar hakkında

He Jingyu (Loretta), Morgan Stanley VP. Cambridge Üniversitesi Bilgisayar Bilimleri Bölümü'nden mezun olan bir kız. İlgi alanları teknoloji, matematik, finanstan tahta oyunlarına, ulusal standartlar, İngilizce kaligrafi, dilbilim, felsefe, piyano ve benzerlerine kadar uzanıyor. Her şeyi bilen herkesin tipik bir krikosu. esnaf. Teknik olarak, esas olarak JVM dilinde iyiyim. Birkaç yıllık Java deneyimim var. 2010'da Clojure ile tanıştıktan sonra, kısa sözdizimi, basit yazımı ve ifade edici özellikleri beni hemen etkiledi. 2011'de 5 yıldan fazla profesyonel Clojure'a başladım. Damo'da Scala yazın. Clojure esas olarak veri akışı işlemede kullanılır, ancak aynı zamanda web uygulamaları ve hatta Android uygulamaları için de kullanılmıştır. JVM'ye ek olarak, Python ve Perl gibi ana diller ve ML gibi ana akım olmayan işlevsel dillerle de ilgilenmiştir. Yaklaşık dört yıl önce yerel Clojure topluluğu ile iletişim kurmaya başladım.Vaktimi Clojure ile ilgili soruları yanıtlamaya adadım ve Clojure'un etkisinin kapsamını genişletmeye devam etmeyi umuyordum.

Bugünün Tavsiyesi

Okumak için aşağıdaki resme tıklayın

Baidu, RPC çerçeve brpc'sini resmi olarak açık kaynaklı

5G prensibi hakkında, bu resim bunu netleştiriyor
önceki
"Final Fantasy World" incelemesi: zarafet dünyayı kurtarabilir mi?
Sonraki
190324 İlkbahar ve sonbahar boyunca seyahat etmek için "Altın Gözler" ve Zhuang Rui'yi kilitleyerek geçmişten gelen bilgileri zenginleştirdi
Minglan'ı ve küçük büyükbabayı unutulmaz eski aşkı tanıyor musun? Küçük kayınpeder Minglan'ı havalandırır ve Gu Tingye'yi kıskandırır
"Biraz Meşgul" gişe rekoru kıran kara at, otoriter kraliçe ve masum beyaz tavşanın üçgen hikayesi
Yeni iPhone burada, eski iPhone gitmiş
Guan Xiaotong, "Lipstick Brother" ile aynı sahnedeydi, ancak "Hate Tian Gao" giyerken dik duramadı. Öğretmeni gördü!
190324 Öğretmen Bainin Ünlem İşareti Becerileri Üç Olmalı Artık Daha Az Değil
DG reklam kahramanı uzun bir makale yayınladı "İlişkiyi ayırt edin", netizenler bunu satın almadı: çok tüyler ürpertici
"Personal Bodyguard" ın Netflix kadın versiyonu geliyor ve çok güzel görünüyor!
Lezzetli ramen yapalım! Bugün yayınlanan "Counter Battle" VR oyunu
Fotoğrafçılığın yolu: lütfen film kamerasını kaçırmayın
"EXO" "Haberler" 190324 Sehun 2019 F / W Seul Moda Haftası'na katıldı, asil prens ortaya çıktı
Cecilia Cheung, küçük prensin biyolojik babasından daha heyecan verici olan iyi haberi duyurur ve hayranlar buna yardım edemez.
To Top