อะไรคือความแตกต่างระหว่างวากยสัมพันธ์และความหมายในภาษาโปรแกรม (เช่น C, C ++)?
อะไรคือความแตกต่างระหว่างวากยสัมพันธ์และความหมายในภาษาโปรแกรม (เช่น C, C ++)?
คำตอบ:
ไวยากรณ์เป็นเรื่องเกี่ยวกับโครงสร้างหรือไวยากรณ์ของภาษา ตอบคำถาม: ฉันจะสร้างประโยคที่ถูกต้องได้อย่างไร? ทุกภาษาแม้แต่ภาษาอังกฤษและภาษาอื่น ๆ ของมนุษย์ (หรือที่เรียกว่า "ธรรมชาติ") ก็มีไวยากรณ์กล่าวคือกฎเกณฑ์ที่กำหนดว่าประโยคนั้นถูกสร้างขึ้นอย่างถูกต้องหรือไม่
กฎไวยากรณ์ภาษาซีมีดังนี้
ความหมายเป็นเรื่องเกี่ยวกับความหมายของประโยค ตอบคำถาม: ประโยคนี้ใช้ได้หรือไม่? ถ้าเป็นเช่นนั้นประโยคนี้มีความหมายว่าอย่างไร? ตัวอย่างเช่น:
x++; // increment
foo(xyz, --b, &qrs); // call foo
เป็นคำสั่ง C ที่ถูกต้องตามหลักไวยากรณ์ แต่หมายความว่าอย่างไร? มันถูกต้องหรือไม่ที่จะพยายามแปลงคำสั่งเหล่านี้ให้เป็นลำดับคำสั่งที่ปฏิบัติการได้? คำถามเหล่านี้เป็นหัวใจสำคัญของความหมาย
พิจารณาตัวดำเนินการ ++ ในคำสั่งแรก ก่อนอื่นการลองทำเช่นนี้ถูกต้องหรือไม่?
สุดท้ายโปรดทราบว่าความหมายบางอย่างไม่สามารถกำหนดได้ในเวลาคอมไพล์ดังนั้นจึงต้องได้รับการประเมิน ณ รันไทม์ ในตัวอย่างโอเปอเรเตอร์ ++ หาก x อยู่ที่ค่าสูงสุดสำหรับชนิดข้อมูลแล้วจะเกิดอะไรขึ้นเมื่อคุณพยายามเพิ่ม 1 เข้าไป อีกตัวอย่างหนึ่ง: จะเกิดอะไรขึ้นถ้าโปรแกรมของคุณพยายามหักล้างตัวชี้ที่มีค่าเป็น NULL
โดยสรุปแล้ววากยสัมพันธ์คือแนวคิดที่เกี่ยวข้องกับตัวเองว่าประโยคนั้นใช้ได้กับไวยากรณ์ของภาษาหรือไม่ ความหมายเกี่ยวกับว่าประโยคนั้นมีความหมายที่ถูกต้องหรือไม่
x
อยู่ที่ค่าสูงสุดสำหรับข้อมูลและ1
ถูกเพิ่มเข้าไปมันจะส่งผลให้เกิดผลลัพธ์แปลก ๆ ( 0
) มันไม่ใช่ข้อผิดพลาดทางความหมายหรือ?
UINT_MAX + 1 == 0
) ไม่ได้กำหนดการล้นลงนาม คอมไพเลอร์โมเดิร์นมักจะมีINT_MAX + 1 == INT_MIN
แต่มีกรณีที่คุณไม่สามารถนับบนนี้ (เช่นfor (i = 0; i <= N; ++i) { ... }
ที่N
เป็นINT_MAX
ไม่ได้ไม่มีที่สิ้นสุดขึ้นอยู่กับการเพิ่มประสิทธิภาพดูblog.llvm.org/2011/05/what-every-c-programmer-should-know html )
วากยสัมพันธ์หมายถึงโครงสร้างของภาษาโดยอ้างอิงนิรุกติศาสตร์ว่าสิ่งต่างๆรวมกันอย่างไร
ตัวอย่างเช่นคุณอาจกำหนดให้รวมรหัสโดยการประกาศประเภทจากนั้นชื่อและอัฒภาคเพื่อให้ถูกต้องตามหลักไวยากรณ์
Type token;
ในทางกลับกันความหมายเป็นเรื่องเกี่ยวกับความหมาย คอมไพเลอร์หรือล่ามสามารถบ่นเกี่ยวกับข้อผิดพลาดทางไวยากรณ์ เพื่อนร่วมงานของคุณจะบ่นเกี่ยวกับความหมาย
Wikipedia มีคำตอบ อ่านไวยากรณ์ (ภาษาโปรแกรม)และความหมาย (วิทยาการคอมพิวเตอร์) wikipages
หรือคิดเกี่ยวกับการทำงานของใด ๆคอมไพเลอร์หรือล่าม ขั้นตอนแรกคือการวิเคราะห์คำศัพท์ ที่โทเค็นถูกสร้างขึ้นโดยการแบ่งสตริงออกคำศัพท์จากนั้นจึงแยกวิเคราะห์ซึ่งสร้างโครงสร้างไวยากรณ์ที่เป็นนามธรรม (ซึ่งเป็นตัวแทนของไวยากรณ์) ขั้นตอนต่อไปเกี่ยวข้องกับการเปลี่ยนหรือประเมิน AST (ความหมาย) เหล่านี้
นอกจากนี้ยังสังเกตว่าถ้าคุณกำหนดตัวแปรของ C ที่คำหลักทุกคำก็กลายเป็นเทียบเท่าของฝรั่งเศส (เพื่อให้if
กลายเป็นsi
, do
กลายเป็นfaire
, else
กลายเป็นsinon
ฯลฯ ฯลฯ ... ) แน่นอนคุณจะเปลี่ยนไวยากรณ์ของภาษาของคุณ แต่คุณจะไม่เปลี่ยนแปลงมากนัก ความหมาย: การเขียนโปรแกรมใน French-C นั้นจะไม่ง่ายกว่านี้!
ความหมายคือความหมายของรหัสของคุณ - สิ่งที่คุณอาจอธิบายในรหัสหลอก ไวยากรณ์คือโครงสร้างที่แท้จริง - ทุกอย่างตั้งแต่ชื่อตัวแปรไปจนถึงเซมิโคลอน
ไวยากรณ์คือโครงสร้างหรือรูปแบบของนิพจน์งบและหน่วยโปรแกรม แต่ความหมายคือความหมายของนิพจน์งบและหน่วยโปรแกรมเหล่านั้น ความหมายเป็นไปตามโดยตรงจากไวยากรณ์ ไวยากรณ์หมายถึงโครงสร้าง / รูปแบบของรหัสที่ภาษาโปรแกรมเฉพาะระบุ แต่ความหมายจัดการกับความหมายที่กำหนดให้กับสัญลักษณ์อักขระและคำ
ไวยากรณ์ของภาษาการเขียนโปรแกรมเป็นรูปแบบของการแสดงออกงบและหน่วยโปรแกรมของตน ใช้ความหมายคือความหมายของการแสดงออกเหล่านั้นงบและหน่วยโปรแกรม ตัวอย่างเช่นไวยากรณ์ของคำสั่ง Java while คือ
while (boolean_expr) statement
ความหมายของรูปแบบคำสั่งนี้คือเมื่อค่าปัจจุบันของนิพจน์บูลีนเป็นจริงคำสั่งฝังตัวจะถูกดำเนินการ จากนั้นการควบคุมโดยปริยายจะกลับไปที่นิพจน์บูลีนเพื่อทำซ้ำกระบวนการ ถ้านิพจน์บูลีนเป็นเท็จคอนโทรลจะโอนไปยังคำสั่งที่ตามมาด้วยโครงสร้าง while
ไวยากรณ์: หมายถึงโครงสร้างทางไวยากรณ์ของภาษา .. หากคุณกำลังเขียนภาษาซี คุณต้องระมัดระวังในการใช้ประเภทข้อมูลโทเค็น [อาจเป็นตัวอักษรหรือสัญลักษณ์เช่น "printf ()" มี 3 tokes "printf, (,)"] ในทำนองเดียวกันคุณต้องระมัดระวังวิธีที่คุณใช้ฟังก์ชันไวยากรณ์ของฟังก์ชันการประกาศฟังก์ชันนิยามการเริ่มต้นและการเรียกใช้
ในขณะที่ความหมายมันเกี่ยวข้องกับตรรกะหรือแนวคิดของประโยคหรือข้อความ หากคุณพูดหรือเขียนอะไรบางอย่างออกไปจากแนวคิดหรือตรรกะแสดงว่าคุณมีความหมายผิด
โดยปกติการวิเคราะห์ไวยากรณ์และความหมายของโค้ดจะทำในส่วน "ส่วนหน้า" ของคอมไพเลอร์
ไวยากรณ์: คอมไพเลอร์สร้างโทเค็นสำหรับแต่ละคีย์เวิร์ดและสัญลักษณ์: โทเค็นมีข้อมูล - ประเภทของคีย์เวิร์ดและตำแหน่งของคีย์เวิร์ดในโค้ด การใช้โทเค็นเหล่านี้ AST (ย่อมาจาก Abstract Syntax Tree) จะถูกสร้างและวิเคราะห์ สิ่งที่คอมไพเลอร์ตรวจสอบที่นี่คือโค้ดมีความหมายเชิงศัพท์หรือไม่กล่าวคือ 'ลำดับของคีย์เวิร์ด' เป็นไปตามกฎของภาษาหรือไม่? ตามที่แนะนำไว้ในคำตอบก่อนหน้านี้คุณจะเห็นว่าเป็นไวยากรณ์ของภาษา (ไม่ใช่ความหมาย / ความหมายของรหัส) หมายเหตุด้านข้าง: มีการรายงานข้อผิดพลาดทางไวยากรณ์ในระยะนี้ (ส่งคืนโทเค็นที่มีประเภทข้อผิดพลาดไปยังระบบ)
ความหมาย: ตอนนี้คอมไพเลอร์จะตรวจสอบว่าการดำเนินการโค้ดของคุณ 'เหมาะสม' หรือไม่ เช่นหากภาษารองรับ Type Inference จะมีการรายงานข้อผิดพลาดเซมาติกหากคุณพยายามกำหนดสตริงให้เป็นทศนิยม หรือประกาศตัวแปรเดียวกันสองครั้ง ข้อผิดพลาดเหล่านี้เป็นข้อผิดพลาดที่ 'ถูกต้องตามหลักไวยากรณ์' แต่ไม่สมเหตุสมผลในระหว่างการดำเนินการ หมายเหตุด้านข้าง: สำหรับการตรวจสอบว่ามีการประกาศตัวแปรเดียวกันสองครั้งหรือไม่คอมไพเลอร์จะจัดการตารางสัญลักษณ์
ดังนั้นผลลัพธ์ของ 2 เฟสส่วนหน้านี้คือ AST ที่มีคำอธิบายประกอบ (พร้อมชนิดข้อมูล) และตารางสัญลักษณ์
พิจารณาภาษาปกติที่เราใช้ ที่นี่ภาษาอังกฤษ:
เช่นเขาไปโรงเรียน - ไวยากรณ์ / ไวยากรณ์ไม่ถูกต้องแม้ว่าเขาต้องการสื่อถึงความรู้สึก / ความหมายที่ถูกต้อง
เช่นเขาไปที่เย็น - เย็นเป็นคำคุณศัพท์ ในภาษาอังกฤษเราอาจพูดได้ว่าสิ่งนี้ไม่สอดคล้องกับไวยากรณ์ แต่จริงๆแล้วมันเป็นตัวอย่างที่ใกล้เคียงที่สุดกับความหมายที่ไม่ถูกต้องกับไวยากรณ์ที่ถูกต้องที่ฉันคิดได้