Professional Documents
Culture Documents
ch3 PL
ch3 PL
Tanıyıcılar (Recognizers), bir dilin girdi dizelerini okur ve bu girdi dizelerinin dilin bir parçası olup
olmadığına karar verir. Örneğin, bir derleyicinin sözdizimi analiz bölümü, programlama dilinin doğru
sözdizimine sahip olup olmadığını kontrol etmek için bir tanıyıcı olarak işlev görür. Bu bölüm, derleyicinin
girdi kodunu inceleyerek dilin yapısal kurallarına uyup uymadığını kontrol eder.
Üreticiler (Generators), bir dilin cümlelerini oluşturan bir cihazdır. Örneğin, bir dilin gramerine uygun
rastgele cümleler oluşturan bir yazılım bir üretici olarak işlev görebilir. Bu tür bir yazılım, dilin yapısını ve
kurallarını temel alarak doğru cümleleri üretir ve çeşitli amaçlar için kullanılabilir, örneğin, dilin test edilmesi
veya eğitim amacıyla kullanılabilir.
Bağlam Bağımsız Gramerler (Context-Free Grammars), Noam Chomsky tarafından 1950'lerin ortalarında
geliştirilmiştir. Bu gramerler, dil üreticilerini kullanır ve doğal dillerin sözdizimini tanımlamak için
tasarlanmıştır. Bağlam bağımsız gramatikler, dilin sözdizimi ve yapısal özelliklerini açıklamak için
kullanılır.Bağlam bağımsız gramatikler, dilin yapısal kurallarını tanımlar ve bu kurallara göre cümlelerin
oluşturulmasını sağlar. Her kural, bir sembol veya sembol dizisini başka semboller veya sembol dizilerine
dönüştürmek için bir üretici kural olarak düşünülebilir. Bu gramerler, dilin yapısal özelliklerini belirleyen bir
dizi kuralları içerir ve bu kuralların uygulanmasıyla dildeki doğru cümlelerin üretimi sağlanır.Bağlam
bağımsız gramatikler, bağlam bağımsız diller olarak adlandırılan bir dil sınıfını tanımlar. Bu dil sınıfı, bir
dilin sözdizimini tanımlayan kuralları kapsar ve birçok doğal ve yapay dil bu sınıfa girer. Bağlam bağımsız
dil sınıfı, bilgisayar biliminde ve dilbilgisinde önemli bir rol oynamaktadır, çünkü birçok programlama dilinin
sözdizimi ve dil işleme sistemlerinin temeli olarak kullanılır.
Backus-Naur Form (BNF), John Backus (ve Peter Naur'un katkılarıyla) tarafından Algol 58'i tanımlamak için
icat edilmiştir. BNF, bağlam bağımsız gramatiklere eşdeğerdir ve bir dilin sözdizimini açıklamak için
kullanılan bir metalenktir.
BNF, dilin yapısını tanımlamak için kullanılan bir formattır. Bu formatta, dilin sentaksını ve kurallarını
açıklamak için kullanılan metalar veya semboller birbirine kural olarak bağlanır. Bu kural setleri, bir dildeki
doğru cümlelerin yapılarını belirtir.
BNF'nin temel amacı, bir dilin yapısal özelliklerini tanımlamak ve anlamak için bir standart sağlamaktır.
BNF'nin kullanılması, programlama dillerinin sentaksının ve yapılarının açıklanmasında, dil işleme
sistemlerinin geliştirilmesinde ve iletişim protokollerinin belirlenmesinde yaygın olarak kullanılır.
Sözdizimsel listeler, özyinelemeli olarak tanımlanır. Bir türeme, kuralların tekrar tekrar uygulanmasıdır;
başlangıç sembolüyle başlar ve bir cümle (tamamen terminal sembollerden oluşan) ile biter.
Yukarıdaki tanımda, <ident_list> sembolü, bir veya daha fazla tanımlayıcı içeren bir listedir. Bu listedeki
tanımlayıcılar virgülle ayrılmıştır. Tanımlama, tek bir tanımlayıcıdan (ident) veya bir tanımlayıcıdan sonra
virgül ve ardından başka bir <ident_list>'in gelmesinden oluşur. Bu kural, bir özyineleme (rekürsif)
kuralıdır; çünkü <ident_list> sembolü, kendisini içerebilir, böylece tanımlayıcı listesi sonsuz uzunlukta
olabilir.
Non-terminal semboller: BNF soyutlamalarıdır ve genellikle < ve > arasında gösterilir. Bunlar dilin
yapısını temsil eder ve başka sembollerle (terminal veya başka non-terminal sembollerle)
birleştirilebilir.
Terminal semboller: Metin veya simgelerdir ve dildeki en küçük yapısal birimleri temsil ederler.
Genellikle açıkça tanımlanmıştır ve non-terminal semboller tarafından kullanılırlar.
Anahtar Semboller: < > | → gibi sembollerdir. < ve > non-terminal sembollerini, | alternatifleri ve →
Örneğin, "a = b + 5;" gibi bir ifade, bu gramerde geçerli bir ifadedir. Bu ifade, bir atama ifadesidir, çünkü bir
değişken "a", bir ifade "b + 5" ile atanır.
Bu türetilmiş örnek, verilen grameri kullanarak bir program ifadesinin nasıl oluşturulabileceğini gösterir.
Başlangıçta, <program> non-terminali bir <stmts> non-terminaline türetilir. Sonra, <stmts> non-terminali bir
<stmt> non-terminaline türetilir ve devam eder.
Sonuç olarak, "a = b + const" ifadesi, gramerde tanımlandığı şekilde türetilir. Bu türetilmiş ifade, bir program
içinde bir atama ifadesini temsil eder: "a" değişkeni, "b" değişkenine bir sabit eklenerek değerlendirilir.
Genişletilmiş BNF (EBNF), BNF'yi daha güçlü bir dil tanımlama aracı haline getiren bazı ek özellikler içerir.
Bu özellikler, daha karmaşık yapıları ve kuralları tanımlamak için kullanışlıdır. İşte bazı yaygın EBNF
öğeleri:
1. İsteğe Bağlı (Optional) [ ]: Bu özellik, parantez içindeki sembolün mevcut olabileceğini ancak zorunlu
olmadığını belirtir. Örneğin, <proc_call> -> ident [(<expr_list>)] kuralında, ifade listesi
(<expr_list>) opsiyoneldir.
2. Alternatifler (Alternative) ( | ): Bu özellik, birden fazla seçenek arasında seçim yapmamızı sağlar.
Örneğin, <term> → <term> (+|-) const kuralında, bir terim bir sabitle toplanabilir veya çıkarılabilir.
3. Tekrarlar (Repetitions) { }: Bu özellik, bir sembolün birden çok kez tekrarlanabileceğini belirtir. { }
içindeki sembolün sıfır veya daha fazla kez olabileceğini ifade eder. Örneğin, <ident> → letter
{letter|digit} kuralında, tanımlayıcı bir harfle başlar ve ardından harf veya rakamdan oluşan bir
dizeyi ifade eder. Tanımlayıcı, sadece bir harfle de olabilir veya birden çok harf ve rakam içerebilir.
Anlamları tanımlamak için geniş kabul görmüş tek bir notasyon veya formalizm yoktur.
Yüksek seviye bir dil için işlemci semantiğini kullanmak için bir sanal makineye ihtiyaç vardır.Tam bir
bilgisayar simülasyonu iyi bir çözümdür.İşlem şu şekildedir:Bir çevirmen oluşturun (kaynak kodunu idealize
edilmiş bir bilgisayarın makine koduna çevirir)İdealize edilmiş bilgisayar için bir simülatör oluşturunİşlemci
semantiğinin değerlendirilmesi:Resmi olmayan şekilde kullanıldığında iyi sonuç verir (dil kılavuzları
vb.)Resmi olarak kullanıldığında son derece karmaşık olabilir (örneğin, VDL), PL/I'nin semantiğini
açıklamak için kullanılmıştır.
Aksiomatik Semantik
Formal mantığa dayanır (özne kavramı)
Orijinal amacı: programın resmii doğrulaması
Her dildeki ifade türü için aksiyomlar veya çıkarım kuralları tanımlanır (ifadelerin başka ifadelerle
dönüşümlerine izin vermek için)Bu ifadeler, önermeler olarak adlandırılır.
Bir ifadenin önünde (önkoşul) ifadenin yürütülme noktasında doğru olan değişkenler arasındaki ilişkileri ve
kısıtlamaları ifade eder.Bir ifadenin sonrasında gelen bir ifade ise bir son koşuldur.En zayıf önkoşul, son
koşulu garanti eden en az kısıtlayıcı (en genel) önkoşuldur.
Bu ifadeler, bir programın belirli bir noktasında değişkenler arasındaki ilişkileri ve kısıtlamaları ifade eder.
Önkoşul, bir ifadeyi çalıştırmadan önce geçerli olan koşulları belirtirken, sonkoşul, ifadenin
çalıştırılmasından sonra geçerli olması gereken koşulları belirtir. En zayıf önkoşul, sonkoşulu sağlayacak en
az kısıtlayıcı (en genel) önkoşuldur.
Örneğin, "a = b + 1" ifadesi için sonkoşul "a > 1" olarak verilmişse, bu durumda olası bir önkoşul "b > 10"
olabilir. Ancak, en zayıf önkoşul "b > 0" olacaktır, çünkü bu koşul, sonkoşulu sağlayacak en genel koşuldur.
Bu, ifadenin çalışması için gereken minimum gereksinimleri ifade eder.
Programın genel sonkoşulu, istenen sonucu ifade eder. Programın başından geriye doğru çalışarak, ilk
ifadenin önkoşulu program özellikleri ile aynı ise, program doğrudur. Bu, programın doğruluğunu kanıtlamak
için kullanılan bir yöntemdir ve genellikle formel doğrulama süreçlerinde kullanılır.
Denotational Semantik
, özyinelemeli fonksiyon teorisine dayanır ve en soyut anlam açıklama yöntemidir. Başlangıçta Scott ve
Strachey (1970) tarafından geliştirilmiştir.
Bir dil için bir denotasyonel spesifikasyon oluşturma süreci şu adımları içerir:
Operational Semantics ve Denotational Semantics'in temel farkı, bir programın anlamını tanımlama
yaklaşımlarının doğasıdır.
1. Operasyonel Semantik:Operasyonel semantikte, bir programın anlamı, programın her bir ifadesinin ve
işleminin nasıl çalıştığını tanımlayan kodlanmış algoritmalar aracılığıyla belirlenir. Bu algoritmalar,
genellikle bir sanal makine üzerinde programın adımlarının nasıl yürütüleceğini belirler. Bu yaklaşım,
bir programın nasıl çalıştığını doğrudan modellemeye dayanır ve adımların açık bir şekilde
tanımlandığı bir simülasyon gerektirir.
2. Denotasyonel Semantik:Denotasyonel semantikte, bir programın anlamı, matematiksel nesneler ve
fonksiyonlar aracılığıyla tanımlanır. Her dil yapısı için bir matematiksel nesne tanımlanır ve ardından
bu yapının semantik işlevi, dil yapısındaki değerlerin matematiksel nesnelere nasıl eşleneceğini
tanımlar. Bu yaklaşım, bir programın anlamını matematiksel olarak analiz etmeye dayanır ve daha
soyut ve genel bir açıklama sunar.
Özetle, operasyonel semantik bir programın adımlarını doğrudan modellerken, denotasyonel semantik bir
programın anlamını matematiksel nesneler ve fonksiyonlar aracılığıyla ifade eder.
Ancak, Denotasyonel Semantik'in karmaşıklığı, genellikle dil kullanıcıları için çok az yarar sağlar.
Matematiksel nesneler ve fonksiyonlarla çalışma, tipik programcılar için genellikle aşırı karmaşık ve
zorlayıcı olabilir. Bu nedenle, genellikle dil kullanıcılarına yönelik açıklamalar ve araçlar daha uygun olabilir.