Programlama dillerinde sözdizimi ve anlambilim arasındaki fark nedir?


Yanıtlar:


202

Sözdizimi, dilin yapısı veya grameri ile ilgilidir. Şu soruyu cevaplar: Nasıl geçerli bir cümle kurarım? Tüm diller, hatta İngilizce ve diğer insan ("doğal") dilleri bile gramerlere, yani cümlenin uygun şekilde inşa edilip edilmediğini tanımlayan kurallara sahiptir.

İşte bazı C dili sözdizimi kuralları:

  • noktalı virgülle ayrı ifadeler
  • Bir IF ifadesinin koşullu ifadesini parantez içine alın
  • küme ayraçları içine alarak birden çok ifadeyi tek bir ifadede gruplandırın
  • veri türleri ve değişkenler ilk çalıştırılabilir ifadeden önce bildirilmelidir (bu özellik C99. C99'da bırakılmıştır ve ikincisi karma tür bildirimlerine izin verir.)

Anlambilim, cümlenin anlamı ile ilgilidir. Soruları cevaplıyor: bu cümle geçerli mi? Eğer öyleyse, cümle ne anlama geliyor? Örneğin:

x++;                  // increment
foo(xyz, --b, &qrs);  // call foo

sözdizimsel olarak geçerli C ifadeleridir. Ama ne demek istiyorlar? Bu ifadeleri çalıştırılabilir bir talimatlar dizisine dönüştürmeye çalışmak bile geçerli mi? Bu sorular anlambilimin merkezindedir.

İlk ifadede ++ operatörünü düşünün. Her şeyden önce, bunu denemek bile geçerli mi?

  • Eğer x bir kayan veri türü ise, bu ifadenin bir anlamı yoktur (C dili kurallarına göre) ve bu nedenle ifade sözdizimsel olarak doğru olsa bile bir hatadır .
  • Eğer x bir veri tipinin göstericisiyse , ifadenin anlamı " x adresindeki değere sizeof ( bazı veri türleri ) eklemek ve sonucu x adresindeki konuma depolamaktır".
  • Eğer x bir skaler ise, ifadenin anlamı "x adresindeki değere bir ekle ve sonucu x adresindeki konuma sakla" şeklindedir.

Son olarak, bazı anlambilimlerin derleme zamanında belirlenemeyeceğini ve bu nedenle çalışma zamanında değerlendirilmesi gerektiğini unutmayın. ++ operatörü örneğinde, x zaten veri türü için maksimum değerdeyse, ona 1 eklemeye çalıştığınızda ne olur? Başka bir örnek: Programınız değeri NULL olan bir göstericiye başvurmayı kaldırmaya çalışırsa ne olur?

Özetle sözdizimi, yalnızca cümlenin dilin grameri için geçerli olup olmadığıyla ilgilenen kavramdır. Anlambilim, cümlenin geçerli bir anlamı olup olmadığı ile ilgilidir.


TAMAM. Eğer xverileri için maksimum değerde olduğu ve 1buna ilave edilir daha sonra bazı garip çıkışı (sonuçlanır 0,) o anlamsal hata değildir?
haccks

Bir araçta bir kilometre sayacı düşünün - her biri üzerinde 0 ile 9 arasındaki rakamların yazılı olduğu bir dizi birbiriyle ilişkili tekerleği vardır. En sağdaki tekerlek en hızlı şekilde döner; 9'dan sıfıra döndüğünde, hemen solundaki tekerlek bir ilerler. Bu tekerlek 9'dan 0'a ilerlediğinde, solundaki tekerlek ilerler ve bu böyle devam eder.
Jeff N

Bir veri türü, bir kilometre sayacının tekerleği gibidir: yalnızca belirli bir değeri tutabilir. Maksimum değere ulaşıldığında, bir sonraki ilerleme tekerleğin sıfıra dönmesine neden olur. Bunun anlamsal bir hata olup olmadığı, dil kurallarına bağlıdır. Bu durumda, C dil standardına geri dönmeniz gerekir. C dil standardının tam olarak ne söylediğini bilmiyorum, ancak işte seçeneklerden bazıları. Taşma şudur: -hata değil; sonuç sıfırdır. -bir hata; derleyicinin bir taşma istisnası oluşturması ZORUNLUdur. -UNDEFINED; derleyici istediğini yapmakta özgürdür.
Jeff N

2
Herhangi birinin belirli bir örneği umursaması durumunda, işaretsiz taşma, modüler aritmetik (yani UINT_MAX + 1 == 0) olarak tanımlanır . İmzalanmış taşma tanımsız. Modern derleyiciler genellikle var INT_MAX + 1 == INT_MINama mesela bu güvenemeyiz durumlar (orada olduğu optimizasyon bağlı sonsuz değildir; bkz blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ). for (i = 0; i <= N; ++i) { ... }NINT_MAX
Daniel H

"bazı anlambilimlerin derleme zamanında belirlenemeyeceğini ve bu nedenle çalışma zamanında değerlendirilmesi gerektiğini unutmayın" - Bunun doğal dillerle paralelliği hoşuma gidiyor. Bağlam olmadan bazı cümlelerin anlamını bilemezsiniz. Örneğin, "Muzları sever" ifadesinde "o" kelimesinin anlamı bağlama bağlıdır.
ymln

22

Sözdizimi, bir dilin etimolojisinin izini sürerek , nesnelerin nasıl bir araya getirildiğini ifade eder.
Örneğin, sözdizimsel olarak doğru olması için bir tür, sonra bir ad ve ardından bir noktalı virgül bildirerek kodun bir araya getirilmesini isteyebilirsiniz.

Type token;

Öte yandan, anlambilim anlamla ilgilidir. Bir derleyici veya yorumlayıcı sözdizimi hatalarından şikayet edebilir. İş arkadaşlarınız anlambilimden şikayet edecekler.


@Talespin_Kit, yapıdan çok anlam ifade eder: mantık daha çok bir soyutlamadır, örneğin P => Q, vb veya !! P = P, ancak anlambilim eklediğinizde şeyler incelikli olabilir, eğer P "mutlu" ise, o zaman !! P "I "mutsuz değilim"! = "Mutluyum"
doctorlove

6
"Bir derleyici veya yorumlayıcı sözdizimi hatalarından şikayet edebilir. İş arkadaşlarınız anlambilimden şikayet edecek."
GeekyJ

11

Wikipedia'nın cevabı var. Okuma sözdizimi (programlama dilleri) & semantik (bilgisayar bilimi) wikipages.

Veya herhangi bir derleyici veya yorumlayıcının çalışmalarını düşünün . İlk adım, dizgelerin sözcükbirimlerine bölünmesi ve ardından bazı soyut sözdizimi ağacı ( sözdiziminin bir temsilidir) oluşturan ayrıştırılmasıyla simgelerin üretildiği sözcüksel analizdir . Sonraki adımlar, bu AST'yi (anlambilim) dönüştürmeyi veya değerlendirmeyi içerir.

Ayrıca, her anahtar kelime Fransızca eşdeğeri haline getirilmiştir C varyantı tanımlanmıştır if (böylece gözlemlemek ifolma si, doolma faire,else olma sinonvb.), Dilinizin sözdizimini kesinlikle değiştireceğinizi, ancak çok fazla değişmeyeceğinizi unutmayın. anlambilim: bu Fransızca-C'de programlama daha kolay olmayacak!


9

Anlambilim, kodunuzun ne anlama geldiğidir - sözde kodla tanımlayabileceğiniz şeydir. Sözdizimi gerçek yapıdır - değişken adlarından noktalı virgüllere kadar her şey.


Farklı insanlar arasındaki bir konuşma mı? Yoksa sadece bir gönderi mi? Ben anlamadım Örneğin, "Aşağıdakilerin ne anlama geldiği hakkında hiçbir fikriniz yok. Daha yanlış olamaz."
doubleOrt

6
  • Derlemek için doğru sözdizimine ihtiyacınız var .
  • Çalışması için doğru anlamlara ihtiyacınız var .

5

Sözdizimi , ifadelerin, ifadelerin ve program birimlerinin yapısı veya biçimidir, ancak Anlambilim bu ifadelerin, ifadelerin ve program birimlerinin anlamıdır. Anlambilim doğrudan sözdiziminden gelir . Sözdizimi , belirli bir programlama dilinin belirttiği kodun yapısını / biçimini belirtir, ancak Anlambilim , sembollere, karakterlere ve kelimelere atanan anlamla ilgilenir.


1

Sözdizimi bir programlama dili olan ifadeler, ifadeleri ve program birimlerinin şeklidir. Onun semantik bu ifadeler, ifadeleri ve program birimlerinin anlamı budur. Örneğin, bir Java while ifadesinin sözdizimi şöyledir:

while (boolean_expr) statement

Bu ifade biçiminin anlam bilgisi, Boole ifadesinin mevcut değeri doğru olduğunda, gömülü ifadenin çalıştırılmasıdır. Daha sonra kontrol, işlemi tekrarlamak için dolaylı olarak Boole ifadesine döner. Boole ifadesi yanlışsa, kontrol while yapısını izleyen ifadeye aktarılır.


1

Sözdizimi: Dilin gramatik yapısına atıfta bulunur .. Eğer c dilini yazıyorsanız. Veri türlerini, belirteçleri [değişmez veya "printf ()" gibi bir simge olabilir. 3 simgesi vardır, "printf, (,)"]. Aynı şekilde, işlevi nasıl kullandığınızı, işlev sözdizimini, işlev bildirimini, tanımlamayı, başlatmayı ve çağırmayı çok dikkatli olmalısınız.

Anlambilim iken, mantık veya cümle veya ifadeler kavramı ile ilgilidir. Kavram veya mantık dışında bir şey söylüyor veya yazıyorsanız, anlamsal olarak yanılıyorsunuz.


1

Derleyicinin kodu nasıl gördüğünü anlama

Genellikle, kodun sözdizimi ve anlambilim analizi derleyicinin 'ön uç' kısmında yapılır.

  • Sözdizimi: Derleyici, her bir anahtar sözcük ve semboller için belirteçler üretir: belirteç, anahtar sözcüğün bilgi türünü ve koddaki konumunu içerir. Bu belirteçleri kullanarak, bir AST (Özet Sözdizimi Ağacı'nın kısaltması) oluşturulur ve analiz edilir. Burada aslında hangi derleyici kontrol ediyor, kodun sözcüksel olarak anlamlı olup olmadığı, yani 'anahtar sözcük dizisi' dil kurallarına uygun mu? Önceki cevaplarda önerildiği gibi, bunu dilin grameri olarak görebilirsiniz (kodun anlamı / anlamı değil). Yan not: Sözdizimi hataları bu aşamada rapor edilir. (Sisteme hata türüne sahip jetonları döndürür)

  • Anlambilim: Şimdi, derleyici kod işlemlerinin 'mantıklı' olup olmadığını kontrol edecek. Örneğin, dil Type Inference'ı destekliyorsa, bir float'a bir dizge atamaya çalışıyorsanız, sematik hata rapor edilecektir. VEYA aynı değişkeni iki kez bildirmek. Bunlar, 'dilbilgisi' / sözdizimi açısından doğru olan ancak işlem sırasında hiçbir anlam ifade etmeyen hatalardır. Yan not: Aynı değişkenin iki kez bildirilip bildirilmediğini kontrol etmek için, derleyici bir sembol tablosunu yönetir

Dolayısıyla, bu 2 ön uç aşamasının çıktısı, açıklamalı bir AST (veri türleriyle birlikte) ve sembol tablosudur.

Daha az teknik bir şekilde anlamak

Kullandığımız normal dili düşünürsek; burada, İngilizce:

örneğin Okula gidiyor. - Hatalı dilbilgisi / sözdizimi, doğru bir anlam / anlam iletmek istemesine rağmen.

örneğin O soğuğa gider. - soğuk bir sıfattır. İngilizcede, bunun dilbilgisine uymadığını söyleyebiliriz, ancak aslında aklıma gelen doğru sözdizimine sahip yanlış anlambilime en yakın örnek.


Derleyiciler Bu bağlantı daha fazla bilgi edinmek için yardımcı olabilir
Vedant Panchal
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.