زمانی که به برنامهنویسی فکر میکنیم، یک از اولین زبانهایی که به ذهنمان میرسد ++C است که شاید دلیلش هم محبوبیت و کاربردهای وسیع این زبان برنامهنویسی چندمنظوره باشد که در سال ۱۹۸۳ به بازار عرضه شد. از آن زمان تاکنون، زبانهای مدرن دیگری مانند Python یا Java هم منتشر شدهاند اما در پاسخ به این سؤال که چه چیزی است که ++C را در دنیای فناوری، گیمینگ و ... متمایز و مهم میکند، به بررسی مصاحبهٔ صورت گرفته با خالق این زبان (Bjarne Stroustrup) میپردازیم که وی سعی کرده تا نکات مهمی را به اشتراک بگذارد.
چه چیزی باعث شد که ++C را طراحی کنید؟
من به زبانی نیاز داشتم که با استفاده از آن بتوانیم در عملکرد سختافزار دستگاهها به صورت مستقیم دخالت داشته باشم و از همهٔ منابع سختافزاری موجود نهایت استفاده را ببریم. همچنین به زبانی نیاز بود که به من اجازه دهد تا پیچیدگیهای کدها را کنترل کنم. با وجود اینکه زبان C قابلیت دستکاری در سختافزار و همچنین قابلیت کنترل پیچیدگی کدها را به برنامهنویس میداد، اما هیچ زبانی وجود نداشت که هر دوی این کارها را با هم انجام دهد. بنابراین شروع به ساخت یک زبان جدید با اضافه کردن کلاسهای زبان Simula به C کردم.
اولین نسخهٔ ++C را برای چه کسی ساختید؟
من زبانی را برای خودم میخواستم تا بتوانم یک سیستم بر پایهٔ یونیکس بسازم؛ حتی قبل از اینکه ساخت این زبان تمام شود، دوستان و همکارانم در آزمایشگاههای Bell شروع به استفاده از آن برای پروژههایشان خود کردند که معمولاً برای پروژههای شبیهسازی از این زبان استفاده میکردند چرا که اولین نسخه از ++C که من تحت عنوان C with Classes نامگذاری کرده بودم، برای این کار مناسب بود. در یک کلام، ++C را در درجهٔ اول برای خود و همکارانم ساختم اما با توجه به طیف بسیاری از درخواستها و سختافزارهای موجود در آزمایشگاههای Bell، این زبان میبایست با همهٔ آنها قابلانطباق و انعطافپذیر میبود و در نتیجه به مرور زمان دست به تکمیل آن زدم.
نخستین چالشهایی که در ساخت زبان ++C با آنها مواجه شدید چه بود؟
چالشهای زیادی پیش روی من بود زیرا در حال ساخت ابزاری برای استفادهٔ کاربردی بودم تا اینکه در حال پیادهسازی یک پروژهٔ دانشگاهی باشم. ابزاری که در حال ساخت آن بودم میبایست آنقدر خوب میبود که پاسخ تمامی نیازهای دولوپرهای خود را میداد. در واقع، باید بگویم که اگر این ابزار فقط برای یک الی دو نفر به درستی کار میکرد و نه بیشتر، برای ما یک موفقیت محسوب نمیشد.
اولین چالشی که با آن مواجه شدم، طراحی خود زبان بود. سؤال اینجا بود که من و همکارانم به چه ویژگیهایی نیاز داشتیم تا بتوانیم کدهای نوشته شدهٔ خود را سادهسازی کنیم به طوری که پیادهسازی این ویژگیها برای اجرای مقرون به صرفهٔ آنها در محیطهای توسعه و اجرای واقعی نیز در ابتدا کار مشکلی بود. زمانی که زبان آماده شد، نصب و پیادهسازی آن روی سختافزارها و سیستمعاملهای مختلف بسیار دشوار بود مضاف بر اینکه آموزش نحوهٔ استفاده از تکنیکهای این زبان برنامهنویسی جدید به افراد مختلف نیز خود چالشی بزرگ بود. جالب است بدانید که در سال اول من تنها کسی بودم که روی پروژهٔ C with Classes کار میکرم و همکارانم تنها از پروژه حمایت میکردند و نیاز به توضیح نیست که در آن زمان هیچ پروژهٔ رسمیای به نام ++C با یک بودجهٔ مشخص وجود نداشت. اگر واقعیت را بخواهم بگویم، کمکهایی که در آزمایشگاههای Bell دریافت کردم، باعث به وجود آمدن نسخهای از زبان برنامهنویسی ++C شد که امروزه همه میشناسند.
چه نیازی به ++C بود وقتی که C خیلی از کارها را هندل میکرد؟
من ++C را بر پایهٔ C ساختم زیرا نمیخواستم تمام کار را از پلهٔ اول شروع کنم و نیاز به توضیح نیست که اختراع مجدد چرخ (شروع از پلهٔ اول) ایدهٔ خوبی برای اِتمام یک پروژه در مدت زمان محدود نیست. با این حال، زبان C نه در گذشته و نه در حال نمیتواند پیچیدگی کدها را به خوبی ++C مدیریت کند. جالب است بدانید که تکمیل زبان C در طول سالها اغلب تحت تأثیر زبان ++C بوده است! زمانی که من پروژهٔ C with Classes را شروع کردم، استفاده از توابع (که امروز یکی از مؤثرترین مفاهیم انتزاع زبان C میباشد) آنطور که باید و شاید معمول نبود اما حدس میزنم که به وجود آمدن همچنین فیچری در زبان C به خاطر الهام گرفتن از ++C بوده است.
Kernighan و Ritchie در زبان C پروتوتایپهای گوناگونی مانند const ،inline و ... را ارائه نکردند. کسانی که به همراه من روی پروژهٔ ++C کار میکردند، میدانند که حتی GNU Compiler Collection یا به اختصار GCC که در سال ۱۹۸۷ انتشار یافت، هم در آن زمان با ++C طراحی شد و هم امروزه توسعه یافته و تکمیل میگردد.
++C چگونه توانست خلأهای برنامهنویسی را پر کند؟
در ده سال اول انتشار این زبان، تعداد دولوپرهایی که از آن استفاده میکردند هر ۷.۵ ماه یکبار دو برابر میشد و هماکنون (سال 2017) بیش از ۴/۵ میلیون برنامهنویس و دولوپر از زبان ++C استفاده میکنند که این رقم هر ساله ۱۰۰۰۰۰ عدد افزایش مییابد. از اینها که بگذریم، ++C در تمامی نقاط جهان و بسیاری از صنایع از جمله امور مالی، بانکداری، بازیسازی، کارهای اداری، مخابرات، الکترونیک، بازاریابی، تولید و خردهفروشی به کار میرود. با توجه به تجربهٔ شخصیِ من، میشود سیستمهای اِمبدد، محاسبات علمی و گرافیک را نیز به این لیست اضافه کرد.
آیا کامیونیتی اپنسورس کمکی در ایجاد زبانهای موفقی مانند C و ++C کرده است؟
خیر. اولین موفقیتهای C و ++C پیش از ظهور پدیدهای به نام اپنسورس به وجود آمد. با این حال، کمپانی AT&T قدم بعدی را محکم برداشت و اجازهٔ استفاده از C و ++C با هزینههای پایین را داد. برای کمپانیهای غیرانتفاعی، قیمت زبان ما ۷۵ دلار بود که تنها هزینهٔ نوار مغناطیسی که در آن حمل میشد بود (سورس و باینری) و این در حالی بود که هنوز خبری از توزیع سازمانیافتهای بر روی اینترنت نبود اما این شرکت خیلی سریع C و ++C را به سازمان ISO داد تا همه بتوانند از آن استفاده کنند و من خودم هم به کمپانیهای دیگر برای نوشتن کامپایلرهای ++C کمک میکردم. امروزه تعداد زیادی کامپیلر اختصاصی و اپنسورس برای ++C وجود دارد و برای اینکه مطمئن شوم که این کار همگانی میشود، طبق توافقی با At&T، تصمیم به ثبت نکردن ++C و هر گونه پتنت به نام خود گرفتم.
آیا زبان برنامهنویسی دیگری دیدهاید که قابلیت جایگزینی ++C را داشته باشد؟
زبانی را ندیدهام که بتواند جایگزین ++C شود زیرا ایدههای به کار رفته در این زبان هنوز بکر هستند. با این حال، هر زبانی هرچند هم که خوب باشد عمری دارد که در نهایت ممکن است یک زبان جدید با امکانات بیشتر در دسترس دولوپرها قرار گیرد اما در عین حال ++C چند دهه است که پرچمدار این ماجرا است و این در حالی است که هیچ بودجهٔ تجاری یا مالکیت قوی پشتوانهٔ این زبان نبوده است!
ویژگیهای عمدهای که باعث میشوند ++C گزینهٔ آسانتری نسبت به C باشد چه هستند؟
++C به شما تایپ سیستم بهتر، کلاسهایی شامل کانستراکتور و دیستراکتور، اُورلودینگ، پشتیبانی لوکال برای برنامهنویسی شییٔگرا و حتی برنامهنویسی سنتی به مراتب بهتری نسبت به C ارائه میکند.
آیا دولوپرها برای پیشرفت در دنیای برنامهنویسی باید به یادگیری ++C بپردازند؟
نمیدانم که آنها میخواهند ++C را یاد بگیرند یا نه، ولی باید بخواهند که یاد بگیرند! این زبان یکی از اصلیترین زبانهای استفاده شده توسط شرکتها در صنایع مختلف بوده و همچنین بسیار انعطافپذیر است. به علاوه اینکه این زبان بهترین اجرای برنامه را به شما ارائه میکند مضاف بر اینکه به شما امکان دسترسی مستقیم به منابع سختافزاری را میدهد. از این گذشته، ++C از معدود زبانهایی است که به شما اجازه میدهد تا از طیف گستردهای از تکنیکهای اصولی برنامهنویسی استفاده کنید. در ضمن، شما میتوانید در بسیاری از صنایع از ++C استفاده میکنید. البته یادمان نرود که سیپلاسپلاس زبانی محبوب هم هست.
از دید شما کدامیک از کامپایلرهای ++C بهتر است و چرا؟
هیچ کامپایلر مورد علاقهای برای ++C ندارم و تمام کامپایلرهایی که تاکنون دیدهام خوب هستند. آنها مطابق استانداردها هستند، کدهای خوبی تولید میکنند، ابزارهای خوبی دارند و از لایبرریهای اصولی برخوردارند. شما میتوانید کامپایلر مورد نظر خود را بر اساس معیارهایی مانند دسترسی به یک سختافزار خاص، یک تکنیک برنامهنویسی خاص، یک محیط خاص، جابهجاپذیری یا یک ابزار خاص مانند GDB یا ویژوالاستودیو انتخاب کنید (GDB مخفف واژگان GNU Project Debugger است).
آیا درست است بگوییم زبانهایی مثل Java و ++C هنوز برای سیستمهای اِمبدد رایج نیستند؟
زبانهایی همچون Python و Java برای برنامهنویسی سیستمهای به اصطلاح Embedded مناسب نیستند اما در عین حال ++C یک ابزار مهم است زمانی که شما نیاز به بهرهوری انرژی (به عنوان مثال افزایش عمر باتری) خارج از یک گجت دارید اما توجه داشته باشید که هر زبانی را بحر کاری ساختهاند. کدهای زیادی برای سیستمهای اِمبدد در ++C وجود دارد. بهتر است یادآوری کنم که سیستمهای اِمبدد در بسیاری جاها (از دستگاههای قهوهساز گرفته تا سیستم کنترل پرواز هواپیماهای جت، از انژکتورهای سوخت گرفته تا تقویتکنندههای استریو، از کنترلکنندههای باتری یونلیتیوم گرفته تا ماشینهای خودکار) وجود دارند.
به نظر شما خوانا بودن سورسکد در یک زبان برنامهنویسی چقدر اهمیت دارد؟
خوانایی یک باید است به طوری که اگر نتوانید سورسکدی را به راحتی بخوانید، نمیتوانید دربارهٔ درستی آن بحث کنید و این در حالی است که امروزه ++C به مراتب خواناتر از نسخههای قبلی شده است. من پروژهای بلندپروازانه را استارت زدهام که توضیح میدهد کدهای مدرن ++C با استفاده از نسخههای ۱۷، ۱۴، ۱۱ و بالاتر چگونه باید به نظر برسند که این پروژه Core Guildlines نام دارد و یک پروژهٔ اپنسورس است (در این پروژه دولوپرهایی از شرکتهای Morgan Stanley ،Microsoft ،Red Hat و Facebook حضور دارند.)
آیا تفاوت عمدهای میان کامپیوترهای سنتی و دیوایسهای اِمبدد اینترنت اشیاء میبینید؟
البته که تفاوتهایی مانند رابطهای کاربردی باینری (ABI) و نگرانیهای امنیتی وجود دارد، ولی اساس برنامهنویسی و محدودیتها یکسان است و من فکر میکنم که حضور ++C در توسعهٔ هر دوی آنها حائز اهمیت است.
آیندهٔ استانداردهای ++C را چگونه میبینید؟
نسخهٔ بیستم این زبان نسخهٔ بعدی استاندارد در سال ۲۰۲۰ خواهد بود که این نسخه میتواند یک چشمانداز بزرگ و هیجانانگیز باشد و راه را برای ما تغییر دهد، اما همه اینها به کمیتهٔ استانداردها بستگی دارد که این تغییرات را بپذیرند یا نه. برای یک گروه ۲۰۰ نفره از متخصصین و دولوپرها سخت است که ایده بدهند و در حین پیادهسازی هم به آنها پایبند باشند اما این در حالی است که برخی از ما در کمیته این کار را انجام میدهیم.
چه ویژگیهایی در نسخههای جدیدتر این زبان وجود دارد که تجربهٔ برنامهنویسی را بهبود میبخشند؟
اگر نسخههای ۱۱، ۱۴ و ۱۷ این زبان را مقایسه کنیم، میبینیم که هیچ تغییر کلی صورت نگرفته است! در واقع، تغییری در نحوهٔ ساختن یک برنامه به وجود نیامده بلکه از نظر من در هر نسخهٔ جدید یکسری آپدیت کوچک صورت گرفته که البته به دولوپرها پیشنهاد میشود که همواره از نسخههای جدید استفاده کنند. چیزی که در مورد ویژگیهای جدید مهم میباشد این است که چهطور میشود با آنها کدهای بهتری نوشت و منظورم از نوشتن کد بهتر هم این است که چهطور برنامه با استفاده از منابع کمتر، بهتر اجرا شود.
چه توصیهای برای دولوپرهای تازهکار دارید؟
کد جایی است که ایدههای ذهنی، جامعهٔ حقیقت به تن میپوشند و فرآیند توسعهٔ نرمافزار کاملاً با نوشتن چیزی با قلم و کاغذ فرق دارد چرا که در حقیقت ما باید کدی بنویسیم که کار کند. قبل از اینکه به کدنویسی برسید، باید مسئله را درک کنید و شاید بتوانید با یک نگاه کلی به کد نوشته شده، از کارکرد آن سر در بیاورید اما برای اینکه بتوانید در آن تغییرات ایجاد کنید (به طور مثال، باگها را رفع کنید)، باید زیر و بم کد را در بیاورید بهخصوص اینکه مثلاً چه چیزی روی یک خط تأثیر میگذارد یا اینکه کدام خط روی کدام خط دیگر تأثیرگذار است.
هر چیزی که به خواندن کد و رصد کردن رفتار اپلیکیشن کمک کند، به شما نیز کمک خواهد کرد (البته به یاد داشته باشید خواندن خط به خط کد و تنها تلاش کردن برای درک کد به شما کمکی نمیکند.) بنابراین به دنبال یک ابزار مسیریابی خوب برای کدها (مانند یک IDE) باشید و همچنین به دنبال یک همکار خوب برای توضیح کدها و ابزارهای مختلف و مورد نیاز مانند دیباگرها و ... باشید. اگر میخواهید از ++C استفاده کنید، اول به خوبی آن را یاد بگیرید. در حقیقت، ++C مدرن را خوب یاد بگیرید و به دنبال نسخههای قبلی نباشید زیرا با اتخاذ این رویکرد خواهید توانست یک کد بهتر نسبت به آنچه در دههٔ ۹۰ میلادی توسط نسخهٔ یازدهم این زبان نوشته میشد، بنویسید.
دنیای برنامهنویسی را در آینده چگونه میبینید؟
امیدوارانه میگویم که کدها خواناتر و به خاطر سپردن آنها سادهتر خواهد شد. نمیخواهم حرفهای تخیلی بزنم، بنابراین وارد جزئیات نمیشوم اما امیدوارم که من و سیپلاسپلاس در این آینده نقش مهمی داشته باشیم.
حال نوبت به نظرات شما میرسد. چقدر صنعت فناوری، بهخصوص توسعهٔ نرمافزار و گیمینگ، را مدیون زبان ++C میدانید و به نظر شما این زبان چه نقشی در آیندهٔ این حوزه ایفا خواهد کرد؟ نظرات، دیدگاهها و تجربیات خود را با سایر کاربران سکان آکادمی به اشتراک بگذارید.