OCaml eleştirisi: hala geçerli mi?


15

Ben OCaml ile tam bir acemi. Kısa bir süre önce bu sayfaya OCaml'e yönelik iyi bir eleştiri listelendi.

Sayfanın oldukça eski olduğunu görünce (2007): listelenen mermi noktalarından hangisi bugün hala geçerli? Örneğin: genel bir nesne yazdırmanın imkansız olduğu hala doğru mu?

Burada ifade edilen görüşler hakkında bir tartışma aramayacağımı açıklığa kavuşturmak istiyorum. Listelenen bilgilerin, tamsayıların uyarı olmadan taşması gibi, OCaml'ın daha yeni sürümleri için hala doğru olup olmadığını soruyorum.


5
Bu soruyu konu dışı olarak kapatmak için oy kullanıyorum çünkü meta.programmers.stackexchange.com/questions/6417/…
Philipp

3
Bunların düzeltilmiş olabileceği bir çatal var: tryfsharp.org
Den

7
Elbette bağladığınız bu makaledeki görüş geçerlidir, ancak bu eleştirilerin sizin için uygun olup olmadığı tamamen farklı bir konudur. Yazarın Ortak Lisp geçmişinden geldiğini ve bu nedenle Lispish değerlerine sahip olduğunu unutmayın. OCaml'a Lisp ile karşılaştırmaktan başka bir yaklaşım alırsanız (örn. “OCaml sadece ölümlüler için Haskell'dir” veya “C işlevsel bir dil olsaydı, OCaml'e sahip olacaksınız”) bunu çok daha tatmin edici bulacaksınız. Tüm kusurları için, OCaml harika bir dildir ve yine de sizi bu konuda cesaretlendirmenizi öneririm.
amon

5
Bildiğim kadarıyla , donanımda tamsayı taşmasını tespit etmenin bir yolu yok , bu yüzden onu tespit etmek için her yere çalışma zamanı kontrolleri eklemeniz gerekir; ancak yazar performans temelinde "bignum" kullanarak işten çıkarıldı! Statik yazmayla ilgili şikayet, emniyet kemerinin kötü olduğunu söyler, çünkü bir araba kazasında ölemeyeceğinizi düşünebilirsiniz. Modül değişmezliği ile ilgili şikayet, bir şeyleri maymunbalığı yapmak istediğini söylüyor - modüler ve hataya eğilimli bir uygulama. "Küçük tip hayvanat bahçesi" tip çıkarım ile ilgisi yoktur. Önyargılarının nerede olduğu açıktır .
Doval

2
@Doval: Elbette donanımdaki taşmayı tespit edebilirsiniz. Ancak bununla başa çıkmak bir yazılım meselesidir.
Mason Wheeler

Yanıtlar:


13

Bu makale birkaç yerde tartışılmıştır:

Özetlemek gerekirse: evet, OCaml bir Lisp değildir ve hayır, mükemmel değildir (bu ne anlama geliyor?). Blog gönderisinde bahsedilen noktaların günlük O'Caml programcıları için geçerli olduğunu düşünmüyorum.

O'Caml'ı inceledikten sonra, C / C ++ / Java'ya yazmaya cesaret edemeyeceğiniz programlar oluşturmanıza yardımcı olabilecek ilginç bir dil olduğunu düşünüyorum: örneğin, Frama-C'ye bir göz atın .

O'Caml'in güncel bir açıklaması için , özellikleri hakkında okumanızı tavsiye ederim : dil, uygulamaların performans, ancak güvenli çalışma zamanları üretmeye odaklanmasını sağlayan güçlü statik tip kontrol tekniklerini teşvik eder.

Önemli : OCaml uzmanı değilim: Eğer onlardan biriyseniz ve korkunç bir yanlış yazdığımı görürseniz, lütfen beni düzeltin. Bu yazıyı buna göre düzenleyeceğim.

