زبان برنامه نویسی سی/آشنایی با زبان های برنامهنویسی
همان طور که گفتیم زبانهای برنامهنویسی به سه دسته سطح پائین ، سطح بالا و خیلی سطح بالا تقسیم میشوند . زبانهای سطح پائین به زبان ماشین و زبان اسمبلی تقسیم میشوند و زبان اسمبلی نیز خود به دو سطح پائین ( یعنی اصلی و دستورالعملهای CPU که همان Instruction Sets می باشد ) و سطح بالا تقسیمبندی میشود .
زبانهای سطح بالا ، بی شمار هستند اما بر اساس خصیصه های مختلفی شناسایی میشوند . زبانهای دستورگرا یا خط-به-خط یا بهتر بگوئیم : کد-به-کد ، زبانهایی هستند که از اسمبلی الگو گرفته و هر کدی که نوشته شده را خط به خط و کد به کد ، دستور میدهند که در نهایت اجرا خواهد شد که مشمول زبان C نیز میشود . درست در خلاف جهت زبانهای دستوری ، زبانهای موضوعی یا هدفگرا هستند که طی آن ، شما آن چه را که قرار است به عنوان خروجی صادر شود برای کامپایلر شرح میدهید ، کامپایلر ابتدا کل متن شما را میخواند و سپس خروجی مورد نظر شما را صادر میکند . خصیصه های دیگری نیز در زبانهای برنامهنویسی وجود دارند ، همچون ساختارگرایی که کدها را داخل بلوکها مینویسید تا بتوانید آنها را از یک دیگر متمایز کرده و هر کدام را هر موقع که خواستید به کار بگیرید ( زبان C ساختار گراست ) یا مثلاً شیئگرایی ، یکی دیگر از قابلیت های برنامهنویسی است که زبان سیِشیئگرا Objective-C را شامل میشود ، اما نه زبان سی را ؛ شیئگرایی قابلیتی از برنامهنویسی است که شما یک الگوی کامل از مجموعهای از بلوکهای تابعها و یا دادهها را تعریف میکند و سپس از روی الگو نمونههایی میسازید که هر نمونه ( که یک « شیئ » نامیده میشود ) خواص الگوی خود را دارد که میتوانید آن را توسعه و تغییر دهید و آنها را کم یا زیاد کنید و یا مقادیر داخل نمونه را تغییر دهید . این قابلیت ( شیئگرایی ) باعث جلوگیری از اتلاف وقت میشود و به جای اینکه هر دادهای را که بخواهید بر روی آن پردازش انجام دهید ، یک به یک تعریف کنید ؛ یک بار ، یک الگوی کامل با خصیصههایی تعریف میکنید و سپس از روی آن الگو ، نمونهها یا همان شیئها را میسازید . زبان C شیئگرا نیست و نزدیک به اسمبلی سطح بالا است ، اما با زبان سی به تمام ورودیها و خروجیها و گذرگاههای سیستم دسترسی دارید ، مخصوصاً که بیشتر عرضهکنندههای کامپایلرها قابلیت ترکیب کردن زبان سی با زبان اسمبلی را فراهم میآورند . میتوان گفت که تمام خصلتهایی که برای برنامهنویسی های سطح بالا شمرده میشود تنها کمک به راحتتر نوشته شدن ( و البته فهم آسانتر آن برای برنامهنویس ) و صرفهجویی در وقت است .
هر برنامهای که با زبان سطح بالا نوشته شود را میتوان با زبان سطح پائین نیز نوشت ، اما هر برنامهای که در زبان سطح پائین نوشته شده را نمیتوان در زبان سطح بالا نوشت . اما وقتی زبانها در سطح هم هستند به احتمال زیاد میتوان آنها را به یکدیگر ترجمه نمود ، ضمن اینکه هر برنامه سطح بالاتر را میتوان به زبان سطح پائینتر ترجمه نمود ولی هر برنامه سطح پائین را نمیتوان به زبان سطح بالاتر ترجمه نمود . شاید از عبارت ترجمه کمی تعجب کرده باشید ، بله ؛ زبانهای برنامهنویسی را در صورت امکان ( که بیان شد ) میتوان توسط مبدلها به یکدیگر ترجمه نمود . اما از آنجایی که ما در این کتاب قصد داریم تنها با زبان C کار کنیم به همین زبان میپردازیم ، جز اینکه در فصل ابتدایی مقدماتی را برای مبتدیان مینویسیم تا آماده یادگیری زبان C شده باشند
چند بار از کلمه کامپایلر استفاده نمودیم . یک برنامه در زبانهای قابل کامپایل و ترجمه به Binary ماشین و یا codebyte کدبایتهای قابل ترجمه توسط کرنل ، در یک فایل متنی با پسوند متناسب زبان خود نوشته و ذخیره میشود و سپس توسط کامپایلر Compiler به کدهای قابل ترجمه توسط پردازشگر ماشین ( CPU ) که همان 0 و 1 که پیشتر گفته شد و یا کرنل سیستمعامل ( Kernel ) و اجزاء کمکی سیستمعامل و کرنل ( کامپوننتها Components ) تبدیل شده و بر روی حافظه نوشته میشوند . در اکثر مواقع ، ما در هنگام برنامهنویسی کدها را در چند فایل متنی مینویسیم . وقتی همه آنها را کامپایل نمودیم ، زمان آن میرسد تا توسط پیونددهنده یا لینکر Linker به صورت یکپارچه در آورده شده و یک خروجی قابل اجرا به وجود بیاوریم . در ویندوز حتماً فایل های exe یا dll را دیدهاید . همه این برنامهها توسط زبانهای برنامهنویسی نوشته شده و سپس توسط کامپایلر و لینکر تبدیل به برنامه قابل اجرا شدهاند . همچنین ممکن است شما در برنامه خود خطای مهلک یا خطای فاحش داشته باشید ( مثل Fatal Error ها ) یا خطاهایی که میتوانند برنامه شما را نامطلوب نمایند Bug ، در صورتی که قوانین استاندارد C را راعایت نکرده باشید ، کامپایلر ، برنامه شما را کامپایل یا ترجمه نخواهد نمود . در اینجا برنامه ای به نام اشکالزدا یا دیباگر Debugger برنامه ای که شما نوشتهاید را میخواند و سپس به شما میگوید که در کدام قسمتهای آن اشکالهایی وجود دارند که جلوی کامپایل شدن آن را میگیرند تا آنها را اشکالزدایی یا Debug نمائید . از طرفی ، گاهی اینکه مدام بنویسید و صبر کنید تا برنامه کامپایل و لینک شود و مدام اشکال زدایی کنید وقت گیر باشد ؛ برنامههایی به نام مفسّر Interpreter وجود دارند ( البته زبان C دارای دیباگرهای قدرتمندی مثل GDB از GNU و LLDB از پروژه LLVM که از پروژه GNU مشتق شده است میباشد که مرحله به مرحله برنامه شما را ارزیابی می نمایند تا متوجه آنچه در برنامه شما انجام می شود بشوید ) که امکان اجرای متن برنامه شما را بدون تبدیل به کد سیستمعامل یا ماشین ، میدهند و در این صورت به سرعت هر تغییری که بخواهید اعمال میکنید و نتیجه آن را ارزیابی مینمائید .
زبانهایی مثل پرل Perl برای کامپایل شدن تعبیه نشدهاند ، از همین روی برنامههای مفسّر ، فایلهای متنی این گونه زبانها را میخوانند و به اجرا میگذارند و اگر بخواهید که از این زبانها برای نوشتن برنامه خود استفاده کنید باید این شرط برقرار گردد که کاربری که قصد استفاده از برنامه نوشته شده شما را دارد نیز محیط اجرای کد شما را داشته باشد ( یعنی دستکم برنامه مفسّر Interpreter زبان پرل را که نسخه Version سازگار با برنامه نوشته شما باشد و البته ممکن است نیاز به برنامههای کمکی دیگر و کتابخانههایی نیز داشته باشد )
زمانی که شما برنامه سطح بالایی را که نوشتهاید را با کامپایلر خود با موفقیت به خروجی رساندید ، برنامه شما تحت همان سیستمعاملی که نوشتهاید قابل اجرا خواهد بود . بنابراین همان طور که قبلاً نیز گفتیم ، برخی از کامپایلرها ، تحت سیستمعامل هستند و متن برنامه شما را به 0 و 1 ماشین تبدیل نمی کنند ، بلکه به کد های تحت سیستمعامل ترجمه میکنند تا در همان سیستمعامل ، مثلاً ویندوز اجرا گردند . بنابراین فایلهای exe را سیستمعاملهای مکینتاش macOS به رسمیت نمی شناسند و ویندوز Microsoft Windows نیز فایل های dmg را به اجرا در نمی آورد . البته کامپایلرهای قدرتمند زبان C مثل ++Visual Studio C از Microsoft و GCC از GNU قابلیت ترجمه به زبان ماشین را دارند و پروژه GCC ( GNU Compiler Collection ) قابلیت ترجمه برنامه شما به معماریهای مختلف پردازشگرها ( مثل x86 و MIPS و ARM و PowerPC و Sparc و z390 و Itanium و ... ) را برای سیستمعاملهای مختلف سری BSD ، سیستمعاملهای مکینتاش macOS یا iOS ، ویندوز و حتی سولاریس و بسیاری از سیستمعاملهای دیگر را نیز دارد
سیستمعاملها ، امکانات زیادی در جهت سهولت در ایجاد برنامه فراهم میکنند که همواره در حال به روز شدن هستند ؛ به همین علت است که یک برنامه در ویندوز اکسپی Windows XP اجرا میشود اما در ویندوز ۷ نه ؛ چون برنامهنویسها برای کم شدن حجم برنامه خود و آسانتر شدن برنامهنویسی ، تمام برنامه خود را و منابع مورد نیازش را نمینویسند ، بلکه از منابع سیستمعامل استفاده میکنند که این منابع ، خود یا دستورهایی که میگیرند و میدهند در هر به روز رسانی مایکروسافت ( و یا حتی سیستمعاملهای دیگر ) تغییر میکنند . گرچه سازمانهای فناوری رایانه و الکترونیک در تلاش هستند تا استانداردهایی را ایجاد کنند که مورد حمایت کمپانی های بزرگ همچون مایکروسافت ، اپل مکینتاش ، آیبیام و ... برای سیستمعاملها و از طرفی دیگر ، ارائه کنندگان کامپایلرها ، قرار گیرد تا در نهایت ، برنامهنویس با سهولت هر چه تمامتر بعد از نوشتن برنامه خود آن را برای تمام سیستمها عرضه کند
بیان این نکته نیز خالی از لطف نیست که عبارت پیادهساز ( Implementation ) در مجموع به کامپایلر ( Compiler ) ، لینکر یا پیونددهنده ( Linker ) ، دیباگر ( Debugger ) و مفسّر ( Interpreter ) گفته میشود