Forth'ın esnekliği neden bir dilbilgisini bunun için uygunsuz hale getiriyor?


10

Geçenlerde yığın tabanlı bir programlama dili yazma görevini üstlendim. Dilimi tasarlamaya başlamadan önce, mevcut yığın tabanlı dilleri okumanın ve denemenin iyi bir fikir olacağını düşündüm.

Bu beni bu yazının konusuna getiriyor. Postfix stil ifadelerini kullanan yığın tabanlı bir dil olan Forth'daki Wikipedia makalesini okuyordum . Makalede, aşağıdaki ifadeyi gördüm:

Forth'un esnekliği statik bir BNF dilbilgisini uygunsuz hale getirir ve monolitik bir derleyiciye sahip değildir. Derleyiciyi genişletmek, dilbilgisini değiştirmek ve temeldeki uygulamayı değiştirmek yerine yalnızca yeni bir sözcük yazmayı gerektirir.

Anladığım kadarıyla Forth lingo'da "kelime" terimi temelde "altyordam" ile eşanlamlı gibi görünüyor. Bu göz önüne alındığında, yukarıdaki ifade garip görünüyor. Neden Forth'ta yeni işlevler oluşturma yeteneği Forth için resmi bir dilbilgisi uygunsuz hale getirir? Tanımladığınız her yeni alt program için dilbilgisini neden yeniden yazmanız gerekiyor? Çevreye yeni bir kelime yazmak derleyiciyi genişletmeyi nasıl oluşturur ? Yukarıdaki ifade, yeni fonksiyonları tanımlayabileceğiniz için resmi bir dilbilgisinin Python için uygun olmadığını söylemeye benzer.

Aslında, aşağıdaki Forth'un basit bir alt kümesi için bir BNF stili dilbilgisi yazmaya karar verdim:

program        ::= stmt+
stmt           ::= func | expr
func           ::= ':' expr+ ';'
expr           ::= INTEGER | word
word           ::= ('+' | '-' | '*' | '/' )

Yukarıdaki dilbilgisi, Forth ifadelerinin geçerli bir alt kümesini kapsamaktadır ve Forth dilindeki tüm geçerli ifadeleri kapsayacak şekilde genişletilmesi zor görünmemektedir. Ayrıca, bir derleyicinin ayrıştırıcısı yukarıdaki dilbilgisini uygularsa, derleyicinin nasıl genişletileceğini göremiyorum. Derleyici, çevresine yeni kelimeler ekleyecektir . Sadece çevre değişti. Wikipedia'dan Yukarıdaki alıntı derleyici oluşturan altını çizerek kodunu (değişmezse olan) conflating sanki neredeyse görünüyor ile derleyici'nın çevre (değişim yapar).

Özetle, Forth'un yeni sözcükleri (altyordamlar) tanımlaması ablitisi neden yazılı bir dilbilgisi için uygun değildir?


1
"Uygunsuz" bu bağlamda güçlü bir kelimedir. Daha iyi bir kelime muhtemelen "gereksiz" olacaktır.
Robert Harvey

1
Oh, tamam @RobertHarvery. Ancak, durum böyleyse, alıntıladığım alıntı çoğu dil için geçerli gibi görünmektedir. Teknik olarak bir dilbilgisine asla ihtiyaç duyulmaz , ancak bir tanesine sahip olmak güzeldir - özellikle el yazıcıları yazarken.
Christian Dean

Ancak çoğu dilde, ayrıştırıcı kullanıcı koduyla değiştirilebilen basit bir çalışma zamanı kütüphanesi değildir, böylece bir sonraki satırın nasıl ayrıştırılacağını etkiler.
Jörg W Mittag

Yanıtlar:


10

"Normal" bir kelime hemen hemen bir altyordamdır.

... ancak derleyicinin çalışma şeklini değiştiren, kullanıcı tanımlı bir tanımlayıcı sözcük yazabilirsiniz . Örneğin, bir tanım normalde iki nokta üst üste (":") ile başlar ve noktalı virgül (";") ile biter. Ancak isterseniz, (örneğin) iki nokta üst üste işaretinin yapısını değiştirebilir ve süreçte bir kelime tanımının nasıl "derlendiğini" değiştirebilir, böylece derleyicinin çalışma şeklini değiştirebilir ve tanınan dilin gramerini değiştirebilirsiniz.

Bu yüzden bir dilbilgisinin uygunsuz olduğunu söylüyor - dilbilgisi kelimenin tam anlamıyla programın bir bölümünden diğerine değişebilir. Bir sözlük yüklemek yalnızca adları şu anda tanınan alt rutinleri değil, aynı zamanda yeni bir kelime tanımladığınızda ayrıştırılan dilbilgisini de değiştirebilir.


2
Forth'un bu özelliğinin sadece semantiği değil, dilbilgisini de değiştirdiğinden emin misiniz?
Doc Brown

@DocBrown: Forth'u kullanan pek çok kişi bunu çok sever, bu nedenle genellikle eldeki görev için gereken en az değişikliği yaparlar. Yeterince hırslı (ve çılgın) biri, istedikleri takdirde sözdizimini tamamen değiştirebilir - yeterince düzeltme yapmak istediklerinde postfix yerine infix gösterimi kullanmak gibi.
Jerry Coffin,

@DocBrown Forth'ta C tercümanı yazmama ve ardından programın ortasında aniden C'ye geçmeme izin verecek ne tür bir gramer yazabilirsiniz?
user253751

@immibis: sorum şu: Forth gerçekten böyle bir şeye izin veriyor mu? Bu bağlantılı makaleden, bu benim için doğal olarak açık değil.
Doc Brown

@DocBrown Evet öyle. Kodunuzu derleme zamanında çalıştırabilirsiniz, yani isterseniz derleyiciyi tamamen ele geçirebilirsiniz. Temel olarak C derleyicinizi / yorumcunuzu Forth derleyicisinin / yorumlayıcısının ortasında çalıştırabilirsiniz. (sonunda
Forth'a

3

Forth'ta, kodu derleme zamanında çalıştırabilirsiniz.

Özellikle, girişteki sözcükleri tüketen kodu çalıştırabilirsiniz. Örneğin, Forth'a bir C derleyicisi yazıp derleme zamanında çağırabilir ve programınızın geri kalanını C'ye yazabilirsiniz.

Daha yaygın olarak, kaynak koddan bağımsız değişkenleri okuyan kelimeleri tanımlayabilirsiniz. Geleneksel olarak kelimeleri derleyiciyle aynı şekilde okursunuz, ancak zorunlu değildir.

Örneğin, ."(bir dize basan) sözcük bir sonraki boşluğa kadar okunmaz, bir sonrakine kadar okur ". Kodu : PRINTHELLO ." Hello ; : func2 world!" ;özel bir durum olmadan ayrıştırmaya çalışırsanız, kodun doğru ayrıştırılmadığını ."görürsünüz.

Kesinlikle için özel bir durum ekleyebilir ."senin dilbilgisi, ama gibi programcı kendi kelimeyi tanımlıyorsa dilbilgisi hala yanlış olacak ."- örneğin burada bir tane: : MY_PRINT POSTPONE ." ; IMMEDIATE. Bu kelime ."; Yazabilirim MY_PRINT Hello ; world! "ve gramerinizin onu ayrıştırması gerekir. Bunda iyi şanslar.

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.