Bir dilin programlanabilir olması için, bağlamsız bir dilbilgisine dayalı olması zorunlu mu?


23

Pratik olarak, sonunda derlenebilecek / sistem düzeyinde talimatlara dönüştürülebilecek bir dil için, bağlamsız bir gramer olması gerekli midir?

Örneğin: Tüm programlama / komut dosyası dilleri ücretsiz gramer içeriyor mu? Java, CFG'lere dayanmaktadır, ancak gerçekte tüm programlama dillerinin CFG'lere dayanması söz konusu mu?

Zorunlu görünmüyor, fakat anlayışımda boşluklar var.

Sorunun bazı bağlamları: Dilbilgisi kurallarını da sağlayan Java dili spesifikasyonuna bakıyordum . Bu bana bu soru hakkında düşündürdü.


1
Genel olarak derleme sorununun hesaplanmasını istediğinizi düşünüyorum ve CFG'leri ayrıştırmak güzel ve kolaydır. Bazı iddiaları duyduğuma rağmen, örneğin, geçerli perl programlarını tanımanın aslında hesaplanamayan bir problem olduğunu söyleyebilirim.
Janne H. Korhonen

2
Aslında gerçekten ihtiyacınız olan şey turing-decidable sözdizimidir (tüm CFG'ler). Ayrıca , sözdizimi devri giderilemez olan bir programlama dili de yapabilirsiniz , ancak yazım hatası yaptığınızda, derleyicinin geçerli sözdizimi olup olmadığına karar vermeye çalışırken hiç durmayabilir. Bu gerçekten yararlı değil
cırcır ucube

@ratchet, sentaksın tekrarlı bir şekilde numaralandırılması gerektiğini mi düşünüyorsun?
David Harris

4
@JanneKorhonen: Spesifik olarak, Perl statik olarak ayrıştırılamaz, yani yürütülmeden ayrıştırılamaz; söz konusu infazın sona ermemesi nedeniyle, Perl'in statik olarak ayrılması Halting Probleminin çözülmesi anlamına gelecektir.
Jon Purdy

@janne, hesaplanabilen veya hesaplanamayan problemler içerebilecek olan ön-işlem sonrası, genel olarak programın onaylandığı son gramerin bağlamsız olduğu durumudur. Daha spesifik olmak gerekirse, ön işleme sonrası, bir belirteç dizisine uyan bir kuralı tanımlamak için diziyi çevreleyen diğer belirteçlere bakmamız gerekir. Mantıklı olup olmadığımı bilmiyorum, bunun için üzgünüm. Aslında biraz kafam karıştı.
sandeepkunkunuru

Yanıtlar:


20

İki kere hayır.

İlk olarak, çoğu HPL içerik içermez. Genellikle bir CFG'ye dayalı bir sözdizimine sahip olsalar da, insanların statik anlambilim dedikleri şeye de sahiptirler (bu genellikle sözdiziminde de bulunur). Bu, doğru bir program için teslim alması gereken adları ve türleri içerebilir. Örneğin,

class A {
  String a = "a";
  int b = a + d;
}

sözdizimsel olarak doğru bir Java programıdır ancak dtanımlanmadığı ve auygun bir türe sahip olmadığı için derlenmeyecektir .

İkincisi, yapabilirsiniz bağlam serbest (besbelli derleyici varlığının kanıtlanmış) olmayan dilleri ayrıştırmak. Sadece CSG'ler etkin biçimde çözümlenebilirken, CSG'ler genel olarak olamaz. Bununla birlikte, verimli kalırken bağlamsız bazı özellikler ekleyebilirsiniz.

Derleyiciler genellikle aşamalar halinde çalışırlar: önce tokenizasyon (normal), sonra bağlamsız ayrıştırma, sonra ad ve tür analizi (bağlam duyarlı, bazen daha da zor). Bu davranışı, aldığınız hata mesajlarından gözlemleyebilirsiniz.


3
Unutma, public class Program { public static void main(String[] args) { ... } }Java ... o kadar kolay çıkmana izin vermeyecek. :-)
Roy Tinker

Teknik olarak, class A { ... }tamamıyla javacyapamayacağınız şeyleri derlemeniz yeterlidir (bir giriş noktasının olmaması nedeniyle). Ama evet.
Raphael,

20

6
Bunun Perl şakasının punchline olması gerektiğini düşünüyorum :)
Suresh Venkat

