ทำไมแอสเซมบลีแทน LLVM ของกลาง (LLVM IR) จึงเป็นเหมือนต้นไม้มากกว่าต้นไม้
อีกทางหนึ่งทำไมการติดตั้งภาษาจึงตั้งเป้าหมาย LLVM IR มากกว่า AST ของเสียงดังกราว
ฉันไม่ได้พยายามถามคำถามสองคำถามที่แตกต่างกันในครั้งเดียวถ้ามันเป็นอย่างนั้น สำหรับฉันดูเหมือนว่าทั้งไคลเอนต์และนักเขียนโปรแกรมไลบรารีได้รับความเห็นพ้องต้องกันว่า API ของ LLVM ไม่มีอะไรมากไปกว่าการออกแบบซอฟต์แวร์ที่ดีและคำถามของฉันก็คือ "ทำไม"
เหตุผลที่ฉันถามคือดูเหมือนว่า LLVM สามารถให้ฟังก์ชันการทำงานมากขึ้นเพื่อ frontends หาก IR เป็นเหมือน AST เพราะเครื่องมือ AST ที่ใช้ clang ของ clang สามารถใช้กับส่วนหน้าใดก็ได้ อีกทางหนึ่งภาษาที่กำหนดเป้าหมาย LLVM IR สามารถรับฟังก์ชั่นการใช้งานได้มากกว่าหากพวกเขาตั้งเป้าหมาย AST ของเสียงดังกราว
เสียงดังกังวานมีคลาสและฟังก์ชั่นสำหรับการสร้างและทำงานกับ AST และเป็นโครงการส่วนหน้าเดียวที่เชื่อมโยงอย่างยิ่งกับโครงการ LLVM ดังนั้นทำไมฟังก์ชั่น AST ของเสียงดังกราวจึงดังต่อไปยัง LLVM
ฉันรู้ว่า Rust (rustc), D (ldc) และ Haskell (GHC) สามารถใช้ LLVM เป็นแบ็กเอนด์ แต่พวกเขาไม่ได้ใช้ Clang AST (เท่าที่ฉันรู้ฉันสามารถทำได้) จะผิด). ฉันไม่ทราบรายละเอียดภายในทั้งหมดของคอมไพเลอร์เหล่านี้ แต่อย่างน้อย Rust และ D แน่นอนดูเหมือนว่าพวกเขาสามารถรวบรวมเพื่อ AST ของเสียงดังกราว บางที Haskell ก็สามารถทำได้เช่นกัน แต่ฉันก็ไม่ค่อยแน่ใจเท่าไหร่
เป็นเพราะเหตุผลทางประวัติศาสตร์ (LLVM เดิมเป็น "เครื่องเสมือนระดับต่ำ" และเสียงดังกราวมาในภายหลัง)? นี่เป็นเพราะส่วนหน้าอื่น ๆ ต้องการให้มีการควบคุมมากที่สุดเท่าที่จะทำได้กับสิ่งที่พวกเขาป้อนให้ LLVM หรือไม่? มีเหตุผลพื้นฐานที่ AST เสียงดังกราวไม่เหมาะสมสำหรับภาษา "ที่ไม่เหมือน C" หรือไม่?
ฉันไม่ได้ตั้งใจคำถามนี้จะออกกำลังกายในใจ ฉันแค่อยากให้มันเป็นประโยชน์กับพวกเราที่มีความอยากรู้เกี่ยวกับการออกแบบคอมไพเลอร์ เนื่องจากโครงการ LLVM และเสียงดังกราวได้รับการพัฒนาในที่สาธารณะฉันหวังว่าคนที่คุ้นเคยกับการพัฒนาโครงการเหล่านี้สามารถตอบได้หรือว่าคำตอบนั้นชัดเจนพอที่จะรวบรวมผู้เรียนที่รู้สึกมั่นใจพอที่จะตอบ
หากต้องการล้างคำตอบที่ชัดเจน แต่ไม่น่าพอใจล่วงหน้า:
ใช่มีการชุมนุมเหมือน IR ให้การควบคุมมากขึ้นกับใครก็ได้ที่งานฝีมือ IR (บางที X lang มี codebase และ AST รูปแบบที่ดีกว่าเสียงดังกราว) แต่ถ้าเป็นคำตอบเดียวแล้วกลายเป็นคำถามว่า "ทำไมไม่ LLVM เพียงมี assembly- ชอบ IR แทนที่จะเป็น IR ต้นไม้ที่เหมือนต้นไม้ระดับสูงและ IR-Assembly เหมือนระดับต่ำ? "
ใช่ไม่ใช่เรื่องยากที่จะแยกวิเคราะห์ภาษาการเขียนโปรแกรมเป็น AST (อย่างน้อยเมื่อเปรียบเทียบกับขั้นตอนการคอมไพล์อื่น ๆ ) ดังนั้นทำไมต้องใช้ AST แยกกัน หากไม่มีอะไรอื่นการใช้ AST เดียวกันจะช่วยให้คุณใช้เครื่องมือที่ทำงานบน AST (แม้จะเป็นเรื่องง่าย ๆ เช่นเครื่องพิมพ์ AST)
ใช่ฉันเห็นด้วยอย่างยิ่งว่าการเป็นแบบแยกส่วนเป็นสิ่งที่ดี แต่ถ้านั่นเป็นเหตุผลเดียวทำไมการใช้ภาษาอื่นมักจะตั้งเป้าหมาย LLVM IR แทนที่จะเป็น AST ของเสียงดังกราว?
pre-emptions เหล่านี้อาจผิดพลาดหรือมองข้ามรายละเอียดดังนั้นอย่าลังเลที่จะให้คำตอบเหล่านี้หากคุณมีรายละเอียดเพิ่มเติมหรือข้อสันนิษฐานของฉันถูกเข้าใจผิด
สำหรับทุกคนที่ต้องการตอบคำถามที่ตอบได้อย่างชัดเจนมากขึ้น: อะไรคือข้อดีและข้อเสียของ IR-assembly ที่มีโครงสร้างคล้ายกับ IR ที่มีโครงสร้างคล้ายต้นไม้?