Statik tip kontrolü

  • Yanlış Güvenlik Anlayışı

    Bu doğrudur, ama açıktır.

    Statik yazım, programınızın özelliklerinin bir alt kümesi hakkında güvenebileceğiniz kanıtlar sağlar. Tüm resmi olmayı kabul etmedikçe, ortalama (oyuncak olmayan) bir program, yalnızca çalışma zamanında tanık olabilecek programlama hata hatalarına tabi olacaktır.

    İşte o zaman dinamik kontrol teknikleri uygulanabilir: OCaml derleyicisinde hata ayıklama bilgileriyle çalıştırılabilir dosyalar oluşturmak için bayraklar vardır, vb. Güçlü programlar isteyen programcılar dinamik kontrolleri açıkça uygulamalıdır.

    Aynı şey örneğin Common Lisp için de geçerlidir, ancak tersine çevrilir: önce dinamik türler, ikinci olarak isteğe bağlı tür bildirimleri ve derleyici yönergeleri.

  • Birkaç Temel Tip

    Yine de geçerlidir: temel dil değişmemiştir (veya önemli ölçüde değişmemiştir).

  • Sessiz Tamsayı Taşması

    Çoğu dilde tamsayı taşmasının eller tarafından kontrol edildiği norm budur. Taşma olup olmadığını kontrol etmek için işlemleri kontrol ediyorum herhangi bir kütüphane bilmiyorum.

  • Modül Bağlanabilirliği

    1. Yazar Functors'tan bahsediyor ancak örneğinin nasıl uygulanamayacağını göremiyorum. Https://realworldocaml.org adresinin Birinci Sınıf Modülleri bölümünü okurken, modüllerin yeni modüller oluşturmak ve oluşturmak için kullanılabileceği görülmektedir . Tabii ki, mevcut bir modülün değiştirilmesi kaynak kodunda değişiklik yapılmasını gerektirir, ancak yine, bu programlama dilleri arasında olağandışı değildir.

    2. " Anlamsal olarak , fonksiyonlar INLINE olarak derlenir"

    Yukarıdaki reddit iş parçacığı, bağlantının bağlantı zamanında çözüldüğünü söyleyerek aynı fikirde değil. Ancak, bu bir uygulama ayrıntı ve ben vurguladı düşünüyorum Semantik fonksiyonları çözülür şekilde ilgilidir. Misal:

     let f x y = x + y ;;
     let g a b = f b a ;;
     let f x y = x * y ;;
     exit (g 2 3) ;;
    

    Yukarıdaki program derlenir ve çalıştırıldığında, çünkü 5 döndürür gilk sürümü ile tanımlanır fsadece olarak -eğer çağıran işlev gçağrısını inlined f. Bu "kötü" değil, bu arada, O'Caml'ın adı gölgeleme kuralları ile tutarlı.

    Özetlemek gerekirse : evet, modüller değişmezdir . Ancak bunlar da birleştirilebilir .

  • Çok Biçimlilik Çalışma Zamanı Türü Hatalarına Neden Oluyor

    Belirtilen hatayı yeniden oluşturamıyorum. Derleyici hatası olduğundan şüpheleniyorum.

Makro Yok

Gerçekten de, makrolar ve önişlemciler yoktur (OcamlP4, OcamlP5, ...).

Küçük Dil Suckiness

  • Alan adlandırma cehennemini kaydet

    Doğru, ancak modülleri kullanmalısınız:

    1. İki kaydın iki alanı OCaml'de aynı etikete sahiptir
    2. Alan adlarını çözümleme
  • Sözdizimi

    Hala geçerlidir (ama gerçekten, bu sadece sözdizimidir).

  • Çok Biçimlilik Yok

    Yine de geçerlidir, ancak bir şekilde Lisp'in sayısal kulesi yerine bunu tercih eden insanlar vardır (nedenini bilmiyorum). Sanırım tip çıkarımda yardımcı oluyor.

  • Tutarsız fonksiyon setleri

    Bkz Dahil OCaml Piller projeyi. Özellikle, BatArray , map2diziler için bir örnek .

  • Dinamik değişken yok

    Uygulanabilir:

    1. http://okmij.org/ftp/ML/dynvar.txt
    2. http://okmij.org/ftp/ML/index.html#dynvar
  • İsteğe bağlı ~ argümanlar emmek

    Dil kısıtlamasıyla, Common Lisp'de isteğe bağlı ve anahtar kelime bağımsız değişkenlerini karıştıramazsınız. Berbat olduğu anlamına mı geliyor? (tabii ki bu makrolarla değiştirilebilir (bkz . cevabım )). O'Caml'de isteğe bağlı ve adlandırılmış argümanlar için O'Caml'ın belgelerine bakın .

  • Kısmi bağımsız değişken uygulaması tutarsızlığı

    Bunun pratikte gerçekten sinir bozucu olduğunu düşünmüyorum.

  • Aritmetik okunabilirliği

    Tutar, ancak isterseniz sayısal sorunlar için R veya Python kullanabilirsiniz.

  • Sessiz ad çakışması çözümü

    Yine de geçerlidir, ancak bunun iyi belgelendiğine dikkat edin.

  • Nesne girişi / çıkışı yok

    Yine de geçerlidir.

