"Diklik" terimi kesin bir matematiksel kavram için bir layman terimidir: dil terimleri bir ilk cebir oluşturur (Wikipedia'da bakın).
Temel olarak "sözdizimi ve anlam arasında 1-1 bir yazışma var" anlamına gelir. Bu şu anlama gelir: bir şeyleri ifade etmenin tam bir yolu vardır ve eğer belirli bir yere biraz ifade koyabilirseniz, oraya başka bir ifade de koyabilirsiniz.
"Dik" düşünmenin başka bir yolu da sözdiziminin ikame ilkesine uymasıdır. Örneğin, bir ifade için yuvalı bir ifadeniz varsa, herhangi bir ifade oraya konabilir ve sonuç yine de sözdizimsel olarak geçerli bir programdır. Ayrıca,
Vurgulamak istiyorum ki, "anlam", hesaplama sonucu anlamına gelmez. Açıkçası, 1 + 2 ve 2 + 1 her ikisi de 3'e eşittir. Ancak, terimler farklıdır ve aynı sonuca sahip olsa bile farklı bir hesaplama gerektirir. İki sıralama algoritması farklı olduğu için anlam farklıdır.
"Soyut sözdizimi ağacı" (AST) duymuş olabilirsiniz. Burada "soyut" kelimesi tam olarak "dik" anlamına gelir. Teknik olarak çoğu AST, aslında soyut değildir!
Belki de "C" programlama dilini duydunuz? C tipi gösterim soyut değildir. Düşünmek:
int f(int);
İşte burada bir işlev bildirim döndürme türü int
. Bu işleve bir işaretçinin türü şu şekilde verilir:
int (*)(int)
Not, fonksiyonun tipini yazamazsınız! C tipi gösterim büyük zaman berbat! Soyut değil. Dik değil. Şimdi, int yerine yukarıdaki türü kabul eden bir işlev yapmak istediğimizi varsayalım:
int (*) ( int (*)(int) )
Herşey yolunda .. ama .. ya geri dönmek istiyorsak:
int (*)(int) (*) (int)
Woops! Geçersiz. Parens ekleyelim:
(int (*)(int)) (*) (int)
Woops! Bu da işe yaramıyor. Bunu yapmak zorundayız (tek yol!):
typedef int (intintfunc*) (int);
intintfunc (*)(int)
Şimdi sorun değil, ama burada bir typedef kullanmak zorunda değilsiniz. C berbat. Soyut değil. Dik değil. Bunu ML'de şu şekilde yapabilirsiniz:
int -> (int -> int)
C'yi sözdizimi düzeyinde kınıyoruz.
Tamam, şimdi f ++ C ++ 'ı alalım. Yukarıdaki aptallığı şablonlarla düzeltebilir ve ML benzeri gösterim (daha fazla veya daha az) alabiliriz:
fun<int, int>
fun< fun<int,int>, int>
ancak asıl yazım sistemi temelde referanslarla kusurludur: eğer T
bir tür ise, o zaman T&
bir türdür? Cevap waffly: sözdizimi düzeyinde, bir U = T & tipine sahipseniz, U & izin verilir, ancak sadece T & anlamına gelir: bir referansa referans, orijinal referanstır. Bu berbat! Teklik gereksinimini anlamsal olarak kırar. Daha kötüsü: T & & sözdizimsel olarak izin verilmez: bu, ikame ilkesini ihlal eder. Dolayısıyla C ++ referansları, bağlama süresine (ayrıştırma veya tip analizi) bağlı olarak dikeyliği iki farklı şekilde keser. Bunu nasıl doğru yapacağınızı anlamak istiyorsanız .. işaretçilerle ilgili bir sorun yok!
Neredeyse hiçbir gerçek dil dik değildir. İfadenin netliğini taklit eden Şema bile değildir. Bununla birlikte, birçok iyi dilin "dik özellik özelliklerine makul ölçüde yakın" olduğu değerlendirilebilir ve bu, hem sözdizimine hem de temel anlambilime uygulanan bir dil için iyi bir tavsiye niteliğindedir.