ภาษาของโปรแกรมสามารถอ่อนไหวได้เพียงพอที่จะอนุญาตให้โปรแกรมขยายความหมายของภาษาหรือไม่


15

ด้วยการอ้างอิงถึงคุณสมบัติในภาษาต่างๆเช่น ruby ​​(และ javascript) ซึ่งอนุญาตให้โปรแกรมเมอร์ขยาย / ลบล้างคลาสได้ตลอดเวลาหลังจากกำหนด (รวมถึงคลาสเช่น String) ในทางทฤษฎีแล้วมันเป็นไปได้ในทางทฤษฎีในการออกแบบภาษา ความหมายของมัน

เช่นทับทิมไม่อนุญาตให้มีการสืบทอดหลายอย่าง แต่ฉันสามารถขยาย / ลบล้างพฤติกรรมภาษาเริ่มต้นเพื่ออนุญาตการใช้งานการสืบทอดหลายมรดก

มีภาษาอื่นที่อนุญาตสิ่งนี้หรือไม่? อันที่จริงเรื่องนี้เป็นเรื่องของนักออกแบบภาษาหรือไม่? ดูทางเลือกของการใช้ ruby ​​สำหรับการสร้างเฟรมเวิร์กเรลสำหรับการพัฒนาเว็บแอปพลิเคชันภาษาดังกล่าวอาจมีประสิทธิภาพมากในการอนุญาตการออกแบบเฟรมเวิร์ก (หรือ DSL) สำหรับการใช้งานที่หลากหลาย


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

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

หากฉันจำได้อย่างถูกต้องแม้ Java จะได้รับคุณสมบัติที่อนุญาตให้โปรแกรมขยายระบบประเภท
Raphael

1
@ ราฟาเอลคุณคิดJSR 305 อยู่หรือเปล่า? คำอธิบายประกอบ Java ได้รับการออกแบบ (บางส่วน) โดยจิลาดบราชาผู้ออกแบบ Newspeak ซึ่งผมเชื่อมโยงในคำตอบของฉันด้านล่างและยังปกป้องระบบการพิมพ์ pluggable JSR 305 วัสดุสิ้นเปลืองหมายเหตุประกอบระบบประเภท@Nullableและ@NonNullที่ใช้โดยตัวตรวจสอบภายนอกเช่น findbugs
Mike Samuel

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

คำตอบ:


12

บรรจบกันมีสิ่งอำนวยความสะดวกการเขียนโปรแกรมเมตาที่น่าประทับใจ

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

ซึ่งเป็นขั้นตอนที่เพิ่มขึ้นจากแมโครที่ถูกสุขลักษณะของ Scheme ซึ่งอนุญาตให้นิยามแมโครที่มีความโปร่งใสแบบอ้างอิง

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


การสะท้อนของ Newspeakอนุญาตให้มีการยกเว้นเป็นโค้ดห้องสมุดได้

7.6 การจัดการข้อยกเว้น

เนื่องจาก Newspeak จัดเตรียมการเข้าถึงแบบไตร่ตรอง (7.2) ให้กับเร็กคอร์ดการเปิดใช้งาน (3.6) การจัดการข้อยกเว้นเป็นปัญหาของห้องสมุดอย่างแท้จริง แพลตฟอร์มดังกล่าวจะให้บริการไลบรารีมาตรฐานที่รองรับการขว้างปาการจับและการดำเนินการยกเว้นต่อตามปกติใน Smalltalk


Perligata: Romanaแสดงให้เห็นว่าไวยากรณ์ใหม่ทั้งหมดสามารถถูกทำให้ผิวเป็นภาษาได้อย่างไร

บทความนี้อธิบายถึงโมดูล Perl - Lingua :: Romana :: Perligata - ซึ่งทำให้สามารถเขียนโปรแกรม Perl เป็นภาษาละตินได้


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


ที่น่าสนใจก็อาจจะOmeta

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

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

วิทยานิพนธ์ของ Alex Warth แสดงให้เห็นถึงการใช้ Ometa เพื่อกำหนด semantics ใหม่ (semantics transactional ผ่านทางโลก) ใน JavaScript + Ometa


8

"เป็นไปได้ในทางทฤษฎีหรือไม่ *

LS

L

SL

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

นี่คือเทคโนโลยี "virtualization" สำหรับการเขียนโปรแกรมภาษา


6

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

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


4

ยังไม่ได้กล่าวถึงในคำตอบ / ความคิดเห็น:

การสำรวจ:

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

และ

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


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