Uygulama, kütüphaneler

Bunlar her gün değişmeye devam ediyor: kesin bir cevap yok.

En sonunda,

"OCaml'ı (ya da daha iyisi Haskell'i) berbat olduğunu düşünmenize ve kullanmayı düşünmese bile denemelisiniz. Bu olmadan, Bilgisayar Bilimi eğitiminiz tamamlanmamış, tıpkı Lisp ve C olmadan tamamlanmamış gibi (veya , daha iyisi, Meclis) maruz kalma. "

... hala geçerli.


Teşekkür ederim, bağlantılara bir göz atacağım, ama bu görüşlerin haklı olup olmadığını gerçekten sormuyorum. Gerçeklerin hala devam edip etmediğini soruyorum. Örneğin: herhangi bir cebirsel veri türünü yazdırmanın bir yolu var mı? Tamsayıların uyarı olmadan taşması hala doğru mu? Bugün dosya üzerinde çalışmanın ve hataları hatalarla kapamak için her zaman yazmak zorunda kalmadan onları atmanın bir yolu var mı?
Andrea

@Andrea cevabımı düzenledim.
coredump

1
“... Lisp'in sayısal kulesi yerine bunu tercih eden insanlar var (nedenini bilmiyorum). Sanırım tip çıkarımına yardımcı oluyor.” Bingo. SML ve OCaml'ın tür sistemi, her ifadenin yalnızca bir türü olmasını gerektirir. SML'nin matematik operatörlerine aşırı yüklenmesi, dilde yerleşik bir istisnadır. Bu Haskell için de geçerlidir; bu tür aşırı yüklemeyi mümkün kılmak tip sınıfların arkasındaki motivasyondu. Yakalama, tür başına yalnızca bir tür sınıf örneğine sahip olabilmenizdir. Ayrıca bir tamsayıyı eşit boyutta bir kayan noktaya körü körüne dönüştüremazsınız - 64 bit'lik bir kayan nokta yalnızca 54 bit hassasiyete sahiptir.
Doval

@Doval Raket için sayısal kule yazmak gibi bir şey var mı? Polimorfik matematik operatörleri sağlamak için tip sınıflarından veya Genelleştirilmiş Cebirsel Veri Tiplerinden (GADT) yararlanacak bir OCaml kütüphanesi hayal edebilir miyiz? Dönüştürme ile ilgili: tüm işlemler mümkün değildir, ancak bazıları yazılır ve yazılabilir.
coredump

2
@Doval: "Re: polimorfik matematik operatörleri, Haskell'in tip sınıflarını uygulamadan bir yol olduğunu sanmıyorum". F #, tip sınıfları olmayan polimorfik matematik operatörlerine sahiptir.
Jon Harrop

7