5
Suresh: SIGBOVIK 2011'de "Eşsiz programlama dilleri hakkında" yazısında çok iyi bir şaka olduğu ortaya çıkmamasına rağmen bu şakayı çoktan yaptım ( sigbovik.org/2011/proceedings.pdf - sayfa 79- 82).
Rob Simmons

1
Not: Perl tercümanı henüz deterministik değildir, eğer herhangi biri için bir rahatlık ise :)
Roy Tinker

15

Python'un dilbilgisinin bağlamsız olduğuna inanmıyorum. Aynı kod bloğundaki satırların aynı miktarda girintiye sahip olması gerekliliği, serbest gramerlerin bağlamı iyi işleyen bir şey değildir.

Daha doğrusu, formun Python bloklarının diline ait bir homomorfizm varmış gibi görünüyor.

eğer durum:
     satır 1
     hat 2
     satırı3
Başka:
     line4

0n10n10n


4
Kesinlikle haklısınız, ancak programlama dilleri bağlamında, tokenization adlı bir ön işleme adımından sonra ortaya çıkan dili bağlamsız hale getirmeye çalışıyoruz . Girintiden önce kontrol edildiğini düşünüyorum.
Diego de Estrada

7
Evet, Python lexer (tokenizer), bir yığın girinti derinliğine sahiptir; simge akışı her bloğun başında bir INDENT sembolüne ve sonunda bir bağlamsız şekilde ayrıştırılabilen bir DEDENT sembolüne sahiptir (INDENT ve DEDENT, C'deki parantezlere benzer şekilde davranır). C "beyan ya da ifadeyi söyleyemez mi?" Sorununa sahip: bir işaretçi mi yoksa çarpma zamanını mı gösteren foo * bar;bir beyan mı? foobarfoobar
Maksimum

8
Tamam, elbette, ama sonra, sık sık olduğu gibi sonlu bir durum transdüseri yapmak yerine, lexer'daki aynı karmaşıklığı gizliyorsunuz.
David Eppstein

1
@DavidEppstein: Adil olmak gerekirse, karmaşıklığın hiçbir şekilde büyük olmadığını söyledi.
Jon Purdy

1
INDENT / DEDENT'in sözlükteki elleçlenmesi dışında Python'un çok basit bir LL (1) gramerı vardır.
saat

13

Bodo Manthey ve Martin Böhme, her C ++ Derleyicisinin mutlaka Turing'in tamamlandığını, yani derleme zamanında herhangi bir kısmi özyinelemeli işlevi hesaplayabileceğini gösteriyor . Bu yüzden içeriğe duyarlı olandan çok daha kötü.

http://wwwhome.math.utwente.nl/~mantheyb/journals/BotEATCS_BoehmeManthey_CompilingCPP.pdf


Evet, ama derleyici hiçbir zaman yalnızca bağlamsız dilbilgisi değildir. Derleyiciyi değil, gramerin kendisini tartışmalısınız.
Jeff Burdges

@Jeff: Cevabımdaki "Derleme zamanı", "verilen bir C + kaynak kodunun doğru olup olmadığını kontrol etmek" anlamına gelir. Makalede yapının hafifçe değiştirilmesiyle, karar verilebilecek her dili, tüm doğru C ++ programlarına indirgeyebilirsiniz.
Markus Bläser,

7

Ben düşünüyorum kullanımdan önce beyan değişkenlerinin ve fonksiyon polimorfizmi cepten dillerinin context free gramerler tarafından ele alınamaz diller özelliklere programlama diğer örnekler şunlardır:

int myfun(int a) { ... }
int myfun(int a, int b) { ... }
int myfun(int a, int b, int c, ...) { ... }
...
int I_m_I_cfg = myfun(1,2);
...

Küçük bir Google araması yaptım ve şu makaleyi buldum: " Basit bir Boole Dili için Boole Dilbilgisi " A.Okhotin (2004); Ona göre, asıl sorun tamamen resmi bir gramer tarafından tanımlanan bir programlama dili bulmaktır :

Bir oyuncak prosedürel programlama dili tanımlanır ve bu dilde iyi biçimlendirilmiş programlar kümesi için bir Boole dilbilgisi oluşturulur. Bu, görünüşe göre, tamamen bir dilbilgisi ile bir programlama dilinin ilk özelliğidir.

Makalenin Giriş bölümü kısa fakat çok açıklayıcı.


6

C'nin gramerinin sadece teknik olarak bağlamsız olduğuna inanıyorum, çünkü ayrıştırıcılar Duff'un cihazını desteklemek için her zaman bağlamsız teknikleri kullanıyorlar .

Girinti tabanlı diller, David'in dediği gibi doğal olarak bağlamsız değildir, ancak parametreli hale getirilmiş bir girinti belirtecine göre bağlamsız hale gelirler.

Haskell, operatör önceliğini infix ve infixl ile değiştirmenize izin verir. Perl'in katı pragma modülü, bağlamsal olmayan, muhtemelen başka ayarlar da yapan $ ^ H ve% ^ H sözcükleri kullanılarak gerçekleştirilir.

TeX gibi makro genişletici diller vardır, burada afaik ayrıştırma işlemi yürütülmeden bir anlam ifade etmez.

Muhtemelen kesişimi bağlamsız olmayan fakat hala bir Turing makinesini tanımlayan bağlamsız iki gramer bile vardır.

Java ve assembler muhtemelen doğal olarak bağlam içermez.


2
(a)-bC'nin belirsizliği bağlam içeriğine duyarlı yapmıyor mu? ( adeğişken veya typedef olabilir - bazı diğer diller bu sebepten dolayı eksi eksi ifadelerinin kullanılmasına izin vermez)
Random832

Gecikmiş yorum için özür dilerim, ancak Duff'un cihazı sözdizimsel sapma içermiyor. Diş telleri doğru dengede. C özelliği, C'nin bağlamsız olup olmadığı konusundaki tartışmalarda önişlemci olarak görmezden gelinir. Herhangi bir yorum, ancak gayri resmi, iyi niyetli bir dil bile olsa, bir makro işlemcili bir dili tanımlamak için kullanılmasına izin veren "bağlamsız" tereddütlü olduğuna şüpheliyim. Ve C önişlemcisi iyi davranılmış bir şey değil.
rici

4

Hayır ve birçok pratik dil bağlamsız değildir. Örneğin, C ++ dilbilgisi değildir, çünkü bazı bağlamlarda dilbilgisi çözünürlüğü içerik içermeyen bilgileri yazmaya bağlıdır.


4

İlk önce bir programlama dilinin sözdizimi ile dilin kendisi arasında bir ayrım yapmama izin verin.

Birçok dilin sözdizimi (en azından temelde) Bağlamsız Dilbilgisi (CFG) 'dir, çünkü bunlar iyi çalışılmıştır ve bir CFG'yi verimli bir şekilde ayrıştırabilecek algoritmalar vardır ve CFG tarafından çözülemeyen kenar durumları özel olarak ele alınabilir

Ancak pek çok dil aslında Bağlamsız değildir (örneğin, java, C (++), D).

Eğlenceli gerçek: D, bir Turing tamamlama derleme zamanı işlev değerlendirmesi ve dilin kendisini Turing'in kararsız hale getirmesini sağlayan şablon genişlemesine sahiptir. Ancak dilin yaratıcısı, sözdizimini bir CFG yapmak için çok uzadı.


Ad ve tür analizi, genellikle kendiliğinden bağlam dışı serbest görevleri gerçekleştirir.
Raphael

C ++ şablonunda meta-programlama Turing tamamlandı.
Jeff Burdges,

3

"Tüm programlama / kodlama dilleri bağlamında ücretsiz gramer var mı?" Bölüm söz konusu olduğunda, cevap kesin bir No.

Re: “sonunda derlenebilen / sistem düzeyinde talimatlara dönüştürülebilen bir dil için” ana sorusu, neden zorunlu olarak bir CFG olmak zorunda olduğunu bilmiyorum. Ancak, ortaya çıkan daha iyi açıklamalar olabilir.


1
Kris, bazı bağlamsız bedava gramer tabanlı programlama dilleri örnekleri verebilir misin? Demek istediğim, programın aleyhinde onaylandığı son gramer olan, hesaplanabilen veya hesaplanamayan sorunlara neden olabilecek ön işleme sonrası.
sandeepkunkunuru

3

Bir programlama dili, CFG'lerin bir örneği olduğu bir tür gramer formalizmine dayandırılmalıdır. Her ne kadar CFG'ler en yaygın olsa da (ve üniversitedeki derleyici kurslarında öğrenilen olağan şeyler olsa da), daha fazla ısırık büyüklüğünde bir okuma için burada (pdf) veya Wikipedia'da daha fazla okuyabileceğiniz Ayrıştırma İfade Dilbilgileri gibi başka formaliteler de vardır .

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.