อะไรคือความแตกต่างระหว่างวากยสัมพันธ์และความหมายในภาษาโปรแกรม?


121

อะไรคือความแตกต่างระหว่างวากยสัมพันธ์และความหมายในภาษาโปรแกรม (เช่น C, C ++)?


2
ฉันต้องการโหวต แต่ไม่มีความพยายามในการวิจัยที่ชัดเจน
null

คำตอบ:


202

ไวยากรณ์เป็นเรื่องเกี่ยวกับโครงสร้างหรือไวยากรณ์ของภาษา ตอบคำถาม: ฉันจะสร้างประโยคที่ถูกต้องได้อย่างไร? ทุกภาษาแม้แต่ภาษาอังกฤษและภาษาอื่น ๆ ของมนุษย์ (หรือที่เรียกว่า "ธรรมชาติ") ก็มีไวยากรณ์กล่าวคือกฎเกณฑ์ที่กำหนดว่าประโยคนั้นถูกสร้างขึ้นอย่างถูกต้องหรือไม่

กฎไวยากรณ์ภาษาซีมีดังนี้

  • แยกคำสั่งที่มีเครื่องหมายอัฒภาค
  • ใส่นิพจน์เงื่อนไขของคำสั่ง IF ไว้ในวงเล็บ
  • จัดกลุ่มคำสั่งหลาย ๆ คำสั่งให้เป็นคำสั่งเดียวโดยใส่วงเล็บปีกกา
  • ต้องประกาศชนิดข้อมูลและตัวแปรก่อนคำสั่งปฏิบัติการแรก (คุณลักษณะนี้ถูกทิ้งใน C99 C99 และหลังอนุญาตให้ประกาศประเภทผสม)

ความหมายเป็นเรื่องเกี่ยวกับความหมายของประโยค ตอบคำถาม: ประโยคนี้ใช้ได้หรือไม่? ถ้าเป็นเช่นนั้นประโยคนี้มีความหมายว่าอย่างไร? ตัวอย่างเช่น:

x++;                  // increment
foo(xyz, --b, &qrs);  // call foo

เป็นคำสั่ง C ที่ถูกต้องตามหลักไวยากรณ์ แต่หมายความว่าอย่างไร? มันถูกต้องหรือไม่ที่จะพยายามแปลงคำสั่งเหล่านี้ให้เป็นลำดับคำสั่งที่ปฏิบัติการได้? คำถามเหล่านี้เป็นหัวใจสำคัญของความหมาย

พิจารณาตัวดำเนินการ ++ ในคำสั่งแรก ก่อนอื่นการลองทำเช่นนี้ถูกต้องหรือไม่?

  • ถ้า x เป็นชนิดข้อมูลลอยคำสั่งนี้จะไม่มีความหมาย (ตามกฎของภาษาซี) ดังนั้นจึงเป็นข้อผิดพลาดแม้ว่าคำสั่งนั้นจะถูกต้องตามหลักไวยากรณ์
  • ถ้า x เป็นตัวชี้ไปยังข้อมูลบางประเภทความหมายของคำสั่งคือ "เพิ่ม sizeof ( ข้อมูลบางประเภท ) ให้กับค่าที่แอดเดรส x และเก็บผลลัพธ์ไว้ในตำแหน่งที่แอดเดรส x"
  • ถ้า x เป็นสเกลาร์ความหมายของคำสั่งคือ "เพิ่มหนึ่งในค่าที่แอดเดรส x และเก็บผลลัพธ์ไว้ในตำแหน่งที่แอดเดรส x"

สุดท้ายโปรดทราบว่าความหมายบางอย่างไม่สามารถกำหนดได้ในเวลาคอมไพล์ดังนั้นจึงต้องได้รับการประเมิน ณ รันไทม์ ในตัวอย่างโอเปอเรเตอร์ ++ หาก x อยู่ที่ค่าสูงสุดสำหรับชนิดข้อมูลแล้วจะเกิดอะไรขึ้นเมื่อคุณพยายามเพิ่ม 1 เข้าไป อีกตัวอย่างหนึ่ง: จะเกิดอะไรขึ้นถ้าโปรแกรมของคุณพยายามหักล้างตัวชี้ที่มีค่าเป็น NULL

