ทำไม LLVM จึงมี IR เหมือนการประกอบมากกว่า IR เหมือนต้นไม้ หรือ: ทำไมโครงการตั้งเป้าหมาย LLVM IR แทนที่จะเป็น AST เสียงดังกราว?


14

ทำไมแอสเซมบลีแทน 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 ที่มีโครงสร้างคล้ายต้นไม้?


1
ฉันไม่ใช่ผู้เชี่ยวชาญ LLVM แต่ฉันคิดว่าคุณเข้าใจผิดเล็กน้อย LLVM ไม่มี asm เช่น IR ในความเป็นจริง IR ของมันเป็นเหมือนกราฟมากกว่าต้นไม้ ฉันสมมติว่าด้วย 'asm-like' คุณหมายถึงไฟล์ IR (* .ll) ที่มนุษย์สามารถอ่านได้ถ้าเป็นเช่นนั้นจะทำเพื่อความสะดวกเท่านั้น แต่เราจะรอผู้เชี่ยวชาญตัวจริงที่สามารถให้คำตอบที่ครอบคลุมมากขึ้น :)
AlexDenisov

1
สิ่งสำคัญอย่างหนึ่งอาจเป็นประวัติ: LLVM ได้รับการออกแบบมาเพื่อแยกส่วนแบ็กเอนด์คอมไพเลอร์จากส่วนหน้าคอมไพเลอร์ แนวคิดก็คือผู้ขายคอมไพเลอร์จะแข่งขันในการเพิ่มประสิทธิภาพภาษาและผู้ขาย CPU จะแข่งขันในการเพิ่มประสิทธิภาพในระดับต่ำ เช่น Microsoft และ Apple จะแข่งขันกันเองซึ่งคอมไพเลอร์ C ผลิต bitcode ที่ "ดีที่สุด" จาก C และ Intel และ AMD จะแข่งขันกันซึ่ง LLVM แบ็คเอนด์ผลิตโค้ด "ดีที่สุด" จาก bitcode ผู้ขายแอปพลิเคชันจะจัดส่งแอปพลิเคชันของตนใน bitcode และการรวบรวมขั้นสุดท้ายจะกระทำกับผู้ใช้ ...
Jörg W Mittag

1
…เครื่องจักร LLVM เริ่มต้นในเวลาที่มันไม่ชัดเจนว่าทุกคนจะใช้ Intel Apple ยังอยู่ใน PowerPC, Intel ยังคงผลักดัน Itanium และอื่น ๆ AFAIK, Apple ยังคงใช้ LLVM ด้วยวิธีนี้ในบางส่วนของเฟรมเวิร์ก 3D โดยที่โค้ดจะถูกส่งเป็น bitcode แล้วคอมไพล์สำหรับ nVidia หรือ ATI ขึ้นอยู่กับชนิดของการ์ดที่ติดตั้ง
Jörg W Mittag

1
ยกโทษให้ฉัน แต่ IR คืออะไร
Adam Copley

คำตอบ:


13

มีคำถามที่เกี่ยวข้องกันจำนวนหนึ่งที่นี่ฉันจะพยายามแยกพวกเขาให้ดีที่สุดเท่าที่จะทำได้

ทำไมภาษาอื่น ๆ จึงสร้าง LLVM IR และไม่ดังกราว AST

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

อย่างไรก็ตามหากคุณกำลังเขียนเครื่องมือสำหรับ C / C ++ เช่นเครื่องมือวิเคราะห์แบบคงที่ดังนั้นการใช้ AST อีกครั้งจึงเป็นเรื่องที่สมเหตุสมผลเพราะการทำงานกับ AST นั้นง่ายกว่าการใช้ข้อความดิบหากคุณทำงานกับ C / C ++ .

ทำไม LLVM IR ถึงเป็นแบบฟอร์ม?

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

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

ดังนั้นการลดภาษาลงใน LLVM IR จึงทำให้นักออกแบบภาษามี "สิ่งฟรี" จำนวนมากซึ่งมีประโยชน์มากในการฝึกฝนทำให้พวกเขามีสมาธิกับภาษานั้นเอง

IR ที่แตกต่างกันจะมีประโยชน์หรือไม่ (ตกลงไม่ใช่ถาม แต่บอกเป็นนัย)

แน่นอน! AST ค่อนข้างดีสำหรับการแปลงบางอย่างในโครงสร้างของโปรแกรม แต่ยากที่จะใช้หากคุณต้องการแปลงการไหลของโปรแกรม แบบฟอร์ม SSA โดยทั่วไปจะดีกว่า อย่างไรก็ตาม LLVM IR อยู่ในระดับต่ำมากดังนั้นโครงสร้างระดับสูงจำนวนมากจึงสูญหาย (โดยมีวัตถุประสงค์เพื่อให้สามารถใช้งานได้โดยทั่วไป) การมี IR ระหว่าง AST และ IR ระดับต่ำสามารถเป็นประโยชน์ได้ที่นี่ ทั้ง Rust และ Swift ใช้แนวทางนี้และมี IR ระดับสูงระหว่างทั้งสอง


Haskell มี IRS จำนวนหนึ่งก่อนที่จะถึง LLVM เช่นกัน
DylanSp

1
@ DylanSp แน่นอน เป็นการเริ่มต้นที่จะเป็นแนวปฏิบัติที่ดีที่สุดสำหรับภาษาที่ซับซ้อน ตัวอย่างเช่น Rust ไม่ได้ทำสิ่งนี้ในตอนแรกและมีการปรับโครงสร้างใหม่เพื่อรวม IR ระดับสูง ฉันยังเชื่อว่ามีบางคนพูดคุยเกี่ยวกับการทำเช่นนี้เพื่อเสียงดังกราว แต่ฉันไม่แน่ใจว่าจะไปที่ไหน
อเล็กซ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.