دوره‌ها / آموزش برنامه‌نویسی C / مقدمه (C Intro)

مقدمه (C Intro)

20 دقیقه Article

معرفیِ زبانِ C: قدرتی که سیستم‌ها را می‌سازد 🔌🏗️

زبانِ C یک زبانِ سطح میانی (Mid-level) محسوب می‌شود. چرا؟ چون هم راحتیِ زبان‌هایِ سطح بالا را دارد و هم قدرتِ زبان‌هایِ سطح پایین (مثل اسمبلی) برایِ کنترلِ سخت‌افزار.

ویژگی‌هایِ فنیِ کلیدی:

  1. ساختاریافته (Structured): کدها به بلوک‌ها و توابع تقسیم می‌شوند که خطایابی را بسیار راحت می‌کند.
  2. قابلِ حمل (Portable): شما می‌توانید یک کد را رویِ ویندوز بنویسید و با کمترین تغییر، آن را رویِ یک میکروکنترلرِ کوچک کامپایل کنید.
  3. کتابخانه‌یِ غنی: توابعِ آماده‌یِ بسیاری برایِ کار با ورودی/خروجی، ریاضیات و حافظه دارد.

تفاوتِ C با دیگر زبان‌ها:

در زبان‌هایی مثل پایتون، شما نمی‌دانید یک متغیر دقیقاً در کجایِ رم قرار دارد. در C، شما "آدرسِ دقیق" آن خانه از رم را می‌دانید و می‌توانید مستقیماً با آن بازی کنید.

نکته مهم: C یک زبانِ Case-sensitive است. یعنی متغیرِ counter با Counter کاملاً متفاوت است. این دقت در نام‌گذاری حیاتی است.
زبانِ کامپایلری: کدهایِ C هیچ‌وقت مستقیماً اجرا نمی‌شوند. آن‌ها توسطِ یک برنامه به نامِ کامپایلر به کدهایِ باینری (صفر و یک) تبدیل می‌شوند تا CPU بتواند آن‌ها را بخواند.

یک مثالِ ساده از قدرتِ C:

در حالی که یک اسکریپتِ پایتون شاید ۱۰۰ مگابایت از رم را برایِ یک کارِ ساده اشغال کند، یک کدِ بهینه‌یِ C می‌تواند همان کار را با کمتر از ۱ مگابایت انجام دهد.

<hr style="margin: 50px 0; border: 0; border-top: 1px dashed rgba(255,255,255,0.1);">

بخش تخصصی: کالبدشکافیِ اجرایِ یک برنامه C 🛠️⚙️⚡

زبانِ C زبانِ نزدیک به سخت‌افزار است. درکِ اینکه چطور کدهایِ متنیِ شما به سیگنال‌هایِ الکتریکی در CPU تبدیل می‌شوند، اولین قدم برایِ تبدیل شدن به یک مهندسِ حرفه‌ای است.

۱. خطِ لوله (Pipeline) کامپایل

فرایندِ تبدیل کدِ C به فایلِ اجرایی (Executable) چهار مرحله‌یِ حیاتی دارد:

  • پیش‌پردازش (Preprocessing): دستوراتی که با # شروع می‌شوند (مثل #include) پردازش می‌شوند. کدهایِ هدر به فایلِ اصلی چسبانده می‌شوند.
  • کامپایل (Compilation): کدهایِ سطحِ بالایِ C به زبانِ اسمبلی (Assembly) تبدیل می‌شوند که برایِ معماریِ آن CPU خاص (مثل x86 یا ARM) قابل فهم باشد.
  • اسمبلی (Assembly): کدهایِ اسمبلی به کدهایِ ماشین (Binary) تبدیل می‌شوند. نتیجه یک فایلِ .obj یا .o است.
  • لینک کردن (Linking): تمامِ فایل‌هایِ آبجکت و کتابخانه‌هایِ استاندارد (مثل stdio.h) به هم متصل می‌شوند تا یک فایلِ نهایی (مثل .exe) ساخته شود.

۲. ساختارِ حافظه در زمانِ اجرا (Runtime Memory)

وقتی برنامه‌یِ شما اجرا می‌شود، از چهار بخشِ اصلی در حافظه استفاده می‌کند:

  1. Text Segment: محلِ نگهداریِ دستوراتِ اجراییِ برنامه (کدهای ماشین).
  2. Data Segment: برایِ نگهداریِ متغیرهایِ سراسری (Global) و استاتیک.
  3. Stack: برایِ نگهداریِ متغیرهایِ محلی و پارامترهایِ توابع مدیریت می‌شود. این بخش سریع است اما فضایِ محدودی دارد.
  4. Heap: برایِ مدیریتِ حافظه‌یِ داینامیک (که با malloc رزرو می‌کنید). این بزرگترین بخشِ حافظه‌یِ در دسترس است.
نکته مهندسی: در C هیچ "Garbage Collector"ای وجود ندارد! برخلافِ پایتون یا جاوا، مدیریتِ هر بیت از حافظه بر عهده‌یِ شماست. این قدرتِ مطلق، مسئولیتِ بزرگی هم به همراه دارد (جلوگیری از Memory Leak).

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

مفهوم Case-sensitive Easy
سوال تمرین

در زبان C، آیا MAIN و main با هم برابر هستند؟ کلمه‌ی No یا Yes را در خروجی چاپ کنید.

پاسخ تمرین
C
#include <stdio.h>

int main() {
  printf("No");
  return 0;
}

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.