
Machine-Level OOP, Exceptions, and Concurrency
در دنیای مدرن توسعه نرمافزار، زبانهای برنامهنویسی سطح بالا با ارائه لایههای متعدد انتزاع، پیچیدگیهای سختافزار را از چشم برنامهنویس پنهان کردهاند. با این حال، برای مهندسان خبره، توسعهدهندگان موتورهای بازیسازی، محققان امنیت سایبری و سازندگان کامپایلرها، درک آنچه در پایینترین سطح سیستم رخ میدهد، نه یک انتخاب، بلکه یک الزام قطعی است. کتاب هنر برنامهنویسی اسمبلی شصت و چهار بیتی (جلد دوم)، دقیقا از همان نقطهای آغاز میشود که جلد اول این مجموعه بینظیر به پایان رسیده بود. این اثر جامع و تحلیلی، شما را از مفاهیم ابتدایی زبان ماشین عبور داده و وارد قلمرو تکنیکهای پیشرفتهای میکند که تنها نخبگان دنیای برنامهنویسی از آنها آگاه هستند.
این کتاب یک راهنمای ساده برای نوشتن چند خط کد اسمبلی نیست؛ بلکه یک مرجع قطعی برای درک هنر معماری نرمافزار در پایینترین سطح ممکن است. مطالعه این کتاب به شما قدرتی میبخشد تا کدهایی بنویسید که با بالاترین هماهنگی ممکن با پردازندههای مدرن شصت و چهار بیتی اجرا شوند. اگر احساس میکنید که محدودیتهای زبانهای سطح بالا مانع از پیادهسازی ایدههای پیچیده شما شدهاند، صفحات این کتاب کلید رهایی از این محدودیتها را در اختیار شما قرار خواهند داد.
بسیاری از برنامهنویسان با شنیدن نام برنامهنویسی پیشرفته اسمبلی، بلافاصله به یاد بهینهسازی کدهای ریاضی و افزایش سرعت اجرای برنامهها میافتند. اما نویسنده این کتاب با یک دیدگاه کاملا مهندسیشده و تحلیلی، این تصور را به چالش میکشد. شما نمیتوانید چیزی را بهینهسازی کنید، مگر آنکه ابتدا معماری و ساختار آن را به درستی بنا کرده باشید. به همین دلیل، مبحث بهینهسازی به جلد بعدی این مجموعه موکول شده است. در این جلد، تمرکز صد در صدی بر روی الگوهای برنامهنویسی، ساختارهای داده پیشرفته و مفاهیمی است که پیش از این شاید پیادهسازی آنها در زبان ماشین غیرممکن به نظر میرسید.
حجم عظیمی از مفاهیم حیاتی وجود دارند که به دلیل محدودیتهای فیزیکی چاپ و تعداد صفحات، امکان گنجاندن آنها در جلد اول وجود نداشت. با تفکیک این مفاهیم پیشرفته در قالب یک جلد مستقل، خوانندگانی که پیشتر با مبانی اسمبلی آشنا شدهاند، دیگر نیازی به مطالعه مطالب تکراری نخواهند داشت و مستقیما وارد مباحث چالشی و هیجانانگیز خواهند شد.
این کتاب به طور خاص برای کسانی به رشته تحریر درآمده است که مفاهیم پایه برنامهنویسی اسمبلی را به خوبی درک کردهاند. به طور ایدهآل، فرض بر این است که شما جلد اول این مجموعه را به طور کامل مطالعه کردهاید. اما حتی اگر مبانی اسمبلی را از منابع دیگری نیز آموخته باشید، این کتاب به گونهای طراحی شده است که هر برنامهنویس مسلط به زبان ماشین بتواند بدون مشکل مفاهیم آن را درک کرده و در پروژههای خود به کار گیرد. البته باید در نظر داشت که بسیاری از مثالهای ارائه شده در این جلد، بر پایه کتابخانهها و کدهای توسعهیافته در جلد اول بنا شدهاند که این پیوستگی، ارزش آموزشی اثر را دوچندان میکند.
کلمات کلیدی:یکی از مهمترین پیشنیازهای این کتاب، آشنایی با اکوسیستم توسعه نرمافزار مایکروسافت است. این کتاب از اسمبلر ماکروی مایکروسافت که به همراه محیط توسعه یکپارچه ویژوال استودیو ارائه میشود، استفاده میکند. از آنجایی که در جلد اول نحوه نصب و راهاندازی این محیط در سیستمعامل ویندوز به تفصیل شرح داده شده است، در این جلد فرض بر این است که شما با این ابزارها کاملا راحت هستید. اگرچه از نظر تئوری امکان ترجمه ذهنی کدهای این کتاب برای سایر اسمبلرها در سیستمعاملهای دیگر مانند لینوکس یا مک وجود دارد، اما این فرایند میتواند بسیار طاقتفرسا باشد. بنابراین، بیشترین بهرهوری از این کتاب زمانی حاصل میشود که از ابزارهای استاندارد مایکروسافت در محیط ویندوز استفاده کنید.
همچنین فرض بر این است که شما با ابزارهای خط فرمان مایکروسافت مانند ابزار ساخت برنامه، ابزار مدیریت کتابخانهها و پیونددهنده باینری، و همچنین یک ویرایشگر متن حرفهای آشنایی دارید. تسلط بر این ابزارها، سرعت شما را در پیادهسازی مثالهای پیچیده این کتاب به شدت افزایش خواهد داد.
این کتاب در یازده فصل کاملا تخصصی و جامع تدوین شده است که هر یک از آنها به تنهایی میتواند به عنوان یک مرجع مستقل مورد استفاده قرار گیرد. در ادامه به تحلیل دقیق محتوای هر یک از این فصول میپردازیم تا به ارزش علمی و عملی این اثر پی ببرید.
ماکروها در زبان اسمبلی بسیار فراتر از جایگزینی ساده متن هستند. در این فصل، شما با قدرت واقعی تولید کد به صورت خودکار آشنا خواهید شد. نویسنده به شما میآموزد که چگونه با استفاده از ویژگیهای پیشرفته اسمبلر ماکروی مایکروسافت، کدهایی بنویسید که در زمان کامپایل، کدهای اسمبلی دیگری را تولید کنند. این تکنیک که به عنوان برنامهنویسیِ برنامهنویسی (متاپروگرمینگ) شناخته میشود، حجم کدهای تکراری شما را به شدت کاهش داده و ضریب خطای انسانی را به صفر میرساند. شما یاد میگیرید که چگونه ساختارهای کنترلی پیچیده را با استفاده از ماکروها شبیهسازی کرده و خوانایی کدهای سطح پایین خود را به طرز چشمگیری افزایش دهید.
در دنیای جهانیشده امروز، پردازش متون مبتنی بر سیستم کدگذاری اسکی دیگر به هیچ وجه پاسخگوی نیازهای نرمافزاری نیست. نرمافزارهای مدرن باید بتوانند کاراکترهای تمامی زبانهای زنده دنیا را به درستی پردازش کنند. این فصل به طور کامل به نحوه مدیریت، پیمایش و دستکاری رشتههای یونیکد در پایینترین سطح حافظه اختصاص دارد. شما با نحوه ذخیرهسازی این کاراکترها در معماری شصت و چهار بیتی آشنا شده و توابع بسیار قدرتمندی برای جستجو، مقایسه و تبدیل این رشتهها بدون نیاز به کتابخانههای سطح بالا توسعه خواهید داد. این مهارت برای کسانی که در حال توسعه سیستمعاملها یا موتورهای رندر متن هستند، یک ضرورت مطلق است.
اگر تصور میکنید که زبان اسمبلی تنها برای جابجایی دادهها در حافظه است، این فصل دیدگاه شما را برای همیشه تغییر خواهد داد. پردازندههای مدرن مجهز به واحدهای قدرتمند پردازش ممیز شناور هستند که میتوانند پیچیدهترین محاسبات ریاضی را در کسری از ثانیه انجام دهند. در این فصل، پیادهسازی توابع متعالی مانند سینوس، کسینوس، تانژانت، لگاریتم و توابع نمایی به صورت مستقیم و با استفاده از دستورالعملهای سختافزاری آموزش داده میشود. مهندسان هوش مصنوعی، توسعهدهندگان شبیهسازهای فیزیکی و سازندگان موتورهای گرافیکی میتوانند با بهرهگیری از تکنیکهای این فصل، سرعت محاسبات ریاضی نرمافزارهای خود را به حداکثر توان ممکن برسانند.
توابع و رویهها، قلب تپنده هر برنامه ساختاریافتهای هستند. اما در زبانهای سطح بالا، شما هرگز متوجه نمیشوید که متغیرهای محلی چگونه در حافظه موقت (پشته) تخصیص داده میشوند. این فصل یک کالبدشکافی بینظیر از فریمهای پشته ارائه میدهد. شما یاد میگیرید که چگونه کامپایلرهای حرفهای، فضای متغیرهای محلی را مدیریت میکنند و چگونه میتوانید با دستکاری دستی پشته، رویههایی بنویسید که حافظه بسیار کمتری مصرف کرده و با سرعت بیشتری فراخوانی شوند. درک عمیق این مفاهیم، شما را به یک متخصص بیرقیب در حوزه مهندسی معکوس و تحلیل بدافزارها تبدیل خواهد کرد.
با توجه به اینکه پردازندههای امروزی دارای چندین هسته پردازشی هستند، اجرای متوالی دستورات به معنای هدر دادن بخش عظیمی از توان محاسباتی سیستم است. در این فصل بسیار حیاتی، شما وارد دنیای برنامهنویسی همزمان و چندنخی میشوید. اما نه با استفاده از کتابخانههای آماده، بلکه با استفاده از دستورالعملهای اتمی پردازنده. شما با مفاهیم پیچیدهای مانند قفلها، موانع حافظه و شرایط رقابتی آشنا شده و یاد میگیرید که چگونه کدهایی بنویسید که به طور همزمان روی چندین هسته پردازشی بدون هیچگونه تداخلی اجرا شوند. این مهارت برای توسعهدهندگان سیستمهای بلادرنگ و سرورهای پردازش تراکنش با فرکانس بالا، یک مزیت رقابتی خارقالعاده محسوب میشود.
شاید ترکیب برنامهنویسی شیگرا و زبان اسمبلی در نگاه اول یک تناقض به نظر برسد. زبان ماشین به صورت ذاتی هیچ درکی از کلاسها، وراثت یا چندریختی ندارد. اما در این فصل شگفتانگیز، نویسنده به شما نشان میدهد که چگونه زبانهای سطح بالا این مفاهیم را در زیر لایههای خود پیادهسازی میکنند. شما گام به گام با نحوه ساخت جداول توابع مجازی، مدیریت چرخهحیات اشیاء و پیادهسازی وراثت در اسمبلی آشنا خواهید شد. این بخش از کتاب به تنهایی میتواند نگاه شما را به تمام زبانهای برنامهنویسی شیگرا تغییر دهد و به شما بفهماند که در پس پرده کلاسها و متدها، تنها آدرسهای حافظه و پرشهای شرطی قرار دارند.
خطاها و کرشهای سیستمی اجتنابناپذیرند. نرمافزارهای حرفهای نباید با بروز یک خطای ساده به طور کامل از کار بیفتند. سیستمعامل ویندوز مکانیزم بسیار پیچیدهای برای مدیریت ساختاریافته استثناها دارد. در این فصل، شما یاد میگیرید که چگونه به صورت دستی بلوکهای کنترل خطا را در سطح اسمبلی پیادهسازی کنید. شما قادر خواهید بود برنامههایی بنویسید که حتی در مواجهه با خطاهای کشنده سختافزاری مانند تقسیم بر صفر یا دسترسی غیرمجاز به حافظه، کنترل خود را حفظ کرده و به صورت ایمن بازیابی شوند. این سطح از پایداری نرمافزاری تنها از طریق درک عمیق مدیریت استثناها در زبان ماشین امکانپذیر است.
این فصل به یکی از انتزاعیترین و در عین حال قدرتمندترین مفاهیم برنامهنویسی یعنی توابع انتقالی و بستارها میپردازد. این تکنیکها که ریشه در برنامهنویسی تابعی دارند، به شما اجازه میدهند کدهایی بنویسید که در زمان اجرا رفتار خود را تغییر میدهند. با استفاده از تکنیکهای این فصل، شما میتوانید قطعه کدهای پویایی تولید کنید که به عنوان پلی میان رابطهای برنامهنویسی قدیمی و جدید عمل میکنند. سازندگان سیستمعاملها و توسعهدهندگان ماشینهای مجازی به طور گسترده از این تکنیکها برای مدیریت فراخوانیهای پیچیده سیستمی استفاده میکنند.
انتقال اطلاعات به توابع در زبان اسمبلی معمولا از طریق ثباتهای پردازنده یا پشته انجام میشود. اما زمانی که نیاز به انتقال ساختارهای داده عظیم و پیچیده دارید، روشهای استاندارد کارایی خود را از دست میدهند. این فصل به بررسی قراردادهای فراخوانی پیشرفته میپردازد. شما یاد میگیرید که چگونه مکانیزمهای اختصاصی خود را برای انتقال پارامترها طراحی کنید تا گلوگاههای عملکردی را به طور کامل از بین ببرید. درک این قراردادها برای پیوند دادن کدهای اسمبلی با زبانهایی مانند سی، پایتون یا راست، کاملا ضروری است.
پردازش مجموعههای بزرگ داده نیازمند حلقههای تکرار بهینهسازی شده است. در این فصل، الگوی طراحی تکرارکنندهها به دنیای زبان ماشین آورده میشود. شما با نحوه طراحی ماشینهای حالت آشنا میشوید که میتوانند ساختارهای داده پیچیده مانند درختها و لیستهای پیوندی را با کمترین سربار پردازشی پیمایش کنند. استفاده از تکرارکنندهها در اسمبلی باعث میشود کدهای شما علاوه بر سرعت بالا، ساختار منطقی بسیار واضحتری داشته باشند و مدیریت حافظه در آنها به مراتب سادهتر شود.
در آخرین فصل از این شاهکار مهندسی، یکی از مدرنترین مفاهیم کنترل جریان برنامه یعنی چندوظیفگی مشارکتی آموزش داده میشود. در حالی که سیستمعامل وظیفه مدیریت ریسمانهای سنگین را بر عهده دارد، شما در این فصل یاد میگیرید که چگونه ریسمانهای سبک (فایبرها) و روالهای همیار را در سطح برنامه خود پیادهسازی کنید. این تکنیکها به شما اجازه میدهند هزاران عملیات ورودی و خروجی را به صورت همزمان و ناهمگام مدیریت کنید، بدون آنکه نیازی به درگیر کردن سیستمعامل و تحمل سربار تغییر بستر (کانتکست سوییچ) داشته باشید. این دقیقا همان تکنولوژی قدرتمندی است که در پسزمینه موتورهای پردازشی مدرن قرار دارد و اکنون شما قدرت پیادهسازی آن را از پایه در اختیار خواهید داشت.
شاید از خود بپرسید در دورانی که کامپایلرهای هوشمند کدهای ما را بهینهسازی میکنند، چه نیازی به مطالعه عمیق زبان ماشین وجود دارد؟ پاسخ در کلمه «کنترل» نهفته است. برنامهنویسانی که تنها به زبانهای سطح بالا تکیه میکنند، همواره در چارچوب محدودیتهایی که سازندگان کامپایلرها برای آنها تعیین کردهاند، محبوس میمانند. اما کسی که به مفاهیم پیشرفته اسمبلی مسلط است، محدودیتها را خودش تعیین میکند.
مطالعه دقیق این کتاب، تفکر تحلیلی شما را دگرگون خواهد کرد. پس از پایان این کتاب، شما دیگر کدهای نوشته شده با زبانهای دیگر را به عنوان کلمات و جملات نمیبینید، بلکه آنها را به عنوان جریانهایی از داده در ثباتهای پردازنده و تغییرات در حافظه پشته تصور خواهید کرد. این تغییر دیدگاه، همان مرز باریکی است که یک برنامهنویس معمولی را از یک معمار برجسته سیستمهای نرمافزاری جدا میکند.
با تهیه این اثر بینظیر و اضافه کردن آن به کتابخانه تخصصی خود، شما گنجینهای از دانش مهندسی را در اختیار خواهید داشت که در هیچ آموزشگاه یا دانشگاهی با این سطح از جزئیات و دقت تدریس نمیشود. تمرینها و مثالهای عملی این کتاب به گونهای طراحی شدهاند که ذهن شما را به چالش کشیده و مهارتهای حل مسئله شما را در مواجهه با پیچیدهترین مشکلات نرمافزاری به شدت ارتقا دهند. اگر آمادهاید تا از منطقه امن خود خارج شده و تسلط کامل و بلامنازع بر پردازندههای مدرن پیدا کنید، این کتاب دقیقا همان راهنمایی است که به دنبال آن بودهاید.
نمونه چاپ کتاب موجود نیست.
نظرات کاربران (0)