Apa perbedaan antara sintaks dan semantik?


87

Saya selalu berpikir bahwa merujuk pada sintaksis suatu bahasa sama dengan merujuk pada semantik suatu bahasa. Tetapi saya telah diberitahu bahwa ternyata bukan itu masalahnya. Apa bedanya?



6
"Gagasan hijau tak berwarna tidur mati-matian" secara sintaksis baik-baik saja tetapi tidak masuk akal semantik. Lihat en.wikipedia.org/wiki/Colorless_green_ideas_sleep_furiously
CesarGon

+1 untuk mengajukan pertanyaan ini. Saya bertanya-tanya sama, terlalu malas untuk mencari di internet untuk ini, dan jelas tidak pernah bertanya.
KK.

Lebih atau kurang, saya katakan ... Semantik adalah jenis contoh, hubungan mereka dengan contoh lain & jaminan yang ada di antara mereka. Sintaks adalah cara untuk mendeklarasikan hal-hal ini melalui serangkaian karakter. Lebih atau kurang.
Dehbop

Jawaban:


106

Semantik ~ Artinya

Sintaksis ~ Representasi simbolik

Jadi dua program yang ditulis dalam bahasa yang berbeda dapat melakukan hal yang sama (semantik) tetapi simbol yang digunakan untuk menulis program akan berbeda (sintaksis).

Kompiler akan memeriksa sintaks Anda untuk Anda (kesalahan waktu kompilasi), dan menurunkan semantik dari aturan bahasa (pemetaan sintaks ke instruksi mesin katakan), tetapi tidak akan menemukan semua kesalahan semantik (kesalahan run-time, misalnya menghitung hasil yang salah karena kode mengatakan add 1 bukannya add 2).


2
Pengecekan kesalahan bukanlah kriteria untuk membedakan antara sintaks dan semantik. Kompiler dapat dan harus mendiagnosis kesalahan sintaksis (seperti titik koma yang hilang) dan kesalahan semantik (seperti di x + ymana tidak ada +operator yang sesuai untuk operan tersebut). Menambahkan 1 daripada 2 adalah apa yang saya sebut kesalahan logis .
Keith Thompson

3
@Keith - tetapi logika (seperti dalam "kesalahan logis") adalah semantik. Beberapa pemeriksaan semantik dapat dilakukan oleh kompiler - terutama pengecekan tipe - jadi saya setuju bahwa kompiler tidak hanya menemukan kesalahan sintaks, tetapi Chris hanya mengatakan " tidak akan menemukan semua kesalahan semantik", yang tidak menyiratkan "tidak bisa" menemukan setiap ".
Steve314

1
@ Steve314: Setuju. Tetapi jika Anda ingin membuat perbedaan yang tajam antara kesalahan yang harus dideteksi oleh penyusun dan kesalahan yang tidak perlu dideteksi, maka saya pikir "semantik" vs. "logis" adalah cara yang baik untuk mengekspresikan perbedaan itu.
Keith Thompson

4
@KeithThompson Sebenarnya, secara teori, kompiler atau penerjemah untuk bahasa dengan sistem tipe yang cukup kuat dan kuat (yaitu, dependen ) dapat memeriksa setiap properti sewenang-wenang dari kode Anda (modulo Masalah Putus, jika berlaku), sehingga memecah kesalahan semantik menjadi "dapat diperiksa" dan "tidak dapat diperiksa" secara umum tidak masuk akal.
Flame Ptharien

@Ptharien'sFlame Saya hanya akan menarik diskusi ini keluar dari awan untuk sesaat dengan menyoroti bagian 'dalam teori' dari pernyataan Anda. Dalam praktiknya, menegakkan semantik dalam kode memerlukan sintaks tambahan untuk memberikan isyarat kepada kompiler mengenai fungsionalitas. Pemeriksaan semantik tambahan datang sebagai biaya (yaitu kompleksitas / keterbacaan). Menyatakan bahwa bahasa bisa cukup kuat untuk memeriksa semua kesalahan semantik adalah seperti mengatakan sistem hukum bisa cukup sempurna untuk mencegah semua kejahatan. Secara pribadi, saya lebih suka kebebasan daripada keselamatan tetapi itulah yang menjadikan ini topik 'agama'.
Evan Plaice

35

