اندیان: تفاوت میان نسخه‌ها

محتوای حذف‌شده محتوای افزوده‌شده
جز ویرایش 2001:590:4802:1DE:2A7A:C819:9A55:77E4 (بحث) به آخرین تغییری که Rezabot انجام داد...
خنثی‌سازی ویرایش 15355876 توسط Kasir (بحث)
برچسب: نیازمند بازبینی
خط ۲:
 
== ریشه‌شناسی ==
[[پرونده:Big-Endian.svg|بندانگشتی|چپ|بیگ اِندیاناندین]]
'''اِندیاناندین''' یا Endian استعاره‌ای است به اختلاف دو قوم لی‌لی‌پوتی بر سر جهت بریدن سر تخم‌مرغ آبپز در [[ماجراهای گالیور]]. یکی از این دوقوم تخم‌مرغ آبپز را به روش سنتی از سر پهنتر باز میکردند که به '''بیگ اِندیاناندین''' یا Big Endian معروف بودند و دیگری معتقد به بریدن سر کوچکتر تخم‌مرغ بودند که به ایشان '''لیتل اِندیاناندین''' یا Little Endian گفته میشدمی شد.
 
[[پرونده:Little-Endian.svg|بندانگشتی|چپ|لیتل اِندیان]]
== در علم کامپیوتر ==
یک رایانه '''بیگ اِندیان''' ''مهمترین'' بایت را ابتدای فضای حافظه ذخیره میکند، در حالیکه یک رایانه '''لیتل اِندیان''' ''کم اهمیتترین'' بایت را ابتدای فضای حافظه ذخیره مینماید. چنانچه در شکلهای روبرو میبینیم اگر داده خود را 0A0B0C0D در نظر بگیریم در یکی 0A در اولین خانه حافظه دخیره شده در حالیکه در دیگری در آخرین فضای حافظه جای گرفته است.
[[پرونده:Little-Endian.svg|بندانگشتی|چپ|لیتل اِندیاناندین]]
هر [[بایت]] از [[حافظه]] آدرس منحصر به فرد خود را داراست و محتوای یک [[متغیر]] n بایتی، یک خانه ی n بایتی را از حافظه را اشغال می کند. یک رایانه '''بیگ اندین''' بایت پرارزش متغیر را در ابتدایی ترین خانه حافظه ذخیره میکند، در حالیکه یک رایانه '''لیتل اندین''' کم ارزش ترین بایت متغیر را در ابتدایی ترین خانه حافظه ذخیره مینماید. چنانچه در شکلهای روبرو می بینیم اگر داده خود را 0A0B0C0D<sub>h</sub> در نظر بگیریم در سیستم های بیگ اندین 0A<sub>h</sub> در اولین خانه حافظه دخیره می شود در حالیکه در سیستم های لیتل اندین در آخرین فضای حافظه جای گرفته است. برای داده 0000111111110000<sub>b</sub> نیز به همین ترتیب، ۸ بیت پر ارزش، یعنی 00001111<sub>b</sub> در سیستم بیگ اندین در ابتدایی ترین خانه حافظه و در سیستم لیتل اندین در آخرین خانه حافظه می گیرد.
 
همچنین حالت سومی با نام ''میدل اندین'' یا Middle Endian وجود دارد که حالت های بسیار متفاوتی دارد. مثلا در [[PDP-11]] کامپایلر مقادیر را مانند روش بیگ اندین اما با فرمت ۱۶ بیتی لیتل اندین ذخیره می کند. به عنوان مثال، مقدار ۳۲ بیتی 0A0B0C0D<sub>h</sub> همان طور که در شکل زیر مشخص است، به صورت 0B0A0D0C<sub>h</sub> ذخیره می شود. این حالت خاص، به ''لیتل اندین ۱۶ بیتی'' یا ''16 Bit Little Endian'' معروف است.
 
{| cellpadding="4" style="border-collapse: collapse; margin: 0.4em 0.4em; text-align: center;"
|-
| colspan="6" |''جهت افزایش مقدار آدرس حافظه: ''&nbsp;&nbsp;→
|-
|style="border: 1px solid; border-left: hidden;" | <tt>…</tt>
|style="border: 1px solid;" | <tt>0C<sub>h</sub></tt>
|style="border: 1px solid;" | <tt>0D<sub>h</sub></tt>
|style="border: 1px solid;" | <tt>0A<sub>h</sub></tt>
|style="border: 1px solid;" | <tt>0B<sub>h</sub></tt>
|style="border: 1px solid; border-right: hidden;" | <tt>…</tt>
|}
 
 
== بی اندین ==
سخت افزار های دارای معماری '''بی اندین''' قابلیت سوئیچ بین دو حالت بیگ اندین و لیتل اندین را در [[سگمنت داده]]، [[سگمنت کد]] و یا هر دو [[سگمنت]] را دارد. بسیاری از این سخت افزارها قابلیت انتخاب فرمت پیش فرض اندین را از طریق نرم افزار دارند، اما در برخی از آنها نیز حالت اندین را مادربرد انتخاب می کند و قابل تغییر نیست.
 