โดยสรุปแล้ววากยสัมพันธ์คือแนวคิดที่เกี่ยวข้องกับตัวเองว่าประโยคนั้นใช้ได้กับไวยากรณ์ของภาษาหรือไม่ ความหมายเกี่ยวกับว่าประโยคนั้นมีความหมายที่ถูกต้องหรือไม่


ตกลง. ถ้าxอยู่ที่ค่าสูงสุดสำหรับข้อมูลและ1ถูกเพิ่มเข้าไปมันจะส่งผลให้เกิดผลลัพธ์แปลก ๆ ( 0) มันไม่ใช่ข้อผิดพลาดทางความหมายหรือ?
haccks

พิจารณามาตรวัดระยะทางในยานพาหนะ - มีชุดล้อที่สัมพันธ์กันโดยมีตัวเลข 0 ถึง 9 พิมพ์อยู่บนแต่ละล้อ ล้อขวาสุดหมุนเร็วที่สุด เมื่อพันจาก 9 กลับเป็นศูนย์ล้อไปทางซ้ายจะเลื่อนไปทีละข้าง เมื่อวงล้อนี้เลื่อนจาก 9 เป็น 0 ล้อไปทางซ้ายจะเลื่อนไปเรื่อย ๆ
Jeff N

ประเภทข้อมูลเปรียบเสมือนวงล้อของเครื่องวัดระยะทาง: สามารถรองรับค่าได้สูงสุดเท่านั้น เมื่อถึงค่าสูงสุดการเลื่อนครั้งถัดไปจะทำให้ล้อกลับสู่ศูนย์ ข้อผิดพลาดนี้จะขึ้นอยู่กับกฎของภาษาหรือไม่ ในกรณีนี้คุณต้องอ้างอิงกลับไปที่มาตรฐานภาษาซี ฉันไม่รู้ว่ามาตรฐานภาษาซีพูดว่าอย่างไร แต่นี่คือตัวเลือกบางส่วน Overflow คือ: - ไม่ใช่ข้อผิดพลาด ผลลัพธ์คือศูนย์ - ข้อผิดพลาด; คอมไพเลอร์ต้องสร้างข้อยกเว้นล้น -UNDEFINED; คอมไพเลอร์มีอิสระที่จะทำทุกอย่างที่ต้องการ
Jeff N

2
ในกรณีที่มีใครสนใจเกี่ยวกับตัวอย่างที่เฉพาะเจาะจงการโอเวอร์โฟลว์ที่ไม่ได้ลงชื่อถูกกำหนดให้เป็นเลขคณิตแบบแยกส่วน (ดังนั้น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 )
Daniel H

"โปรดทราบว่าความหมายบางอย่างไม่สามารถกำหนดได้ในเวลาคอมไพล์ดังนั้นจึงต้องได้รับการประเมิน ณ รันไทม์" - ฉันชอบวิธีการนี้ควบคู่ไปกับภาษาธรรมชาติ คุณไม่สามารถรู้ความหมายของวลีบางคำหากไม่มีบริบท ตัวอย่างเช่นในวลี "เขาชอบกล้วย" ความหมายของ "เขา" ขึ้นอยู่กับบริบท
ymln

22

วากยสัมพันธ์หมายถึงโครงสร้างของภาษาโดยอ้างอิงนิรุกติศาสตร์ว่าสิ่งต่างๆรวมกันอย่างไร
ตัวอย่างเช่นคุณอาจกำหนดให้รวมรหัสโดยการประกาศประเภทจากนั้นชื่อและอัฒภาคเพื่อให้ถูกต้องตามหลักไวยากรณ์

Type token;

ในทางกลับกันความหมายเป็นเรื่องเกี่ยวกับความหมาย คอมไพเลอร์หรือล่ามสามารถบ่นเกี่ยวกับข้อผิดพลาดทางไวยากรณ์ เพื่อนร่วมงานของคุณจะบ่นเกี่ยวกับความหมาย


@Talespin_Kit มีความหมายมากกว่าโครงสร้าง: ตรรกะเป็นนามธรรมมากกว่าเช่น P => Q ฯลฯ หรือ !! P = P แต่เมื่อคุณเพิ่มความหมายสิ่งต่างๆอาจมีความละเอียดอ่อนถ้า P คือ "มีความสุข" ดังนั้น !! P คือ "ฉัน 'm not un-happy "! =" ดีใจจัง "
doctorlove

