เป็นไปได้หรือไม่ที่จะคอมไพล์ภาษาระดับสูงขึ้นเพื่อให้สามารถอ่าน C ++ ได้? [ปิด]


12

C ++ เป็นภาษาที่ยอดเยี่ยมในหลาย ๆ ด้าน แต่บางสิ่งที่ยุ่งยากในการเขียนโดยไม่ต้องใช้ IDE ในฐานะผู้ใช้ VIM มันน่าสนใจมากถ้าฉันสามารถใช้ภาษาระดับสูงขึ้นซึ่งทำให้ฉันสามารถเขียน C ++ ด้วย S-Expressions และอาจมีมาโครคล้าย Lisp ซึ่งทำให้สามารถสร้างโค้ดที่สะอาดได้ในขณะเดียวกันก็หลีกเลี่ยงการเขียน patters เดิม ครั้งแล้วครั้งเล่า.

ฉันถาม freenode และทดสอบแนวคิดหลายอย่างเช่นการคอมไพล์ Lisp-> C กับคอมไพเลอร์เช่น ECL และ Bigloo แต่ไม่มีสิ่งใดที่สร้างโค้ด C ที่สะอาดเป็นพิเศษ

มีงานใด ๆ ในปัญหานี้หรือไม่?


3
ทำไมไม่เขียนโค้ดของคุณใน lisp ด้วย macros เพราะมันคือ C ++ ทั้งหมดและจากนั้นฟีเจอร์ที่คุณต้องการ แต่ยากที่จะทำเพียงแค่ขยายโดยแมโคร LISP จากไวยากรณ์ธรรมดาไปยัง C ++ ที่ซับซ้อนยิ่งขึ้น ยังดีกว่าคุณสามารถเขียนโค้ดของคุณใน LISP :)
จิมมี่ฮอฟฟา

2
คุณคาดหวังว่าการแปล Lisp -> C ++ เพื่อสร้างโค้ด C ++ ใหม่เมื่อการประกอบ (ง่ายกว่า) C ++ -> Assembly สร้างแอสเซมบลีที่ไม่สามารถอ่านได้ ใครคือเป้าหมายของการคอมไพล์สำหรับทุกคน?

1
ยังไงก็เถอะฉันไม่มั่นใจเลยว่าใครก็ตามที่ได้เขียนมาโครเพื่อขยายสิ่งที่คุณต้องการให้ขยายออกไป แต่ในฐานะที่เป็นกฎมาโครที่เขียนได้ง่ายอย่างน่าประหลาดใจพวกเขาเป็นเพียงวิธีการประมวลผลรายการ ด้านในของ s-expression เดียวที่คุณกำหนดเมื่อคุณต้องการให้ expander แมโครให้ความสนใจจากนั้นเพียงพิมพ์รายการเพื่อรับรหัส C ++ ของคุณพร้อมส่วนขยาย
จิมมี่ฮอฟฟา

2
ฉันยอมรับว่า Lisp สามารถทำบางสิ่งที่ยากใน C ++ (เช่นการปิด) คุณต้องการทำสิ่งเหล่านั้นหรือไม่? จากนั้นเนื่องจากพวกเขาทำยากใน C ++ ไม่ว่าคุณจะนำพวกเขาไปสู่ ​​C ++ ได้โดยอัตโนมัติหรือด้วยตนเองมันจะไม่สวย คำแนะนำของฉัน: ถ้าคุณไม่ต้องการสิ่งที่ยากจริง ๆ ที่ Lisp สามารถทำได้จริงๆอย่าใช้ Lisp ทำได้ดีที่ C ++ หากคุณต้องใช้สิ่งเหล่านั้น แต่คุณต้องใช้รหัสใน C ++ ให้หาวิธีการใช้ใน C ++ นั่นคือสิ่งที่แยกผู้ใหญ่ออกจากเด็ก ๆ ในธุรกิจนี้
Mike Dunlavey

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

คำตอบ:


13

การรวบรวมภาษาระดับที่สูงขึ้นไปยังภาษาที่ระดับต่ำกว่าคือเค้ก มีตัวอย่างมากมายที่กำลังทำอยู่ เราสามารถชี้ไปที่คอมไพเลอร์ C ++ ก่อนหน้าซึ่งคอมไพล์ลงไปที่ C

เมื่อคุณเริ่มโยน "สะอาด" และ "อ่าน" ลงในส่วนผสมอย่างไรก็ตามสิ่งต่าง ๆ นั้นยากมาก รหัสที่สะอาดและอ่านได้จะแสดงความหมายและเจตนาของสิ่งที่คุณเขียน คอมพิวเตอร์มีการตีความและสร้างความหมายที่ไม่ดี คุณมีแนวโน้มที่จะจบลงด้วยตัวแปรชื่อกว่าint_147 input_buffer_lengthแน่นอนว่าถ้าคุณจริงๆอยากจะทำให้การทำงานของโครงการนี้คุณสามารถมีส่วนร่วมในโครงการเอไอขนาดใหญ่ที่จะจัดการกับการแปลงเสียงกระเพื่อมของคุณเพื่อเรียงลำดับของการอ่าน decently c ++ บางส่วน แต่จะเป็นทำเลที่ดีเลิศเที่ยงตรง, คอมไพเลอร์ทั่วไปเสียงกระเพื่อมจะสวยร่วมเพศดีในสิ่งที่พวกเขาทำ .

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

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

