Statik yazı sistemi, prototip tabanlı bir dilin tasarımını nasıl etkiler?


15

Prototip tabanlı dillerde Wikipedia makalesi aşağıdaki paragrafı içerir:

Hemen hemen tüm prototip tabanlı sistemler, yorumlanmış ve dinamik olarak yazılmış dillere dayanır. Bununla birlikte, statik olarak yazılmış dillere dayalı sistemler teknik olarak mümkündür.

Statik tip bir sistem hangi şekillerde kısıtlamalar getirir veya prototip tabanlı dilde karmaşıklık getirir ve neden daha dinamik olarak yazılmış prototip dilleri vardır?


2
+1 ve iyilik: Kendimi bir süredir düşünmekteyim ve yapısal bir tip sistemde olağanüstü zor problemler bulamadım . Aslında, bu beni o kadar rahatsız ediyor ki ilerlemek istiyorum ve sadece hangi problemlerin olduğunu görmek için statik olarak yazılmış prototip tabanlı bir dil oluşturmaya çalışıyorum ...

Aynı sürece kendim de bu sürece başlıyorum :)
Joe

Yanıtlar:


6

Temel tip ve nesne arasındaki sınır bulanıklaşır ve genellikle yapay olarak tanıtılır. Örneğin, C'de bir yapı sadece bir grup kayıttır, sadece türetilmiş bir nesne olmayan türdür. C ++ 'da, yapı tüm alanları genel olan bir sınıftır, bir nesne. Yine de, C ++ neredeyse tamamen C ile uyumludur ... sınır burada gerçekten yumuşaktır.

Prototip tabanlı programlama için nesnelerin çalışma zamanında değiştirilebilir olması gerekir. Yumuşak yazılmalıdır ZORUNLU çünkü çalışma zamanında her değişiklik, bir tür sınıf diğerine dönüşür - türü değişir.

Yine de temel ve türetilmiş nesne olmayan türleri statik olarak tutabilirsiniz. Ancak bu garip bir eşitsizlik getirir, nesneler yumuşak tiplidir, nesneler statik tiplidir ve ikisi arasında sert bir bariyer kurulmalıdır. Bir yapıyı değiştirebilmeniz gerekir mi? Dizi? Sayı bir sınıf mı yoksa temel bir tür mü olmalı yoksa int / float / bignum / vb.

Bu üniformaya sahip olmak, öğrenmek, kullanmak ve yazmak daha doğal ve kolaydır, tüm türler değişebilir veya çalışma zamanında hiçbir tür değişmez. Yalnızca bir türün (Nesne) değiştirilebilir olduğunu bildirirseniz, her iki dünyanın baş ağrısı ve sorunları ile sonuçlanırsınız.

Statik tip:

  • uygulaması daha kolay
  • daha hızlı / daha verimli
  • daha güvenli
  • soyutlama nedeniyle büyük sistemlerin bakımı / dokümantasyonu daha kolaydır.

Dinamik tip:

  • daha hızlı yazmak,
  • daha özlü
  • dil öğrenmesi daha kolay
  • tasarım hataları için daha affedici.

İkisini harmanlayarak çok fedakarlık edersiniz.

  • Uygulama önceki ikisinden daha zorlaşıyor.
  • hız, yumuşak türleri kullanıp kullanmamanıza bağlıdır ... Yaparsanız, düşüktür, eğer yapmazsanız, neden dili seçersiniz?
  • tür güvenliği tüm nesne türleri için pencereden çıkar.
  • bir türün diğerine nasıl dönüştüğünü izlemek oldukça zor bir iştir. Belgeleme - çok zor.
  • Tüm defter tutma işlemlerini, özlü ve yazma hızını öldüren temel türlerle yapmanız gerekir.
  • Dil karmaşıklığı "özel" olanlardan daha yüksektir (öğrenmesi daha zordur),
  • Dinamik türden bir yazının "affedilmesi", uyumsuz öznitelik türlerinde bazı çok zor hatalara eğilim ile değiştirilir.