6
+1 สำหรับ "คอมไพเลอร์หรือล่ามอาจบ่นเกี่ยวกับข้อผิดพลาดทางไวยากรณ์เพื่อนร่วมงานของคุณจะบ่นเกี่ยวกับความหมาย"
GeekyJ

11

Wikipedia มีคำตอบ อ่านไวยากรณ์ (ภาษาโปรแกรม)และความหมาย (วิทยาการคอมพิวเตอร์) wikipages

หรือคิดเกี่ยวกับการทำงานของใด ๆคอมไพเลอร์หรือล่าม ขั้นตอนแรกคือการวิเคราะห์คำศัพท์ ที่โทเค็นถูกสร้างขึ้นโดยการแบ่งสตริงออกคำศัพท์จากนั้นจึงแยกวิเคราะห์ซึ่งสร้างโครงสร้างไวยากรณ์ที่เป็นนามธรรม (ซึ่งเป็นตัวแทนของไวยากรณ์) ขั้นตอนต่อไปเกี่ยวข้องกับการเปลี่ยนหรือประเมิน AST (ความหมาย) เหล่านี้

นอกจากนี้ยังสังเกตว่าถ้าคุณกำหนดตัวแปรของ C ที่คำหลักทุกคำก็กลายเป็นเทียบเท่าของฝรั่งเศส (เพื่อให้ifกลายเป็นsi, doกลายเป็นfaire, elseกลายเป็นsinonฯลฯ ฯลฯ ... ) แน่นอนคุณจะเปลี่ยนไวยากรณ์ของภาษาของคุณ แต่คุณจะไม่เปลี่ยนแปลงมากนัก ความหมาย: การเขียนโปรแกรมใน French-C นั้นจะไม่ง่ายกว่านี้!


9

ความหมายคือความหมายของรหัสของคุณ - สิ่งที่คุณอาจอธิบายในรหัสหลอก ไวยากรณ์คือโครงสร้างที่แท้จริง - ทุกอย่างตั้งแต่ชื่อตัวแปรไปจนถึงเซมิโคลอน


เป็นการสนทนาระหว่างคนที่แตกต่างกันหรือไม่? หรือเป็นแค่โพสต์เดียว? ฉันไม่เข้าใจ เช่น "ไม่รู้ว่าสิ่งต่อไปนี้ควรจะหมายถึงอะไรมันไม่ผิดไปกว่านี้แล้ว"
doubleOrt


5

ไวยากรณ์คือโครงสร้างหรือรูปแบบของนิพจน์งบและหน่วยโปรแกรม แต่ความหมายคือความหมายของนิพจน์งบและหน่วยโปรแกรมเหล่านั้น ความหมายเป็นไปตามโดยตรงจากไวยากรณ์ ไวยากรณ์หมายถึงโครงสร้าง / รูปแบบของรหัสที่ภาษาโปรแกรมเฉพาะระบุ แต่ความหมายจัดการกับความหมายที่กำหนดให้กับสัญลักษณ์อักขระและคำ


1

ไวยากรณ์ของภาษาการเขียนโปรแกรมเป็นรูปแบบของการแสดงออกงบและหน่วยโปรแกรมของตน ใช้ความหมายคือความหมายของการแสดงออกเหล่านั้นงบและหน่วยโปรแกรม ตัวอย่างเช่นไวยากรณ์ของคำสั่ง Java while คือ

while (boolean_expr) statement

ความหมายของรูปแบบคำสั่งนี้คือเมื่อค่าปัจจุบันของนิพจน์บูลีนเป็นจริงคำสั่งฝังตัวจะถูกดำเนินการ จากนั้นการควบคุมโดยปริยายจะกลับไปที่นิพจน์บูลีนเพื่อทำซ้ำกระบวนการ ถ้านิพจน์บูลีนเป็นเท็จคอนโทรลจะโอนไปยังคำสั่งที่ตามมาด้วยโครงสร้าง while


1

