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?
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?
Jawaban:
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).
x + y
mana tidak ada +
operator yang sesuai untuk operan tersebut). Menambahkan 1 daripada 2 adalah apa yang saya sebut kesalahan logis .
Sebenarnya tidak ada dua level tetapi tiga:
i
dan f
menghasilkan if
)if
, (
, 42
, ==
, answer
dan )
menghasilkan pernyataan kondisional)ValidIdentifier
terminal, 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.
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.
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).
Sintaks adalah bagaimana Anda mengatur token bahasa. Semantik adalah apa makna token itu (biasanya, apa arti pengaturan token tertentu).
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:
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.
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 + y
mana x
dan y
dari 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.)
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).
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
Sintaks mengacu pada aturan formal yang mengatur konstruksi pernyataan yang valid dalam bahasa. Semantik mengacu pada seperangkat aturan yang memberi makna suatu pernyataan.
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.
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.
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.
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.
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.
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.
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".
-
operator adalah token yang sama , tetapi mereka secara sintaksis berbeda, karena mereka digunakan dalam konteks yang berbeda. 0 - 1
cocok dengan aturan sintaksis additive-expression: additive-expression - multiplicative-expression
, sementara - 1
cocok dengan aturan sintaksis unary-expression: unary-operator cast-expression
(referensi: standar C99).
-
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