زبان سی یک میراث قدیمی دوست داشتنی و همچنان پر قدرت
سی (C) یک زبان برنامهنویسی از نوع همهمنظوره، کامپایلشونده، سطح میانی، ساختیافته، دستوری و روندگرا میباشد که در سال ۱۹۷۲ توسط دنیس ریچی در آزمایشگاههای بل ساخته شد. در سال ۱۹۶۷ مارتین ریچاردز زبان BCPL را برای نوشتن نرمافزارهای سیستمعامل و کامپایلر در دانشگاه کمبریج ابداع کرد. سپس در سال ۱۹۷۰ کن تامسون زبان B را بر مبنای ویژگیهای زبان BCPL نوشت و از آن برای ایجاد اولین نسخههای سیستمعامل یونیکس در آزمایشگاههای بل استفاده کرد. زبان C در سال ۱۹۷۲ توسط دنیس ریچی از روی زبان B و BCPL در آزمایشگاه بل ساخته شد و ویژگیهای جدیدی همچون نظارت بر نوع دادهها نیز به آن اضافه شد. ریچی از این زبان برای ایجاد سیستمعامل یونیکس استفاده کرد اما بعدها اکثر سیستمعاملهای دیگر نیز با همین زبان نوشته شدند. استفاده گسترده این زبان در انواع کامپیوترها و سختافزارهای مختلف باعث شد که نسخههای مختلفی از این زبان بهوجود آید که با یکدیگر ناسازگار بودند. در سال ۱۹۸۳ مؤسسه استانداردهای ملی آمریکا (ANSI) کمیتهای موسوم به X3J11 را را مأمور کرد تا یک تعریف فاقد ابهام و مستقل از ماشین را از این زبان تدوین نماید. در سال ۱۹۸۹ این استاندارد تحت عنوان ANSI C به تصویب رسید و سپس در سال ۱۹۹۰، سازمان بینالمللی استانداردسازی (ISO) نیز این استاندارد را پذیرفت و مستندات مشترک آنها تحت عنوان ANSI/ISO C منتشر گردید. سی دارای امکاناتی برای برنامهنویسی ساخت یافته است و دامنه متغیر واژگان را امکانپذیر میسازد. سیستم نوع ایستا آن از انجام عملیات ناخواسته جلوگیری میکند. در C، کلیه کدهای اجرایی در زیر برنامهها (که «توابع» نیز نامیده میشوند وجود دارد، گرچه به معنای برنامهنویسی کاربردی کاملاً دقیق نیست). پارامترهای عملکرد همیشه توسط مقدار منتقل میشوند. گذر توسط مرجع در C با عبور صریح مقادیر اشاره گر شبیهسازی میشود. متن منبع برنامه C با فرمت آزاد است و با استفاده از دکتر کلمات به عنوان یک اصطلاح کننده بیان و بندهای فرفیژه برای گروهبندی جملهها استفاده میشود. در حالی که C ویژگیهای خاصی را که در زبانهای دیگر یافت میشود (مانند جهتیابی اشیاء و جمعآوری زباله)، این موارد را میتوان پیادهسازی یا تقلید کرد، غالباً با استفاده از کتابخانههای خارجی (به عنوان مثال، سیستم اشیاء GLib یا جمعآوری زباله Boehm). بسیاری از زبانهای نسل بعد بهطور مستقیم یا غیرمستقیم از C وام گرفتهاند، از جمله C ++ , C #، C , Unix’s C shell , D، Go , Java , JavaScript (از جمله ترانسپلرها)، Limbo , LPC , Objective-C، Perl , PHP , Python , Rust, Swift, Verilog و SystemVerilog (زبانهای توصیف سختافزار). این زبانها بسیاری از ساختارهای کنترلی خود و سایر ویژگیهای اصلی را از C. ترسیم کردهاند. بیشتر آنها (پایتون یک استثناء چشمگیر) نیز نحو کاملاً مشابهی را با C نشان میدهند، و آنها تمایل دارند ترکیب و نحو قابل تشخیص C را با نوع زیرین ترکیب کنند. سیستمها، مدلهای دادهها و معنایی که میتوانند تفاوت چشمگیری با یکدیگر داشته باشند. در سال ۲۰۰۷، کار روی تجدید نظر در مورد استاندارد C، بهطور غیررسمی به نام “C1X” تا انتشار رسمی آن در تاریخ ۲۰۱۱-۱۲-۰۸ آغاز شد. کمیته استاندارد C دستورالعملهایی را برای محدود کردن استفاده از ویژگیهای جدید که توسط آزمایشهای موجود آزمایش نشدهاند، اتخاذ کردهاست. استاندارد C11 چندین ویژگی جدید به C اضافه میکند و کتابخانه، از جمله ماکرو نوع عمومی، ساختارهای ناشناس، پشتیبانی بهبود یافته یونیکد، عملیات اتمی، چند رشتهای و عملکردهای محدود شده را بررسی میکند. همچنین برخی از بخشهای موجود در کتابخانه C99 را به اختیاری تبدیل کرده و سازگاری با ++C را بهبود میبخشد. کلان استاندارد __STDC_VERSION__ به عنوان 201112L تعریف شدهاست تا نشان دهد که پشتیبانی C11 در دسترس است. C18 که در ژوئن سال ۲۰۱۸ منتشر شده استاندارد فعلی زبان برنامهنویسی C است. این معرفی هیچ ویژگی جدید زبان نداشت، فقط اصلاحات فنی و شفاف سازی در مورد نقص C11 را ارائه میدهد. کلان استاندارد __STDC_VERSION__ با عنوان 201710L تعریف شدهاست.
زبان سی پلاس پلاس، نسخه قدرتمندتر زبان سی
سی پلاس پلاس (++C) یک زبان برنامهنویسی همهمنظوره، سطح میانی و شیءگرا است که از برنامهنویسی رویهای، تجرید دادهها و برنامهنویسی شیءگرا پشتیبانی میکند. این زبان دارای قابلیتهای انواع داده ایستا، نوشتار آزاد، چندمدلی، معمولاً زبان ترجمهشده با پشتیبانی از برنامهنویسی ساختیافته، برنامهنویسی شیءگرا، برنامهنویسی جنریک است. از آنجا که در ++C اشیاء را میتوان ابتدا به ساکن از کلاسهایی ایجاد کرد که به هیچگونه سلسله مراتب ردهها و وراثت مقید نیستند، لذا ++C از برنامهسازی شیء بنیاد (object-based programming) نیز پشتیبانی میکند. سی پلاس پلاس به همراه C از پرطرفدارترین زبانهای برنامهنویسی هستند. سی پلاس پلاس یک زبان سطح میانی در نظر گرفته میشود؛ این زبان دارای قابلیتهای زبانهای برنامهنویسی سطح بالا و زبانهای برنامهنویسی سطح پایین بهصورت همزمان است. در ابتدا ویژگیهای کلاس، کلاسهای مشتق شده، کنترل نوع قوی، توابع درونخطی و آرگومانهای پیشفرض از طریق Cfront به C اضافه شد. اولین نسخه تجاری در سال ۱۹۸۵ ارائه شد. در سال ۱۹۸۳ نام زبان از «C با کلاس» به سی پلاس پلاس تغییر یافت. ویژگیهای دیگر شامل توابع مجازی، سربارگزاری عملگر و نام تابع، ارجاعات، ثوابت، کنترل حافظه توسط کاربر بهصورت آزاد، کنترل نوع بهتر، و توضیحات یکخطی به صورت BCPL با استفاده از «//» نیز به آن اضافه شد. در سال ۱۹۸۵ اولین نسخه زبان برنامهنویسی ++C انتشار یافت و مرجع مهمی برای این زبان فراهم شد در حالی که هیچ استاندارد رسمیای وجود نداشت. در سال ۱۹۸۹ ویرایش ۲٫۰ از زبان ++C ارائه شد. ویژگیهای جدیدی مانند ارثبری چندگانه، کلاسهای انتزاعی، اعضای ایستای توابع، اعضای ثابت تابع، و اعضای حفاظت شده به آن اضافه شد. در سال ۱۹۹۰ «راهنمای مرجع ++C» منتشر شد. این کار بنیان استانداردهای بعدی شد. آخرین ویژگیهای اضافه شده شامل موارد زیر بودند: قالب توابع، استثناها، فضاهای نام، تبدیلات جدید، و یک نوع داده منطقی. در حین تکامل سی پلاس پلاس کتابخانه استاندارد سی++ نیز بهوجود آمد. اولین نسخه کتاب استاندارد شامل کتابخانه جریانات I/O بود که جایگزین printf و scanf شد. در ادامه مهمترین ویژگی اضافه شده Standard Template Library بودهاست. در کتاب «طراحی و تکامل ++C» استراستروپ قوانین مورد استفاده در طراحی سی پلاس پلاس را اعلام کرد که از مهمترین آنها میتوان به موارد زیر اشاره کرد: سی پلاسپلاس طراحی شده تا یک زبان عمومی با کنترل نوع ایستا و همانند C قابل حمل و پربازده باشد، سی پلاسپلاس اجازه میدهد تا مستقیماً و به صورت جامع از چندین شیوه برنامهنویسی بتوان استفاده کرد (برنامهنویسی ساختیافته، برنامهنویسی شیگرا، انتزاع داده، و برنامهنویسی جنریک)، سی پلاسپلاس به برنامهنویس امکان انتخاب دهد حتا اگر این انتخاب اشتباه باشد، سی پلاسپلاس طراحی شده تا حداکثر تطابق با C وجود داشته باشد و یک انتقال راحت از C را ممکن سازد، سی پلاسپلاس از بهکار بردن ویژگیهای خاص که مانع از عمومی شدن است خودداری مینماید، سی پلاسپلاس از ویژگیهایی که بهکار برده نمیشوند استفاده نمیکند و در نهایت سی پلاسپلاس طراحی شده تا بدون یک محیط پیچیده عمل نماید. در مقایسه با C زبان سی پلاس پلاس ویژگیهای جدیدی را معرفی نمودهاست مانند تعریف متغیر به عنوان عبارت، تغییر نوعهای همانند تابع، نو/حذف، نوع داده bool، توابع درونخطی، آرگومان پیشفرض، گرانبارسازی عملگر و تابع، فضای نام و عملگر تعیین حوزه ::، کلاسها (شامل تمام ویژگیهای مربوط به کلاسها همانند وراثت، اعضای تابع، توابع مجازی، کلاسهای انتزاعی، و سازندهها)، قالبها، پردازش استثناء، کنترل نوع زمان اجرا، عملگرهای سربار شده ورودی (<<) و خروجی (>>). برخلاف باور عموم سی پلاس پلاس نوع داده ثابت را معرفی ننموده است. کلمه const قبلتر توسط زبان سی به صورت رسمی استفاده میشد. در برخی مواقع سی پلاسپلاس تعداد کنترل نوع بیشتری نسبت به زبان C انجام میدهد. توضیحات با استفاده از // قبل از زبان C در زبان بیسیپیال معرفی شده بود که مجدداً در زبان سی پلاسپلاس استفاده شد. برخی ویژگیهای سی پلاسپلاس بعداً توسط C استفاده شد که از آن جمله میتوان به نحوه تعریف for، توضیحات به شکل ++C (با استفاده از //)، و کلمه inline با وجود اینکه تعریف این کلمه در C با تعریف آن در زبان سی پلاسپلاس هماهنگی ندارد اشاره کرد. همچنین در C ویژگیهایی معرفی شدهاست که در سی پلاسپلاس وجود ندارند مانند ماکروهای قابل تغییر و استفاده بهتر از آرایهها به عنوان آرگومان. بعضی کامپایلرها این ویژگیها را پیاده نمودهاند اما در بقیه این ویژگیها موجب ناهماهنگی میگردد.
سی شارپ زبان محبوب چهارچوب داتنت
سی شارپ (#C)، زبانی شیءگرا و سطح بالا از خانواده زبانهای چارچوب داتنت شرکت مایکروسافت است. زبان سی شارپ، یک زبان برنامهنویسی چند الگویی و منظم شده مدلهای تابعی، امری، عمومی، شیءگرا و جز گرا و در بستر دات نت میباشد. این زبان توسط مایکروسافت و جزئی از دات نت به وجود آمد و بعداً استانداردهای ECMA و ISO را نیز دربر گرفت. سی شارپ یکی از ۴۴ زبان برنامهنویسی است که توسط زمان اجرای زبان مشترک از چارچوب داتنت پشتیبانی میشوند و در همه جا به وسیله مایکروسافت ویژوال استودیو شناخته میشود. زبان سی شارپ با قدرت و در عین حال سطح بالایی خود توانسته توجه بسیاری از برنامه نویسان را به خود جلب کند. این زبان برپایه سادگی، مدرن بودن، همه منظوره و شیءگرا بودن ساخته شد. آندرس هجلزبرگ، طراح زبان برنامهنویسی دلفی، سرپرستی تیم طراحان زبان سی شارپ را بر عهده داشت. این زبان دارای دستوری شیءگرا مشابه ++C است و به شدت از زبانهای جاوا و دلفینیازمندمدرک تأثیر پذیرفتهاست. در ابتدا نام این زبان COOL بود که مخفف C like Object Oriented Language بود، هر چند در ژوئیه ۲۰۰۰، زمانی که مایکروسافت پروژه را عمومی اعلام کرد، اسم آن به سی شارپ تغییر پیدا کرد.
چرا زبان سی شارپ ابداع شد؟
استاندارد ECMA این اهداف طراحی زبان را برای سی شارپ ارائه کرده است:
سی شارپ یک زبان برنامهسازی ساده، مدرن، برای اهداف عمومی و شیءگرا است. به دلیل مهم بودن نیرومندی و دوام و بهرهوری برنامهنویس، زبان دارای چککننده Strong Type، چککننده مرزهای آرایه، تشخیص حالتهایی که یک متغیر مقداردهی اولیه نشدهاست، قابلیت انتقال کدها و Garbage Collection خودکار است. این زبان برای استفاده در اجزای توسعه نرمافزار برای دستیابی به مزایای سامانههای توزیعی در نظر گرفته شدهاست. قابلیت انتقال برنامهنویس بسیار مهم است، خصوصاً برای آن دسته از برنامهنویسانی که با زبانهای C و سی پلاس پلاس آشنا هستند. پشتیبانی از این زبان برای بینالمللی شدن بسیار مهم است. زبان سی شارپ برای نوشتن برنامهها برای سامانههای تعبیه شده و میزبان در نظر گرفته شدهاست، سیستمعاملهای پیچیده بسیار بزرگ گرفته تا توابع اختصاصی بسیار کوچک. هر چند برنامههای نوشته شده با سی شارپ طوری هستند که از لحاظ حافظه و پردازنده مورد نیاز مقرون به صرفه باشند، ولی خود زبان از لحاظ اندازه و کارایی به خوبی زبانهای C و اسمبلی نیست.
زبان سی شارپ چه تفاوت با سی و سی پلاس پلاس دارد؟
هیچ تابع یا متغیر سراسری(Global) وجود ندارد، تمام متدها و اعضا بایستی در داخل کلاسها تعریف شوند. این امر ممکن است، هر چند برای استفاده از متغیرها و توابع عمومی باید از متدها و متغیرها در کلاسهای عمومی استفاده کرد. متغیرهای عمومی، بر خلاف C و ++C، نمیتوانند بلاکهای پیوستی را در بر بگیرند. سی شارپ دارای یک نوع داده بولی است (bool). برخی از عبارتها مانند while و if که شرطی هستند، نیازمند یک عبارت نوع بولی هستند. همانطور که ++C نیز دارای نوع داده بولی است، این نوع داده به راحتی میتواند به یا از Integerها تبدیل شود، و عبارتی مانند (if(a نیازمند این امر است که a از یک نوع قابل تبدیل به bool یا اشاره گر باشد. کامپایلر سی شارپ برنامهنویس را در این شرایط مجبور به استفاده از عباراتی میکند که به درستی یک مقدار bool را برمیگردانند؛ بنابراین دستوری مانند (if(a = b باعث بروز خطا میشوند. (به جای = بایستی از == استفاده شود) در سی شارپ، اشاره گرهای به حافظه بایستی فقط در داخل بلوکهای unsafe استفاده شوند و برنامه در این حالت برای اجرا نیاز به اجازه از کاربر دارد. بیشتر دسترسی شی از طریق شی امن است که یا همیشه در حال اشاره به شی صحیح موجود است یا یک مقدار Null دارد. اشاره گری به شی به درد نخور یا بلاک حافظه رندم غیرممکن است. اشاره گر نا امن میتواند به نمونهای از value-type، آرایه، رشته یا بلاکی که حافظه به آن داده شدهاست اشاره نماید. کدی که به عنوان نا امن علامت نخورده باشد، هنوز میتواند اشاره گرها را از سامانه بازیابی یا در آن ذخیره کند ولی نمیتواند مرجع جدیدی به آنها اختصاص دهد.
حافظه ساماندهی شده نمیتواند صریحاً آزاد شود، ولی بهطور خودکار به عنوان به درد نخور تلقی میشود. انتخاب آدرسهای به درد نخور حافظه نفوذ ناپذیر است. هم چنین سی شارپ با استفاده از عبارات، پشتیبانی مستقیمی از پایان اجباری میکند (پشتیبانی از اصطلاح Resource Acquisition Is Initialization). وراثت چندگانه از کلاسها در این زبان پشتیبانی نمیشود. البته یک کلاس امکان ارث بری از تعداد نامحدود واسطها را دارد. پشتیبانی نکردن از وراثت چندگانه به دلیل اهداف معماری این زبان در CLI و برای جلوگیری از پیچیدگی است. در عوض میتوان از اینترفیسهای مختلف استفاده کرد. یعنی برای یک کلاس که احتمالاً فرزند کلاسی دیگر است (ارث برده) میتوان چندین اینترفیس را پیادهسازی (Implement) نمود. سی شارپ بسیار typesafe تر از سی پلاس پلاس است. تنها تبدیلات ضمنی مثل تبدیل نوع داده کوچکتر به بزرگتر یا تبدیل نوع مشتق شده به نوع پایه بهطور پیش فرض و بدون خطا صورت میپذیرد. هیچ تبدیل ضمنی ای میانBooleanها و Integerها وجود ندارد و هر تبدیل user-defined بایستی به صراحت با یکی از کلمات explicit یا implicit نشانه گذاری شود. تبدیل b به a در حالتی که a یک Integer و b یک double باشد در زبان سی پلاس پلاس مجاز است اما در سی شارپ به یک خطای زمان کامپایل منجر میشود (بایستی به صورت explicit تعریف شود). اعضای Enumeration در داخل محدوده شخصی خود قرار دارند. سی شارپ قابلیت syntactic sugar را برای توابع متداول، اکسسورها و ماجولهای کسول شده در یک کلاس به صورت ویژگیها قرار دادهاست. اکسسورها که خاصیت نیز گفته میشوند در زبان سی شارپ قادر به کنترل دسترسی اعضا و معتبرسازی دادهها هستند. تمام انواع بازتابی(Reflection) و بازیابی(Recovery) قابل استفادهاست.