ไวยากรณ์: หมายถึงโครงสร้างทางไวยากรณ์ของภาษา .. หากคุณกำลังเขียนภาษาซี คุณต้องระมัดระวังในการใช้ประเภทข้อมูลโทเค็น [อาจเป็นตัวอักษรหรือสัญลักษณ์เช่น "printf ()" มี 3 tokes "printf, (,)"] ในทำนองเดียวกันคุณต้องระมัดระวังวิธีที่คุณใช้ฟังก์ชันไวยากรณ์ของฟังก์ชันการประกาศฟังก์ชันนิยามการเริ่มต้นและการเรียกใช้

ในขณะที่ความหมายมันเกี่ยวข้องกับตรรกะหรือแนวคิดของประโยคหรือข้อความ หากคุณพูดหรือเขียนอะไรบางอย่างออกไปจากแนวคิดหรือตรรกะแสดงว่าคุณมีความหมายผิด


1

ทำความเข้าใจว่าคอมไพลเลอร์มองเห็นโค้ดได้อย่างไร

โดยปกติการวิเคราะห์ไวยากรณ์และความหมายของโค้ดจะทำในส่วน "ส่วนหน้า" ของคอมไพเลอร์

  • ไวยากรณ์: คอมไพเลอร์สร้างโทเค็นสำหรับแต่ละคีย์เวิร์ดและสัญลักษณ์: โทเค็นมีข้อมูล - ประเภทของคีย์เวิร์ดและตำแหน่งของคีย์เวิร์ดในโค้ด การใช้โทเค็นเหล่านี้ AST (ย่อมาจาก Abstract Syntax Tree) จะถูกสร้างและวิเคราะห์ สิ่งที่คอมไพเลอร์ตรวจสอบที่นี่คือโค้ดมีความหมายเชิงศัพท์หรือไม่กล่าวคือ 'ลำดับของคีย์เวิร์ด' เป็นไปตามกฎของภาษาหรือไม่? ตามที่แนะนำไว้ในคำตอบก่อนหน้านี้คุณจะเห็นว่าเป็นไวยากรณ์ของภาษา (ไม่ใช่ความหมาย / ความหมายของรหัส) หมายเหตุด้านข้าง: มีการรายงานข้อผิดพลาดทางไวยากรณ์ในระยะนี้ (ส่งคืนโทเค็นที่มีประเภทข้อผิดพลาดไปยังระบบ)

  • ความหมาย: ตอนนี้คอมไพเลอร์จะตรวจสอบว่าการดำเนินการโค้ดของคุณ 'เหมาะสม' หรือไม่ เช่นหากภาษารองรับ Type Inference จะมีการรายงานข้อผิดพลาดเซมาติกหากคุณพยายามกำหนดสตริงให้เป็นทศนิยม หรือประกาศตัวแปรเดียวกันสองครั้ง ข้อผิดพลาดเหล่านี้เป็นข้อผิดพลาดที่ 'ถูกต้องตามหลักไวยากรณ์' แต่ไม่สมเหตุสมผลในระหว่างการดำเนินการ หมายเหตุด้านข้าง: สำหรับการตรวจสอบว่ามีการประกาศตัวแปรเดียวกันสองครั้งหรือไม่คอมไพเลอร์จะจัดการตารางสัญลักษณ์

ดังนั้นผลลัพธ์ของ 2 เฟสส่วนหน้านี้คือ AST ที่มีคำอธิบายประกอบ (พร้อมชนิดข้อมูล) และตารางสัญลักษณ์

ทำความเข้าใจด้วยวิธีการทางเทคนิคที่น้อยลง

พิจารณาภาษาปกติที่เราใช้ ที่นี่ภาษาอังกฤษ:

เช่นเขาไปโรงเรียน - ไวยากรณ์ / ไวยากรณ์ไม่ถูกต้องแม้ว่าเขาต้องการสื่อถึงความรู้สึก / ความหมายที่ถูกต้อง

เช่นเขาไปที่เย็น - เย็นเป็นคำคุณศัพท์ ในภาษาอังกฤษเราอาจพูดได้ว่าสิ่งนี้ไม่สอดคล้องกับไวยากรณ์ แต่จริงๆแล้วมันเป็นตัวอย่างที่ใกล้เคียงที่สุดกับความหมายที่ไม่ถูกต้องกับไวยากรณ์ที่ถูกต้องที่ฉันคิดได้


คอมไพเลอร์ ลิงค์นี้อาจเป็นประโยชน์ในการเรียนรู้เพิ่มเติม
Vedant Panchal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.