Hangi teorik olmayan, pratik programlama dilinde ayrılmış anahtar kelimeler yoktur?


22

Ayrılmış anahtar kelimeleri olmayan pratik bir programlama dili arıyordum ancak bir tane bulma şansım olmadı.

Kendi düzenlemem ve eğlencem için bir programlama dili üzerinde çalışıyorum ve henüz herhangi bir anahtar kelime eklememe gerek yoktu, bu da beni arama ve soruya yönlendiren şeydi:

Derleyici yazarın, dilin son kullanıcısı için önemli olduğunu düşünmüyorum. Bilgisayarlar günümüzde bağlamdan anlam çıkarmaya yetecek kadar güçlü. Bir yazar, isim, fiil vb. Bir roman yazarken etiketlemek zorunda değildir, neden bir programcının işlevleri ve değişkenleri function x() {}veya set x = 1veya var x = 1vb. İle etiketlemesi gerekir ; ifadeler bağlamından bunun bir işlev bildirimi veya bir çağrı olduğunu veya bir etiketin bir değere atama veya bu etiket değerine bir başvuru olduğunu söyleyebiliyorsam?

İşte şu andaki çözümleyicimin ne yaptığının somut bir örneği, normalde bir demet gürültüye sahip olan funcya functionda decya da ya da olmayan bir şeyleri ortak şeyleri desteklemek için ayrılmış anahtar kelimelere gerek yok.

İşlev Beyanı

sum3(a,b,c) -> a + b + c.

İşlev Çağrısı

x = sum3(1,2,3).

Adsız İşlev Adı x

x = (a,b,c) -> a + b + c.
y = x(1,2,3).

Başarılı bir programlama dili için neden önemli anahtar kelimeler olduğunu bilmek istiyorum.


8
Dördüncü oldukça pratik ve herhangi bir anahtar kelime yok.
SK-mantık

4
@JamesAnderson, hayır, sadece kelimeler, diğer kelimelerle aynı. Özel bir anlamı yok.
SK-mantık

7
Operatörler ve noktalama işaretleri "anahtar kelime" olarak sayılıyor mu? evet ise, o zaman dil mevcut olmayabilir, çünkü sözdizimi tanımlanamaz.
Emilio Garavaglia

2
@ SK-mantık: genellikle. Ama henüz belirtmek istemiyorsanız, "tanımlayıcılar" nedir? Bir belirteç "ne olursa olsun acı", "int", "değer" ve "+" olduğu için, bir sözdizimi kuralı verilmeden önce farklı değildir. Eğer "+" operatör olarak tanımlanmadıysa, diğer unicode tek karakterli dizgiler gibi herhangi bir şey için sadece bir isim olabilir. Operatörler, saf sözdizimi açısından, "tek karakterli anahtar kelimeler" den başka bir şey değildir.
Emilio Garavaglia

2
Bu bağlamda, anahtar kelime nedir? Derleyici için özel bir anlamı olan bir tanımlayıcı mı? Programcının değişken olarak kullanmaması gereken bir tanımlayıcı mıdır? Anahtar kelimelerin özel olarak belirtilmesi gerekiyorsa, anahtarsız olarak mı sayılır? (Uzun zaman önce, anahtar kelimelerin anahtar kelimeler olarak belirtilmesi gereken ALGOL sistemini gördüm.)
David Thornley

Yanıtlar:


12

MUMPS oldukça başarılı, sigorta ve sağlık hizmetlerinde yaygın olarak kullanılıyor ve özel kelimeleri içermiyor. Daha net bir kod yazmak için yardımcı olduklarını söyleyebilirim ama kesinlikle gerekli değiller. APL başka bir örnektir. APL, Nükleer Endüstrideki diğerlerinin yanı sıra one-off scriptleri için de kullanmaktadır. APL ailesinin bir üyesi olan J de anahtar kelimelerden yoksundur.