1
Nesnelerin neden "değiştirilebilir" olması gerektiğine dair bir örnek vermeyi unutmayın (genellikle yazmayla ilişkili olmadığı için, bunları değiştirmemek değil, niteliklerin eklenmesi ve kaldırılması anlamına geldiğinizi varsayıyorum).

@delnan: gerçekte değil, prototip tabanlı programlamada, canlı bir örnekte hem yöntemleri hem de nitelikleri sığdırırken, kaldırırken, eklerken, değiştirirken, kapakta gördüğünüz gibi bir nesnenin bağırsaklarını kazabilirsiniz. Bütün mesele bu ve katı klasik miras kuralları ile nesneleri değiştirmek için çok uygun, esnek bir yedek. Bir dil Sınıf olarak Tür kullanıyorsa, tür yumuşak değilse yapısını anında değiştiremezsiniz.
SF.

1
Ben öyle düşünmüyorum. Aynı mantıkla, sınıf tabanlı programlamanın dinamik sınıf tabanlı dillerle aynı özgürlüklere ihtiyaç duyduğu iddia edilebilir. Hayır, yapısal tip sistemlere sahip statik prototipler, üyelerinin bir listesi ve özyinelemeli türleri olan nesnelere açıklama ekler ve tüm üyelerin nesne oluşturma veya mevcut olarak sunulmasını gerektirerek bu üyelerin var olduğunu (ve doğru türe sahip olduğunu) statik olarak kontrol eder. prototip ve üyeleri kaldırmak için bir yol içermez. Sonuç hala bana oldukça prototip görünüyor ve her üyenin her zaman hazır bulunacağını garanti ediyor.

@delnan: Kompozisyon yoluyla klasik kalıtımdan bahsettiniz. Evet, oldukça prototip görünüyor ve klasik bir kalıtım modeli dilinde prototip tabanlı programlama yapmanın (çok sinirlenmiş) bir yoludur. Sadece eğlencenin% 90'ını pb.p'yi çıkarır, en büyük avantajlarını öldürür (ve aynı zamanda en büyük tehlikeleri ortadan kaldırır). Evet, eski ayak çekim benzetmesinde, tam özellikli pb.p, her iki bacağınızı bir çay kaşığı ile vurmanıza yardımcı olacaktır. Bu tür bir gücü sevmiyorsanız, klasik mirasa bağlı kalsanız iyi olur.
SF.