Sayfanın oldukça eski olduğunu görünce (2007): listelenen mermi noktalarından hangisi bugün hala geçerli?

  • Yanlış Güvenlik Anlayışı . Bu saçmalık.

  • Birkaç Temel Tip . OCaml artık bayt ve bayt dizilerine sahiptir, ancak yerleşik unicode dizeleri, 16 bit tam sayıları, işaretsiz tam sayıları, 32 bit kayan sayıları, vektörleri veya matrisleri yoktur. Üçüncü taraf kütüphaneleri bunlardan bazılarını sağlar.

  • Sessiz Tamsayı Taşması . Değişmedi ama hiçbir zaman sorun olmadı.

  • Modül Değişmezliği . Fonksiyonların ve modüllerin değişebilir olması tavsiyesi Lisp için korkunç bir geri dönüş ve gerçekten kötü bir fikir. İsterseniz modüllerin yerini alabilir include, ancak elbette değiştiremezsiniz.

  • Çok Biçimlilik Çalışma Zamanı Türü Hatalarına Neden Olur . Bu OCaml ile ilgili büyük bir sorundur ve düzeltilmemiştir. Tipleriniz polimorfik eşitlik geliştirdikçe, fonksiyonlar gibi tiplerle karşılaştıklarında karşılaştırma ve karma başarısız olmaya başlayacak ve problemi ayıklamak çok zor. F # bu soruna harika bir çözüm sunuyor.

  • Makro yok . İronik bir şekilde, bu OCaml'ın aslında makroları tam olarak desteklediğini yazarken, şimdi özelliği çekmeye karar verdiler.

  • Sarmalayıcılar . Bu gerçek bir sorundu ve giderilmedi. try ... finallyOCaml dilinde hala bir yapı yoktur ve bunu stdlib'de uygulayan hiçbir sarıcı yoktur.

  • Yerler . Değişmedi ama sorun değil.

  • Alan adlandırma cehennemini kaydedin . Modülleri kullanarak kodunuzu doğru şekilde yapılandırın.

  • Sözdizimi . Değişmedi ama sorun değil.

  • Polimorfizm yok . Bu onu yazdığında çoğunlukla saçmalıktı ve hiçbir şey değişmedi.

  • Tutarsız fonksiyon setleri . OCaml'ın hala bir consişlevi yoktur. Bu iyi. Lisp öğelerini kendi dilimde istemiyorum, teşekkür ederim.

  • Dinamik değişken yok . OCaml hakkında iyi bir şeydi. OCaml hakkında hala iyi bir şey.

  • İsteğe bağlı ~ argümanlar emmek . İsteğe bağlı argümanlar kaya. F # 'a isteğe bağlı bağımsız değişkenler eklemelerini sağlamak için Microsoft'u kötüleştirdim.

  • Kısmi argüman uygulaması tutarsızlığı . Eh?

  • Aritmetik okunabilirliği . OCaml ~ 8 yıl önce kullanmayı bıraktığımdan beri bu durum değişti. Görünüşe göre şimdi yapabilirsiniz Int64.((q * n - s * s) / (n - 1L)).

  • Sessiz ad çakışması çözümü . Lisp'de olduğu gibi REPL'de tam gelişmiş yazılım geliştirme yapmaya çalışıyordu. Bunu OCaml'de yapma. Yalnızca test, tek kullanımlık kod çalıştırma ve etkileşimli teknik hesaplama için REPL'e uygun dosyaları ve toplu derlemeyi kullanın.

  • Değerlendirme sırası . Yazarken bu yanlıştı. Değerlendirme sırası OCaml'de tanımlanmamıştır.

  • Nesne girişi / çıkışı yok . Bu sorunu zaten çözen bir üçüncü taraf kütüphanesine atıfta bulundu.

  • Derleyici ilk hatadan sonra durur . Eh?

  • Yerel olarak derlenmiş yürütülebilir dosyalar için yığın izlemesi yok . Sabit.

  • Hata ayıklayıcı berbat . Hata ayıklayıcıyı hiç kullanmadım. Statik tip kontrolü hemen hemen tüm hatalarımı yakalar.

  • GC berbat . OCaml'nin GC'sinin büyük bir sorun dışında mükemmel olduğunu gördüm: küresel kilit paralel programlamayı önler.

  • Örtülü ileri bildirim yok . Karşılıklı özyineleme tüm ML'lerde tasarımla açıktır. Tek gariplik, typetanımlar varsayılan olarak özyinelemeli iken, letbağlamalar varsayılan olarak özyinelemesizdir .

  • İşlev turu yok . OCaml'ın hala çıplak bir kemik stdlib var ama Jane St's Core gibi üçüncü taraf kütüphaneleri roundve arkadaşları.

  • Listeler . List.maphala kuyruk özyinelemeli değil. Bunun gibi ciddi hataları düzeltmek için yamalar gönderdim ve sürümlerde görünmeden önce yıllarca beklemek zorunda kaldım. Listeler elbette hala değişmez. Ve öyle olmalılar.

  • Hız . Büyük polimorfik varyantların derlenme sürelerinin giderildiğine inanıyorum.

  • Örüntü eşleme . Gerçekliğin üzerinde bir umut zaferi. Lisp topluluğu bunu başaramadı. Bu yüzden 10. kuralım: Yeterince karmaşık olan herhangi bir Lisp programı, OCaml'nin desen eşleştirme derleyicisinin yarısının geçici, gayri resmi olarak belirtilen ve hataya dayalı bir uygulamasını içeriyor.