Anahtar kelimeler, derleyici yazarlarının daha kolay ayrıştırma yapmasına yardımcı olur. APL ünlü haklı dernektir. Ayrıca sözleşmelerin güçlendirilmesine ve okunabilirliğin iyileştirilmesine yardımcı olurlar. APL'nin büyük oranda okunabilir olduğu bilinmemektedir.


2
+1 "Anahtar kelimeler, derleyici yazarlarının ayrıştırmayı daha kolay uygulamalarına yardımcı olur". Bence bu çok fazla. Anahtar kelimeler, bir derleyicinin bellekte tutması gereken bağlam miktarını azaltmak için, tüm derleyicinin ve çalışma setinin bir düzine KB RAM'e sığması gerektiğinde kısaltıldı.
Jörg W Mittag

2
APL için bir çözümleyici yazmak, neredeyse diğer tüm dillerden daha kolaydır! Bir APL yorumlayıcısının ilk uygulamasının transistörler ve diyotlar kullanılarak yapıldığını düşünün.
James Anderson,

2
Anahtar kelimelerin asıl sebebinin insanların dili daha kolay ayrıştırmasını kolaylaştırmak olduğunu düşünüyorum. Dil, tıpkı kendi makine kodu gibi tamamen sayılardan ve bit desenlerinden oluşuyorsa, bilgisayarlar daha mutlu olurdu.
James Anderson,

6
APL'nin anahtar kelimelerden yoksun olması, kendi yazı tipini talep etmekten daha fazlasını oluşturur.
Blrfl

@Blrfl J, K ve Q'nun noktası budur. Hepsi ASCII'de bir dereceye kadar APL'dir.
Dünya Mühendisi

9