== تفاوت ها ==
در حالت لیتل اندین، در صورتی که مقدار AB000000<sub>h</sub> در خانه ای ۴ بایتی از حافظه قرار داشته باشد، و چهار متغیر داشته باشیم که به این خانه از حافظه اشاره کنند، متغیر ۸ بیتی دارای AB<sub>h</sub>، متغیر ۱۶ بیتی دارای 00AB<sub>h</sub>، متغیر ۲۴ بیتی دارای 0000AB<sub>h</sub> و متغیر ۳۲ بیتی دارای 000000AB<sub>h</sub> خواهد بود. که در همه این چهار متغیر، مقدار مقدار عددی برابر با هم را خواهند داشت. هرچند این قابلیت سیستم های لیتل اندین بسیار به ندرت توسط برنامه نویسان یک [[زبان برنامه نویسی سطح بالا]] مانند [[زبان سی شارپ]] استفاده می شود، اما در برخی زبان ها مانند [[زبان اسمبلی]] جهت بهینه سازی نرم افزار و همچنین سیستم عامل ها بسیار کاربردی است. همچنین بسیاری از زبان های سطح بالای امروزی مانند [[PHP]] چنین قابلیتی ندارند.
 
 
== سخت افزارها ==
معماری های مختلف از شیوه های متفاوتی استفاده می کنند. به عنوان مثال در معماری ۳۲ بیتی [[x86]] اینتل و نسخه ۶۴ بیتی آن که به [[X86-64]] ای ام دی معروف است و امروزه در کامپیوترهای رومیزی استفاده های فراوانی دارند، از سیستم لیتل اندین استفاده می شود، در حالی که در معماری IBM [[z/Architecture]] از سیستم بیگ اندین استفاده می شود. معماری [[ARM]] نیز بی اندین است و قابلیت سوییچ کردن بین حالت های بیگ اندین، لیتل اندین و میدل اندین را داراست.
 
== شبکه ==
در شبکه، network order در بسیاری از [[RFC]] ها تعبیه شده است. در صورتی که چنین چیزی در RFC مربوطه پیش بینی نشده باشد، معمولا از روش بیگ اندین که در [[RFC 1700]] ( [[استاندارد اینترنت]] ) تعبیه شده است، استفاده می شود، هرچند تمامی پروتکل ها به این روش پایبند نیستند.
 
== فایل ها ==
فایل های داده ای مانند فایل های متنی txt، از روش بیگ اندین استفاده می کنند اما فایل های متنی یونیکد می توانند با چند بایت خاص که به [[BOM]] مشهورند شروع شوند و نوع قرارگیری بایت ها را مشخص کنند.
فایل های تصاویر TIFF نیز با توجه به اینکه دارای پرچمی خاص هستند، قابلیت استفاده از هر دو حالت را دارند.
بنابراین هر نوع فایل می تواند از هر روشی خاص جهت ذخیره سازی استفاده کنند و بستگی به شیوه مهندسی آن نرم افزار خاص دارد.
 
همچنین، فایل های اجرایی برنامه ها، با توجه به نوع کامپایلر می تواند متفاوت باشد که این مسئله باعث میشود یک برنامه که توسط کامپایلر بیگ اندین کامپایل شده، در سیستم های لیتل اندین قابل اجرا نباشد. برخی از کامپایلر ها قابلیت انتخاب ایندین توسط کاربر را دارند. برخی نیز به صورت خودکار، حالت ذخیره خود را تغییر می دهند و روی سخت افزارهای مختلف قابل اجرا هستند. در صورتی که کامپایلر از این قابلیت پشتیبانی نکند و برنامه نویس بخواهد که فایل کامپایل شده نرم افزارش بر روی تمامی سیستم ها اجرا شود باید خود دست به کار شود.
خروجی برخی زبان ها مانند [[Java]] و [[JavaScript]] و [[PHP]] مستقل از سخت افزار هستند. برنامه های کامپایل شده JAVA، در زمان اجرا توسط JRE خوانده شده و با توجه به سخت افزار نوع آن انتخاب می شود اما PHP و JavaScript نیازی به کامپایل ندارند و مفسر PHP و مرورگر، آنها را مانند یک فایل متنی خوانده و اجرا می کند. هرچند فایل های PHP را می توان با نرم افزارهای مختلف کامپایل کرد و این فایل ها و باز هم مستقل از سخت افزار هستند، چون وابسته به خود مفسر php هستند.
زبان هایی که دارای مفسر هستند، مستقل از سخت افزار هستند، مانند زبان های [[PHP]] و [[JavaScript]]. این زبان ها برخلاف زبان های سطح پایین، معمولا دسترسی چندانی به خانه های حافظه نمی دهند، هرچند برای زبان هایی مانند PHP می توان [[افزونه]] هایی نوشت تا دسترسی به خانه های حافظه را ممکن سازد اما در زبان هایی مانند JavaScript چنین چیزی به دلایل امنیتی غیر ممکن است.
 
== روش تغییر ایندین ==
نمونه کد زیر که به [[زبان C]] می باشد، یک مقدار عددی ۳۲ بیتی را گرفته و آن را از حالت بیگ اندین به لیتل اندین و بلعکس تبدیل می کند.
<source lang=c>
/* C function to change endianness for byte swap in an unsigned 32-bit integer */
 
uint32_t ChangeEndianness(uint32_t value)
{
uint32_t result = 0;
result |= (value & 0x000000FF) << 24;
result |= (value & 0x0000FF00) << 8;
result |= (value & 0x00FF0000) >> 8;
result |= (value & 0xFF000000) >> 24;
return result;
}
</source>
 
== منابع ==