Sebenarnya tidak ada dua level tetapi tiga:

  • tingkat leksikal: bagaimana karakter digabungkan untuk menghasilkan elemen bahasa ( idan fmenghasilkan if)
  • tingkat sintaksis: bagaimana unsur-unsur bahasa dikombinasikan untuk menghasilkan ekspresi bahasa ( if, (, 42, ==, answerdan )menghasilkan pernyataan kondisional)
  • tingkat semantik: bagaimana ekspresi bahasa dikonversi menjadi instruksi CPU untuk membentuk suatu makna (pernyataan kondisional memungkinkan untuk mengeksekusi satu cabang atau yang lain tergantung pada hasil dari ekspresi boolean)

10
Pemisahan antara tahap lexing dan parsing sepenuhnya buatan, itu tidak lebih dari sebuah optimasi. Dan ada beberapa bahasa di mana tidak ada set terbatas dari leksem didefinisikan - tetapi masih, ada sintaks yang jelas. Jadi, saya lebih suka mendefinisikan lexemes sebagai bagian dari sintaks, bukan entitas yang terpisah.
SK-logic

@ SK-logic: Dalam banyak bahasa, daftar leksem resmi atau terlarang yang membentuk nama variabel ditentukan. Jadi pemisahan itu masuk akal.
mouviciel

5
@ mouviciel, masuk akal hanya sebagai optimasi - jika tidak, Anda hanya akan memiliki ValidIdentifierterminal, yang dapat didefinisikan sebagai sesuatu seperti ![AnyKeyword] [Identifier](Saya menggunakan notasi PEG-like di sini). Anda tidak perlu pass lexing terpisah untuk bahasa seperti itu. Lihat, misalnya, parser C ++ berbasis GLR.
SK-logic

2
@ EvanPlaice, apa yang kamu bicarakan? Maksud saya adalah bahwa lexing tidak perlu (dan sebenarnya membatasi bahasa Anda), bukan penguraian .
SK-logic

1
@ SK-logic Saya kira saya membaca komentar Anda berarti kebalikan dari apa yang Anda maksudkan. Saya pikir Anda berbicara tentang kasus-kasus di mana hanya lexer diperlukan - seperti dalam bahasa 'biasa' atau 'bebas konteks' murni. Dalam bahasa tingkat yang lebih tinggi, lexer mungkin tidak diperlukan, tetapi menyediakan cara cepat untuk menjalankan validasi sintaks satu pass. Saya sepenuhnya setuju bahwa ada banyak kasus di mana akan bermanfaat untuk mematikan atau sepenuhnya menghilangkan tahap lexer.
Evan Plaice

18

Saya akan menjelaskannya kepada Anda dengan contoh sederhana dalam bahasa ENGLISH:

The glass drank Ben

Apakah pernyataan yang benar secara sintaksis. Ini memiliki kata benda, kata kerja, dll.

Tetapi secara semantik itu salah, karena pernyataan ini tidak memiliki makna yang masuk akal atau benar.


15

Semantik menggambarkan entitas logis dari bahasa pemrograman dan interaksinya. Sintaks mendefinisikan bagaimana ini diekspresikan dalam karakter.

Sebagai contoh, konsep pointer aritmatika adalah bagian dari semantik C; cara +dan -operator dapat digunakan untuk mengekspresikan operasi pointer adalah bagian dari sintaksnya.

