مقدمه (C Intro)
معرفیِ زبانِ C: قدرتی که سیستمها را میسازد 🔌🏗️
زبانِ C یک زبانِ سطح میانی (Mid-level) محسوب میشود. چرا؟ چون هم راحتیِ زبانهایِ سطح بالا را دارد و هم قدرتِ زبانهایِ سطح پایین (مثل اسمبلی) برایِ کنترلِ سختافزار.
ویژگیهایِ فنیِ کلیدی:
- ساختاریافته (Structured): کدها به بلوکها و توابع تقسیم میشوند که خطایابی را بسیار راحت میکند.
- قابلِ حمل (Portable): شما میتوانید یک کد را رویِ ویندوز بنویسید و با کمترین تغییر، آن را رویِ یک میکروکنترلرِ کوچک کامپایل کنید.
- کتابخانهیِ غنی: توابعِ آمادهیِ بسیاری برایِ کار با ورودی/خروجی، ریاضیات و حافظه دارد.
تفاوتِ C با دیگر زبانها:
در زبانهایی مثل پایتون، شما نمیدانید یک متغیر دقیقاً در کجایِ رم قرار دارد. در C، شما "آدرسِ دقیق" آن خانه از رم را میدانید و میتوانید مستقیماً با آن بازی کنید.
counter با Counter کاملاً متفاوت است. این دقت در نامگذاری حیاتی است.
یک مثالِ ساده از قدرتِ C:
در حالی که یک اسکریپتِ پایتون شاید ۱۰۰ مگابایت از رم را برایِ یک کارِ ساده اشغال کند، یک کدِ بهینهیِ C میتواند همان کار را با کمتر از ۱ مگابایت انجام دهد.
بخش تخصصی: کالبدشکافیِ اجرایِ یک برنامه C 🛠️⚙️⚡
زبانِ C زبانِ نزدیک به سختافزار است. درکِ اینکه چطور کدهایِ متنیِ شما به سیگنالهایِ الکتریکی در CPU تبدیل میشوند، اولین قدم برایِ تبدیل شدن به یک مهندسِ حرفهای است.
۱. خطِ لوله (Pipeline) کامپایل
فرایندِ تبدیل کدِ C به فایلِ اجرایی (Executable) چهار مرحلهیِ حیاتی دارد:
- پیشپردازش (Preprocessing): دستوراتی که با
#شروع میشوند (مثل#include) پردازش میشوند. کدهایِ هدر به فایلِ اصلی چسبانده میشوند. - کامپایل (Compilation): کدهایِ سطحِ بالایِ C به زبانِ اسمبلی (Assembly) تبدیل میشوند که برایِ معماریِ آن CPU خاص (مثل x86 یا ARM) قابل فهم باشد.
- اسمبلی (Assembly): کدهایِ اسمبلی به کدهایِ ماشین (Binary) تبدیل میشوند. نتیجه یک فایلِ
.objیا.oاست. - لینک کردن (Linking): تمامِ فایلهایِ آبجکت و کتابخانههایِ استاندارد (مثل
stdio.h) به هم متصل میشوند تا یک فایلِ نهایی (مثل.exe) ساخته شود.
۲. ساختارِ حافظه در زمانِ اجرا (Runtime Memory)
وقتی برنامهیِ شما اجرا میشود، از چهار بخشِ اصلی در حافظه استفاده میکند:
- Text Segment: محلِ نگهداریِ دستوراتِ اجراییِ برنامه (کدهای ماشین).
- Data Segment: برایِ نگهداریِ متغیرهایِ سراسری (Global) و استاتیک.
- Stack: برایِ نگهداریِ متغیرهایِ محلی و پارامترهایِ توابع مدیریت میشود. این بخش سریع است اما فضایِ محدودی دارد.
- Heap: برایِ مدیریتِ حافظهیِ داینامیک (که با
mallocرزرو میکنید). این بزرگترین بخشِ حافظهیِ در دسترس است.
تمرینهای عملی
برای تثبیت یادگیری این درس تمرینهای زیر را حل کنید
در زبان C، آیا MAIN و main با هم برابر هستند؟ کلمهی No یا Yes را در خروجی چاپ کنید.
#include <stdio.h>
int main() {
printf("No");
return 0;
}
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.