Sözdizimi ile anlambilim arasındaki fark nedir?


87

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?



6
"Renksiz yeşil fikirler öfkeyle uyuyor" sözdizimsel olarak sorun değil, ancak anlam ifade etmiyor. Bakınız en.wikipedia.org/wiki/Colorless_green_ideas_sleep_furiously
CesarGon

Bu soruyu sormak için +1. Aynı merak ediyorum, bunun için interneti aramak için çok tembel ve açıkça sordu.
KK.

Az ya da çok, derim ki ... Anlambilim, örneklerin türleri, diğer örneklerle ilişkileri ve aralarında var olan garantilerdir. Sözdizimi, bu gibi karakterleri karakter dizileri ile ilan etmenin yoludur. Az çok.
Dehbop

Yanıtlar:


106

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.


2
Hata kontrolü, sözdizimi ile anlambilim arasında ayrım yapmak için bir kriter değildir. Bir derleyici hem sözdizimi hatalarını (eksik bir noktalı virgül gibi) hem de anlamsal hataları ( bu işlenenler için x + yuygun +işleçlerin olmadığı yerlerde ) teşhis edebilir ve gerekir . 2 yerine 1 eklemek, mantıklı bir hata dediğim şeydir .
Keith Thompson,

3
@Keith - ama mantık ("mantıksal hata" da olduğu gibi) anlambilimdir. Bazı anlamsal kontroller, derleyici tarafından yapılabilir - özellikle tip kontrolü - bu nedenle, derleyicilerin sadece sözdizimi hataları bulmayacağı konusunda hemfikirim, ancak Chris sadece " anlamsal olmayan tüm hataları bulamaz ", "anlamına gelmez" dedi. Herhangi birini bul ".
Steve314

1
@ Steve314: Kabul edildi. Ancak bir derleyicinin algılaması gereken hatalar ile tespit etmesi gerekmeyen hatalar arasında keskin bir ayrım yapmak istiyorsanız, "anlamsal" vs. "mantıksal" ifadesinin bu ayrımı ifade etmenin iyi bir yolu olduğunu düşünüyorum.
Keith Thompson,

4
@KeithThompson Aslında, teoride, yeterince güçlü ve güçlü (yani, bağımlı ) bir tür sistemi olan bir dil için bir derleyici veya tercüman , kodunuzun herhangi bir keyfi özelliğini kontrol edebilir (eğer varsa, Halting Problemini modüle ederek), "kontrol edilebilir" ve "kontrol edilemez" genel olarak pek bir anlam ifade etmemektedir.
Ptharien'ın Alevi

@ Ptharien's Flame İfadenizin 'teoride' kısmını vurgulayarak bu tartışmayı bir saniye boyunca bulutların dışına çıkaracağım. Uygulamada, semantikleri kodda uygulamak, derleyicilere işlevsellik ile ilgili ipuçları vermek için ek sözdizimi gerektirir. Ek anlamsal kontrol bir maliyet olarak gelir (örneğin, karmaşıklık / okunabilirlik). Bir dilin tüm anlamsal hataları kontrol etmek için yeterince güçlü olabileceğini belirtmek, yasal bir sistemin tüm suçları önleyecek kadar mükemmel olabileceğini söylemek gibidir. Şahsen, güvenlikten özgürlüğü tercih ediyorum, ancak bunu 'dini' bir konu haline getiriyor.
Evan Plaice

35

Aslında iki seviye değil üç:

  • sözcüksel seviye: karakterlerin dil unsurları üretmek için nasıl birleştirildiği ( ive fürettiği if)
  • sözdizimsel seviyesi: dil elemanları dili ifadeleri üretmek için kombine (nasıl if, (, 42, ==, answerve )bir koşullu deyimi üretir)
  • anlam düzeyi: anlam oluşturmak için dil ifadelerinin CPU komutlarına nasıl dönüştürüldüğü (koşullu bir ifade, boolean ifadesinin sonucuna bağlı olarak bir dalın veya diğerinin yürütülmesine izin verir)

10
Lexing ve ayrıştırma aşamaları arasındaki bir ayrım tamamen yapaydır, bir optimizasyondan başka bir şey değildir. Ve sonlu düz bir dizi lexemes'in tanımlanmadığı bazı diller var - ama yine de açıkça tanımlanmış bir sözdizimi var. Bu nedenle, kelimeleri bir sözdiziminin parçası olarak tanımlamayı tercih ederim, ayrı bir varlık değildir.
SK-mantık

@ SK-mantık: Pek çok dilde, değişken bir isim oluşturan izin verilen veya yasaklanan sözlüklerin listesi belirtilmiştir. Böylece ayrılık mantıklı geliyor.
mouviciel

5
@mouviciel, sadece bir optimizasyon olarak anlam ifade ediyor - aksi takdirde, sadece 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.
SK-mantık

2
@EvanPlaice, neden bahsediyorsun? Benim demek ki lexing değil, (ve aslında dilinizi sınırlar) gerekli değildir ayrıştırma .
SK-mantık

1
@ SK-mantık Sanırım istediğinizi zıttı demek için yorumunuzu okudum. Sadece 'düzenli' veya 'bağlamsız' dillerdeki gibi sadece bir sözcüye ihtiyaç duyulan vakalardan bahsettiğinizi düşünmüştüm. Daha yüksek seviyeli dillerde, bir sözcü gerekli olmayabilir, ancak tek geçişli bir sözdizimi doğrulaması yapmak için hızlı bir yol sağlar. Lexer aşamasını kapatmanın veya tamamen ortadan kaldırmanın yararlı olacağı pek çok vaka olduğu konusunda hemfikirim.
Evan Plaice,

