فصل اول آموزش gnu c

ویکی‎کتاب، کتابخانهٔ آزاد

فصل اول: دیباچه‌ای بر C[ویرایش]

ltr article

تعریف زبان برنامه نویسی[ویرایش]

زبان برنامه نویسی، در ساده ترین تعریف، یک زبان خاص برای اعمال دستورات مشخص به هسته پردازنده مرکزی می باشد. این دستورات اعم از ایجاد و نمایش یک پنجره، نوشتن در یک فایل، ارسال درخواست به یک سرور (از طریق NIC) و موارد مشابه می باشند.

زبان های برنامه نویسی، به دو دسته سطح پایین و سطح بالا تقسیم می شوند. زبان های برنامه نویسی سطح پایین مانند C به دسته زبان هایی خطاب می شود که به کاربر اجازه تعامل و دسترسی بیشتری به منابع سیستم و سخت افزار را می دهد و خوانایی به نسبت کمتری دارد، در مقابل، زبان های برنامه نویسی سطح بالا مانند Java نیز به طور کلی برای ایجاد نرم افزار های کاربردی و تمرکز بیشتر بر خود نرم افزار تا مدیریت منابع به صورت دستی از طریق خودکار کردن عملیات مدیریت و اشغال منابع، ایجاد شدند. بنابراین سطح پایین اشاره به نزدیکتر بودن به سخت افزار دارد و برعکس، سطح بالا به معنی بالاتر بودن و دورتر بودن از سخت افزار است.

در علوم کامپیوتر انواعی زبان برنامه نویسی با انواع پارادایم یا الگو ها وجود دارد. یک پارادایم برنامه نویسی، الگو و شیوه ای است که یک زبان برنامه نویسی به کاربرانش به منظوری خاص ارائه می دهد. برای مثال پاردایم برنامه نویسی شئ گرا، به منظور خوانایی و فهم، دسته بندی و انکپسوله کردن داده ها، چندگانگی و تسهیل دریافت و ویرایش داده است در حالی که مثلا پارادایم برنامه نویسی تابعی (Functional) برای پیشگیری از تکرار کد، همچنین خوانایی و پیشگیری از باگ و یا پیدا کردن سریعتر باگ (به صورت دستی) می باشد. زبان برنامه نویسی C که موضوع این ویکی‌کتاب است، یک زبان برنامه نویسی تابعی است و با اینکه شئ گرا محسوب نمی‌شود، برخی خصایص برنامه نویسی شئ گرا در این زبان پیاده سازی شده.

معرفی زبان برنامه نویسی C[ویرایش]

C یک زبان سطح پایین است که در سال ۱۹۷۲ توسط دنیس ریچی و کن تامپسون نوشته یا ایجاد شد. این زبان برنامه نویسی از آنجایی که نوشتار (Syntax) خوانا و ساده تری نسبت به دیگر زبان های برنامه نویسی آن زمان داشت، و به دلیل ویژگی هایی مانند خوانایی بهتر و انعطاف پذیری فوق العاده، به عنوان یک الگوی ساختاری در اکثر زبان های برنامه نویسی جدیدتر قرار گرفت. حتی در اوایل دهه ۸۰ و اواخر ۷۰ میلادی به دلیل وسیع تر شدن سیستم عامل یونیکس (که اولین سیستم عامل رایانه های شخصی بود و مخصوصا توسط دنیس ریچی که سازنده زبان سی هست نوشته شده بود) که با زبان اسمبلی (Assembly) نوشته شده بود، و از آنجایی که زبان اسمبلی خوانایی کمتر در نتیجه نگهداری و مقیاس پذیری پایین تری داشت، توسط شخص دنیس ریچی با زبان برنامه نویسی C بازنویسی شد.

در مثال زیر دو زبان برنامه نویسی Assembly و C برای نوشتن یک برنامه ساده با خروجی یکسان "Hello World" را مقایسه می‌کنیم (در اسمبلر NASM و با استفاده از فراخوانی سیستم در لینوکس):

Assembly:

section .data
  msg: db "Hello World"
  msgLength: db $-msg

