آبجکت کد

**آبجکت کد**  یا **کد هدف**، کدی است که مترجم یا اسمبلر آن را تولید می‌کند و در واقع مجموعه دستورالعملهایی به زبان ماشین (به صورت ۰ و ۱) یا یک زبان واسط (برای مثال زبان انتقال ثبات) است.

برای استفاده از کد آبجکت، باید آن را در یک فایل اجرایی، فایل کتابخانه، یا یک آبجکت فایل قرار داد. برای تبدیل فایل آبجکت به فایل قابل اجرا یا فایل باینری از پیوندده استفاده می‌شود.

## مراحل تبدیل کد منبع به فایل اجرایی

### ۱. ترجمه (Compilation / Assembly)

* در این مرحله، کد منبع (مثلاً به زبان‌های C++، C، یا اسمبلی) به کد آبجکت تبدیل می‌شود.
* هر فایل `.c` یا `.cpp` پس از کامپایل به یک فایل `.o` یا `.obj` تبدیل می‌شود.
* در زبان‌های سطح پایین‌تر مانند اسمبلی، اسمبلر این کار را انجام می‌دهد و خروجی آن نیز یک فایل آبجکت است.

### ۲. پیوند (Linking)

* فایل‌های آبجکت به همراه **کتابخانه‌های استاندارد** یا **کتابخانه‌های خارجی** توسط **لینکر (Linker)** ترکیب می‌شوند.
* خروجی این مرحله یک فایل اجرایی است که می‌تواند روی سیستم‌عامل اجرا شود.

### ۳. بارگذاری و اجرا (Loading & Execution)

* پس از لینک شدن، فایل اجرایی در حافظه بارگذاری شده و پردازنده آن را اجرا می‌کند.

## چرا از کد آبجکت استفاده می‌شود؟

### ۱. افزایش ماژولار بودن کد
برنامه‌های بزرگ به چندین فایل تقسیم می‌شوند. هر فایل جداگانه کامپایل شده و به یک **فایل آبجکت** تبدیل می‌شود. در نهایت، این فایل‌ها در مرحله لینکینگ به یکدیگر متصل می‌شوند.

### ۲. بهینه‌سازی و به‌کارگیری کتابخانه‌ها

* بسیاری از کتابخانه‌های سیستم، مانند `libc` در لینوکس، به‌صورت **فایل‌های آبجکت از پیش کامپایل‌شده** در اختیار برنامه‌ها قرار می‌گیرند.
* این موضوع باعث کاهش حجم برنامه و بهینه‌سازی زمان کامپایل می‌شود.

### ۳. امکان استفاده از چندین زبان در یک پروژه

* برخی پروژه‌ها شامل **کدهای نوشته‌شده در زبان‌های مختلف** هستند.
* مثلاً بخشی از برنامه به زبان C و بخشی دیگر به اسمبلی نوشته شده است.
* از آنجایی که خروجی هر دو زبان یک **فایل آبجکت** است، لینک‌کننده می‌تواند آن‌ها را ترکیب کند.

## ساختار یک فایل آبجکت
یک فایل آبجکت معمولاً شامل بخش‌های زیر است:

# **کد ماشین (Machine Code)**: شامل دستورالعمل‌های پردازنده.
# **جدول نمادها (Symbol Table)**: شامل نام توابع و متغیرهای تعریف‌شده در فایل.
# **بخش داده‌ها (Data Section)**: شامل داده‌های موردنیاز برنامه.
# **اطلاعات مربوط به رفع ابهام (Relocation Information)**: مشخص می‌کند که آدرس‌های حافظه هنگام لینک شدن چگونه تنظیم شوند.

## مثال عملی از تولید کد آبجکت
فرض کنید فایلی به نام `main.c` داریم:
```c
#include <stdio.h>
int main() {
    printf("Hello, World!\n");
    return 0;
}
```


### کامپایل و تولید فایل آبجکت در لینوکس
با اجرای دستور زیر در ترمینال:
```text
gcc -c main.c -o main.o
```
یک فایل آبجکت به نام `main.o` تولید می‌شود. این فایل هنوز قابل اجرا نیست.

### لینک کردن فایل آبجکت و تولید فایل اجرایی
برای تبدیل `main.o` به یک فایل اجرایی، دستور زیر را اجرا می‌کنیم:
```text
gcc main.o -o main
```
حال فایل `main` یک **فایل اجرایی** است که می‌توان آن را اجرا کرد:
```text
./main
```
خروجی:
```text
Hello, World!
```


## انواع فایل‌های آبجکت
۱. **Relocatable Object Files** (قابل جابه‌جایی):

* این فایل‌ها بعداً توسط لینک‌کننده ترکیب می‌شوند.
* خروجی دستور `gcc -c` از این نوع است.

۲. **Executable Object Files** (اجرایی):

* این فایل‌ها کاملاً لینک شده و آماده اجرا هستند.
* خروجی نهایی کامپایلر پس از لینک شدن.

۳. **Shared Object Files** (کتابخانه‌های مشترک):

* فایل‌های `.so` در لینوکس و `.dll` در ویندوز.
* به‌عنوان کتابخانه‌های دینامیکی در زمان اجرا بارگذاری می‌شوند.

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

## منابع

*

رده:زبان ماشین