กลับไปหน้าบทความ

อ่าน 4 นาที

การเขียนโปรแกรมที่ขยายได้

ในวิทยาการคอมพิวเตอร์การเขียนโปรแกรมแบบขยายได้เป็นรูปแบบการเขียนโปรแกรมคอมพิวเตอร์ที่เน้นกลไกในการขยายภาษาการเขียนโปรแกรมคอมไพเลอร์และระบบรันไทม์ (สภาพแวดล้อม)

การเขียนโปรแกรมที่ขยายได้

ในวิทยาการคอมพิวเตอร์การเขียนโปรแกรมแบบขยายได้เป็นรูปแบบการเขียนโปรแกรมคอมพิวเตอร์ที่เน้นกลไกในการขยายภาษาการเขียนโปรแกรมคอมไพเลอร์และระบบรันไทม์ (สภาพแวดล้อม) ภาษาการเขียนโปรแกรมแบบขยายได้ซึ่งสนับสนุนรูปแบบการเขียนโปรแกรมนี้เป็นหัวข้อที่มีการวิจัยอย่างแข็งขันในช่วงทศวรรษ 1960 แต่การเคลื่อนไหวนี้ถูกลดบทบาทลงในช่วงทศวรรษ 1970 [ 1 ]การเขียนโปรแกรมแบบขยายได้กลับมาเป็นหัวข้อที่ได้รับความสนใจอีกครั้งในศตวรรษที่ 21 [ 2 ]

การเคลื่อนไหวทางประวัติศาสตร์

เอกสารฉบับแรก[ 1 ] [ 3 ]ที่เกี่ยวข้องกับการเคลื่อนไหวของภาษาโปรแกรมที่ขยายได้คือเอกสารของ M. Douglas McIlroy ในปี 1960 เกี่ยวกับ มาโครสำหรับ ภาษา โปรแกรมระดับสูง[ 4 ]คำอธิบายเบื้องต้นอีกประการหนึ่งของหลักการของการขยายได้ปรากฏในเอกสารของ Brooker และ Morris ในปี 1960 เกี่ยวกับคอมไพเลอร์-คอมไพเลอร์ [ 5 ] จุดสูงสุดของการเคลื่อนไหวนี้ถูกทำเครื่องหมายด้วยการประชุมวิชาการสองครั้ง ในปี 1969 และ 1971 [ 6 ] [ 7 ]ภายในปี 1975 บทความสำรวจเกี่ยวกับการเคลื่อนไหวโดย Thomas A. Standish [ 1 ]เป็นเหมือนการวิเคราะห์หลังเหตุการณ์Forthเป็นข้อยกเว้น แต่โดยพื้นฐานแล้วไม่มีใครสังเกตเห็น

ลักษณะของขบวนการทางประวัติศาสตร์

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

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

ภาษาโปรแกรมใดๆ ที่โปรแกรมและข้อมูลสามารถแลกเปลี่ยนกันได้โดยพื้นฐาน ถือได้ว่าเป็นภาษาที่ขยายได้ [sic] ... สิ่งนี้สามารถเห็นได้ง่ายมากจากข้อเท็จจริงที่ว่า Lisp ถูกใช้เป็นภาษาที่ขยายได้มาหลายปีแล้ว[ 8 ]

ในการประชุมปี 1969 Simulaถูกนำเสนอในฐานะภาษาที่สามารถขยายได้

