การวิเคราะห์ภาษาการเขียนโปรแกรม


10

ในSICPรัฐผู้เขียน ( ส่วน 1.1 ) ว่ามี "กลไก" พื้นฐานสามประการของภาษาโปรแกรม:

  • การแสดงออกดั้งเดิมซึ่งเป็นตัวแทนของหน่วยงานที่ง่ายที่สุดที่เกี่ยวข้องกับภาษา

  • หมายถึงการรวมกันโดยที่องค์ประกอบผสมถูกสร้างขึ้นจากคนที่เรียบง่าย

  • หมายถึงนามธรรมซึ่งองค์ประกอบสารประกอบสามารถตั้งชื่อและจัดการเป็นหน่วย

ฉันจะวิเคราะห์ภาษาโปรแกรมกระแสหลัก (ตัวอย่างเช่น Java) ในแง่ขององค์ประกอบหรือกลไกเหล่านี้ได้อย่างไร


คุณเคยดูในแบบฟอร์ม Extended Backus-Naur, EBNFหรือ Backus-Naur Form, BNFมาก่อนหรือไม่? มันสามารถทำลายไวยากรณ์ที่คล้ายกับแนวคิดทั้งสามนี้ได้ แต่ฉันไม่แน่ใจจริงๆว่าความตั้งใจของคุณคืออะไรฉันจึงไม่รู้ว่ามันจะช่วยหรือไม่
Jetti

@Jetti - ใช่ฉันมีและไม่ไม่ใช่สิ่งที่ฉันสนใจฉันกำลังมองหาการวิเคราะห์ความหมาย (คำถาม: นั่นคือคำที่ฉันกำลังมองหาใช่หรือไม่) ไม่ใช่ภาษาโปรแกรม รูปแบบที่เป็นลายลักษณ์อักษร (เช่นไวยากรณ์)

คำตอบ:


1

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

ตัวอย่างหนังสือเรียนของแนวคิดทั้งสามนี้คือแคลคูลัสแลมบ์ดาซึ่งมีหนึ่งในนั้น:

  • ตัวแปรx , y , …เป็นนิพจน์ดั้งเดิมเท่านั้น
  • ฟังก์ชันของแอปพลิเคชันMNเป็นวิธีการรวมกันอย่างหนึ่ง
  • แลมบ์ดา abstraction λx.Mเป็นวิธีการหนึ่งที่เป็นนามธรรม

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