section .text
  mov eax, 4 ; فراخوان سیستم شماره ۴ - write() - ایجاد بافر برای نوشتن در یک فایل دسکریپتور یا توصیف کننده فایل
  mov ebx, 1 ; اولین پارامتر فراخوان سیستم شماره ۴، ۱ به معنی چاپ در خروجی استاندارد
  mov ecx, msg ; دومین پارامتر فراخوان سیستم شماره ۴، رشته برای نوشتن به خروجی تعیین شده که در این مورد خروجی استاندارد است
  mov edx, msgLength ; سومین پارامتر فراخوان سیستم شماره ۴، اندازه حروف برای نوشتن
  
  int 0x80 ; فراخوانی کنترل کننده وقفه هسته سیستم عامل که در لینوکس در موقعیت ذکر شده (۸۰ هگزادسیمال) مموری است

  mov eax, 1 ; فراخوان سیستم شماره ۱ - exit() خروج 
  mov ebx, 0 ; اولین پارامتر فراخوان سیستم شماره ۱، کد خروج
  int 0x80 ; ...

C:

#include <stdio.h>

int main() {
  printf("Hello World"); // فراخوانی تابع printf با دادن آرگومان (های) مناسب
}

ابزارهای نیاز زبان برنامه نویسی C[ویرایش]

برنامه های نوشته شده با این زبان، تنها با استفاده از یک کامپایلر می توانند به کد قابل اجرا تبدیل شوند. هر سیستم عاملی کامپایلر مخصوص خود را دارد که مطابق کتابخوانه ها، ساختار هسته سیستم عامل و فراخوانی های سیستم (system calls) خود ابتدا کد نوشته شده را به زبان Assembly تبدیل کرده و سپس آن را با استفاده از یک Assembler که معمولا در خود کامپایلر وجود دارد، به کد قابل اجرا تبدیل می‌کند.

پس تنها ابزار های نوشتن و اجرا کردن زبان برنامه نویسی عبارتند از:

  • کامپایلر (برای سیستم عامل های شبه‌یونیکس معمولا GCC یا Clang)
  • یک IDE یا ویرایشگر متن (در خصوص IDE بهترین آن Jetbrains CLion)

نکته: اجرای کد کامپایل شده در یک سیستم عامل، در سیستم عاملی دیگر با هسته ای متفاوت به علت تفاوت در ساختار هسته و کتابخوانه های پویا و ایستا، مگر با نرم افزاری خاص که در محیط خود ساختار سیستم عامل منبع را شبیه سازی کند، ممکن نیست.

معرفی GCC[ویرایش]

محبوب ترین کامپایلر زبان برنامه نویسی C در سیستم عامل های شبه‌یونیکس مانند لینوکس، GCC مخفف GNU C Compiler، می باشد. این کامپایلر مخصوصا برای سیستم عامل های شبه‌یونیکس نوشته شده و برای استفاده آن در ویندوز باید از یک کامپایلر با خصایص GCC اما به قصد ویندوز به نام MinGW استفاده کرد. از خصوصیات این کامپایلر می توان به متن باز بودن آن و امکانات متعدد برای توسعه دهندگانی که از سیستم های شبه‌یونیکس استفاده می‌کنند اشاره کرد.

این کامپایلر در اکثر توزیع های لینوکس و BSD به طور پیش فرض نصب شده، ولی در صورتی که اینگونه نبود می توان از طریق مدیریت بسته توزیع یا دانلود مستقیم فایل قابل اجرای آن و یا کامپایل کردن کد آن، آن را نصب کرد. خط فرمان اجرای این کامپایلر (نام فایل برنامه در یکی از دایرکتوری های موجود در متغیر PATH) cc و gcc است.

در طی فرآیند این ویکی‌کتاب، از این کامپایلر استفاده خواهد شد. اگر کاربر ویندوز هستید از MinGW که معادل ویندوزی GCC است استفاده نمایید. اگر نیز کاربر MacOS هستید، میتوانید GCC را از مدیریت بسته Homebrew یا روش های مذکور، نصب کنید.

چه کسی c معتبر را تعریف می‌کند؟[ویرایش]

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

سی کرنیگان و ریچی[ویرایش]

