การออกแบบภาษา: การผสมผสาน Gotos และฟังก์ชันต่างๆ

ฉันกำลังออกแบบและกำลังคิดใหม่เกี่ยวกับภาษาโปรแกรมตีความระดับต่ำที่มีความคล้ายคลึงกับแอสเซมเบลอร์

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

ดังนั้นฉันจึงพยายามหาบางสิ่งระหว่างฟังก์ชันกับ goto ที่สามารถทำได้

  • การเรียกซ้ำ
  • ลูปที่มีประสิทธิภาพ

หลังจากคิดอยู่พักหนึ่ง ฉันก็เกิดแนวคิดเรื่องรูทีนย่อยขึ้นมา:

  • มีจุดเริ่มต้นและจุดสิ้นสุดเหมือนฟังก์ชัน
  • พวกเขามีชื่อแต่ไม่มีข้อโต้แย้งเหมือนข้ามไป
  • คุณสามารถเข้าไปที่หนึ่งด้วยการกระโดดและออกจากมันอีกครั้งก่อนที่จะลงท้ายด้วย return (ไม่คืนผลลัพธ์ใด ๆ เพียงหยุดรูทีนย่อยเท่านั้น)
  • จัดการเหมือนโค้ดปกติ -> ขอบเขตทั่วโลกเหมือนข้ามไป

ฉันก็เลยอยากจะรู้ว่า:

  • แนวคิดข้างต้นดีหรือไม่? มีข้อดี (ข้อเสีย) อะไรบ้าง?
  • จะมีการผสมผสานระหว่างฟังก์ชันและข้ามไปที่ดีกว่านี้หรือแม้แต่แนวคิดใหม่ทั้งหมดหรือไม่?

person sub    schedule 09.04.2010    source แหล่งที่มา
comment
โดยพื้นฐานแล้วคุณกำลังใช้งาน GOSUB ใช่ไหม?   -  person David    schedule 09.04.2010
comment
คุณหมายถึงสิ่งนั้นจาก BASIC เหรอ? เป็นไปได้ แต่ฉันไม่รู้ว่า GOSUB รองรับการเรียกซ้ำหรือไม่   -  person sub    schedule 09.04.2010
comment
หากรูทีนย่อยของคุณไม่มีพารามิเตอร์หรือตัวแปร คำถามเกี่ยวกับการเรียกซ้ำจะไม่เกี่ยวข้อง   -  person PauliL    schedule 09.04.2010
comment
@PauliL: สิ่งที่คุณพูดนั้นผิดธรรมดา   -  person sub    schedule 09.04.2010


คำตอบ (3)


แนวคิดข้างต้นดีหรือไม่?

No.

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

มีข้อดี (ข้อเสีย) อะไรบ้าง?

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


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

คุณอาจลองใช้ Googling "ภาษาแอสเซมบลีแบบพกพา" แล้วดูว่าคุณพบสิ่งที่น่าสนใจหรือไม่

person Norman Ramsey    schedule 10.04.2010

ฉันคิดว่าเมื่อคุณอยู่ในระดับแอสเซมบลี GOTO จะหยุดทำตัวชั่วร้าย และเริ่มเป็นเพียงวิธีที่โปรแกรม ทำงาน จริงๆ

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

person Mr. Boy    schedule 09.04.2010
comment
ฉันใช้สแต็กที่มีตำแหน่งของการกระโดดเพื่อให้ล่ามรู้ว่าจะกลับไปที่ไหนหลังจากรูทีนย่อย อย่างไรก็ตาม เพื่อหลีกเลี่ยงการกินหน่วยความจำ ความล่าช้าและการล้น สแต็กจะไม่ถูกใช้เมื่อรูทีนย่อยเรียกตัวเองว่า -› ลูป - person sub; 09.04.2010
comment
ย่อย ถ้าคุณไม่เก็บที่อยู่ผู้ส่งเมื่อรูทีนย่อยเรียกตัวเอง มันก็ไม่ใช่การเรียกซ้ำจริงๆ และไม่มีประเด็นใดที่จะนำลูปไปใช้โดยใช้การเรียกซ้ำ ใช้ข้ามไปแทน - person PauliL; 09.04.2010

รูทีนย่อยที่คุณกำลังใช้งานนั้นเหมือนกับ GOSUB ใน Basic หรือ CALL ใน Assembly

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

อย่างไรก็ตาม ในภาษาสคริปต์ง่ายๆ บางภาษาที่มีเฉพาะตัวแปรส่วนกลางเท่านั้น มีคำสั่ง PUSH และ POP สำหรับการจัดเก็บตัวแปรในสแต็ก (เหมือนกับที่รีจิสเตอร์ถูกพุชและป๊อปในภาษาแอสเซมบลี) . สามารถใช้สำหรับการนำตัวแปรท้องถิ่นและการเรียกซ้ำในระดับต่ำไปใช้

ฉันเคยใช้วิธีการนั้นในตัวอย่างภาษามาโครของ Vedit ใน Rosetta Code ดูตัวอย่าง Towers of Hanoi และ เส้นโค้งเบซิเยร์

person PauliL    schedule 09.04.2010