Komut Dosyası Dili Oluşturma Hakkında Soru


12

Mesela, örneğin, birisine programlama dili ya da senaryo dili oluşturmak için birine ödeme yapmak istedim. Tam olarak ne istediğimi tam olarak anlamak için ne tür bir belgeye ihtiyaçları olacaktı.

Yani, söz konusu yeni programlama / kodlama dilini tanımlayan standart belgeler var mı?


Bu programcılarla değil programlama ile ilgili olduğundan, bu muhtemelen StackOverflow için daha uygun.
Muad'Dib

14
Muad'Dib ile aynı fikirde değilim. Burası bu soru için iyi bir yer olduğunu düşünüyorum.
Chris

5
Bence kendi kodlama dilinizi icat etmek yerine, sizin ve kullanıcılarınızın yeni bir dil öğrenmek zorunda kaldıkları için çok fazla çalışma pahasına, mevcut bir kodlama dilini daha iyi yerleştirmelisiniz. Python, Javascript / ECMAScript gibi bazı diller daha büyük bir çerçeveye yerleştirilebilecek şekilde tasarlanmıştır. Kısacası, yalnızca API'yi tasarlamanız ve kod yorumlayıcısını kendi programınıza yerleştirmenin bir yolunu bulmanız gerekir.
Yalan Ryan

1
Eğer dil bir DSL olacaksa, bunu yapmanın avantajı vardır. genel bir dil için çok fazla değil. Elbette bazı genel diller DSL'ler için Lisp veya TCL
jk

Yanıtlar:


16

Yazmanız gereken şey dil belirtimi olarak adlandırılır .

Dilin dilbilgisinin (tercihen Genişletilmiş Backus-Naur-Formunda ) ve semantiğinin bir tanımını içermelidir .

İkinci kısım için ya kendi kelimelerinizle bir açıklama yazabilirsiniz (ama kesin olmaya özen gösterin) ya da resmi bir anlambilim yazabilirsiniz .


1
BNF sadece içerik ücretsiz dilbilgisi için yararlıdır, komut dosyası dilleri her zaman bağlamsız değildir, örneğin TCL (yine de çoğu durumda bağlamsız bir dile sahip olmanın tercih edilebilir olduğunu düşünüyorum)
jk.

@jk. BNF'nin bağlam dışı diller için tamamen yararsız olduğunu söyleyemem. Bağlamdan bağımsız sözdiziminin ne olduğuna bağlı olarak, EBNF'de belirtmek ve daha sonra sözcüklerdeki belirsizlikleri çözmek mantıklı olabilir. Örneğin C ++ standardının yaptığı budur. Çoğu durumda, bunun her şeyi kelimelerle açıklamaktan veya içeriğe duyarlı veya kısıtlamasız bir dilbilgisi kullanarak belirtmekten daha açık olduğunu düşünüyorum.
sepp2k