ใน (โมเดลทั่วไปของ) Java นิพจน์ดั้งเดิมเป็นค่าคงที่และตัวแปรเป็นหลัก หมายถึงการรวมกันรวมถึงผู้ประกอบการจำนวนมาก; แม่นยำยิ่งขึ้น“ การแสดงออกที่เพิ่มขึ้น” เป็นวิธีการรวมกันกับสองช่อง (ด้านซ้ายและด้านขวา) หรือสามช่อง (ทั้งสองด้านบวกกับผู้ควบคุม) หากคุณรวมทั้งA + BและA - Bภายใต้ชื่อนั้น (ในกรณีนี้ผู้ประกอบการ+และ-จะเป็นโครงสร้างดั้งเดิมในสิทธิของตนเอง) วิธีการอื่น ๆ ของการรวมกัน ได้แก่ ลำดับของการสอนI ; J , การสร้างลูปwhile (…) {…}และอื่น ๆ จากนั้นคุณมีโครงสร้างเช่นประกาศตัวแปรคำจำกัดความของฟังก์ชั่นคำจำกัดความของชั้นเรียนและอื่น ๆ ซึ่งเป็นทั้งสองวิธีรวมกัน (พวกเขารวมชื่อพารามิเตอร์และประเภท, ร่างกาย, initializers, ... ) และวิธีการที่เป็นนามธรรม (เพราะพวกเขากำหนดชื่อ ในความเป็นจริงมันเป็นเรื่องธรรมดาที่หมายถึงการรวมกันเป็นนามธรรม: พวกเขารวมชื่อกับคำนิยาม


คำตอบที่ดี; คุณได้รับปัญหาที่ฉันต้องดิ้นรน - ความแตกต่างที่ไม่ชัดเจนระหว่างดึกดำบรรพ์ชุดค่าผสมและอื่น ๆ

"ตัวแปร" หมายความว่าอย่างไร ไม่สามารถอธิบายได้ว่าสิ่งเหล่านี้เป็นวิธีการที่เป็นนามธรรมเพราะมีชื่อหรือไม่?
morbidCode

@morbidCode แนวคิดของตัวแปรเป็นสิ่งที่ซับซ้อนและคำนั้นมีความหมายแตกต่างกัน แต่มีความหมายที่เกี่ยวข้องในแลมบ์ดาแคลคูลัสและใน Java ตัวแปรถือได้ว่าเป็น“ นามธรรม” เนื่องจากมันหมายถึงค่าที่ไม่ระบุ อย่างไรก็ตามมันไม่ได้เป็นวิธีการที่เป็นนามธรรม: มันไม่ได้สร้างการอ้างอิงมันเป็นเพียงวิธีการใช้นามธรรมที่มีอยู่ แลมบ์ดานามธรรมสร้างวิธีใช้บล็อกของรหัสเป็นวัตถุที่สามารถจัดการได้
Gilles 'SO- หยุดความชั่วร้าย'

4

แทงหยาบ:

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

ชุดค่าผสมจะรวมถึงการแสดงออกผสมคำสั่ง (ตัวแปร ?,) วิธีการกลไกการเรียนและแพคเกจ โมดูลเช่นกันเมื่อพวกเขาอยู่ในภาษา

ใน Java หมายถึงสิ่งที่ง่ายที่สุดของ abstraction คือคลาส: ไม่มีสิ่งใดอยู่นอกคลาส อาจมี "เลเยอร์" ของสิ่งที่เป็นนามธรรม: วิธีการแบบคงที่นั้นง่ายกว่าวิธีแบบอินสแตนซ์เนื่องจากมันไม่ต้องการอินสแตนซ์

Generics เสนอเลเยอร์เพิ่มเติมของสิ่งที่เป็นนามธรรม (และแห้ว)


@MattFenwick การแสดงออกอาจประกอบด้วยหนึ่งดั้งเดิมการรวมกันของดั้งเดิมและหน่วยงานอื่น ๆ ทำให้การแสดงออกผสม (ยังคงแสดงออก แต่ไม่ได้คำสั่ง)
Dave Newton

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

เกี่ยวกับคุณ: มีปัญหากับการใช้งานจาวาทั่วไปหรือไม่?
Steven Evers

2

นี่คือการจัดหมวดหมู่พื้นฐานของฉัน ฉันกำลังพยายามวาดภาพคู่กับ LISP

การแสดงออกดั้งเดิม

  • ค่าดั้งเดิมทั้งหมดสิ่งที่คุณสามารถใช้แทนตัวอักษร (ตัวเลขบูลีน ... )

Parallel in LISP : อะตอมตัวเลขและรายการ

หมายถึงการรวมกัน (วิธีที่คุณสามารถสร้างโครงสร้างข้อมูลแบบผสม)

  • อาร์เรย์
  • วัตถุ / structs

Parallel in LISP : เซลล์ที่มีข้อ จำกัด

หมายถึงสิ่งที่เป็นนามธรรม

  • ไวยากรณ์การไหลของการควบคุมทั้งหมด (ถ้าในขณะที่ใช้)
  • ทั้งหมดผู้ประกอบการในตัว ( +, -, *, /, ... )
  • ฟังก์ชั่นทั้งหมด (ในหมวดหมู่นี้เรามีชั้นเรียนและวิธีการ)

ขนานใน LISP : ฟังก์ชั่น, น้ำตาลประโยคเช่นlet,define


คำตอบที่ดี! ฉันคิดว่าบางทีโครงสร้างการควบคุมการไหลบางอย่างอาจเหมาะสมภายใต้การรวมกัน แนวที่ดีกับ LISP ที่ช่วยได้มาก

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

0

ภาษาโปรแกรมที่ถูกกำหนดโดยทั่วไปของไวยากรณ์และความหมาย ทั้งสองนี้จะถูกกำหนดไว้ในมาตรฐานสำหรับภาษา

ไวยากรณ์สรุปวิธีการเขียนโปรแกรมที่ถูกต้องและความหมายกำหนดความหมายของโปรแกรมที่ถูกต้อง

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

ตัวอย่างเช่นไวยากรณ์จะบอกวิธีเขียนforลูปที่ถูกต้อง ซีแมนทิกส์จะบอกคุณว่าสำหรับลูปทำอะไร

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


1
รออะไร? "เรียบง่ายเหมือน C ก่อนที่จะเจาะเข้าไปใน Java" คุณทำให้ฉันที่ "Simple like C"
corsiKa

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

ในความเป็นจริง "ไวยากรณ์" อธิบายสิ่งที่ "ง่ายที่สุด" ในภาษาอย่างแม่นยำอะตอมที่ประกอบด้วย
Ira Baxter

ไวยากรณ์ไม่ได้จับสิ่งที่โปรแกรมที่ถูกต้องคือไกลจากที่ ตัวอย่างเช่นโปรแกรมที่ถูกต้องทางไวยากรณ์อาจไม่ตรวจสอบประเภท โปรแกรม AC ที่รันคำสั่งx = ++x;ไม่ถูกต้องแม้ว่าคอมไพเลอร์ทั่วไปจะยอมรับ
Gilles 'หยุดความชั่วร้าย'

0

ฉันไม่ทราบว่ามันถูกต้อง แต่วิธีที่ฉันเข้าใจการแบ่งเป็นดังนี้:

การแสดงออกดั้งเดิมเหล่านี้จะเป็นสิ่งต่าง ๆ เช่น >>, +, *, /, int, บูลีนตัวแปรวิธีการ ฯลฯ

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

หมายถึงสิ่งที่เป็นนามธรรม, นี้จะเป็นไวยากรณ์ที่ใช้ในการตั้งชื่อตัวแปรและวิธีการเช่นเดียวกับวิธีการสร้างอินเตอร์เฟซ, คลาส, คลาสคงที่, วิธีการบรรทุกเกินพิกัด ฯลฯ

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


หนังสือออนไลน์ฟรี ลิงค์ได้รับใน OP ฉันรู้สึกแบบเดียวกันกับmeans of combination- มันยากที่จะคิดออกว่าเป็นของอะไร คำตอบที่ดีแม้ว่า

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