Kadang-kadang, dua bahasa berbagi bagian dari semantik mereka, tetapi sintaksinya sangat berbeda (misalnya C # dan VB.NET - keduanya menggunakan tipe nilai dan tipe referensi, tetapi karakter yang Anda ketik untuk mendefinisikannya berbeda); dalam kasus lain, dua bahasa secara sintaksis mirip, tetapi semantik tidak cocok (pertimbangkan Java vs JavaScript, di mana kesamaan sering membingungkan pemula).


Jadi, "Paradigma" terkait dengan semantik? Maksud saya paradigma adalah seperangkat semantik yang saling terkait?
Gulshan

1
@Gulshan, paradigma adalah konsep yang jauh lebih luas daripada hal formal seperti semantik. Paradigma dapat mencakup semantik, tetapi lebih merupakan metodologi, atau, bahkan lebih luas, sebuah filsafat.
SK-logic

6

Sintaks adalah bagaimana Anda mengatur token bahasa. Semantik adalah apa makna token itu (biasanya, apa arti pengaturan token tertentu).


5

Anda tidak menentukan apakah Anda hanya merujuk ke bahasa pemrograman atau ke bahasa umum yang digunakan dalam pemrograman, jadi jawaban saya adalah tentang bahasa data (seperti XML, RDF, sistem tipe data, dll.):

Brian L. Meek dalam tujuh aturan emasnya untuk menghasilkan standar bahasa-independen (1995) menulis bahwa "sintaksis satu bahasa dapat menjadi semantik yang lain" . Dia merujuk pada kata-kata "sintaks" dan "semantik" yang digunakan dalam deskripsi data: jadi jika Anda menemukan kata-kata ini dalam spesifikasi beberapa format data, Anda sebaiknya mengganti kedua kata dengan "Potrzebie" untuk menjelaskan bahwa Anda harus berolahraga artinya untuk dirimu sendiri.

Hubungan antara sintaksis dan semantik, setidaknya dalam data yang ditentukan secara tepat, dapat lebih baik dijelaskan dengan istilah "encoding" . Semantik dikodekan dalam sintaksis. Karena rekaman dapat disarangkan, sintaksis satu bahasa adalah semantik yang lain. Jika seseorang melampaui bidang data, sarang ini bisa menjadi tak terbatas, seperti yang dijelaskan oleh Umberto Eco sebagai "semiosis tak terbatas".

Untuk memberi contoh:

  • Sintaks XML (hal-hal dengan semua tanda kurung ini) adalah sintaksis dengan Infoset XML (pohon abstrak) sebagai semantik.
  • XML Infoset sebagai sintaksis dapat mengekspresikan catatan dalam beberapa format data XML sebagai semantik, misalnya dokumen RDF / XML yang menyandikan grafik RDF.
  • Grafik RDF (hal-hal dengan Referensi URI) sebagai sintaks menyandikan grafik sumber daya abstrak sebagai semantik.
  • Grafik sumber daya abstrak sebagai sintaks menyandikan model konseptual sebagai semantik.

Orang biasanya berhenti pada tingkat tertentu dan menganggapnya sebagai semantik, tetapi pada akhirnya tidak ada semantik terakhir kecuali beberapa manusia menginterpretasikan data dalam pikirannya. Begitu seseorang mencoba untuk mengekspresikan semantik dalam bentuk data, itu menjadi sintaksis.


4

Jika itu dapat dijelaskan dalam BNF (Backus-Naur Form) atau yang serupa, itu sintaksis. Jika tidak bisa, itu tidak benar.

Semantik, di sisi lain, adalah tentang arti suatu program (atau potongan kode sumber lainnya).

Dan kadang-kadang garis di antara keduanya bisa buram.

Salah satu cara untuk memahami perbedaannya adalah dengan melihat jenis kesalahan yang Anda dapatkan ketika sintaks atau semantik program Anda salah.

Kesalahan sintaksis adalah kegagalan kode sumber untuk mencocokkan tata bahasa bahasa, misalnya, tidak memiliki titik koma di mana satu diperlukan.

Kesalahan semantik adalah kegagalan untuk memenuhi persyaratan bahasa lain (apa yang C, misalnya, sebut "kendala"); contoh mungkin menulis di x + ymana xdan ydari jenis yang tidak kompatibel. Tata bahasa memberi tahu Anda bahwa tambahan tampak seperti something + something, tetapi tidak cukup kuat untuk mengungkapkan persyaratan pada jenis operan kiri dan kanan.

(Kesalahan logis, seperti menggunakan 1 di mana 2 akan benar, umumnya tidak terdeteksi oleh kompiler - meskipun dalam beberapa kasus kompiler dapat memperingatkan tentang kode yang dipertanyakan.)


0

Sintaks adalah apa yang dikatakan simbol (leksikal). Semantik adalah apa yang mereka maksudkan.

Mempertimbangkan:

C #: condition ? true_value : false_value
VB.NET: If(condition, true_value, false_value)
- Sintaks yang berbeda, semantik yang sama.

C #: left_value / right_value
VB.NET: left_value / right_value
- Sintaks yang sama, semantik yang berbeda (untuk bilangan bulat).


0

Sintaksis adalah susunan kata dari tata bahasa dalam suatu kalimat yaitu urutan kata.

(Bahasa Inggris) ' cat dog boy ' dan (pemrograman) ' hi.5 ' tidak benar secara sintaksis.

(Bahasa Inggris) ' cat hugs boy ' dan (pemrograman) '* 3.2 * 5 *' secara sintaksis valid.

Semantik Statis adalah apakah pernyataan yang valid secara sintaksis memiliki arti.

(Bahasa Indonesia) ' Saya besar ' (pemrograman) (python) ' 3 +' hi ' ' secara sintaksis benar tetapi memiliki kesalahan semantik statis.

Semantik adalah makna yang terkait dengan rangkaian simbol yang benar secara sintaksis tanpa kesalahan semantik statis, yaitu kalimat yang secara sintaksis dan semantik benar, tetapi artinya mungkin bukan yang dimaksudkan.

(Inggris) ' Pesawat terbang bisa berbahaya ' dapat memiliki dua arti yaitu terbang pesawat bisa berbahaya atau pesawat yang terbang bisa berbahaya.

(Pemrograman) 'komputer tidak akan menghasilkan pesan kesalahan apa pun, tetapi tidak akan melakukan apa yang Anda perintahkan; itu akan melakukan sesuatu yang lain. '

Sumber : MIT 6.00.1


-2
  1. Sintaks mengacu pada aturan formal yang mengatur konstruksi pernyataan yang valid dalam bahasa. Semantik mengacu pada seperangkat aturan yang memberi makna suatu pernyataan.

  2. Kesalahan karena sintaksis terjadi dalam suatu program ketika reruntuhan bahasa pemrograman dilanggar atau disalahgunakan. Kesalahan karena semantik terjadi dalam suatu program ketika pernyataan tidak bermakna.

  3. Urutan kata adalah prinsip dasar sintaksis, mereka yang mencoba memahami apa yang ditulis menggunakan isyarat sintaksis urutan kata untuk membantu memberikan struktur dan makna kalimat. Semantik adalah interpretasi individu tentang makna "kalimat" berdasarkan pengetahuan mereka sebelumnya. Oleh karena itu kalimat yang tampaknya tidak masuk akal sintaksis, dapat memiliki makna ketika menggunakan isyarat semantik.

  4. Sintaks hanya berkaitan dengan apa yang secara linguistik dan tata bahasa benar. Semantik membutuhkan semua pengetahuan sebelumnya yang, dan jauh melampaui apa pun yang spesifik bahasa.

  5. Kalimat "Minuman susu bayi" tidak memiliki arti sintaksis, tetapi melalui semantik kebanyakan orang akan menafsirkannya sebagai "susu minum bayi" seperti pengetahuan kita sebelumnya memberitahu kita bahwa bayi minum susu, dan oleh karena itu kita dapat menemukan makna dari kata kunci.



-2

Sintaksis dan semantiknya seperti strategi dan taktik atau kiri dan kanan .

Mereka bukan konsep universal yang benar-benar independen, tetapi pasangan kata yang terkait yang, ketika Anda berada dalam konteks tertentu, menunjukkan arah yang berlawanan. Tetapi hal yang sama yaitu strategi pada satu skala adalah taktik pada skala lain.

Jadi, jika Anda menulis kode dalam bahasa, sintaks adalah bahasa yang Anda gunakan dan perilaku yang diinginkan adalah semantik. Tetapi jika Anda menerapkan, atau mendiskusikan, kompiler untuk bahasa itu, maka sintaksisnya adalah tata bahasa dan mungkin tipe sistem dan semantik yang dibangun dengan semua itu. Dan seterusnya.


4
BS esoterik macam apa itu? Suka kiri dan kanan? Suka strategi dan taktik? Mungkin bahkan seperti Yin dan Yang, Dewa dan Setan, Harry dan Voldemort?
JensG

-3

Sintaks adalah apa yang dipahami komputer, semantik adalah apa yang dipahami manusia.

Kompiler / juru bahasa tidak peduli sedikit pun tentang desain Anda, dan dalam kode apa pun yang dikompilasi ke tingkat mesin, Anda akan kesulitan menyimpulkan desain. Pengembang peduli tentang desain karena desain yang baik adalah tentang mengurangi kompleksitas dengan mengabstraksi perilaku dan interaksi yang kompleks, dan berbagai jenis masalah cocok untuk semantik yang berbeda. Pilihan bahasa sebagian besar tentang seberapa mudah dan efisien semantik yang ingin Anda gunakan dapat diekspresikan dalam sintaksisnya.


"Sintaks adalah apa yang dipahami komputer, semantik adalah apa yang dipahami manusia" adalah penyederhanaan yang berlebihan. Manusia juga memahami sintaksis, dan komputer memahami beberapa jenis semantik.
CesarGon

4
Jelas salah. Ada bahasa dengan sintaksis yang identik dan semantik yang sama sekali berbeda (misalnya, versi bersemangat dan malas dari bahasa yang sama), ada bahasa yang hampir tidak memiliki sintaksis dan semantik yang sangat kaya dan variabel (misalnya, Forth dan Lisp). Semantik adalah bagaimana kompiler mengartikan bahasa Anda. Manusia mungkin tidak tahu apa-apa tentang hal itu dan masih bisa menggunakan bahasa.
SK-logic

@ SK-logika, Anda menentang diri sendiri. Jika semantik yang berbeda dapat diekspresikan dengan sintaks yang sama, maka jelas semantik tidak terkandung dalam sintaksis, tetapi lebih pada bagaimana itu digunakan. Namun kompiler hanya memiliki sintaks untuk bekerja. Itu tidak menafsirkan semantik, itu menafsirkan sintaksis. Itu tidak mengkompilasi sintaks yang sama secara berbeda berdasarkan apa yang dikatakan pengembang, tetapi hanya pada apa yang diketiknya. Semantik disediakan oleh pengembang, dan hanya bermakna baginya.
kylben

3
@ Kylben, saya tidak menentang diri saya sendiri, karena saya tidak pernah mengatakan bahwa sintaks dan semantik bahkan terhubung. Dan kompiler tidak melakukan apa pun dengan sintaks langsung setelah tahap parsing - kompiler mengimplementasikan semantik . Jelas interpretasi Anda tentang terminologi salah. Baca ini sebagai permulaan: en.wikipedia.org/wiki/Denotational_semantics
SK-logic

3
Anda sedang berbicara tentang makna suatu program , yang merupakan "semantik" seperti yang akan didefinisikan oleh ahli bahasa. Tetapi dalam ilmu komputer, semantik adalah makna dari bahasa , bukan program tertentu.
SK-logic

-3

Contoh yang sangat singkat dengan "plain c":

void main()
{
  int a = 10;
  int x = a - 1;
  int y = - 1;

  printf("x = %i", x);
  printf("y = %i", y);
    getch();
}

Dalam contoh ini, sintaks untuk token "-" adalah sama, tetapi memiliki arti yang berbeda ("semantik), tergantung di mana digunakan.

Dalam "x" assignament, "-" berarti operasi "substraction", Dalam "y" assignament, "-" berarti operasi "tanda negatif".


3
Salah. Kedua -operator adalah token yang sama , tetapi mereka secara sintaksis berbeda, karena mereka digunakan dalam konteks yang berbeda. 0 - 1cocok dengan aturan sintaksis additive-expression: additive-expression - multiplicative-expression, sementara - 1cocok dengan aturan sintaksis unary-expression: unary-operator cast-expression(referensi: standar C99).
Keith Thompson

@Keith Thompson: Anda melewatkan intinya. Apakah pertanyaan semantik atau sintaks, bukan pertanyaan standar C. Standar itu benar, tetapi, jawaban saya diarahkan untuk menjelaskan konsep, bukan, mengikuti secara harfiah, standar. Ini seperti pertanyaan "Kapten Kirk" vs "Dr Spock". Cheers ;-)
umlcat

Saya tidak setuju. Perbedaan antara kedua -oeprator adalah sintaksis, bukan hanya semantik (meskipun mereka juga memiliki semantik yang berbeda). Sintaks didefinisikan oleh tata bahasa, dan kedua operator ditentukan dalam bagian tata bahasa yang berbeda. Lihat konsep N1570 , bagian 6.5.3 untuk operator unary dan 6.5.6 untuk operator aditif. (BTW, jika Anda akan menggunakan contoh C, itu mungkin harus benar; void main()harus int main(void), dan Anda hilang #include <stdio.h>dan header apa pun menyatakangetch
Keith Thompson

Untuk memperjelas poinnya, sintaksis tidak hanya tentang urutan token, ini tentang bagaimana token itu membangun konstruksi yang lebih besar. Kompiler biasanya memiliki penganalisis leksikal (tokenizer) dan pengurai sebagai komponen yang berbeda; keduanya berurusan dengan sintaks.
Keith Thompson
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.