สแตนดิชได้อธิบายถึงการขยายความทางภาษาไว้ 3 ประเภท ซึ่งเขาตั้งชื่อว่าการถอดความ (paraphrase ) การถอดความตรงตัว (orthophrase ) และการถอดความแบบอุปมา (metaphrase) (หรืออีกนัยหนึ่ง การถอดความและการถอดความแบบอุปมาคือ คำศัพท์ที่ ใช้ในการแปล )

  • การถอดความหมายถึงการอธิบายสิ่งอำนวยความสะดวกโดยแสดงวิธีการแลกเปลี่ยนสิ่งนั้นกับสิ่งที่เคยถูกกำหนดไว้แล้ว (หรือที่จะถูกกำหนดในอนาคต) ตัวอย่างเช่น เขาได้กล่าวถึงคำจำกัดความของมาโคร คำจำกัดความของกระบวนการทั่วไป ส่วนขยายทางไวยากรณ์ คำจำกัดความของข้อมูล คำจำกัดความของตัวดำเนินการ และส่วนขยายของโครงสร้างควบคุม
  • ออร์โธฟราส (Orthophrase) คือการเพิ่มคุณสมบัติให้กับภาษาที่ไม่สามารถทำได้โดยใช้ภาษาพื้นฐาน เช่น การเพิ่ม ระบบ รับ/ส่งข้อมูล (I/O) ให้กับภาษาพื้นฐานที่เดิมไม่มีส่วนประกอบ I/O พื้นฐาน ส่วนขยายต้องเข้าใจว่าเป็นออร์โธฟราสที่สัมพันธ์กับภาษาพื้นฐานที่กำหนดไว้ เนื่องจากคุณสมบัติที่ไม่ได้กำหนดไว้ในภาษาพื้นฐานจะต้องกำหนดไว้ในภาษาอื่น ซึ่งสอดคล้องกับแนวคิดสมัยใหม่ของปลั๊กอิน (plug-ins )
  • การถอดความแบบเมตาแฟรส (Metaphrase) ปรับเปลี่ยนกฎการตีความที่ใช้กับสำนวนที่มีอยู่แล้ว ซึ่งสอดคล้องกับแนวคิดสมัยใหม่ของการเขียนโปรแกรมเชิงสะท้อน (Reflection)

การสิ้นสุดของขบวนการทางประวัติศาสตร์

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

แม้ว่าก่อนหน้านี้จะมีการนำเสนอ Simula ว่าสามารถขยายได้ แต่ในปี 1975 การสำรวจของ Standish ดูเหมือนจะไม่ได้รวมเทคโนโลยีที่ใช้การนามธรรมแบบใหม่ไว้ในทางปฏิบัติ (ถึงแม้ว่าเขาจะใช้คำจำกัดความทั่วไปของการขยายได้ซึ่งในทางเทคนิคอาจรวมถึงเทคโนโลยีเหล่านั้นด้วย) ประวัติศาสตร์ของการเขียนโปรแกรมแบบนามธรรมตั้งแต่การประดิษฐ์คอมพิวเตอร์จนถึงขณะนั้นในปี 1978 ไม่ได้กล่าวถึงมาโคร และไม่ได้บอกใบ้ว่าการเคลื่อนไหวของภาษาที่ขยายได้เคยเกิดขึ้น[ 9 ]มาโครได้รับการยอมรับอย่างไม่เป็นทางการในการเคลื่อนไหวของการนามธรรมในช่วงปลายทศวรรษ 1980 (อาจเป็นเพราะการเกิดขึ้นของมาโครแบบสุขอนามัย ) โดยได้รับนามแฝงว่าการนามธรรมทางไวยากรณ์[ 10 ]

ขบวนการสมัยใหม่

ในความหมายสมัยใหม่ ระบบที่รองรับการเขียนโปรแกรมแบบขยายได้จะมอบฟีเจอร์ ทั้งหมด ที่อธิบายไว้ด้านล่างนี้

ไวยากรณ์ที่ขยายได้