1
"Dinamik" i "prototiplerle" karıştırırsınız. Statik tip sistemlerle iyi uyum sağlamayan bu özgürlükler prototiplerin özellikleri değil, dinamizmin özellikleridir. Elbette statik yazım eklemek onları önler, ancak prototiplerin bir parçası değildir (bu, IMGO'nun esas olarak ebeveyn olarak hareket edecek nesneleri klonlama lehine sınıfların olmamasıdır). Bu dinamizm prototiplere diktir. Tüm popüler prototip dilleri bunları içerir, ancak daha önce belirtildiği gibi prototiplerden bağımsızdır . Bu parçacığı kurgusal bir dilde düşünün: pastebin.com/9pLuAu9F . Nasıl prototip değil?

3

Zorluğu görmek oldukça basittir: Nesnelerin yöntemlerin sözlükleri veya mesajlara yanıt veren şeyler olarak görülmesi, statik olarak yazılan yaygın OO dilleri hakkında aşağıdakilere dikkat edin:

  • Tüm sözlük anahtarları / mesajları genellikle statik olarak bildirilen tanımlayıcılar kullanılarak önceden bildirilir.

  • Belirli ileti kümeleri önceden bildirilir ve hangi iletilere yanıt verdiklerini belirlemek için nesneler bu kümelerle ilişkilendirilir.

  • Bir ileti kümesinin diğerinin alt kümesi olan içerme ilişkileri statik ve açık olarak bildirilir; bildirilmemiş ancak mantıksal alt kümeler geçerli değil.

  • Tür denetimi, tüm iletilerin yalnızca kendilerine yanıt veren nesnelere gönderilmesini sağlamaya çalışır.

Bunların her biri bir ölçüde prototip tabanlı bir sistemle çatışır:

  • Mesaj adları önceden, "atomlar" veya stajyer teller şeklinde ya da başka bir şey olarak bildirilebilirdi; nesnelerin plastisitesi, metotlara tip atamanın garip olduğu anlamına gelir.

  • İleti kümelerinin, bir nesnenin tam tersine değil, yanıtladığı şeyle tanımlandığı, prototip tabanlı bir sistemin temel özelliğidir. Derleme zamanında belirli kombinasyonlara takma ad atamak mantıklı olacaktır, ancak çalışma zamanında belirlenen mesaj setleri mümkün olmalıdır.

  • Yukarıdaki iki sonucun gerçek etkisi, açık beyanların tamamen işe yaramadığı, içerme ilişkileriyle birlikte eve vuruyor. Statik, nominal alt tip anlamında kalıtım, prototip tabanlı bir sistem için antitetiktir.

Ki bu son noktaya, bize getiriyor yok aslında değişim istiyor. Hala iletilerin yalnızca kendilerine yanıt veren nesnelere gönderildiğinden emin olmak istiyoruz. Ancak:

  • Hangi mesajların birlikte gruplandırılabileceğini statik olarak bilemeyiz.
  • Hangi grupların başkalarının alt kümeleri olduğunu bilemeyiz.
  • Hangi gruplamaların mümkün olduğunu bilemeyiz.
  • Tek bir mesajla birlikte ne tür argümanların gönderileceğini bile belirleyemiyoruz.
  • Temel olarak, tamamen genel durumda hiçbir şey belirtemediğimizi tespit ettik.

Peki bu nasıl çözülebilir? Ya (nahoş olan ve hızlı bir şekilde ilk etapta bir prototip tabanlı bir sistem kullanmanın herhangi bir yarar öldürebilir) nasılsa tam genelliği sınırlamak veya tür sistemi çok daha akışkan hale ve ekspres kısıtlamaları yerine tam tipleri .

Kısıtlamaya dayalı tip sistemi, hızlı bir şekilde , çok gevşek bir anlamda "ördek tipleme" nin statik eşdeğeri olarak düşünülebilecek yapısal alt tipleme kavramına yol açar . Buradaki en büyük engel, bu tür sistemlerin tip kontrolü için çok daha karmaşık olması ve daha az bilinmesidir (bu, çalışmak için daha az çalışma anlamına gelir).

Özetle: Nominal bir statik tip sistemden veya çalışma zamanı meta verilerine dayanan dinamik bir sistemden daha zordur ve bu nedenle çok az kişi rahatsız eder.


1

Statik olarak yazılmış, prototip tabanlı bir dil elde etmenin bir yolunun, dili Şablonlar ve Kavramlar etrafında temellendirmek olduğuna inanıyorum.

Kavramlar bir zamanlar C ++ 0x için planlanan bir özellikti. C ++ şablonlarındaki genel kod zaten fiilen "statik olarak ördek tipi" dir. Kavramlar fikri, bu ilişkinin altında bir sınıf miras modeli gerektirmeden veya ima etmeden, gerekli üyeler ve türlerin özellikleri hakkında bazı şeyler söyleyebilmektir (çünkü zaten "statik olarak ördek türünde" olan mevcut şablon koduyla çalışmak zorundaydı. ).

Şablonlar ve Kavramların temelini oluşturan bir dilde, prototip tabanlı Kavramlar olacaktır ve Şablonlar, değer türlerini uygulamak için kullanılabilecek veya kullanılamayacak herhangi bir sınıf modelini önemsemekten kurtaracaktır.

Dilin kendi meta dili olmasına izin vermek için aşamalı derleme kullanma hilelerinin yanı sıra, bu prototipik Kavramlar türevleri oluşturulduktan sonra mutlaka değişmez olacaktır. Ancak, prototip tabanlı olmayan itiraz kırmızı bir ringa balığıdır. Basitçe işlevsel bir dil olurdu. Bir dinamik da işlevseldir prototip-baz dil teşebbüs edilmiş en azından sahiptir .

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.