โอ้ใช่. เจ้านายของคุณต้องการให้คุณเขียน C ++ และคุณไม่ต้องการ อัพเดทประวัติย่อของคุณและหางานใหม่


ฉันหวังว่าฉันจะสามารถอัปเดตประวัติและหางานอื่นได้ น่าเสียดายที่มันไม่ตรงไปตรงมาเมื่อ job = "student" และ boss = "Professor" และน่าเสียดายที่ฉันควรจะมีประกาศนียบัตร ไม่ว่าฉันจะไม่ไปเรียน แต่เรียนรู้ด้วยตัวเองที่บ้าน ในความเป็นจริงฉันได้ทำงานในอุตสาหกรรมและสร้างรายได้มากกว่าบัณฑิตส่วนใหญ่ที่ฉันรู้จัก นั่นเป็นวิธีการทำงาน เศร้า. มีความสุขที่อาจารย์ของฉันยอมรับที่จะผ่านฉันถ้าฉันเขียนบางสิ่งบางอย่างที่ซับซ้อนใน C ++ ฉันรู้ C ++ แล้ว ดังนั้นผมจึงอยากจะใช้โอกาสในการเรียนรู้บางสิ่งบางอย่างที่แตกต่างกัน (;.. พูดจาโผงผางกันตอบที่ดีขอบคุณ
MaiaVictor

@ Dokkat: ฉันไม่เชื่อว่าคุณรู้จัก C ++ คุณสามารถเขียนเทมเพลตที่มีการใช้งานพิเศษขึ้นอยู่กับว่าพารามิเตอร์มีวิธีหรือฟังก์ชั่นหรือไม่? คุณทำการคำนวณเวลาคอมไพล์โดยใช้ Boost.MPL หรือไม่ คุณเข้าใจหรือไม่ว่า Boost.ForEach ทำงานอย่างไร หากคุณต้องทำใน C ++ ลองใช้โอกาสนี้ในการเรียนรู้ C ++ ขั้นสูงเพิ่มเติม มันจะใช้งานได้มากขึ้นสำหรับการทำงานของคุณด้วย
Jan Hudec

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

3

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

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


ฉันเดาว่าคุณอ่านมากเกินไปสิ่งที่ฉันหมายถึงด้วย "อ่าน"! ไม่จำเป็นต้องสวยงามจริงๆ เพียงพอเพื่อให้คุณสามารถอ่านและเข้าใจสิ่งที่เกิดขึ้น ฉันเดาว่าฉันจะไปกับมาโคร Lisp บางตัวเพื่อทำการแปลโดยตรงตามที่ JimmyHoffa แนะนำในการแสดงความคิดเห็น
MaiaVictor

3

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

True, C ++ ไม่มีมาโครแบบ lisp แต่เทมเพลตสามารถทำทุกอย่างที่ถูกสุขลักษณะของมาโครได้และเพราะคุณสามารถนำมาใช้ต่างกันตามประเภทและตามความสามารถของมัน ทรูมันขาดตัวรวบรวมขยะทำให้การปิดเป็นเรื่องที่น่าเบื่ออีกเล็กน้อย แต่ RAII สำนวนที่ใช้สำหรับการจัดการทรัพยากรแทนมีข้อดีและคุณสมบัติที่น่าสนใจ

หากคุณเป็นนักเรียนคุณรู้จัก C ++ ขั้นสูงจริง ๆ หรือไม่? จากไลบรารีอัลกอริทึมไปยังการเขียนเทมเพลตที่มีการใช้งานแบบอื่นโดยอิงตามคุณสมบัติของประเภทอาร์กิวเมนต์การคำนวณเวลาคอมไพล์โดยใช้การเขียนโปรแกรมแม่แบบเมตา (โดยใช้ Boost.MPL) เพื่อทำความเข้าใจว่า Boost ทำงานอย่างไรภายใต้ฮูด ถ้าไม่ฉันขอแนะนำให้ใช้สิ่งนี้เป็นโอกาสในการเรียนรู้ C ++ ขั้นสูงบางอย่าง การมอบหมายงานในโรงเรียนไม่จำเป็นต้องได้รับการดูแลรักษาดังนั้นคุณสามารถเล่นกับภาษาเพื่อดูว่าคุณลักษณะใดบ้างที่มีค่าในรหัสการผลิตที่คุณต้องระวังเกี่ยวกับการอ่าน


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


เห็นด้วยกับ VIM มันพอดีกับถุงมือสำหรับการพัฒนา C ฉันเป็นผู้ใช้แบบกลุ่ม แต่สำหรับเสียงกระเพื่อมฉันใช้ Emacs ในโหมดความชั่วด้วย SLIME และ Paredit มีการสนับสนุนบางอย่างสำหรับ Lisping ในกลุ่มที่มี hooks REPL พื้นฐาน แต่ไม่เข้าใกล้ SLIME
mike30 30
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.