Jawaban:
Sintaks adalah tentang struktur atau tata bahasa suatu bahasa. Ini menjawab pertanyaan: bagaimana cara membuat kalimat yang valid? Semua bahasa, bahkan bahasa Inggris dan bahasa manusia (alias "alami") lainnya memiliki tata bahasa, yaitu aturan yang menentukan apakah kalimat dibuat dengan benar atau tidak.
Berikut beberapa aturan sintaks bahasa C:
Semantik adalah tentang arti kalimat. Ini menjawab pertanyaan: apakah kalimat ini valid? Jika ya, apa arti kalimat tersebut? Sebagai contoh:
x++; // increment
foo(xyz, --b, &qrs); // call foo
adalah pernyataan C yang valid secara sintaksis. Tapi apa maksudnya? Apakah valid untuk mencoba mengubah pernyataan ini menjadi urutan instruksi yang dapat dieksekusi? Pertanyaan-pertanyaan ini merupakan inti dari semantik.
Pertimbangkan operator ++ di pernyataan pertama. Pertama-tama, apakah sah untuk mencoba ini?
Terakhir, perhatikan bahwa beberapa semantik tidak dapat ditentukan pada waktu kompilasi dan oleh karena itu harus dievaluasi pada waktu proses. Dalam contoh operator ++, jika x sudah berada pada nilai maksimum untuk tipe datanya, apa yang terjadi saat Anda mencoba menambahkan 1 ke dalamnya? Contoh lain: apa yang terjadi jika program Anda mencoba untuk mendereferensi pointer yang nilainya NULL?
Singkatnya, sintaksis adalah konsep yang memperhatikan dirinya sendiri hanya apakah kalimat tersebut valid atau tidak untuk tata bahasa. Semantik adalah tentang apakah kalimat tersebut memiliki makna yang valid atau tidak.
x
berada pada nilai maksimum untuk datanya dan 1
ditambahkan ke dalamnya maka itu menghasilkan beberapa keluaran yang aneh ( 0
), bukankah itu kesalahan semantik?
UINT_MAX + 1 == 0
). Overflow yang ditandatangani tidak ditentukan. Kompiler modern biasanya memiliki INT_MAX + 1 == INT_MIN
, tetapi ada kasus Anda tidak dapat mengandalkan ini (misalnya for (i = 0; i <= N; ++i) { ... }
di mana N
yang INT_MAX
tidak tak terbatas tergantung pada optimasi, lihat blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
Sintaks mengacu pada struktur suatu bahasa, menelusuri etimologinya hingga bagaimana hal-hal disatukan.
Misalnya, Anda mungkin memerlukan kode untuk disatukan dengan mendeklarasikan tipe lalu nama dan titik koma, agar benar secara sintaksis.
Type token;
Di sisi lain, semantik adalah tentang makna. Seorang compiler atau interpreter dapat mengeluh tentang kesalahan sintaks. Rekan kerja Anda akan mengeluh tentang semantik.
Wikipedia punya jawabannya. Membaca halaman wiki sintaks (bahasa pemrograman) & semantik (ilmu komputer) .
Atau pikirkan tentang pekerjaan compiler atau interpreter mana pun . Langkah pertama adalah analisis leksikal dimana token dibuat dengan membagi string menjadi lexemes kemudian parsing , yang membangun beberapa pohon sintaks abstrak (yang merupakan representasi dari sintaksis). Langkah selanjutnya melibatkan mengubah atau mengevaluasi AST (semantik) ini.
Juga, perhatikan bahwa jika Anda menentukan varian C di mana setiap kata kunci diubah menjadi padanan bahasa Prancisnya (jadi if
menjadi si
, do
menjadi faire
, else
menjadi , sinon
dll.) Anda pasti akan mengubah sintaks bahasa Anda, tetapi Anda tidak akan banyak berubah semantik: pemrograman dalam bahasa Prancis-C itu tidak akan lebih mudah!
Semantik adalah arti kode Anda - apa yang mungkin Anda gambarkan dalam pseudo-code. Sintaks adalah struktur aktual - mulai dari nama variabel hingga titik koma.
Sintaks adalah struktur atau bentuk ekspresi, pernyataan, dan unit program tetapi Semantik adalah arti dari ekspresi, pernyataan, dan unit program tersebut. Semantik mengikuti langsung dari sintaks . Sintaks mengacu pada struktur / bentuk kode yang ditentukan oleh bahasa pemrograman tertentu tetapi Semantik berurusan dengan makna yang ditetapkan ke simbol, karakter, dan kata-kata.
The sintaks dari bahasa pemrograman adalah bentuk ekspresi, pernyataan, dan unit program. Its semantik adalah makna dari ungkapan-ungkapan, pernyataan, dan unit program. Misalnya, sintaks dari pernyataan while adalah
while (boolean_expr) statement
Semantik dari bentuk pernyataan ini adalah ketika nilai ekspresi Boolean saat ini adalah benar, pernyataan yang disematkan akan dijalankan. Kemudian kontrol secara implisit kembali ke ekspresi Boolean untuk mengulangi proses tersebut. Jika ekspresi Boolean salah, kontrol ditransfer ke pernyataan setelah konstruksi while.
Sintaks: Ini mengacu pada struktur gramatikal bahasa .. Jika Anda menulis bahasa c. Anda harus sangat berhati-hati dalam menggunakan tipe data, token [bisa literal atau simbol seperti "printf ()". Ini memiliki 3 tokes, "printf, (,)"]. Dengan cara yang sama, Anda harus sangat berhati-hati, bagaimana Anda menggunakan fungsi, sintaks fungsi, deklarasi fungsi, definisi, inisialisasi dan pemanggilannya.
Sedangkan semantik berkaitan dengan logika atau konsep kalimat atau pernyataan. Jika Anda mengatakan atau menulis sesuatu di luar konsep atau logika, maka Anda salah secara semantik.
Biasanya, analisis sintaks dan semantik kode dilakukan di bagian 'frontend' dari compiler.
Sintaks: Compiler menghasilkan token untuk setiap kata kunci dan simbol: token berisi informasi- jenis kata kunci dan lokasinya dalam kode. Dengan menggunakan token ini, AST (singkatan dari Abstract Syntax Tree) dibuat dan dianalisis. Yang benar-benar diperiksa oleh compiler di sini adalah apakah kode tersebut bermakna secara leksikal, yaitu apakah 'urutan kata kunci' sesuai dengan aturan bahasa? Seperti yang disarankan dalam jawaban sebelumnya, Anda dapat melihatnya sebagai tata bahasa (bukan arti / arti kode). Catatan samping: Kesalahan sintaks dilaporkan dalam fase ini. (Mengembalikan token dengan jenis kesalahan ke sistem)
Semantik: Sekarang, kompilator akan memeriksa apakah operasi kode Anda 'masuk akal'. mis. Jika bahasa mendukung Jenis Inferensi, kesalahan sematic akan dilaporkan jika Anda mencoba untuk menetapkan string ke float. ATAU mendeklarasikan variabel yang sama dua kali. Ini adalah kesalahan yang 'secara tata bahasa' / sintaksis benar, tetapi tidak masuk akal selama operasi. Catatan samping: Untuk memeriksa apakah variabel yang sama dideklarasikan dua kali, compiler mengelola tabel simbol
Jadi, output dari 2 fase frontend ini adalah AST beranotasi (dengan tipe data) dan tabel simbol.
Mempertimbangkan bahasa normal yang kami gunakan; di sini, bahasa Inggris:
misalnya Dia pergi ke sekolah. - Tata bahasa / sintaksis salah, meskipun ia ingin menyampaikan pengertian / semantik yang benar.
mis. Dia pergi ke kedinginan. - dingin adalah kata sifat. Dalam bahasa Inggris, kami mungkin mengatakan ini tidak sesuai dengan tata bahasa, tetapi sebenarnya ini adalah contoh yang paling dekat dengan semantik yang salah dengan sintaks yang benar yang dapat saya pikirkan.