Pendeknya
Bahasa pemrograman terdiri dari sintaks yang mewakili program sebagai string karakter, dan semantik yang merupakan makna yang dimaksud dari program.
Bahasa formal adalah sintaksis tanpa makna. Ini dimaksudkan untuk mempelajari struktur set string yang didefinisikan secara formal, tanpa biasanya menempelkan makna pada string tersebut.
Ekspresi reguler dan formalisme lainnya (seperti Context-Free Grammars) digunakan untuk mendefinisikan bahasa formal, digunakan sebagai komponen sintaksis pemrograman dan bahasa alami, yaitu untuk merepresentasikan kalimat dengan cara terstruktur. Mekanisme lain digunakan untuk menghubungkan struktur itu dengan semantik bahasa pemrograman.
Banyak di sini sangat disederhanakan, terutama mengenai bahasa alami.
Dengan lebih banyak detail
Untuk menjawab pertanyaan Anda, kami harus mulai dari awal. Bahasa dalam arti biasa, secara informal, merupakan sarana untuk menyampaikan informasi atau ide. Dalam suatu bahasa, orang biasanya membedakan antara sintaks dan semantik. Semantik adalah apa yang ingin Anda bicarakan / tulis. informasi yang ingin Anda sampaikan. Sintaks adalah cara yang Anda gunakan untuk menyampaikannya, yaitu representasi konvensional yang dapat dipertukarkan antara orang, dan sekarang juga antara orang dan perangkat, atau antara perangkat (komputer).
Biasanya, Anda akan menggunakan kata itu dog
untuk menyampaikan ide tentang seekor anjing. Kata dog
itu terbuat dari tiga huruf, atau suara yang setara, dan dimaksudkan untuk menjadi representasi dari beberapa jenis hewan. Gagasan utamanya adalah bahwa komunikasi dilakukan melalui representasi dari apa yang harus dikomunikasikan. Struktur representasi biasanya disebut sintaksis, sedangkan yang direpresentasikan disebut semantik. Ini berlaku lebih atau kurang untuk bahasa alami serta untuk bahasa pemrograman.
Kata-kata adalah entitas sintaksis untuk mewakili konsep semantik yang kurang lebih elementer. Tetapi konsep-konsep dasar ini harus disatukan dalam berbagai cara untuk memberikan makna yang lebih kompleks. Kami menulis
the dog
untuk menyampaikan bahwa yang kami maksud adalah anjing tertentu, dan the dog bites the cat
untuk menyampaikan ide yang lebih kompleks. Tetapi cara mengatur kata-kata harus diperbaiki dengan aturan, sehingga kita dapat mengetahui anjing dan kucing mana yang benar-benar menggigit.
Jadi kami memiliki aturan seperti sentence -> subject verb complement
yang seharusnya cocok dengan kalimat dan memberi tahu kami bagaimana ide yang terkait dengan masing-masing bagian diartikulasikan. Aturan-aturan ini adalah aturan sintaksis, karena aturan tersebut memberi tahu kita bagaimana representasi pesan kita diatur. The subject
sendiri bisa didefinisikan oleh aturan subject -> article noun
, dan sebagainya.
2 x + 1 = 23x123
equation -> expression "=" expression
expression -> expression "+" expression
expression -> number
Struktur bahasa pemrogramannya sama. Bahasa pemrograman secara semantik khusus dalam mengekspresikan perhitungan yang harus dilakukan, daripada mengungkapkan masalah yang harus dipecahkan, bukti teorema atau hubungan persahabatan antara hewan. Tapi itulah perbedaan utama.
Representasi yang digunakan dalam sintaksis biasanya string karakter, atau suara untuk bahasa yang diucapkan. Semantik biasanya milik domain abstrak, atau mungkin realitas, tetapi masih diabstraksikan dalam proses pemikiran kita, atau pada domain perilaku perangkat. Komunikasi memerlukan pengodean informasi / ide ke dalam sintaksis, yang ditransmisikan dan diterjemahkan oleh penerima. Hasilnya kemudian diartikan dengan cara apa pun oleh penerima.
Jadi apa yang kita lihat dari bahasa ini sebagian besar sintaks dan strukturnya. Contoh di atas hanya salah satu cara paling umum untuk mendefinisikan string sintaksis dan organisasi strukturalnya. Ada yang lain. Untuk bahasa tertentu, beberapa string dapat diberi struktur, dan dikatakan milik bahasa, sementara yang lain tidak.
Hal yang sama berlaku untuk kata-kata. Beberapa urutan huruf (atau suara) adalah kata-kata yang sah, sementara yang lain tidak.
Bahasa formal hanya sintaksis tanpa semantik. Mereka mendefinisikan dengan seperangkat aturan urutan apa yang dapat dibangun, menggunakan elemen dasar alfabet. Apa aturannya bisa sangat bervariasi, terkadang rumit. Tetapi bahasa formal digunakan untuk banyak tujuan matematika di luar komunikasi linguistik, baik untuk bahasa pemrograman alami. Seperangkat aturan yang menentukan string dalam bahasa disebut tata bahasa. Tetapi ada banyak cara lain untuk mendefinisikan bahasa.
Dalam praktiknya, sebuah bahasa disusun dalam dua tingkat. Tingkat leksikal mendefinisikan kata-kata yang dibangun dari alfabet karakter. Tingkat sintaksis mendefinisikan kalimat, atau program yang dibangun dari alfabet kata (atau lebih tepatnya dari keluarga kata, sehingga tetap menjadi alfabet terbatas). Ini tentu agak disederhanakan.
Struktur kata-kata cukup sederhana di sebagian besar bahasa (pemrograman atau alami) sehingga biasanya didefinisikan dengan apa yang biasanya dianggap sebagai jenis bahasa formal yang paling sederhana: bahasa biasa. Mereka dapat didefinisikan dengan ekspresi reguler (regexp), dan cukup mudah diidentifikasi dengan perangkat yang diprogram yang disebut automata keadaan terbatas. Dalam kasus bahasa pemrograman, contoh kata adalah pengidentifikasi, integer, string, bilangan real, kata yang dicadangkan seperti if
atau repeat
, simbol tanda baca atau tanda kurung terbuka. Contoh keluarga kata adalah identifier, string, integer.
Tingkat sintaksis biasanya ditentukan oleh jenis bahasa formal yang sedikit lebih kompleks: bahasa bebas konteks, menggunakan kata-kata sebagai alfabet. Aturan yang telah kita lihat di atas adalah aturan bebas konteks untuk bahasa alami. Dalam hal aturan bahasa pemrograman dapat:
statement -> assignment
statement -> loop
loop -> "while" expression "do" statement
assignment -> "identifier" "=" expression
expression -> "identifier"
expression -> "integer"
expression -> expression "operator" expression
Dengan aturan seperti itu, Anda dapat menulis:
while aaa /= bbb do aaa = aaa + bbb / 6
yang merupakan pernyataan.
Dan cara itu diproduksi dapat diwakili oleh struktur pohon yang disebut pohon parse atau pohon sintaks (tidak lengkap di sini):
statement
|
_______________ loop _______________
/ / \ \
"while" expression "do" statement
__________|_________ |
/ | \ assignment
expression "operator" expression _______|_______
| | | / | \
"identifier" "/=" "identifier" "identifier" "=" expression
| | | |
aaa bbb aaa ... ...
Nama-nama yang muncul di sebelah kiri aturan disebut non-terminal, sedangkan kata-katanya disebut juga terminal, karena mereka berada dalam alfabet untuk bahasa (di atas tingkat leksikal). Non-terminal mewakili struktur sintaksis yang berbeda, yang dapat digunakan untuk menyusun program.
Aturan seperti itu disebut bebas konteks, karena non-terminal dapat diganti secara sewenang-wenang menggunakan salah satu aturan yang sesuai, terlepas dari konteks di mana ia muncul. Seperangkat aturan yang mendefinisikan bahasa disebut tata bahasa bebas konteks.
Sebenarnya ada batasan untuk itu, ketika pengidentifikasi harus dideklarasikan pertama kali, atau ketika ekspresi harus memenuhi batasan tipe. Tetapi pembatasan semacam itu dapat dianggap semantik, bukan sintaksis. Sebenarnya beberapa profesional menempatkan mereka dalam apa yang mereka sebut
semantik statis .
Diberikan kalimat apa pun, program apa pun, makna kalimat itu diekstraksi dengan menganalisis struktur yang diberikan oleh pohon parse untuk kalimat ini. Oleh karena itu sangat penting untuk mengembangkan algoritma, yang disebut parser, yang dapat memulihkan struktur pohon yang sesuai dengan program, ketika diberikan program.
Pengurai didahului oleh penganalisa leksikal yang mengenali kata-kata, dan menentukan keluarga tempatnya. Kemudian urutan kata-kata, atau elemen leksikal, diberikan kepada parser yang mengambil struktur pohon yang mendasarinya. Dari struktur ini kompiler kemudian dapat menentukan bagaimana menghasilkan kode, yang merupakan bagian semantik dari pemrosesan program di sisi kompiler.
Parser dari kompiler dapat benar-benar membangun struktur data yang sesuai dengan parse-tree dan meneruskannya ke tahap selanjutnya dari proses kompilasi, tetapi tidak harus. Menjalankan jumlah algoritma parsing untuk mengembangkan strategi komputasi untuk mengeksplorasi pohon sintaksis yang tersirat dalam teks program. Sintaks / parse tree ini dapat atau tidak dapat dieksplorasi dalam proses, tergantung pada strategi kompilasi (jumlah tahapan). Apa yang diperlukan adalah bahwa pada akhirnya ada setidaknya satu eksplorasi bottom-up dari pohon parse, baik yang dieksplisit atau dibiarkan tersirat dalam struktur perhitungan.
Alasan untuk itu, secara intuitif, adalah bahwa cara formal standar untuk mendefinisikan semantik yang terkait dengan struktur pohon sintaksis adalah melalui apa yang disebut homomorfisme. Jangan takut kata besar. Idenya adalah hanya untuk mempertimbangkan makna keseluruhan dibangun dari makna bagian-bagian, atas dasar operator yang menghubungkan mereka
Misalnya, kalimatnya the dog bites the cat
bisa dianalisis dengan aturan sentence -> subject verb complement
. Mengetahui makna dari ketiga sub pohon subject
,, verb
dan complement
, aturan yang menyusunnya memberi tahu kita bahwa subjek sedang melakukan tindakan, dan bahwa kucinglah yang digigit.
Ini hanya penjelasan intuitif, tetapi bisa diformalkan. Semantik dibangun ke atas dari konstituen. Tapi ini menyembunyikan banyak kerumitan.
Kerja internal kompiler dapat didekomposisi menjadi beberapa tahap. Kompiler yang sebenarnya dapat bekerja tahap demi tahap, menggunakan representasi perantara. Mungkin juga menggabungkan beberapa tahapan. Ini tergantung pada teknologi yang digunakan dan pada kerumitan kompilasi bahasa yang ada.