چرا زبان C هنوز فرمانرواست ؟

گردآوری و تالیف : ارسطو عباسی
تاریخ انتشار : 10 شهریور 1398
دسته بندی ها : برنامه نویسی

زبان برنامه‌نویسی C از سال ۱۹۷۲ تا به اکنون در حوزه برنامه‌نویسی استفاده می‌شود. اما آیا این خلاف دنیای تکنولوژی نیست؟ منظورم آن است که در دنیای تکنولوژی همه چیز به سرعت جایگزین موارد دیگری می‌شود اما در ارتباط با زبان C بدین گونه نبوده.

با گذشت دهه‌ها، زبان‌های برنامه‌نویسی بسیار زیادی بوجود آمده‌اند که برخی از آن‌ها منحصرا برای رقابت با C ایجاد شدند اما نتیجه چنین کاری همانطور که امروز مشاهده می‌کنیم، شکست‌ناپذیری C در مقابل آن‌ها بوده است.

با وجود آنکه افراد بسیار زیادی معتقدند که زبان C باید بازنشسته شود اما هنوز هم با گذشت چنین زمانی، زبانی با کارایی بالای C ساخته نشده است. از طرفی دیگر بسیاری از زبان‌های برنامه‌نویسی موجود از C نشئت گرفته‌اند. 

اما حال در این مطلب قصد داریم تا در ارتباط با حضور C در مقابل زبان‌های برنامه‌نویسی مدرن‌تری صحبت کنیم. با مقایسه این موارد با همدیگر می‌توانیم به این نتیجه دست یابیم که آیا حضور C هنوز موجه است یا خیر.

سی‌ در مقابل سی‌پلاس‌پلاس

سی‌پلاس‌پلاس را می‌توان یک نسخه بسیار پیشرفته‌تر از زبان سی دانست. سی‌پلاس‌پلاس نسبت به سی توانایی انجام کارهای بسیار بیشتری را دارد و گزینه‌های توسعه بیشتری را در اختیار گرفته است.

فضاهای نامی، تمپلیت‌ها، استثناها، مدیریت خودکار حافظه و… ویژگی‌هایی هستند که سی‌پلاس‌پلاس نسبت به سی ارائه می‌کند. پروژه‌هایی که کارایی بالایی نیاز دارند و ارتباط بسیار زیادی با پردازنده و یا کارت گرافیک برقرار می‌کنند معمولا با زبان سی‌پلاس‌پلاس نوشته می‌شوند. 

از طرفی دیگر سی‌پلاس‌پلاس زبانی است که در حال توسعه و گسترش پیدا کردن است. چیزی که ما در سی آن را مشاهده نمی‌کنیم. ویژگی‌های جدید‌تری با گذر زمان به سی‌پلاس‌پلاس اضافه می‌شود که این خود یکی از نقاط برتری این زبان است. 

اما مشکلی که سی‌پلاس‌پلاس در مقابل سی دارد پیچیدگی بسیار زیاد آن است. توسعه‌دهندگان بسیار زیادی وجود دارند که تصمیم گرفته‌اند برای انجام بسیاری از کارهای‌شان از ابزاری مینیمال‌تر مانند سی استفاده کنند. تیم توسعه لینوکس را به عنوان یک مثال در نظر بگیرید، آن‌ها به صورت کامل از سی استفاده می‌کنند و تصمیمی هم برای استفاده از سی‌پلاس‌پلاس ندارند. از طرفی دیگر برای کارهایی مانند کرنل نویسی زبان سی کارایی و سرعت بسیار بیشتری را نسبت به سی‌پلاس‌پلاس ارائه می‌کند که خود این موضوع بسیار مهمی است. 

البته باید در نظر داشت که سی‌پلاس‌پلاس ویژگی‌های بسیار سطح بالاتری نسبت به سی‌ ارائه می‌کند اما اگر قرار باشد که گزینه مینیمال‌تری مانند سی کار شما را راه بیاندازد چه دلیلی برای استفاده از سی‌پلاس‌پلاس وجود دارد.

سی در مقابل جاوا

بعد از چند دهه جاوا هنوز به عنوان ابزار اصلی برای توسعه اپلیکیشن‌های سازمانی باقی مانده است. البته اپلیکیشن‌های مدرن امروزی نیز با استفاده از جاوا ساخته می‌شوند. بسیاری از پروژه‌های بزرگ دنیا به صورت کامل از جاوا استفاده می‌کنند. در این میان می‌شود به اغلب پروژه‌های بنیاد آپاچی اشاره کرد. در هر حال با گذشت این همه سال جاوا هنوز پر قدرت باقی مانده است.

