Apa perbedaan antara sintaks dan semantik dalam bahasa pemrograman?


120

Apa perbedaan antara sintaks dan semantik dalam bahasa pemrograman (seperti C, C ++)?


2
Saya ingin memberikan suara tetapi tidak ada upaya penelitian yang terbukti.
null

Jawaban:


201

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:

  • pisahkan pernyataan dengan titik koma
  • menyertakan ekspresi bersyarat dari pernyataan IF di dalam tanda kurung
  • kelompokkan beberapa pernyataan menjadi satu pernyataan dengan menyertakan tanda kurung kurawal
  • tipe data dan variabel harus dideklarasikan sebelum pernyataan eksekusi pertama (fitur ini telah dihilangkan di C99. C99 dan yang terakhir memungkinkan deklarasi tipe campuran.)

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?

  • Jika x adalah tipe data float, pernyataan ini tidak memiliki arti (menurut aturan bahasa C) dan oleh karena itu merupakan kesalahan meskipun pernyataan tersebut benar secara sintaksis.
  • Jika x adalah penunjuk ke beberapa tipe data , arti dari pernyataan tersebut adalah untuk "menambahkan ukuran ( beberapa tipe data ) ke nilai di alamat x dan menyimpan hasilnya ke lokasi di alamat x".
  • Jika x adalah skalar, arti dari pernyataannya adalah "tambahkan satu ke nilai di alamat x dan simpan hasilnya ke lokasi di alamat x".

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.


BAIK. Jika xberada pada nilai maksimum untuk datanya dan 1ditambahkan ke dalamnya maka itu menghasilkan beberapa keluaran yang aneh ( 0), bukankah itu kesalahan semantik?
haccks

Pertimbangkan odometer di dalam kendaraan - odometer memiliki serangkaian roda yang saling terkait dengan angka 0 hingga 9 tercetak di setiap roda. Roda paling kanan berputar paling cepat; ketika membungkus dari 9 kembali ke nol, roda di sebelah kiri terdekatnya maju satu per satu. Saat roda ini maju dari 9 ke 0, roda di sebelah kirinya maju, dan seterusnya.
Jeff N

Jenis data seperti roda odometer: ia hanya dapat menampung nilai tertentu. Ketika nilai maksimum tercapai, gerak maju berikutnya menyebabkan roda kembali ke nol. Apakah ini adalah kesalahan semantik atau tidak tergantung pada aturan bahasa. Dalam hal ini, Anda perlu merujuk kembali ke standar bahasa C. Saya tidak tahu persis apa yang dikatakan standar bahasa C, tetapi berikut adalah beberapa opsinya. Overflow adalah: -bukan error; hasilnya nol. -salah satu kesalahan; kompiler HARUS menghasilkan pengecualian overflow. -UNDEFINED; kompilator bebas melakukan apapun yang diinginkannya.
Jeff N

2
Jika ada yang peduli dengan contoh spesifiknya, unsigned overflow didefinisikan sebagai aritmatika modular (jadi 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 Nyang INT_MAXtidak tak terbatas tergantung pada optimasi, lihat blog.llvm.org/2011/05/what-every-c-programmer-should-know. html ).
Daniel H

"perhatikan bahwa beberapa semantik tidak dapat ditentukan pada waktu kompilasi dan oleh karena itu harus dievaluasi pada saat berjalan" - Saya suka bagaimana ini memiliki paralel dengan bahasa alami. Anda tidak dapat mengetahui arti dari beberapa frasa tanpa konteks. Misalnya, dalam frasa "Dia suka pisang", arti "dia" bergantung pada konteks.
ymln

21

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.


@Talespin_Kit artinya daripada struktur: logika lebih merupakan abstraksi misalnya P => Q, dll atau !! P = P, tetapi ketika Anda menambahkan semantik sesuatu dapat memiliki kehalusan, jika P "bahagia", maka !! P adalah "I saya bukannya tidak senang "! =" Saya senang "
doctorlove

5
+1 untuk "Penyusun atau juru bahasa dapat mengeluh tentang kesalahan sintaksis. Rekan kerja Anda akan mengeluh tentang semantik."
GeekyJ

11

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 ifmenjadi si, domenjadi faire, elsemenjadi , sinondll.) Anda pasti akan mengubah sintaks bahasa Anda, tetapi Anda tidak akan banyak berubah semantik: pemrograman dalam bahasa Prancis-C itu tidak akan lebih mudah!


8

Semantik adalah arti kode Anda - apa yang mungkin Anda gambarkan dalam pseudo-code. Sintaks adalah struktur aktual - mulai dari nama variabel hingga titik koma.


Apakah ini percakapan antara orang yang berbeda? Atau hanya satu postingan? Saya tidak mengerti. Misalnya "Tidak tahu apa maksud dari kalimat berikut ini. Tidak mungkin lebih salah".
doubleOrt

5

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.


5
  • Anda membutuhkan sintaks yang benar untuk mengkompilasi.
  • Anda perlu semantik yang benar untuk membuatnya berfungsi.

1

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.


1

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.


1

Memahami bagaimana kompilator melihat kode

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.

Memahami dengan cara yang tidak terlalu teknis

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.


Penyusun Tautan ini mungkin berguna untuk mempelajari lebih lanjut
Vedant Panchal
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.