Örneğin: genel bir nesne yazdırmanın imkansız olduğu hala doğru mu?

O yazamadığı zaman yapamazsın:

print value

ancak güzel yazıcıyı üst düzeyden bir kütüphane çağrısı olarak çağırarak gerekli tür bilgilerini verebilirsiniz. Ve güzel yazıcıların otomatik olarak oluşturulmasını sağlamak için veri yapılarına açıklama eklemek için kullanabileceğiniz bir makro vardı.


Örüntü eşleme: OCaml kaynak kodu ve optima aynı kağıda başvurur : "Örüntü Eşleştirmeyi Optimize Etme". Burada ne "ad-hoc", "bug-ridden" ne de "gayri resmi olarak belirtilen" in gerçekçi bir şekilde uygulanamayacağını söyleyebilirim. "F # bu soruna harika bir çözüm sunuyor": Mümkünse bununla ilgili biraz daha ayrıntılı bilgi almak istiyorum. Yanıt iyi ama hakkında konuşurken küfretmek conskötü bir ton veriyor (orijinal makale bir ranttır, ancak bunu kopyalamanıza gerek yoktur).
coredump

2
@coredump: "Mümkünse bununla ilgili biraz daha ayrıntı görmek istiyorum". F #, belirli işleçler ve işlevler üzerinde kullanıcı tanımlı geçici polimorfizme sahiptir. Böylece +, ints, float ve komplekslerde kullanabilirsiniz , ancak kendi türlerinizi de tanımlayabilir ve +türünüz üzerinde çalışmak için aşırı yük ekleyebilirsiniz . Bu, Lisp veya Haskell'in kısaca ve okunabilirliğini, SML veya OCaml'in öngörülebilir derecede iyi performansı ile sağlar ve başka bir dilin yapmadığı bir şey elde eder.
Jon Harrop

@coredump: "OCaml kaynak kodu ve optima aynı kağıda gönderme yapıyor". Bu makalede açıklanan teknikler tamamen ML tipi sistem üzerine inşa edilmiştir. Lisp'de olmayan bir tür sistem. Optima bu makalede anlatılanların çoğunu yapmaz ve yapamaz. Sadece "Kapsamlılık bilgilerinin kullanılması" bölümüne bakın. Lisp'de kapsamlılık bilgisi yoktur, çünkü varyant tipi yoktur. Örneğin, OCaml, yaprak sayısına bağlı olarak iç içe atlamalar veya bir sevk tablosu arasında seçim yapar, ancak bu bilgiler Lisp'te bilinmemektedir.
Jon Harrop

Lisp ve OCaml farklı şeyler için tasarlanmıştır (örn. Dinamizm, görüntü tabanlı programlama). Ama Lisp sahiptir Hindley'nin-Milner farklı bir tip sistemi ve uygulamalar yapmak derleme sırasında bunu istismar. Bu SBCL oturumuna makalenin 4.2 bölümündeki örneklerle bakın. Kapsamlılık derleyici tarafından tür çıkarımı ve bildirimlerinden zaten kontrol edilmiştir. Optima, başka stratejilere sahip olmak için derleme zamanı makro genişletme (veya SBCL VOP) için uygulamaya özel kod ekleyebilir, ancak bunu yapmak için yeterli teşvik yoktur.
coredump

Bu, kullanıcı tanımlı cebirsel veri tipi için nasıl geçerlidir?
Jon Harrop
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.