لینوس توروالدز، خالق کرنل لینوکس، در گفتوگویی که بهتازگی منتشر شده، بار دیگر از زبان برنامهنویسی C بهعنوان انتخاب اصلی خود برای توسعه کرنل دفاع کرد و راز سرعت خیرهکننده لینوکس را نه در یک ترفند خاص، بلکه در انبوهی از بهینهسازیهای خرد و نزدیکی هرچه بیشتر کد به رفتار واقعی سختافزار دانست. این اظهارات که با استقبال گسترده جامعه برنامهنویسان روبهرو شده، بار دیگر توجهها را به یکی از قدیمیترین و پابرجاترین بحثهای دنیای نرمافزار جلب کرده: چرا کرنلی که بیش از سه دهه از عمر آن میگذرد، هنوز هم یکی از سریعترین و کارآمدترین سیستمعاملهای موجود در جهان است؟
در این مقاله، بهجای بازنشر ساده این اظهارات، فلسفه فنی پشت آنها را با مثالهای واقعی از تصمیمات و نوشتههای خود توروالدز در طول سالهای توسعه کرنل لینوکس بررسی میکنیم؛ از نبرد قدیمی C در برابر ++C و Rust گرفته تا نمونهای مشخص از مخالفت او با یک تصمیم فنی جنجالی در کامپایلر.
توروالدز چه گفته؟ خلاصه اظهارات اخیر او درباره کارایی لینوکس
در این گفتوگو، توروالدز بار دیگر تاکید کرد که ترجیح او به زبان C، صرفاً یک عادت قدیمی یا وفاداری احساسی به ابزار آشنا نیست، بلکه ریشه در ویژگیهای فنی این زبان دارد؛ زبانی که به برنامهنویس اجازه میدهد کنترل دقیقی بر نحوه اجرای کد روی سختافزار داشته باشد، بدون لایههای انتزاعی اضافی که در زبانهای سطحبالاتر معمول است.
دفاع از زبان C در برابر ++C و راست (Rust)
توروالدز در گذشته هم بهکرات نقدهای تندی نسبت به ++C مطرح کرده و آن را زبانی دانسته که پیچیدگیهای غیرضروری به کد اضافه میکند و امکان تولید کد باکیفیت پایین را برای برنامهنویسان کمتجربهتر بیشتر میکند. نکته جالب اینجاست که با وجود این دیدگاه سرسختانه نسبت به ++C، کرنل لینوکس در سالهای اخیر رسماً بهسمت پذیرش زبان Rust در کنار C و اسمبلی حرکت کرده است؛ روندی که نشان میدهد مخالفت توروالدز با ++C بیشتر ریشه در نگرانی از پیچیدگی بیمورد دارد تا مخالفت کلی با هر زبان جایگزین C.
بهینهسازی خرد سختافزاری یعنی چه؟
یکی از مفاهیم کلیدی که توروالدز همواره روی آن تاکید داشته، مفهوم «بهینهسازی خرد» یا Micro-optimization است؛ یعنی تغییرات ظاهراً کوچک در نحوه نوشتن کد که تاثیر قابلتوجهی روی سرعت اجرای نهایی آن روی پردازنده میگذارند.
چرا کد خطی (بدون پرش) برای پردازندههای مدرن سریعتر است
در یکی از نوشتههای شناختهشده توروالدز به توسعهدهندگان کرنل، او توضیح داده بود که پردازندههای مدرن در اجرای کد «خطی» (یعنی دستورهایی که بدون پرش شرطی و بهترتیب اجرا میشوند) بسیار کارآمدتر از کدی هستند که پر از پرشهای شرطی است. بهگفته او، جهشهای شرطی در کد، برخلاف دستورهای ساده و پشتسرهم، تقریباً هرگز «رایگان» نیستند و میتوانند عملکرد پردازنده را بهطور محسوسی کند کنند.
مثال عملی؛ چطور یک شرط ساده میتواند کند یا سریع باشد
توروالدز در همان نوشته، یک مثال ساده و کاربردی ارائه داده بود: بهجای نوشتن یک ساختار شرطی که مقدار یک متغیر را در دو شاخه جداگانه if/else تعیین میکند، پیشنهاد او این بود که مقدار پیشفرض ابتدا تعیین شود و تنها در صورت نیاز، شرط آن را تغییر دهد. این تغییر ظاهراً جزئی، به کامپایلر اجازه میدهد بهجای تولید کد پرشی، از دستورهای «انتقال شرطی» (Conditional Move) پردازنده استفاده کند؛ دستوراتی که بدون نیاز به پرش واقعی در جریان اجرای برنامه، همان نتیجه منطقی را تولید میکنند و برای پردازنده بهمراتب سریعتر قابلاجرا هستند.
چرا توروالدز به نزدیکی به سختافزار اهمیت میدهد؟
این نگاه عمیق به رفتار واقعی سختافزار، ریشه در پیشینه شخصی توروالدز دارد. او برنامهنویسی را با کدنویسی مستقیم در سطح باینری و زبان اسمبلی آغاز کرد؛ تجربهای که بهگفته بسیاری از تحلیلگران، پایهگذار مهارت بینظیر او در بهینهسازیهای سطح پایین کد شده است. این پیشینه توضیح میدهد چرا نگاه توروالدز به کارایی نرمافزار، برخلاف بسیاری از برنامهنویسان امروزی که عمدتاً با انتزاعهای سطح بالا کار میکنند، تا این حد به جزئیات نحوه اجرای واقعی دستورات روی پردازنده نزدیک است.
نمونه واقعی از فلسفه توروالدز در تصمیمات کرنل
این فلسفه فنی صرفاً یک بحث نظری در مصاحبهها نبوده و بارها در تصمیمات واقعی توسعه کرنل لینوکس نمود پیدا کرده است.
چرا او با فعالسازی -O3 در کامپایلر مخالفت کرد
یکی از نمونههای شناختهشده این موضوع، مخالفت رسمی توروالدز با تلاش برای فعالسازی سطح بهینهسازی -O3 کامپایلر GCC در فرآیند ساخت کرنل لینوکس بود. دلیل این مخالفت ساده بود: بر اساس تجربه و دادههای موجود، سطح -O3 در طول تاریخ اغلب کدی با کیفیت پایینتر از سطح -O2 تولید کرده است؛ بنابراین از دید توروالدز، افزایش عددی سطح بهینهسازی بهتنهایی تضمینی برای بهبود واقعی کارایی نیست، مگر آنکه با داده و بنچمارک واقعی پشتیبانی شود.
این فلسفه چه درسی برای برنامهنویسان امروزی دارد؟
فراتر از بحث فنی خاص کرنل لینوکس، دیدگاه توروالدز پیامی کاربردی برای هر برنامهنویسی دارد: فارغ از زبان برنامهنویسی مورد استفاده (چه C باشد، چه Python یا JavaScript)، فهم دقیقتر از نحوه رفتار واقعی پردازنده، حافظه و کامپایلر همچنان یک مهارت ارزشمند و اغلب کمتر آموزشدادهشده در دورههای امروزی برنامهنویسی است. در دنیایی که بسیاری از توسعهدهندگان با لایههای انتزاعی فراوان کار میکنند، بازگشت گاهبهگاه به این سطح از تفکر میتواند تفاوت محسوسی در کارایی نهایی نرمافزار ایجاد کند.
سوالات متداول
سوال: چرا لینوس توروالدز زبان C را به ++C و Rust ترجیح میدهد؟
پاسخ: توروالدز معتقد است C کنترل دقیقتری بر نحوه اجرای کد روی سختافزار به برنامهنویس میدهد و از پیچیدگیهای غیرضروری زبانهایی مانند ++C که به گفته او امکان تولید کد ضعیف را افزایش میدهند، دور است.
سوال: بهینهسازی خرد (Micro-optimization) در برنامهنویسی دقیقاً به چه معناست؟
پاسخ: بهینهسازی خرد به تغییرات کوچک و دقیق در نحوه نوشتن کد گفته میشود که بهطور مستقیم روی نحوه اجرای آن روی پردازنده تاثیر میگذارند؛ مانند پرهیز از پرشهای شرطی غیرضروری برای تولید کد سریعتر.
سوال: چرا کد بدون پرش شرطی (Straight-line Code) روی پردازندههای امروزی سریعتر اجرا میشود؟
پاسخ: پردازندههای مدرن در اجرای دستورهای پشتسرهم و بدون پرش بسیار کارآمدتر عمل میکنند؛ در حالی که پرشهای شرطی میتوانند جریان اجرای پردازنده را مختل کرده و کارایی را کاهش دهند.
سوال: آیا رمز سرعت لینوکس فقط به زبان C مربوط است یا عوامل دیگری هم دخیلاند؟
پاسخ: به گفته توروالدز، زبان C تنها بخشی از داستان است؛ عامل اصلی، مجموعهای از بهینهسازیهای خرد و نزدیکی کد به رفتار واقعی سختافزار در طول سالها توسعه کرنل است.
سوال: چرا توروالدز با استفاده از سطح بهینهسازی -O3 در کامپایلر کرنل مخالفت کرد؟
پاسخ: چون بر اساس تجربه و دادههای موجود، سطح -O3 کامپایلر GCC در طول تاریخ اغلب کدی با کیفیت پایینتر از سطح -O2 تولید کرده و از دید او، افزایش سطح بهینهسازی بدون پشتوانه بنچمارک واقعی، تضمینی برای بهبود کارایی نیست.










ارسال پاسخ