18

Bu dili size basit bir örnekle açıklayacağım ENGLISH:

The glass drank Ben

Sözdizimsel olarak doğru bir ifadedir. Bir isim, fiil vb. Vardır.

Ancak anlamsal olarak yanlış, çünkü bu ifadenin akla gelebilecek veya doğru bir anlamı yoktur.


15

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).


Öyleyse, "Paradigmalar" anlambilim ile ilişkili mi? Yani bir paradigma, birbiriyle ilişkili bir anlambilim kümesidir?
Gulshan

1
@ Gülhan, paradigma anlambilim gibi resmi bir şeyden çok daha geniş bir kavramdır. Paradigma anlambilimi içerebilir, fakat daha çok bir metodoloji, hatta daha geniş bir felsefedir.
SK-mantık

6

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).


5

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:

  • XML sözdizimi (bu köşeli ayraçların tümü), XML Infoset (soyut bir ağaç) ile anlamsal olarak sözdizimidir.
  • Sözdizimi olarak bir XML Infoset, bazı XML veri formatlarındaki bir kaydı, örneğin bir RDF grafiğini kodlayan bir RDF / XML belgesi gibi, anlamsal olarak ifade edebilir.
  • Bir RDF grafiği (URI Referansları olan materyaller) sözdizimi olarak soyut kaynakların semantik olarak grafiğini kodlar.
  • Soyut kaynakların sözdizimi olarak grafiği, kavramsal bir modeli anlamsal olarak kodlar.

İ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.


4

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 + ynerede xve yuyumsuz 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.)


0

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).


0

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


-2
  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.

  2. 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.

  3. 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.

  4. 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.

  5. "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.


1
Sonuncusu dışında kalan her şey için puan verin (puan 5)
nawfal

-2

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.


4
Bu nasıl bir ezoterik BS? Sol ve sağ gibi mi? Strateji ve taktikler gibi mi? Belki Yin ve Yang, Tanrı ve Şeytan, Harry ve Voldemort gibi?
JensG

-3

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.


"Sözdizimi bilgisayarın anladığı, anlambilim ise insanın anladığıdır" büyük bir basitleştirmedir. İnsanlar da sözdizimini anlar ve bilgisayarlar bazı anlamsallıkları anlar.
CesarGon

4
Kesinlikle yanlış. Aynı sözdizimi ve tamamen farklı bir anlambilimine sahip diller var (örneğin, aynı dilin istekli ve tembel bir versiyonu), neredeyse hiç sözdizimi olmayan ve çok zengin ve değişken anlambilimsiz diller var (örneğin, Forth ve Lisp). Anlambilim, derleyicinin dilinizi nasıl yorumladığıdır. İnsan bu konuda hiçbir şey bilmeyebilir ve hala bir dil kullanabilir.
SK-mantık

@ SK-mantık, kendinle çelişiyorsun. Eğer farklı semantikler aynı sözdizimi ile ifade edilebilirse, o zaman açıkça anlambilim sözdiziminde değil, bunun yerine nasıl kullanıldığını içerir. Yine de derleyici, çalışmak için yalnızca sözdizimine sahiptir. Anlambilimi yorumlamaz, sözdizimini yorumlar. Geliştiricinin ne demek istediğine bağlı olarak aynı sözdizimini farklı şekilde derlemez, ancak yalnızca yazdıklarını temel alır. Anlambilim geliştirici tarafından sağlanır ve yalnızca onun için anlamlıdır.
kylben

3
@kylben, kendimle çelişmiyorum, çünkü sözdizimi ve anlambilimin birbiriyle bağlantılı olduğunu bile söylemedim. Ve derleyici ayrıştırma aşamasından hemen sonra sözdizimi ile hiçbir şey yapmıyor - derleyici anlambilimi uyguluyor . Açıkçası terminoloji yorumunuz yanlıştır. Bir başlangıç ​​için bunu okuyun: en.wikipedia.org/wiki/Denotational_semantics
SK-

3
Bir dilbilimci tarafından tanımlanacağı gibi bir "anlambilim" olan bir programın anlamından bahsediyorsunuz . Fakat bilgisayar bilimlerinde anlambilim, belirli bir program değil , bir dilin anlamıdır .
SK-mantık

-3

"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.


3
Yanlış. İki -operatör aynı belirtecidir , ancak sözdizimsel olarak farklıdırlar çünkü farklı bağlamlarda kullanılırlar. 0 - 1sözdizimi kuralına uygun olan additive-expression: additive-expression - multiplicative-expressionise, - 1sözdizimi kuralıyla eşleşen unary-expression: unary-operator cast-expression(: C99 standart referans).
Keith Thompson

@Keith Thompson: Noktayı kaçırdınız. Bir anlambilim veya sözdizimi sorusu, C standartları sorusu değil. Standart doğru, ancak cevabım kelimenin tam anlamıyla bir standardı izlemeyen bir kavramı açıklamaya yöneldi. "Dr Spock" ile "Kaptan Kirk" gibi. Şerefe ;-)
umlcat

Katılmıyorum. İki -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
Keith Thompson,

Noktayı netleştirmek için, sözdizimi sadece belirteçlerin dizilimi ile ilgili değildir, belirteçlerin daha büyük yapılar oluşturmasıyla ilgilidir. Bir derleyici tipik olarak bir sözcüksel analizöre (tokenizer) ve ayrı bileşenler olarak bir çözümleyiciye sahiptir; ikisi de sözdizimi ile ilgileniyor.
Keith Thompson,
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.