โดยสังเขป
ภาษาการเขียนโปรแกรมประกอบด้วยไวยากรณ์ที่แสดงถึงโปรแกรมเป็นสตริงของตัวอักษรและความหมายที่เป็นความหมายที่ตั้งใจไว้ของโปรแกรม
ภาษาทางการเป็นไวยากรณ์โดยไม่มีความหมาย มันมีวัตถุประสงค์เพื่อศึกษาโครงสร้างของชุดของสตริงที่กำหนดไว้อย่างเป็นทางการโดยไม่ต้องแนบความหมายกับสตริงเหล่านั้น
การแสดงออกปกติและพิธีการอื่น ๆ (เช่นไวยากรณ์ฟรีบริบท) ใช้เพื่อกำหนดภาษาที่เป็นทางการใช้เป็นองค์ประกอบทางไวยากรณ์ของการเขียนโปรแกรมและภาษาธรรมชาติคือการแสดงประโยคในลักษณะที่มีโครงสร้าง กลไกอื่น ๆ ถูกใช้เพื่อเชื่อมโยงโครงสร้างนั้นกับซีแมนทิกส์ของภาษาโปรแกรม
ที่นี่ง่ายมากโดยเฉพาะอย่างยิ่งเกี่ยวกับภาษาธรรมชาติ
พร้อมรายละเอียดที่มากขึ้น
เพื่อตอบคำถามของคุณเราควรเริ่มจากจุดเริ่มต้น ภาษาในความหมายปกติคือทางการหมายถึงสื่อข้อมูลหรือความคิด ในภาษาหนึ่งมักจะแยกความแตกต่างระหว่างไวยากรณ์และความหมาย ความหมายคือสิ่งที่คุณต้องการพูดคุย / เขียนเกี่ยวกับ ข้อมูลที่คุณต้องการสื่อ ไวยากรณ์คือวิธีที่คุณใช้สื่อความหมายเช่นการแสดงแบบดั้งเดิมที่สามารถแลกเปลี่ยนระหว่างผู้คนและตอนนี้ก็ระหว่างผู้คนกับอุปกรณ์หรือระหว่างอุปกรณ์ (คอมพิวเตอร์)
โดยปกติแล้วคุณจะใช้คำว่าdog
สื่อความคิดของสุนัข คำdog
นี้ประกอบด้วยสามตัวอักษรหรือเสียงที่เท่ากันและมีวัตถุประสงค์เพื่อเป็นตัวแทนของสัตว์บางชนิด แนวคิดหลักคือการสื่อสารจะกระทำผ่านการเป็นตัวแทนของสิ่งที่จะสื่อสาร โครงสร้างการเป็นตัวแทนมักจะเรียกว่าซินแท็กซ์ สิ่งนี้จะมากหรือน้อยสำหรับภาษาธรรมชาติเช่นเดียวกับภาษาโปรแกรม
คำเป็นหน่วยงานเชิงวากยสัมพันธ์เพื่อเป็นตัวแทนของแนวคิดเชิงความหมายระดับต้น ๆ แต่แนวคิดพื้นฐานเหล่านี้จะต้องมีการรวมกันในหลากหลายวิธีเพื่อให้ความหมายที่ซับซ้อนมากขึ้น เราเขียน
the dog
เพื่อสื่อว่าเราหมายถึงสุนัขที่เฉพาะเจาะจงและthe dog bites the cat
เพื่อถ่ายทอดความคิดที่ซับซ้อนมากขึ้น แต่วิธีการจัดระเบียบจะต้องได้รับการแก้ไขตามกฎเพื่อให้เราสามารถบอกได้ว่าสุนัขตัวใดและแมวตัวใดกัดตัวจริง
ดังนั้นเราจึงมีกฎเช่นsentence -> subject verb complement
ที่ควรจะจับคู่ประโยคและบอกเราว่าความคิดที่เกี่ยวข้องกับแต่ละส่วนนั้นมีความชัดเจน กฎเหล่านี้เป็นกฎเกี่ยวกับวากยสัมพันธ์เนื่องจากพวกเขาบอกเราว่าจะจัดระเบียบข้อความของเราอย่างไร subject
ตัวเองสามารถกำหนดโดยกฎsubject -> article noun
และอื่น ๆ
เช่นเดียวกับในวิชาคณิตศาสตร์ คุณมีนิพจน์ทางคณิตศาสตร์ที่เขียนด้วยไวยากรณ์ที่เป็นทางการมาก และความหมายของการแสดงออกสามารถทำได้โดยการวิเคราะห์โครงสร้างประโยค ตัวอย่างเช่น
2 x + 1 = 23x123
equation -> expression "=" expression
expression -> expression "+" expression
expression -> number
โครงสร้างของภาษาโปรแกรมเหมือนกัน ภาษาการเขียนโปรแกรมมีความหมายเฉพาะทางในการแสดงการคำนวณที่จะดำเนินการแทนที่จะแสดงปัญหาที่ต้องแก้ไขหลักฐานของทฤษฎีบทหรือความสัมพันธ์ฉันมิตรระหว่างสัตว์ แต่นั่นคือความแตกต่างหลัก
การแทนค่าที่ใช้ในไวยากรณ์มักเป็นชุดอักขระหรือเสียงสำหรับภาษาที่พูด ความหมายมักอยู่ในโดเมนนามธรรมหรืออาจเป็นจริง แต่ก็ยังคงมีนามธรรมในกระบวนการคิดของเราหรือโดเมนพฤติกรรมของอุปกรณ์ การสื่อสารก่อให้เกิดการเข้ารหัสข้อมูล / ความคิดเป็นไวยากรณ์ซึ่งถูกส่งและถอดรหัสโดยผู้รับ ผลลัพธ์จะถูกตีความโดยวิธีใดก็ตามโดยผู้รับ
ดังนั้นสิ่งที่เราเห็นในภาษาส่วนใหญ่คือไวยากรณ์และโครงสร้าง ตัวอย่างข้างต้นเป็นเพียงหนึ่งในวิธีที่พบได้บ่อยที่สุดในการกำหนดสตริงของวากยสัมพันธ์และโครงสร้างองค์กร มีคนอื่น ๆ สำหรับภาษาที่กำหนดสตริงบางตัวสามารถกำหนดโครงสร้างและบอกว่าเป็นของภาษาในขณะที่คนอื่นไม่ได้
เช่นเดียวกับคำพูด ลำดับตัวอักษร (หรือเสียง) บางคำเป็นคำที่ถูกต้องตามกฎหมาย
ภาษาที่เป็นทางการเป็นเพียงไวยากรณ์โดยไม่มีความหมาย พวกเขากำหนดด้วยชุดของกฎสิ่งที่สามารถสร้างลำดับโดยใช้องค์ประกอบพื้นฐานของตัวอักษร สิ่งที่กฎสามารถเปลี่ยนแปลงได้มากบางครั้งซับซ้อน แต่ภาษาทางการใช้เพื่อจุดประสงค์ทางคณิตศาสตร์มากมายนอกเหนือจากการสื่อสารทางภาษาไม่ว่าจะเป็นภาษาธรรมชาติของการเขียนโปรแกรมก็ตาม ชุดของกฎที่กำหนดสตริงในภาษาเรียกว่าไวยากรณ์ แต่มีวิธีอื่น ๆ ในการกำหนดภาษา
ในทางปฏิบัติภาษามีโครงสร้างในสองระดับ ระดับคำศัพท์กำหนดคำที่สร้างขึ้นจากตัวอักษรของตัวละคร ระดับวากยสัมพันธ์กำหนดประโยคหรือโปรแกรมที่สร้างขึ้นจากตัวอักษรของคำ (หรือมากกว่าอย่างแม่นยำของครอบครัวคำเพื่อที่จะยังคงเป็นตัวอักษรที่ จำกัด ) สิ่งนี้ค่อนข้างง่าย
โครงสร้างของคำค่อนข้างง่ายในภาษาส่วนใหญ่ (การเขียนโปรแกรมหรือธรรมชาติ) เพื่อให้พวกเขามักจะกำหนดด้วยสิ่งที่มักจะถือว่าเป็นภาษาที่ง่ายที่สุด: ภาษาปกติ สามารถกำหนดด้วยนิพจน์ทั่วไป (regexp) และสามารถระบุได้ง่ายด้วยอุปกรณ์ที่ตั้งโปรแกรมเรียกว่าสถานะออโตมาตา จำกัด ในกรณีของภาษาโปรแกรมตัวอย่างของคำคือตัวระบุจำนวนเต็มสตริงจำนวนจริงคำสงวนเช่นif
หรือrepeat
สัญลักษณ์เครื่องหมายวรรคตอนหรือเครื่องหมายวงเล็บเปิด ตัวอย่างของคำตระกูลคือตัวระบุสตริงจำนวนเต็ม
ระดับไวยากรณ์มักจะถูกกำหนดโดยภาษาทางการที่ซับซ้อนกว่าเล็กน้อย: ภาษาที่ไม่มีบริบทใช้คำเป็นตัวอักษร กฎที่เราได้เห็นข้างต้นเป็นกฎที่ไม่มีบริบทสำหรับภาษาธรรมชาติ ในกรณีของกฎการเขียนโปรแกรมภาษาสามารถ:
statement -> assignment
statement -> loop
loop -> "while" expression "do" statement
assignment -> "identifier" "=" expression
expression -> "identifier"
expression -> "integer"
expression -> expression "operator" expression
ด้วยกฎดังกล่าวคุณสามารถเขียน:
while aaa /= bbb do aaa = aaa + bbb / 6
ซึ่งเป็นคำสั่ง
และวิธีการผลิตสามารถแสดงโดยโครงสร้างต้นไม้ที่เรียกว่าต้นไม้แยกหรือต้นไม้ไวยากรณ์ (ไม่สมบูรณ์ที่นี่):
statement
|
_______________ loop _______________
/ / \ \
"while" expression "do" statement
__________|_________ |
/ | \ assignment
expression "operator" expression _______|_______
| | | / | \
"identifier" "/=" "identifier" "identifier" "=" expression
| | | |
aaa bbb aaa ... ...
ชื่อที่ปรากฏทางด้านซ้ายของกฎจะเรียกว่าไม่ใช่เทอร์มินัลในขณะที่คำนั้นเรียกว่าเทอร์มินัลเนื่องจากเป็นตัวอักษรสำหรับภาษา (เหนือระดับศัพท์) ไม่ใช่เทอร์มินัลแสดงถึงโครงสร้างของวากยสัมพันธ์ต่าง ๆ ซึ่งสามารถใช้ในการเขียนโปรแกรม
กฎดังกล่าวเรียกว่าไม่มีบริบทเนื่องจากไม่มีเทอร์มินัลสามารถถูกแทนที่โดยพลการโดยใช้กฎที่เกี่ยวข้องใด ๆ โดยไม่ขึ้นอยู่กับบริบทที่ปรากฏ ชุดของกฎที่กำหนดภาษานั้นเรียกว่าไวยากรณ์ที่ไม่มีบริบท
จริงๆแล้วมีข้อ จำกัด ในเรื่องนั้นเมื่อต้องระบุตัวระบุก่อนหรือเมื่อนิพจน์ต้องเป็นไปตามข้อ จำกัด ประเภท แต่ข้อ จำกัด ดังกล่าวอาจถือว่าเป็นความหมายมากกว่าการสร้างประโยค ที่จริงผู้เชี่ยวชาญบางวางไว้ในสิ่งที่พวกเขาเรียก
ความหมายแบบคงที่
เมื่อพิจารณาถึงประโยคใด ๆ โปรแกรมใด ๆ ความหมายของประโยคนั้นจะถูกแยกออกมาโดยการวิเคราะห์โครงสร้างที่กำหนดโดยแผนผังการแยกสำหรับประโยคนี้ ดังนั้นจึงเป็นสิ่งสำคัญมากในการพัฒนาอัลกอริทึมที่เรียกว่า parsers ที่สามารถกู้คืนโครงสร้างทรีที่สอดคล้องกับโปรแกรมเมื่อได้รับโปรแกรม
ตัวแยกวิเคราะห์นำหน้าโดยตัววิเคราะห์คำที่จดจำคำและกำหนดตระกูลที่พวกมันเป็นเจ้าของ จากนั้นลำดับของคำหรือองค์ประกอบคำศัพท์จะถูกมอบให้กับ parser ที่ดึงโครงสร้างต้นไม้ต้นแบบ จากโครงสร้างนี้คอมไพเลอร์สามารถกำหนดวิธีการสร้างรหัสซึ่งส่วน semantic ของเขาในการประมวลผลโปรแกรมด้านคอมไพเลอร์
parser ของคอมไพเลอร์สามารถสร้างโครงสร้างข้อมูลที่สอดคล้องกับ parse-tree และส่งไปยังขั้นตอนต่อไปของกระบวนการรวบรวม แต่มันไม่จำเป็นต้อง การรันจำนวนอัลกอริธึมการแยกวิเคราะห์เพื่อพัฒนากลยุทธ์การคำนวณเพื่อสำรวจโครงสร้างไวยากรณ์ที่อยู่ในข้อความของโปรแกรม แผนผังไวยากรณ์ / การแยกวิเคราะห์นี้อาจหรืออาจไม่สามารถอธิบายได้ในกระบวนการขึ้นอยู่กับกลยุทธ์การรวบรวม (จำนวนขั้นตอน) สิ่งที่จำเป็นคือแม้ว่าท้ายที่สุดแล้วจะมีการสำรวจล่างขึ้นบนอย่างน้อยหนึ่งครั้งของการแยกวิเคราะห์ต้นไม้ไม่ว่าจะเป็นการสำรวจหรือการบอกเป็นนัยในโครงสร้างการคำนวณ
เหตุผลที่ว่าโดยสังหรณ์ใจคือวิธีมาตรฐานอย่างเป็นทางการในการกำหนดความหมายที่เกี่ยวข้องกับโครงสร้างต้นไม้ทางวากยสัมพันธ์คือสิ่งที่เรียกว่าโฮโมมอร์ฟิซึม อย่ากลัวคำใหญ่ ความคิดนี้เป็นเพียงการพิจารณาความหมายของทั้งหมดนั้นถูกสร้างขึ้นจากความหมายของชิ้นส่วนบนพื้นฐานของผู้ประกอบการที่เชื่อมต่อพวกเขา
ตัวอย่างประโยคสามารถวิเคราะห์ได้ด้วยกฎthe dog bites the cat
sentence -> subject verb complement
รู้ความหมายของ 3 subtrees subject
, verb
และcomplement
กฎที่ประกอบด้วยพวกเขาบอกเราว่าเรื่องที่จะทำดำเนินการและว่าแมวเป็นหนึ่งในผู้ที่ถูกกัด
นี่เป็นเพียงคำอธิบายที่เข้าใจง่าย แต่สามารถทำเป็นระเบียบได้ ความหมายถูกสร้างขึ้นจากองค์ประกอบ แต่สิ่งนี้ซ่อนความซับซ้อนไว้มากมาย
การทำงานภายในของคอมไพเลอร์สามารถแบ่งออกเป็นหลายขั้นตอน คอมไพเลอร์จริงอาจทำงานทีละขั้นตอนโดยใช้การเป็นตัวแทนระดับกลาง นอกจากนี้ยังอาจรวมบางขั้นตอน ขึ้นอยู่กับเทคโนโลยีที่ใช้และความซับซ้อนของการรวบรวมภาษาในมือ