C توسط Dennis Ritchie بین سالهای ۱۹۶۹ تا ۱۹۷۳ ساخته شد. در سال ۱۹۷۸دنیس ریچی به همراه Brian Kernighan یک کتاب آموزشی بسیار خوب برای C با نام "The C programming language"منتشر کرد. این کتاب در واقع اولین تعریف رسمی از این زبان بود و از آنجا که لهجه اصلی C محسوب می‌شود گاهی اوقات به آن C سنتی می‌گویند. متاسفانه این کتاب بسیاری از جنبه‌های این زبان را تعریف نشده باقی گذاشت. بنابر این افرادی که کامپایلرها را می‌نوشتند مجبور بودند خود در مورد چگونگی رفتار با این جنبه‌ها تصمیم گیری کنند. نتیجه این شد که اجرای یک قطعه کد بسته به نوع کامپایلر مورد استفاده نتایج متفاوتی را در برداشت. استفاده از این لهجه مدت زیادی به طول نینجامید. gcc تنها برای کامپایل برنامه‌های خیلی قدیمی از آن پشتیبانی می کندو ما تنها به خاطر مقاصد تاریخی به آن اشاره کردیم.

ISO C[ویرایش]

در سال ۱۹۸۳ موسسه استاندارد ملی آمریکا “ANSI” کمیته‌ای را به منظور تدوین یک استاندارد صحیح و رفع برخی کاستی‌ها ی زبان C تشکیل داد. کار تدوین این استاندارد در سال ۱۹۸۹ به پایان رسید و مورد پذیرش سازمان بین‌المللی استاندارد نیز قرار گرفت. این لهجه جدید با نام C89 شناخته شد. همچنین از آن به عنوان ISO C و ANSI C نیز یاد می‌شود. gcc یکی از سازگارترین کامپایلرهای موجود با این لهجه است.

C99[ویرایش]

کمیته ANSI C جلسات بسیار کمی را برای ارتقای این زبان تشکیل می‌دهد. آخرین استاندارد ارتقا یافته در سال ۱۹۹۹ عرضه شد که با نام سی ۹۹ شناخته می‌شود. تاکنون کامپایلرهای بسیار کمی به طور کامل از سی ۹۹ پشتیبانی می‌کنند زیرا ایجاد تغییرات در یکی از مهمترین نرم‌افزارهای سیستم عامل کار زمان گیری است. تا زمان نگارش این کتاب پشتیبانی GCC از سی ۹۹ تا حد زیادی کامل شده است اما توسعه دهندگان هنوز مشغول کار بر روی آن هستند.

گنو سی[ویرایش]

Gnu C بسیار شبیه C89 است اما دارای برخی خصیصه‌های جدیدتر از C99 و برخی امکانات فرعی اضافه(extension) دیگر است. امکانات فرعی به صورت محتاطانه برای رفع برخی اشکالاتی که C99 راه حل مناسبی برای آنها ارایه نکرده توسط توسعه دهندگان ارایه شده‌اند.Gnu C لهجه پیش فرض gcc و نیز لهجه ایست که ما در این کتاب به کار خواهیم برد. ما نهایت تلاش خود را خواهیم کرد تا در مواقعی که از امکانات فرعی Gnu C استفاده می‌کنیم آنها را مشخص کنیم هر چند به طور کلی استفاده کامل از Gnu C بهتر است زیرا استفاده از ISO C باعث محدود شدن برنامه‌های شما به استفاده از جنبه‌های مشترک می گرددو کابرد آنها را محدود به موارد معینی می‌سازد.

انتخاب یک لهجه[ویرایش]

در صورتیکه می‌خواهید لهجه‌ای غیر از لهجه پیش فرض انتخاب کنید می‌توانید با سوییچ = std - انتخاب خود را مشخص کنید. به دنبال این سوییچ می‌توانید یکی از گزینه‌های c89، c99، gnu89 و gnu99 را وارد کنید. gnu89 در حال حاضر گزینه پیش فرض است تا زمانی که پشتیبانی از c99 تکمیل شود. در آن صورت gnu99 گزینه پیش فرض خواهد شد. در هر صورت تغییرات چندان قابل توجه نخواهد بود.

آینده استانداردها[ویرایش]

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

خاتمه[ویرایش]

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