doğrusu, daha çok dejenere sözdizimleri olan lisp, tcl veya forth (aslında DSL'leri tanımlamak için çok iyi) dilleri vardı ve böylece BNF size çok az şey söylüyor
jk.

@jk. Elbette, ancak bu durumda sözdizimini tanımlamanın diğer her yolu size eşit derecede az şey söyleyecektir, çünkü söylenecek çok az şey vardır. Bu, spesifikasyonun sözdizimi kısmının çok kısa olacağı anlamına gelir.
sepp2k

13

Aşağıdakilere ihtiyacınız olacak:

  • Yeni bir dil yaratmanın bir nedeni
  • Bir Felsefe
  • Anlamsal Bir Tanım
  • Jetonlarınızın sözlüksel açıklaması
  • Bir Sözdizimi Analizi tanımı

Diliniz nasıl farklı olacak? Görevi nedir? İşlevsel mi? Nesne yönelimli mi? Meta bir dil mi? Eşsiz özellikleri nelerdir? Var olmayan (veya çirkin bir şekilde var olan) dünyaya ne verecek? Bir şeyi nasıl değiştirmek istiyorsun? Derlenmiş veya yorumlanmış mı? DSL mi yoksa genel amaçlı bir dil mi? Bu sizin felsefenizdir ve dilinizin tasarımı hakkında çok şey ifade eder.

Sonra, kaba sözdizimi ve semanti kazıma üzerinde çalışın. Bu sizin anlamsal tanımınız olacak ... sahte kod yazmak düşüncelerinizi geliştirmek için harika bir yoldur. Bunun nasıl yapıldığına dair mükemmel bir örnek için "C Programlama Dili" ni okuyun. Onunla oyna.

Daha sonra belirteçlerinizi ve sözdizimini bir şekilde tanımlamanız gerekir. Programlar daha sonra bunları dizelerde okuyabilen ve sözdizimini işleyebilen otomatik veri olarak işler. Yacc ve Bison, sırasıyla lexical ve syntax analizi için Regular Expressions ve BNF stili bir sözdizimi kullanır. Diğer diller için Yacc ve Bison benzeri araçlar da bulunmaktadır.

Ayrıca ne YAPMAYI bilmek için dil teorisinde / derleyicide bir topraklamaya ihtiyacınız olacaktır . Örnekler arasında belirsiz gramerler, AST oluşturma ve manipülasyon sorunları ve genellikle yaşamın kendiniz için nasıl basitleştirileceği sayılabilir. Teoriyi bilmek çok önemlidir. Başlamak için aşağıdakileri almayı düşünürüm:

Derleyiciler: İlkeler, Teknikler ve Araçlar (Dragon Book)
C'de Modern Derleyici Uygulaması veya Java'da Modern Derleyici Uygulaması


1
Felsefe için +1, DSL için burada etki alanını açıkça tanımlamak istersiniz
jk.

8

Yeni bir dil oluşturmak için zamanın% 99,9'u tamamen gereksizdir. Yatırımın geri dönüşü büyük olasılıkla küçük olacak ve zamanınızı boşa harcamış olacaksınız.

Büyük olasılıkla Javascript'i duyarlı bir komut dosyası dili olarak kullanabilirsiniz ve çoğu dil için zaten ayrıştırıcılar vardır. Bunlar için uygun bir ayrıştırıcı bulabilirseniz, istediğiniz diğer komut dosyası dillerini de kullanabilirsiniz. Bunları programınıza uygulamak çok daha az çalışma gerektirir ve daha büyük bir getiri sağlar. İnsanlar başka bir dil öğrenmek zorunda değil, sadece API'nızı öğrenmek zorundalar. Çok daha iyi bir çözüm.

Yeni bir dil oluşturmak neredeyse her zaman kötüdür.


9
Kötü olmadığı zamanlar hariç. Kendi basit DSL'lerinizi oluşturmak çok faydalı olabilir. Şimdi kendi genel amaçlı dilinizi oluşturmak, cevabınızın söylediklerine daha uygun olacaktır.
ChaosPandion

@ChaosPandion ama birçok dil zaten bu dilden kod kullanan bir DSL oluşturmada mükemmel (yani yakut bu konuda iyi)
alternatif

2
Cevabınıza katılıyorum, ancak bu sorunun doğru cevabı olmadığına inanıyorum. Asker, bir dil yaratmanın artıları / eksileri için değil, bir betik dili yaratmanın genelliğine baktığına inanıyorum.
Tim Murphy

Yeni bir dil oluşturmak neredeyse her zaman en iyi çözümdür. en.wikipedia.org/wiki/Language-oriented_programming
SK-mantık

3

BNF'de dilinizin dilbilgisini tanımlayabilirsiniz .

Örneğin, bu Python'un grameri .


6
Dilbilgisi tek başına bir dili uygulamak için yeterli bilgi değildir. Ayrıca semantiği şu ya da bu şekilde belirtmelidir.
sepp2k

0

.NET kullanıyorsanız, bir süre önce tökezlediğim bir şey var. Sadece meraklı bir bakış verdim, ama belki de sana yarar: ironi .

Irony, dilleri .NET platformunda uygulamak için bir geliştirme kitidir.

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.