سینتکس جاوا به شدت از سی‌پلاس‌پلاس و سی نشئت می‌گیرد. البته برعکس زبان سی، جاوا به کدهای نیتیو تبدیل نمی‌شود. بجای آن جاوا از محیط اجرایی مخصوص به خود استفاده می‌کند که JVM نام دارد. با استفاده از ماشین مجازی جاوا شما قابلیت آن را خواهید داشت تا کدهای جاوا را در هر جایی اجرا کنید.  از طرفی دیگر برنامه‌های C برای کامل اجرا شدن در سیستم عامل‌های مختلف به میزانی از پیکربندی نیاز دارند. ترکیبی از انتقال‌پذیری و کارایی بالا باعث می‌شود که جاوا زبانی بسیار مناسب برای ایجاد اپلیکیشن‌های مختلف باشد. 

اما با وجود تمام این قضایا جاوا زبانی مناسب برای کارهای سطح پایین‌تر نیست چرا که دسترسی مستقیمی به سخت‌افزار ندارد و برای اجرا شدن نیز از یک ماشین مجازی استفاده می‌کند. از این رو نسبتا برنامه‌های سنگین‌تری داشته و نمی‌تواند برای برنامه‌هایی که نیاز به آخرین سطح از بهینه بودن دارند مناسب باشد. کدهای سی از طرفی دیگر مستقیما به زبان ماشین تبدیل می‌شوند و به همین دلیل می‌توانند برنامه‌های بهینه‌تری برای کامپیوترها بنویسند. 

سی در مقابل سی‌شارپ و .NET

تقریبا دو دهه از ساخت سی‌شارپ و خانواده .NET می‌گذرد و می‌توان گفت که بعد از جاوا محبوب‌ترین تکنولوژی برای توسعه اپلیکیشن‌های سازمانی است. البته باید گفت که خود سی‌شارپ نیز از جاوا موارد بسیار زیادی را به ارث برده است. به همین دلیل می‌شود مزیت‌های گفته شده در بخش قبلی را نیز در همین جا تکرار کرد. این موضوع برای زبان سی نیز به همین صورت است.

در سال‌های اخیر محیط اجرایی .NET توانست در سیستم عامل مختلف حضور یابد و براساس همین موضوع سی‌شارپ به عنوان زبان اصلی این خانواده مانند جاوا به زبانی تبدیل شد که قابلیت اجرا شدن در پلتفرم‌های مختلف را پیدا کرد. یکی از ویژگی‌های اصلی جاوا JIT یا کامپایل به صورت just in time است که کدهای نوشته شده را بهینه می‌کند. چنین قابلیتی را می‌توانید در زبان سی‌شارپ نیز پیدا کنید. انجام چنین کاری در زبان سی امکان‌پذیر نیست.

البته یکی از مزیت‌هایی که سی‌شارپ نسبت به جاوا ارائه می‌کند وجود قابلیت‌هایی برای دسترسی مستقیم به حافظه است. در این حالت توسعه‌دهنده می‌تواند برای بهینه‌تر کردن کارایی کدها به صورت دستی عمل کند. البته قطعا انجام چنین کاری به دانش خاصی نیاز دارد.

اما باز هم این قابلیت دسترسی نسبت به زبان سی با محدودیت‌های خاصی روبروست. از این رو می‌توان سی را باز هم در برخی از کارها مورد نیاز دید.

سی در مقابل GO

گو یکی از زبان‌هایی‌ست که بیشترین شباهت را با سی دارند. می‌توان گفت که برنامه‌نویسانی که زبان سی را به خوبی درک می‌کنند می‌توانند به سادگی سراغ گو نیز بروند. البته این بدان معنا نیست که گو از نظر کارایی برابر با سی است. گو ویژگی‌های سطح بالایی را ارائه می‌کند که در بین آن‌ها می‌توان به سیستم مدیریت پکیج و فضاهای نامی اشاره کرد.

یکی از اهداف اصلی خالقان زبان گو این بوده که آن را تا جایی که می‌توانند خوانا نگه دارند. کار با کدبیس زبان سی تا حدی دشوار است اما گو این مشکل را حل کرده. از طرفی دیگر بسیاری از قابلیت‌های موجود در گو مانند همزمانی و goroutines یا در زبان سی وجود ندارند و یا اگر باشند نیاز است که آن‌ها را به صورت دستی پیاده‌سازی کرد.