Anahtar kelimeler olmadan iyi bilinen bir dil Lisp. Anahtar kelimelere en yakın şey özel biçimler olarak adlandırılır - sayıları lehçelere göre değişebilir - tercümandan özel muamele görür. Bunun dışında, nasıl kullanılırlarsa, yeniden tanımlanamadıkları durumlar haricinde, normal işlevlerden ayırt edilemezler (en azından aşina olduğum Lisps'de).

Bu basit (ancak yüksek) ağır sözdizimi ile sonuçlanır ve Lisp'in böyle güçlü bir makro sisteme sahip olmasını sağlayan şeylerden biridir. Öte yandan, Lisp’in genellikle okunması zor olduğu söylenir. APL ve MUMPS, daha da ötesi, her ikisini de Brainf * ck. Anahtar kelimeler bu bölümde yardımcı oluyor ve insanlar için okuma kodunu kolaylaştırıyor.

Bu yüzden, başarılı bir dil için anahtar kelimeler gerektiğini söylemem, ancak bir dilin başarılı olması için kesinlikle yardımcı olurlar.


1
IIRC Lisp anahtar kelimesine sahip değil. Özel formlar derleyici tarafından özel olarak ele alınmalıdır, ancak isimleri normal sembollerdir.
Jan Hudec

2
Anahtar kelimeler, Lisp’in sahip olmadığı sözdiziminin bir özelliğidir. Gerçekten, Lisp'teki anahtar kelimeler hakkında konuşmanın bile mantıklı geldiğini sanmıyorum.
Jörg W Mittag

2
Jörg ile aynı fikirdeyim. Bir dilin benzer bir yapıya sahip belirteçlerden ayırt edilmesi için açıkça özel olarak tanımlanması gereken belirteçleri bulunduğunda anahtar kelimeler hakkında konuşabileceğini düşünüyorum. Farklı belirteçler, farklı sözdizimi ağaçlarına yol açar. Örneğin, ifC'de özel olarak tanımlanmamışsa (bir anahtar kelime) geçerli bir tanımlayıcı olabilir. Bu if, tanımlayıcı olmadığı ve if = 10sözdizimi hatası verdiği anlamına gelir . Yanılmıyorsam ise Lisp'in minimal sözdizimi ayrım yapmaz defundan f, x, yve +de (defun f (x y) (+ x y)).
Giorgio

@Giorgio özellikle if olduğunu Common Lisp (ve diğer Lisp-2'lerin) geçerli bir değişken adı (defparameter if nil)şey kırmak olmaz ve benzeri formlarda kullanılabilir(unless if (setf if t))
tobyodavies

Aynı notta olsa, (defun if ...)başarısız olur. Yorumlardan not alınmış ve cevapları düzenlenmiştir. Özel formların, C ile aynı düzeyde anahtar kelimeler olmadığı, örneğin Lisp'in en yakınları oldukları konusunda hemfikir olabilirim.
scrwtp

8

TCL anahtar kelimeler içermez ve gerçekten de sadece 12 sözdizimi kuralı vardır. bir zamanlar olduğu kadar popüler olmasa da, ECAD ve yönlendiricilerde beklediği ve yer aldığı bir yeri var, bu yüzden kesinlikle aklıma bir pratik sayıyor.

Ayrıca, birçok dilin neden bu rotaya gitmediğini gösterebileceğini de düşünüyorum. Evet, bir TCL ayrıştırıcı yazmak mükemmel bir şekilde mümkün (diğer birçok dilden daha tartışmalı) ancak dil için çok yararlı bir BNF dilbilgisi yazamazsınız ve birçok insan dili öğrenmekte zorlanıyor gibi görünüyor. Bunun en azından kısmen anahtar kelime eksikliğinden kaynaklandığından şüpheleniyorum.


2
Tcl bu konuda Lisp'e çok benziyor, "her şey bir liste" yerine "her şey bir dize". Bir liste sadece içinde boşluk bulunan bir dizedir ve bir prosedür çağrısı yalnızca ilk öğesi bir işlemin adı olarak yorumlanan ve geri kalanı argümanları olarak yorumlanan bir listedir. Bu aslında bir Lisp S İfadesi.
Jörg W Mittag

evet, her ikisi de cila yazısını kullanır ve homo-ikoniktir, bu yüzden oldukça benzer bir semantiği vardır
jk.

5

Günümüzde bilgisayarlar, bağlamdan anlam çıkarmaya yetecek kadar güçlüdür.

Bu, bağlamsız bir gramer istediğin anlamına mı geliyor? İyi şanslar.

Bu güçlü ya da olmamakla ilgili bir soru değil. Dillerle ilgili sonsuz, değişmeyen kurallar var - matematiksel olanlar. Bu ve bir programlama dilinin sözdizimsel olarak kolay olması gerektiği, CFG'lerin on yıllarca gelmesini sağlayacaktır.

Btw., Haskell'de sentaks gibi, sadece

f x y = (x+1)*(y-1)

Bir işlevi tanımlamak için Ancak, bu durumda "anahtar kelimenin" "=" olduğunu gözlemleyin. Eğer kaçırırsanız, ayrıştırıcıda korkunç şeyler olacak.

Ama bu seninle aynı fikirde olduğum bir nokta, bunu diğer dillerde fonksiyonlar tanıtan tüm def, dcl, fun, fn, function ya da what-not anahtar kelimelerinden daha sezgisel buluyorum.

Ancak, bu dilbilgisi düz eski LALR (1) 'de yazılabilir, hiçbir anlamı burada "bağlamdan çıkarılamaz".


1
Bu ifadeye değinmek için +1 (Bilgisayarlar, bağlamdan anlamları çıkartabilmek için günümüzde yeterince güçlüdür). CFG'nin gramerlerinin tercih edilmesinin sebebinin program yapısının indüktif olarak tanımlanmasına izin vermesi olduğunu düşünüyorum. Bunu neden 100 yılda bile değiştirmek istediğini anlamıyorum, belki de sadece hayal gücümden yoksundur?
Giorgio

2
CFG'ler oldukça ölü ve on yıllardır ölmüştü. HTML içinde JavaScript, hatta C biçiminde C dizeleri, hatta OCaml'de iç içe geçmiş yorumlar bile vardır - bunların hepsi bağlamsız değildir. Ve neden kendini, şimdi PEG ve GLR çağında, bu kadar keyfi seçilmiş bir formalizmle sınırlamak istiyorsun?
SK-mantık

1
@Ingo, evet, haklısın, örneğin yanlış bir seçim. CFG olmayan karışık ve genişletilebilir (yani, yüksek dereceli) gramerleri kastediyorum .
SK-mantık

2
@ SK-mantık: CFG'lerin oldukça ölü olduğu bilgisini nereden bulduğunuzu bilmiyorum. Son 20 yıldır derleyici inşaatı öğreten eski bir meslektaşımla konuşuyorum ve CFG'ler ölmekten çok uzak görünüyor.
Giorgio

1
@Ingo: Hatırladığım kadarıyla, ayrıştırma ağacı anlamsal olarak analiz edilerek CF olmayan yönler sonradan ele alınır. Örneğin, { int x = 0; x = "HELLO"; }bir ayrıştırma ağacı oluşturmalı, ancak derleyici ikinci atamadaki x ifadesine baktığında bir int olarak bildirildiğini ve bir tip hatası verdiğini görür. Bu nedenle, program CF yapısı doğru olsa bile reddedilir.
Giorgio

4

Bildiğim kadarıyla Smalltalk, en az anahtar kelimeye sahip dildir (Brainfuck gibi dilleri saymıyorsam). Smalltalk anahtar kelimeler true, false, nil, self, superve thisContext.

Smalltalk'tan ilham alan ve anahtar kelimesi olmayan bir kordon tasarladım. Ancak bir süre kullandıktan sonra, çoğunlukla sözdizimsel şeker için birkaç anahtar kelime ekledim.

Bu nedenle, benim görüşüme göre, anahtar kelimeleri olmayan bir dilin mümkün olduğu, ancak çok pratik değil ve tüm popüler dillerin anahtar kelimeleri olmasının nedeni budur.


Mesajı en azından o zaman, örtük alıcısıyla gönderir için Smalltalk desteği olsaydı true, falseve nilyansıma yetenekleri yanı muhtemelen diğer üç verilen bu örtük alıcı üzerindeki yöntemleri olarak tanımlanabilir ve.
Jörg W Mittag

1
Bunlar anahtar kelime değil, sahte değişkenler. "Sözde" çünkü true, falseve nilçevre tarafından sağlanan tanınmış değerlerdir ve self, superve thisContextayarlamadığınızı değişkenlerdir ancak, değerleri yürütme sonucunda değişir.
Frank Shearar

3

Sahte bir varsayımda çalışıyor gibi görünüyorsunuz, anahtar kelimeler derleyici için işleri kolaylaştırmak için orada. Derleyici için işleri kolaylaştırırken, çok daha önemli bir yararı var: Kodu okuyan kişi için işleri kolaylaştırıyor .

Evet, bir çok bağlamı inceleyebilir ve bir işlev bildirgesine veya değişken bir bildirime baktığınızı anlayabilirsiniz, ancak ilgili kodun içeriğine ve karmaşıklığına bağlı olarak, çözülmesi uzun zaman alabilir. . Veya, orada fonksiyon veya var gibi kullanışlı bir anahtar kelimeye sahip olabilirsiniz ve neye baktığınızı hemen bilirsiniz.

Evet, kodun yazılmasını daha karmaşık hale getiriyorlar , ancak programların üretimde olduğundan çok daha fazla zaman harcadıklarını ve kodlarını okunuyor, hata ayıklanıyor ve oluşturulduğundan çok daha fazla koruduğunu ve dilinizi tasarlamaya çalıştığını düşünüyorlar. Okumak yerine kolay yazmayı kolaylaştırır, zararlı erken optimizasyonun klasik bir halidir.

Ayrıca, derleyicinin işini kolaylaştıran kavramları açıklamayın. Ayrıştırmak ne kadar kolaysa, kodunuz o kadar hızlı derlenir, bu da edit-build-debug çevrimlerinin daha hızlı olması anlamına gelir, bu da verimliliğiniz artar.

Büyük, karmaşık bir kod tabanına sahipseniz, bu verimlilikte önemsiz bir fark yaratabilir. Mesela çalıştığım yerde 4 milyon Delphi hattı olan bir programımız var. Yaklaşık 300.000 satır C ++ olan başka bir modülümüz var. Her ikisi de derlenecek kadar zaman alır. (Yaklaşık 3 dakika.) Eğer 4 milyon C ++ satırımız olsa, inşaatı bir saat sürebilir!


Tüm mükemmel noktalar. +1

Bir romandaki her isim, fiil, zarf ve sıfat etiketli olsaydı, HARDER'in okumasını kolaylaştırmazdı!

@ JarrodRoberson: Elbette, olur, ama kod bir roman değildir. Doğal diller programlama dillerinden çok farklıdır. Doğal dil sezgisel olarak anlaşılır, bir programlama dili ise biçimsel anlamlıdır. Onu okumak ve anlamını anlamak için kullanılan teknikler çok farklıdır ve sizin gibi ikisini eşitlemeye çalışmak bir hatadır.
Mason Wheeler

Dediğim derleyici yazar farklıdır derleyici . Derleyiciler daha hızlı donanımda daha hızlı olurlar , derleyici yazarları insandır, biz Moore Yasasına uymuyoruz!

Çalışma eğiliminde olduğum kod tabanları, uzunluktaki romanlardan daha uzun büyüklükteki emirler, çoğu> 1,000,000+ kod satırı , en uzun romanların çoğu <2,000,000 kelime ! Ve insanlar tarafından okudukları romanlarda olduğu gibi, aslında kodu okumaktan daha çok zaman harcanıyor! > 10 yaşından büyük ve 1000.000'den fazla olan bir kod tabanı göz önüne alındığında, geliştiriciler tarafından 10 yıl boyunca okunduğu süreleri cüceler oluşturuyor.

2

Bazı nadir örnekler var.

APL sadece semboller kullanır - ama birçoğu! Dili kullanmak için özel bir klavyeye ihtiyacınız var.

Bkz bu wikipedia makale

CORAL 66 - Anahtar kelimeleri vardı, ancak bunları yalnızca tek tırnak işareti kullanmaları durumunda tanıdı.

PL / 1 anahtar kelimelere de sahipti - ancak bunları değişken veya prosedür adları olarak da kullanabilirsiniz.

Sonuçta sorunuz biraz "neden konuşulan dillerin kelimeleri var?"


Eklemek gerekirse, APL'nin görünüşünü seviyorsanız, ancak yeni bir klavye almak istemiyorsanız, J tam da budur.
AakashM

0

Asıl sebep, hem insanların hem de bilgisayarların ayrıştırılmasının daha kolay olmasıdır. Anahtar kelimeler olmadan karmaşık bir dilin yanlış anlaşılması, sözdizimi gibi birçok sembol gerektirir ve çok büyük ve gereksiz yere kafa karıştırıcı olurdu. Bu okumak çok daha kolaydır functiondaha $!{}. Bağlam bütün belirsizlikleri çözmez.


1
Cevabınızdaki anahtar kelime karmaşık , bence yeterince tasarlanmış bir dil karmaşık değil basit olmalı .

1
@ Robrod Roberson: Leonardo da Vinci: "Sadelik, en üst düzey sofistikedir", Antoine de Saint Exupéry: "Eklenecek bir şey kalmadığında değil, götürecek bir şey kalmadığında mükemmelliğe ulaşılmış gibi görünüyor".
Giorgio

1
@ Jarrod: Anlamlı bir şekilde ifade edilen bilgisayar dillerinin tümü karmaşıktır.
DeadMG

1
@DeadMG: Şema çok basit ve aynı zamanda çok etkileyici. Ne yazık ki, bildiğim kadarıyla standart bir kütüphane bulunmuyor.
Giorgio

Erlang, çok etkileyici ve sözdizimsel olarak karmaşık değildir. Tüm işlevsel dillerin daha az ayrılmış anahtar kelimelerle daha etkileyici olduğunu düşünüyorum.
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.