นี่หมายความว่าภาษาต้นฉบับที่จะคอมไพล์ต้องไม่ปิดตายตัวหรือคงที่ จะต้องสามารถเพิ่มคำหลัก แนวคิด และโครงสร้างใหม่ลงในภาษาต้นฉบับได้ ภาษาที่อนุญาตให้เพิ่มโครงสร้างที่มีไวยากรณ์ที่ผู้ใช้กำหนด ได้แก่Rocq [ 11 ] Racket , Camlp4 , OpenC++ , Seed7 [ 12 ] Red , RebolและFelix แม้ว่าจะเป็นที่ยอมรับได้สำหรับคุณลักษณะพื้นฐานและโดยเนื้อแท้ของภาษาบางอย่าง ที่ ไม่สามารถเปลี่ยนแปลงได้ แต่ระบบต้องไม่พึ่งพาคุณลักษณะของภาษาเหล่านั้นเพียงอย่างเดียว จะต้องสามารถเพิ่มคุณลักษณะใหม่ได้

คอมไพเลอร์ที่ขยายได้

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

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

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

รันไทม์ที่ขยายได้

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

เนื้อหาแยกออกจากรูปแบบ

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

การสนับสนุนการดีบักภาษาต้นฉบับ

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

ตัวอย่าง

ดูเพิ่มเติม

ทั่วไป

  1. บทความของ Greg Wilson ใน ACM Queue
  2. การสนทนาบน Slashdot
  3. ภาษาโปรแกรมสมัยใหม่ที่ขยายได้ (Modern Extensible Languages) ถูกเก็บถาวรไว้ที่Wayback Machine เมื่อวันที่ 12 มิถุนายน 2011 – บทความโดยDaniel Zingaro

เครื่องมือ

  1. MetaL – การใช้งานเอนจินคอมไพเลอร์การเขียนโปรแกรมที่ขยายได้
  2. XPS – ระบบการเขียนโปรแกรมที่ขยายได้ (อยู่ระหว่างการพัฒนา)
  3. MPS – ระบบเมตาโปรแกรมมิงของ JetBrains

ภาษาที่มีไวยากรณ์ที่ขยายได้

  1. เปิดZz
  2. xtc – eXTensible C
  3. สคริปต์ภาษาอังกฤษ
  4. เนเมอร์เล มาโครส
  5. มาโครไวยากรณ์ Boo
  6. คอมไพเลอร์รูปแบบระดับกลางของมหาวิทยาลัยสแตนฟอร์ด
  7. Seed7 – ภาษาโปรแกรมที่ขยายได้
  8. Katahdin – ภาษาที่มีไวยากรณ์และความหมายที่เปลี่ยนแปลงได้ในขณะทำงาน
  9. π – ภาษาที่มีไวยากรณ์ที่ขยายได้ ซึ่งพัฒนาขึ้นโดยใช้ตัวแยกวิเคราะห์ Earley
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Extensible_programming&oldid=1311882763 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ การเขียนโปรแกรมที่ขยายได้

ในวิทยาการคอมพิวเตอร์การเขียนโปรแกรมแบบขยายได้เป็นรูปแบบการเขียนโปรแกรมคอมพิวเตอร์ที่เน้นกลไกในการขยายภาษาการเขียนโปรแกรมคอมไพเลอร์และระบบรันไทม์ (สภาพแวดล้อม)

การเคลื่อนไหวทางประวัติศาสตร์

เอกสารฉบับแรก [ 1 ] [ 3 ] ที่เกี่ยวข้องกับการเคลื่อนไหวของภาษาโปรแกรมที่ขยายได้คือเอกสารของ M.

ลักษณะของขบวนการทางประวัติศาสตร์

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

การสิ้นสุดของขบวนการทางประวัติศาสตร์

สแตนดิชกล่าวว่าความล้มเหลวของขบวนการขยายขีดความสามารถนั้นเกิดจากความยากลำบากในการเขียนโปรแกรมส่วนขยายที่ต่อเนื่องกัน โปรแกรมเมอร์อาจสร้างโครงสร้างพื้นฐานของมาโครขึ้นมาก่อน จากนั้น หากมีการสร้างโครงสร้างพื้นฐานของมาโครขึ้นมาอีก โปรแกรมเมอร์คนต่อๆ...