گو نیز مانند سی‌شارپ قابلیت‌های لازم برای داشتن دسترسی به حافظه را دارد. این کار در گو از طریق پکیج unsafe انجام می‌شود. البته استفاده از این پکیج براساس قواعد اصلی گو کار چندان صحیحی نیست چرا که ممکن است اپلیکیشن ایجاد شده امن نباشد.

با وجود تمام ویژگی‌های عالی که زبان گو ارائه می‌کند اما باز هم نمی‌توان آن را موردی مناسب برای کرنل‌نویسی، درایورنویسی و کارهای سطح پایین دیگری دانست. به همین دلیل باز هم در مواجه با زبان سی کم و کاستی‌هایی دارد که استفاده از زبان سی را توجیه می‌کند.

سی در مقابل Rust

در بین زبان‌های موجود می‌توان Rust را به عنوان نزدیک‌ترین زبان به سی دانست چرا که قابلیت مدیریت حافظه، تبدیل به کدهای ماشین، کارایی بالا و… را دارد. البته به صورت پیشفرض یک حالت امن برای حافظه در نظر گرفته شده که توسعه‌دهندگان با مشکلات مرسومی برخورد نکنند. Rust با وجود آنکه کدهای امن‌تر و کم باگ‌تری را نسبت به سی تولید می‌کند اما سرعت و کارایی آن پایین نیست و این موضوع خود از اهمیت بالایی برخوردار است.

اما Rust در مقابل سی انعطاف کمتری را در مدیریت حافظه و دسترسی به ویژگی‌های سطح پایین‌تر نشان می‌دهد. از طرفی دیگر C با وجود قدرت بالایی که به توسعه‌دهندگان می‌دهد حجم بسیار کمی داشته و حتی کمتر پیچیده است. اما Rust درست مانند C++ با وجود قدرت بالایی که دارد اما در بعضی از حالات می‌تواند ساده‌تر عمل کند.

سی در مقابل پایتون

امروزه نمی‌توان در جایی صحبت از توسعه نرم‌افزار کرد و پایتون را فراموش نمود. به نظر می‌رسد که پایتون در همه جا حضور دارد. دلایل بسیار زیادی برای این موضوع وجود دارد اما در نهایت می‌توان گفت که منعطف بودن و کاربردپذیری بالایی که پایتون ارائه می‌کند می‌تواند دلیل این میزان از محبوبیت وی باشد.

اما نقطه مقابل پایتون و سی در زمان‌بندی توسعه و اجرا است. پایتون روال توسعه بسیار سریعی دارد اما در اجرا کند است در مقابل سی روال توسعه کندی دارد اما در اجرا بسیار سریع است. اما از آنجایی که سخت‌افزارهای مدرن پیشرفت بسیار زیادی داشته‌اند سرعت پایتون به اندازه کافی می‌تواند پاسخگوی همه کارها باشد. پس مشکلی در این بابت چندان وجود ندارد.

در پایتون مدیریت حافظه و کارایی برنامه به صورت کاملا خودکار مدیریت می‌شوند. از این رو توسعه‌دهنده دسترسی به سطوح پایین یک سخت افزار را ندارد. البته باید گفت که رابطه میان پایتون و سی مانند رابطه دیگر زبان‌ها با همدیگر نیست چرا که محیط اجرایی پایتون در حقیقت با خود C نوشته شده است. همچنین کتابخانه‌های بسیار زیادی وجود دارد که در زبان پایتون اجرا می‌شوند اما در حقیقت آن‌ها نیز با زبان C توسعه پیدا کرده‌اند. 

از آنجایی که خود پایتون نیز با C توسعه پیدا کرده دیگر نیازی به توضیح در ارتباط با نیاز مبرم به زبان C نیست.

در پایان

زبان سی را می‌توان مادر زبان‌های مدرن امروزی دانست. از طرفی دیگر نیز دنیای نرم‌افزار بدون زبان C تقریبا معنی نخواهد داشت. از همین رو بسیار مهم است که جایگاه C را در بین زبان‌های مختلف درک کنیم.

منبع

مقالات پیشنهادی

  • چرا به Context API جدید React نیاز داریم ؟

    چندین سال پیش، Context API به عنوان یک ویژگی آزمایشی با هشدار «این API در آینده می‌تواند بشکند» معرفی شد. با توجه به این که Context API آزمایشی بود، ا...

    عرفان کاکایی