ข้อดีและข้อเสียของการสร้างโค้ดทั้งหมดผ่านคลาสและคอมไพล์ไปยังคลาส (เช่น Java)


13

แก้ไข: ภาษาของฉันอนุญาตให้มีการสืบทอดหลายครั้งซึ่งแตกต่างจาก Java

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

ตอนแรกฉันตัดสินใจที่จะปิด Java

นี่หมายความว่ารหัสทั้งหมดจะถูกเขียนในรูปแบบของคลาสและรหัสนั้นคอมไพล์ลงในคลาสซึ่งโหลดโดย VM

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

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

ตอนนี้ฉันก็ยังสงสัยว่าอะไรคือ Upside และ Downside ของการมีคลาสเป็นหน่วยการคอมไพล์

นอกจากนี้ความเห็นทั่วไปเกี่ยวกับการออกแบบของฉันก็จะได้รับการชื่นชมมาก โพสต์ข้อมูลเกี่ยวกับภาษาของฉันสามารถพบได้ที่นี่: http://www.yannbane.com/2012/12/kava.html


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

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

1
@delnan: ที่จริงแล้วคุณยังคงสามารถใช้การจัดองค์ประกอบเพื่อสร้างฟังก์ชันการทำงานได้
Robert Harvey

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

@delnan: มีอะไรผิดปกติกับการใช้การสืบทอดสำหรับ subtyping และ polymorphism? นั่นคือสิ่งที่เป็นมรดกสำหรับ ...
เมสันล้อ

คำตอบ:


6

ประโยชน์ของการมีคลาสเป็นหน่วยการคอมไพล์คืออะไร

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

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

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


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

@ yannbane - ฉันไม่ได้หมายถึงobjectฉันหมายถึงคลาสที่มีพฤติกรรมเหมือนโมดูลมากกว่าคลาสภายในที่ไม่จำเป็นต้องเปิดเผยต่อสาธารณะนอกหน่วยการคอมไพล์ 'Works out the dependencies' จะเปลี่ยนเป็นรังของแตนยักษ์ในรายละเอียดหากคุณต้องการพฤติกรรมสไตล์ DLL YMMV ในฐานะที่เป็นแบบคงที่
Telastyn

พฤติกรรมแบบโมดูลนั้นจะสำเร็จได้ด้วยการใช้วิธีการ / ตัวแปรแบบคงที่ใช่ไหม? การสร้างคลาสที่สามารถสร้างอินสแตนซ์ได้แทนที่จะสร้างคลาสที่มีสมาชิกแบบคงที่และวิธีการเท่านั้นหรือไม่ ผมเห็นบทความนั้น แต่ฉันไม่คิดว่าจะนำไปใช้อย่างต่อเนื่องสมาชิกแบบคงที่หรือวิธีการคง ตัวอย่างเช่นผมเห็นอะไรที่ไม่ถูกต้องในการสร้างระดับที่เป็นจริงโมดูลด้วยวิธีการแบบคงที่และคงเป็นสมาชิกดับเบิลคงเรียกว่าMath Pi
jcora

@yannbane - ไม่ไม่จริง โมดูลเป็นโมดูลเพราะพวกเขากำลังพูดถึงได้ทันที มิฉะนั้นคุณจะมีเนมสเปซสไตล์ C ++ เมื่อคุณ จำกัด คลาสระดับบนสุดของคุณให้เป็นเนมสเปซสไตล์ C ++ พวกเขาจะไม่ได้เรียนอีกต่อไป
Telastyn

อืมฉันยังคงโอเคและไม่เห็นปัญหาในการสร้างโมดูลที่มีคลาส และใช่โมดูลทำหน้าที่เป็นเนมสเปซโดยเฉพาะอย่างยิ่งโมดูลหลาม
jcora

4

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

วิศวกรรมภาษาคอมพิวเตอร์

สิ่งที่ต้องมีก่อนคือ Java

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-035-computer-language-engineering-spring-2010/lecture-notes/

คำอธิบายรายวิชา

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

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