Her zaman bir dilin sözdizimine atıfta bulunmanın bir dilin anlambilimine atıfta bulunduğunu düşündüm. Ama görünüşe göre durum böyle değil. Fark ne?
Her zaman bir dilin sözdizimine atıfta bulunmanın bir dilin anlambilimine atıfta bulunduğunu düşündüm. Ama görünüşe göre durum böyle değil. Fark ne?
Yanıtlar:
Anlambilim ~ Anlamı
Sözdizimi ~ Sembolik temsil
Bu nedenle, farklı dillerde yazılmış iki program aynı şeyi yapabilir (anlambilimsel), ancak programı yazmak için kullanılan semboller farklı olurdu (sözdizimi).
Bir derleyici sizin için sözdiziminizi kontrol eder (derleme zamanı hataları) ve semantiği dil kurallarından türetir (sözdizimini makine talimatlarıyla eşleştirerek), ancak tüm anlamsal hataları bulamaz (çalışma zamanı hataları, örneğin hesaplama) yanlış sonuç, çünkü kod, add 2 yerine add 1 diyor.
x + y
uygun +
işleçlerin olmadığı yerlerde ) teşhis edebilir ve gerekir . 2 yerine 1 eklemek, mantıklı bir hata dediğim şeydir .
Aslında iki seviye değil üç:
i
ve f
ürettiği if
)if
, (
, 42
, ==
, answer
ve )
bir koşullu deyimi üretir)ValidIdentifier
şöyle bir şey olarak tanımlanabilen bir terminale sahip olacaksınız ![AnyKeyword] [Identifier]
(PEG benzeri gösterimde kullanıyorum). Böyle bir dil için ayrı bir dilekçe geçmeniz gerekmez. Örneğin, GLR tabanlı C ++ ayrıştırıcılarına bakın.
Anlambilim , bir programlama dilinin mantıksal varlıklarını ve etkileşimlerini tanımlar. Sözdizimi , bunların karakter olarak nasıl ifade edildiğini tanımlar.
Örneğin, işaretçi aritmetik kavramı C'nin anlambiliminin bir parçasıdır; yolu +
ve -
operatörler işaretçi işlemlerini ifade etmek için kullanılabilir kendi sözdizimi bir parçasıdır.
Bazen, iki dil anlamlarının bir bölümünü paylaşır, ancak sözdizimi çılgınca farklılık gösterir (örneğin, C # ve VB.NET - hem değer türlerini hem de başvuru türlerini kullanır, ancak onları tanımlamak için yazdığınız karakterler farklıdır); diğer durumlarda, iki dil sözdizimsel olarak benzerdir, ancak anlambilim eşleşmez (benzerliklerin genellikle yeni başlayanları karıştırdığı Java ile JavaScript'i düşünün).
Sözdizimi, bir dilin belirteçlerini nasıl düzenlediğinizdir. Anlambilim, bu belirteçlerin ne anlama geldiğidir (genellikle belirli bir belirteç düzeninin ne anlama geldiği).
Sadece programlama dillerine mi yoksa programlamada kullanılan genel dillere mi bakacağınızı belirtmediniz, bu yüzden cevabım veri dilleri hakkında (XML, RDF, veri tipi sistemleri vb.):
Brian L. Meek, dilden bağımsız standartlar üretme konusundaki yedi altın kuralında (1995) "bir dilin sözdiziminin diğerinin semantiği olabileceğini" yazıyor . Veri açıklamasında kullanılan "sözdizimi" ve "semantik" kelimelerini ifade eder: bu yüzden bazı sözcük formatlarının spesifikasyonunda bu kelimelere rastlarsanız, çalışmanız gerektiğinden emin olmak için her iki kelimeyi de "Potrzebie" ile değiştirmelisiniz. kendin için anlam.
Sözdizimi ile anlamsal arasındaki ilişki, en azından tam olarak belirtilen verilerde, "kodlama" terimi ile daha iyi tanımlanabilir . Anlamsal, sözdiziminde kodlanmıştır. Kayıtlar yuvalanabildiği için, bir dilin sözdizimi diğerinin semantiğidir. Biri veri dünyasının ötesine geçerse, bu yuvalanma, Umberto Eco tarafından "sınırsız semiyoz" olarak tanımlandığı gibi, neredeyse sonsuz olabilir.
Bir örnek vermek gerekirse:
İnsanlar genellikle bir düzeyde durup anlamsal olarak kabul ederler, fakat sonunda, bazı insanlar aklındaki verileri yorumlamadıkça, son anlamsallık yoktur. Semantik'i veri şeklinde ifade etmeye çalıştığı anda, sözdizimi olur.
O tarif edilebilir ise BNF (Backus-Naur Form) veya benzer bir şey, sözdizimi. Olmazsa, değil.
Diğer yandan anlambilim, bir programın anlamı (veya kaynak kodun diğer bir kısmı) ile ilgilidir.
Ve bazen ikisi arasındaki çizgi bulanık olabilir.
Ayrımı anlamanın bir yolu, programınızın sözdizimi veya anlambilimi yanlış olduğunda aldığınız hata türlerine bakmaktır.
Sözdizimi hatası, kaynak kodun dil grameriyle eşleşmemesi, örneğin gerekli olan bir noktalı virgül bulunmamasıdır.
Anlamsal bir hata, diğer dil gereksinimlerini karşılamada bir başarısızlıktır (örneğin, C, "kısıtlamaları" olarak adlandırır); bir örnek x + y
nerede x
ve y
uyumsuz tipte olduğunu yazıyor olabilir . Dilbilgisi size bir ilavenin göründüğünü söyler something + something
, ancak sol ve sağ operandların tiplerine ilişkin gereksinimleri ifade etmek için yeterince güçlü değildir.
(2'nin doğru olacağı 1'i kullanmak gibi mantıksal hatalar, derleyici tarafından genellikle tespit edilemez - bazı durumlarda bir derleyici sorgulanabilir kodlar hakkında uyarabilir.)
Sözdizimi, (sözlük) sembollerin söylediği şeydir. Anlambilim onların anlamı.
Düşünmek:
C #: condition ? true_value : false_value
VB.NET: If(condition, true_value, false_value)
- Farklı sözdizimi, aynı anlambilim.
C #: left_value / right_value
VB.NET: left_value / right_value
- Aynı sözdizimi, farklı anlamlar (tamsayılar için).
Sözdizimi , bir cümle içindeki kelimelerin gramer düzenlemesidir, yani kelime sırası.
(İngilizce) ' cat dog boy ' ve (programlama) ' hi.5 ' sözdizimsel olarak doğru değil .
(İngilizce) ' kedi kucaklama çocuğu ' ve (programlama) '* 3.2 * 5 *' sözdizimsel olarak geçerlidir.
Statik Semantik , sözdizimsel olarak geçerli ifadelerin herhangi bir anlamı olup olmadığıdır.
(İngilizce) ' Ben büyük'üm (programlama) (python)' 3 + 'hi' 'sözdizimsel olarak doğru ama statik anlamsal hata var.
Anlambilimsel , statik anlamsal hata içermeyen, sözdizimsel olarak doğru sembol dizisi ile ilişkili anlamdır , yani cümle, sözdizimsel ve anlamsal olarak doğrudur, ancak anlamı, amaçlanan olmayabilir.
(Türkçe) ' Uçan uçaklar tehlikeli olabilir ' iki anlamı olabilir, yani uçakların uçması tehlikeli olabilir ya da uçan uçaklar tehlikeli olabilir.
(Programlama) 'bilgisayar herhangi bir hata mesajı üretmez, ancak ne yapmanız gerektiğini söylemez; başka bir şey yapacak. '
Kaynak : MIT 6.00.1
Sözdizimi, bir dilde geçerli ifadelerin oluşturulmasını düzenleyen resmi kuralları ifade eder. Anlambilim, bir ifadenin anlamını veren kurallar kümesini ifade eder.
Sözdiziminden kaynaklanan hatalar, bir programda programlama dilinin ihlalleri ihlal edildiğinde veya yanlış kullanıldığında ortaya çıkar. Anlamsallıktan kaynaklanan hatalar, bir programda ifadeler anlamlı olmadığında meydana gelir.
Kelime sırası, sözdiziminin temel ilkesidir, ne yazıldığını anlamaya çalışanlar, cümle yapısını ve anlamını vermede yardımcı olmak için kelime sırasının sözdizimsel ipuçlarını kullanır. Anlambilim, bireylerin önceden edindikleri bilgiye dayanarak "cümlenin" anlamını kendi yorumlamalarıdır. Bu nedenle, sözdizimsel bir anlam ifade etmeyen bir cümlenin anlamsal ipuçlarını kullanırken bir anlamı olabilir.
Sözdizimi yalnızca dilsel ve dilbilgisel olarak doğru olanla ilgilidir. Anlambilim, herkesin dile özgü olan ve dile özgü olan her şeyin ötesinde olan önceden bilmesini gerektirir.
"Bebek sütü içiyor" cümlesi, sözdizimsel bir anlam ifade etmiyor, ancak anlambilimsel olarak çoğu insan, "Bebek sütü içiyor" anlamına gelir, önceki bilgimiz bize bir bebeğin süt içtiğini söyler. Anahtar kelimeler.
Söz dizimi ve semantik gibidir strateji ve taktik veya sol ve sağ .
Bunlar gerçekten bağımsız evrensel kavramlar değil, belirli bir bağlamda olduğunuzda zıt yönleri belirten ilgili bir çift kelimedir. Ancak bir ölçekte strateji olan aynı şey diğerinde taktiklerdir.
Dolayısıyla, bir dilde kod yazıyorsanız, sözdizimi kullandığınız dildir ve istenen davranış anlambilimdir. Ancak, o dilin derleyicisini uyguluyorsanız ya da tartışıyorsanız, sözdizimi, dilbilgisi ve belki de sistem ve bunun üzerine kurulu her şeyin anlambilimidir. Ve bunun gibi.
Sözdizimi bilgisayarın anladığı, anlambilim ise insanın anladığıdır.
Bir derleyici / yorumlayıcı, tasarımınız için beyazı önemsemez ve makine seviyesine kadar derlenmiş kodlarda, tasarımdan çıkmakta zorlanacaksınız. Geliştiriciler tasarıma önem verir çünkü iyi bir tasarım, karmaşık davranışları ve etkileşimleri soyutlayarak karmaşıklığı azaltmakla ilgilidir ve farklı türden problemler kendilerini farklı semantiklere kazandırır. Dil seçimi büyük ölçüde kullanmak istediğiniz anlambilimin sözdiziminde ne kadar kolay ve verimli bir şekilde ifade edilebileceği ile ilgilidir.
"Plain c" ile çok kısa bir örnek:
void main()
{
int a = 10;
int x = a - 1;
int y = - 1;
printf("x = %i", x);
printf("y = %i", y);
getch();
}
Bu örnekte, "-" belirteci için sözdizimi aynıdır, ancak kullanıldığı yere bağlı olarak farklı bir anlamı vardır ("anlamsal).
"X" tayininde "-" "çıkarma" işlemi anlamına gelir, "y" tayininde "-" "eksi işareti" işlemi anlamına gelir.
-
operatör aynı belirtecidir , ancak sözdizimsel olarak farklıdırlar çünkü farklı bağlamlarda kullanılırlar. 0 - 1
sözdizimi kuralına uygun olan additive-expression: additive-expression - multiplicative-expression
ise, - 1
sözdizimi kuralıyla eşleşen unary-expression: unary-operator cast-expression
(: C99 standart referans).
-
operatör arasındaki ayrım , sadece anlamsal değil, aynı zamanda farklı anlambilimine sahip olsa da, sözdizimseldir. Sözdizimi dilin dilbilgisi ile tanımlanır ve iki operatör dilbilgisinin farklı bölümlerinde belirtilir. N1570 taslağına , unary operatörleri için bölüm 6.5.3'e ve ilave operatörler için 6.5.6'ya bakınız . (BTW, eğer bir C örneği kullanacaksanız, muhtemelen doğru void main()
olmalı ; olmalı int main(void)
ve eksiksiniz #include <stdio.h>
ve başlığı ne olursa olsun bildirirgetch