کتاب LLVM Code Generation: A deep dive into compiler backend development (تولید کد در LLVM: نگاهی عمیق به توسعه بخش پشتی کامپایلر) به فرآیند پیچیده تولید کد در LLVM، که بخش حیاتی توسعه کامپایلر است، میپردازد.
این کتاب با تمرکز بر بکاند (Backend) کامپایلر، چگونگی تبدیل کد میانی LLVM (LLVM IR) به کد ماشین بهینهشده برای معماریهای مختلف سختافزاری را به صورت عمیق بررسی میکند. مطالعه این کتاب برای مهندسانی که علاقهمند به درک و توسعه بخشهای پایانی کامپایلرها، به خصوص در اکوسیستم LLVM، هستند، بسیار مفید و کاربردی خواهد بود.)
در ادامه مقدمهای از کتاب LLVM Code Generation را از زبان نویسنده شرح خواهیم داد.
مقدمهای بر کتاب LLVM Code Generation:
به LLVM Code Generation خوش آمدید
زیرساخت LLVM مجموعهای از کتابخانههاست که میتوانند برای ساخت ابزارهای مختلفی که بازنماییهای میانی (IRs) را دستکاری میکنند، و به ویژه کامپایلرها – یعنی ابزارهایی که یک زبان ورودی (برای مثال، C++) را به یک زبان خروجی (برای مثال، کد اسمبلی x86) ترجمه میکنند، در حالی که معنای زبان ورودی را حفظ میکنند – به کار روند. یکی از شناختهشدهترین پروژههای مبتنی بر LLVM، ابزار زنجیره C++ Clang است.
در کتاب LLVM Code Generation، ما بر استفاده از زیرساخت LLVM برای نوشتن بکاندهای کامپایلر تمرکز میکنیم – یعنی بخشی از کامپایلر که مسئول تولید کد اسمبلی برای یک معماری خاص مانند واحدهای پردازش مرکزی (CPU) AArch64 یا x86 برای نوشتن بکاندها است.
یک بکاند LLVM حول دو IR اصلی میچرخد: LLVM IR و Machine IR. تفاوت بین این بازنماییها در این مرحله اهمیت ندارد؛ آنچه مهم است این است که شما باید یاد بگیرید چگونه هر دو را دستکاری کنید تا بتوانید یک بکاند در LLVM بنویسید.
LLVM IR قبلاً به طور گسترده در ادبیات پوشش داده شده است، اما Machine IR (بخشهایی که به بازنمایی اسمبلی نزدیکتر هستند) پوشش داده نشده است.
کتاب LLVM Code Generation قصد دارد این شکاف را با توضیح نحوه عملکرد و مثالهای عملی که پیادهسازی مفاهیم را نشان میدهند، پر کند. ما همچنین LLVM IR و مکانیسمهای مربوط به آن را پوشش خواهیم داد تا تصویری کامل از زیرساخت LLVM به شما ارائه دهیم و به شما کمک کنیم تا بفهمید چگونه همه چیز در یک بکاند کاملاً کاربردی که از LLVM IR به کد اسمبلی میرسد، به هم متصل میشوند.
به طور خلاصه، برای درک کامل قابلیتهای زیرساخت LLVM، این کتاب هر جزء درگیر در تولید کد اسمبلی، از جمله LLVM IR، خط لوله Pass، TableGen (زبان خاص دامنه (DSL) خود LLVM)، و بکاند TableGen مربوطه، Machine IR، و بخشهایی از لایه کد ماشین (MC) را پوشش میدهد.
کتاب LLVM Code Generation برای چه کسانی است؟
این کتاب برای افرادی است که میخواهند از زیرساخت LLVM برای نوشتن بکاندهای جدید یا اصلاح/توسعه بکاندهای موجود استفاده کنند.
ما کتاب LLVM Code Generation را برای افرادی که هیچ دانشی از بکاندهای کامپایلر ندارند، تهیه کردهایم. این بدان معناست که تمام مفاهیم استفاده شده ابتدا معرفی و توضیح داده میشوند تا نیازی به دانش قبلی از بکاند کامپایلر نباشد. ما معتقدیم این کتاب مقدمهای خوب برای هر کسی است که میخواهد با بخش تولید کد (codegen) یک ابزار زنجیره کامپایلر شروع کند، چه با کامپایلرها و LLVM آشنا باشد یا نباشد.
به ویژه، مفاهیم معرفی شده در کتاب LLVM Code Generation برای هر کامپایلری کاربرد دارد، و LLVM تنها یک پیادهسازی ممکن از چنین مفاهیمی است. به عبارت دیگر، ما معتقدیم که محتوای این کتاب ممکن است برای دانشجویان و متخصصان کامپایلر فراتر از LLVM نیز مفید باشد. البته، بسیاری از محتوای این کتاب هنوز مختص LLVM است.
به طور خلاصه، چه در زمینه کامپایلرها تازه وارد باشید، چه در LLVM تازه وارد باشید، یا در بکاندهای LLVM تازه وارد باشید، ما معتقدیم که در کتاب LLVM Code Generation چیزی مفید خواهید یافت.
کتاب LLVM Code Generation چه چیزی را پوشش میدهد؟
فصل 1، ساخت LLVM و درک ساختار دایرکتوری، پروژه LLVM را معرفی میکند، نحوه ساخت آن را آموزش میدهد و توضیح میدهد که کل پروژه چگونه سازماندهی شده است. این به شما امکان میدهد تا با پروژه LLVM شروع کنید و یک گام کلیدی برای شروع صحیح است.
فصل 2، مشارکت در LLVM، شما را به تعامل با جامعه منبع باز راهنمایی میکند و گامهای مشخصی را که میتوانید برای مشارکت در پروژه بردارید، به شما میدهد. به ویژه، این فصل از کتاب LLVM Code Generation، عناصر مشخصی را در مورد نحوه کمک گرفتن از جامعه منبع باز به شما ارائه میدهد.
فصل 3، مبانی کامپایلر و نحوه نگاشت آنها به APIهای LLVM، مفاهیم مورد استفاده در کامپایلرها را معرفی میکند و به شما آموزش میدهد که کدام رابطهای برنامهنویسی کاربردی (API) LLVM را میتوانید برای دستکاری آنها استفاده کنید. این فصل از کتاب LLVM Code Generation، برای درک خوب بقیه کتاب LLVM Code Generation اساسی است، زیرا دانش اصلی آنچه را که در یک کامپایلر مانند LLVM دستکاری میکنید، به شما میدهد.
فصل 4، نوشتن اولین بهینهسازی شما، به شما میآموزد که چگونه بهینهسازیهای خود را با استفاده از زیرساخت LLVM ایجاد کنید. علاوه بر این، مفاهیم پیشرفته کامپایلر را که باید هنگام کار با بهینهسازیها بدانید، معرفی میکند.
فصل 5، کار با Pass Managers، توضیح میدهد که چگونه مدیران Pass را درک، اشکالزدایی و دنباله بهینهسازیهای خود را با هر دو مدیر Pass قدیمی و جدید بسازید. LLVM با خطوط لوله Pass از پیش موجود عرضه میشود، و برای اینکه بتوانید آنها را گسترش دهید یا یک خط لوله جدید بسازید، درک نحوه عملکرد مدیران Pass مهم است. این دانش برای ساخت کامپایلر بهینهساز خود کلیدی است.
فصل 6، TableGen – چاقوی سوئیسی LLVM برای مدلسازی، نحو TableGen را به شما آموزش میدهد، نحوه ادغام آن با بقیه زیرساخت LLVM را نشان میدهد و دستورالعملهایی را برای اشکالزدایی آن به شما میدهد.
از گزینههای خط فرمان تا رمزگذاری دستورالعملها، تعریف Intrinsics، توصیف کلاسهای رجیستر و غیره، TableGen ابزاری فراگیر است که در کل زیرساخت LLVM استفاده میشود. به لطف این فصل کتاب LLVM Code Generation، با اطمینان به وظایف مدلسازی که در فصول بعدی مورد نیاز است، نزدیک خواهید شد.
فصل 7، درک LLVM IR، یک نمای کلی از LLVM IR و نحوه درک آن را ارائه میدهد. LLVM IR ستون فقرات زیرساخت LLVM است و به این ترتیب، درک آن اولین قدم برای بهینهسازی یا به طور کلی تبدیل آن است.
فصل 8، بررسی Passهای موجود، یک نمای کلی از بهینهسازیها و تحلیلهایی که زیرساخت LLVM ارائه میدهد، به شما میدهد. این فصل از کتاب LLVM Code Generation، همچنین APIهای کلیدی را که ممکن است برای بهرهمندی حداکثری از بهینهسازیها و تحلیلهای مربوطه نیاز به پیادهسازی داشته باشید، نشان میدهد. به لطف این دانش، شما قادر خواهید بود از هر آنچه زیرساخت LLVM ارائه میدهد برای ساخت خط لوله بهینهسازی عالی استفاده کنید.
فصل 9، معرفی ساختارهای خاص هدف، به جزئیات چگونگی افزایش زیرساخت LLVM با اطلاعات خاص هدف و به ویژه نحوه افزودن یک بکاند جدید در زیرساخت میپردازد. این فصل از کتاب LLVM Code Generation، برای تنظیم ارتباطات بین زیرساخت LLVM و بکاند شما کلیدی است تا LLVM بتواند شروع به تولید عناصری کند که مختص بکاند شما هستند.
فصل 10، اشکالزدایی عملی LLVM IR Passها، مکانیسمهای موجود برای کمک به اشکالزدایی با Passهای LLVM IR را توضیح میدهد، از جمله نحوه استفاده از مکانیسم لاگینگ، ابزارهایی برای کاهش خودکار اندازه ورودیهای شما، و نحوه تعامل با زیرساخت LLVM در یک دیباگر.
فصل 11، شروع با بکاند، به شما در مورد Machine IR آموزش میدهد و به شما نشان میدهد که چگونه قطعات کلیدی بکاند خود را برای شروع فرآیند تولید کد پیادهسازی کنید. این اطلاعات برای تعامل با Machine IR کلیدی است.
فصل 12، شروع با لایه کد ماشین، لایه MC را معرفی میکند و به شما نشان میدهد که چگونه توضیحات دستورالعملهای بکاند خود را با اطلاعات رمزگذاری که در نهایت برای تولید فایل شیء نهایی استفاده میشود، تکمیل کنید.
فصل 13، خط لوله Machine Pass، به شما در مورد خط لوله تولید کد پیشفرض که زیرساخت LLVM ارائه میدهد، مراحل مختلفی که Machine IR از آن عبور میکند، و نحوه تزریق بهینهسازیهای خود در آن خط لوله آموزش میدهد. به لطف این اطلاعات، شما قادر خواهید بود خط لوله تولید کد را بر اساس نیازهای خود سفارشی کنید.
فصل 14، شروع با انتخاب دستورالعمل، چارچوبهای LLVM مسئول ترجمه LLVM IR به Machine IR را معرفی میکند، به شما نشان میدهد که چگونه هر یک از آنها را به خط لوله تولید کد خود متصل کنید، نحوه دستکاری IRهای داخلی آنها را نشان میدهد، و به شما میآموزد که چگونه یک اسکلت از یک انتخابکننده دستورالعمل با استفاده از این چارچوبها ایجاد کنید.
فصل 15، انتخاب دستورالعمل – فاز ساخت IR، به جزئیات کاهش LLVM IR به IR عمومی چارچوبهای انتخاب دستورالعمل میپردازد. این شامل نشان دادن چگونگی کاهش رابط باینری برنامه (ABI) بکاند شما است.
فصل 16، انتخاب دستورالعمل – فاز قانونیسازی، به شما میآموزد که چگونه IR عمومی چارچوبهای انتخاب دستورالعمل را به چیزی که هدف شما پشتیبانی میکند، تبدیل کنید.
فصل 17، انتخاب دستورالعمل – فاز انتخاب و فراتر از آن، فرآیند انتخاب دستورالعمل را با مرحله نهایی این تبدیل با نشان دادن نحوه تولید دستورالعملهای خاص هدف و نحوه استفاده از برخی از قابلیتهای چارچوبهای انتخاب دستورالعمل برای اشکالزدایی و بهینهسازی خط لوله انتخاب دستورالعمل، به پایان میرساند.
فصل 18، زمانبندی دستورالعمل، به شما میآموزد که چگونه از زیرساخت زمانبندی دستورالعمل برای تولید توالیهای کد بسیار بهینهشده استفاده کنید.
فصل 19، تخصیص رجیستر، بازنماییهای مورد استفاده در LLVM را که به مفهوم زیستبودن رجیستر میپردازند، معرفی میکند و به شما میآموزد که چگونه قطعات کلیدی را برای اجازه دادن به زیرساخت LLVM برای انجام تخصیص رجیسترها ارائه دهید. این بخش از پیادهسازی در تولید کد برای برنامههایی که چیزی بیش از مثالهای اسباببازی هستند، کلیدی است.
فصل 20، کاهش طرحبندی پشته، شما را در پیادهسازی کاهش طرحبندی پشته بکاند خود راهنمایی میکند. طرحبندی پشته بخش مهمی از ABI هدف شماست، و پیادهسازی آن یک گام اجباری برای پشتیبانی از هر چیزی فراتر از مثالهای اسباببازی است. این فصل از کتاب LLVM Code Generation، همچنین به موارد گوشهای که ناگزیر هنگام کاهش پشته خود با آنها روبرو میشوید، مانند تمام شدن رجیسترها هنگام گسترش آفستهای پشته، و نوع کمکهایی که زیرساخت LLVM برای خارج کردن شما از این موقعیتها ارائه میدهد، میپردازد.
فصل 21، شروع با اسمبلر، کتاب LLVM Code Generation را با نشان دادن اینکه چگونه آنچه را که پیادهسازی کردهاید برای تولید فایل شیء نهایی به هم میآید و به شما میآموزد که چگونه مفاهیم خاص این بخش از ابزار زنجیره کامپایلر، مانند جابجاییها (relocations)، را پیادهسازی کنید، به پایان میرساند. مفاهیم معرفی شده شما را به دنیای جذاب ابزارهای باینری باز میکند و سفر شما را در دنیای بکاند کامپایلر به پایان میرساند.
سرفصلهای کتاب LLVM Code Generation:
- Preface
- Getting Started with LLVM
- Building LLVM and Understanding the Directory Structure
- Contributing to LLVM
- Compiler Basics and How They Map to LLVM APIs
- Writing Your First Optimization
- Dealing with Pass Managers
- TableGen – LLVM Swiss Army Knife for Modeling
- Middle-End: LLVM IR to LLVM IR
- Understanding LLVM IR
- Survey of the Existing Passes
- Introducing Target-Specific Constructs
- Hands-On Debugging LLVM IR Passes
- Introduction to the Backend
- Getting Started with the Backend
- Getting Started with the Machine Code Layer
- The Machine Pass Pipeline
- LLVM IR to Machine IR
- Getting Started with Instruction Selection
- Instruction Selection: The IR Building Phase
- Instruction Selection: The Legalization Phase
- Instruction Selection: The Selection Phase and Beyond
- Final Lowering and Optimizations
- Instruction Scheduling
- Register Allocation
- Lowering of the Stack Layout
- Getting Started with the Assembler
- Other Books You May Enjoy
- Index
جهت دانلود کتاب LLVM Code Generation میتوانید پس از پرداخت، دریافت کنید.
دیدگاهها
هیچ دیدگاهی برای این محصول نوشته نشده است.