واسط دودویی کاربردی: تفاوت میان نسخهها
جز Hooman Mallahzadeh صفحهٔ رابط دودویی نرمافزار را به واسط دودویی کاربردی منتقل کرد |
بدون خلاصۀ ویرایش |
||
خط ۱: | خط ۱: | ||
یک '''میانای دودویی کاربردی''' یا '''واسط دودویی کاربردی''' {{به انگلیسی|application binary interface}} با کوتهنوشت ABI یک واسط است که بین دو «پودمان برنامه دودویی» وجود دارد. معمولا یکی از این پودمان ها یک کتابخانه یا وسیله سیستمعامل است، و دیگری یک برنامه است که توسط یک کاربر در حال اجرا است. |
یک '''میانای دودویی کاربردی''' یا '''واسط دودویی کاربردی''' {{به انگلیسی|application binary interface}} در [[علوم رایانه]]، با کوتهنوشت '''ABI''' یک [[واسط (رایانش)|واسط]] است که بین دو «پودمان برنامه دودویی» وجود دارد. معمولا یکی از این پودمان ها یک [[کتابخانه (رایانش)|کتابخانه]] یا وسیله [[سیستمعامل]] است، و دیگری یک برنامه است که توسط یک کاربر در حال اجرا است. |
||
یک ABI در واقع دارد نحوه دسترسی به ساختمان داده یا رویه محاسباتی را در کد ماشین تعریف می کند، که این کد ماشین یک قالب سطح پایین و وابسته به سخت افزار است. در مقابل مفهوم API است که این دسترسی را در کد منبع تعریف می کند، که کد منبع یک قالب نسبتا سطح بالا، مستقل از سختافزار، و معمولا انسان-خواندنی است. یک بخش معمول از یک ABI تعریف قرارداد تماسگرفتن است، که تعیین می کند که چگونه داده به عنوان ورودی ارائه گردد، یا به عنوان خروجی، از رویه های محاسباتی خوانده شود. قراردادهای تماسگیری x86 مثالهایی در این زمینه اند. |
یک ABI در واقع دارد نحوه دسترسی به ساختمان داده یا رویه محاسباتی را در [[کد ماشین]] تعریف می کند، که این کد ماشین یک قالب سطح پایین و وابسته به سخت افزار است. در مقابل این دیدگاه، مفهوم [[واسط برنامهنویسی کاربردی|API]] است که این دسترسی را در [[کد منبع]] تعریف می کند، که کد منبع یک قالب نسبتا سطح بالا، مستقل از سختافزار، و معمولا [[فرمت خواندنی برای انسان|انسان-خواندنی]] است. یک بخش معمول از یک ABI تعریف [[قرارداد تماسگرفتن]] است، که تعیین می کند که چگونه داده به عنوان ورودی ارائه گردد، یا به عنوان خروجی، از رویه های محاسباتی خوانده شود. [[قراردادهای فراخوانی اکس۸۶|قراردادهای تماسگیری x86]] مثالهایی در این زمینه اند. |
||
یک مفهوم پیوسته با ABI (که می تواند استانداردسازی شود یا نشود)، کارهای نویسنده یک |
یک مفهوم پیوسته با ABI (که می تواند استانداردسازی شود یا نشود)، کارهای نویسنده یک [[کامپایلر]]، سیستمعامل، یا کتابخانه است. با این حال، یک برنامهنویس کاربردی موقعی که «یک برنامه را به صورت مخلوطی از چند زبان برنامهنویسی می نویسد» یا حتی موقعی که «یک برنامه نوشته شده به یک زبان را با چند کامپالر متفات کامپایل می کند» با ABI ها سروکار دارد. |
||
== توصیف == |
== توصیف == |
||
خط ۹: | خط ۹: | ||
* مجموعه دستورالعمل یک پردازنده (با جزییاتی مثل ساختار فایل ثبات، سازمان پشته، انواع دسترسی به حافظه و غیره). |
* مجموعه دستورالعمل یک پردازنده (با جزییاتی مثل ساختار فایل ثبات، سازمان پشته، انواع دسترسی به حافظه و غیره). |
||
* اندازه، چیدمانها، و ترازهای انواع داده اصلی که پردازه می تواند به آنها به صورت مستقیم دسترسی یابد. |
* اندازه، چیدمانها، و [[تراز ساختمان داده|ترازهای]] [[نوع داده|انواع داده]] اصلی که پردازه می تواند به آنها به صورت مستقیم دسترسی یابد. |
||
* قرارداد |
* [[قرارداد تماسگرفتن|قرارداد تماس]]، که نحوه ارسال آرگومان های [[رویه (علوم رایانه)|تابع]]، و بازیابی مقادیر بازگشتی را کنترل می کند. مثلا این موارد را کنترل می کند: |
||
** آیا همه پارامترها باید روی پشته قرار گیرند یا بعضی از آنها در ثبات قرار گیرند |
** آیا همه پارامترها باید روی پشته قرار گیرند یا بعضی از آنها در ثبات قرار گیرند |
||
** کدام ثبات برای کدان عملکرد تابعی استفاده شود؛ |
** کدام ثبات برای کدان عملکرد تابعی استفاده شود؛ |
||
** آیا اولین پارامتر تابعی قرارگرفته روی پشته، اول یا آخر روی پشته نشانده شده است. |
** آیا اولین پارامتر تابعی قرارگرفته روی پشته، اول یا آخر روی پشته نشانده شده است. |
||
* یک برنامهکاربردی چگونه باید با سیستمعامل تماس سامانهای بگیرد، و اگر ABI تماسهای سامانهای مستقیم را به جای تماسهای رویهای به تهرسیدهای تماس سامانهای تعیین نموده است، باید اعداد تماس سامانهای تعیین شود. |
* یک برنامهکاربردی چگونه باید با سیستمعامل [[تماس با سامانه (رایانه)|تماس سامانهای]] بگیرد، و اگر ABI تماسهای سامانهای مستقیم را به جای تماسهای رویهای به [[شگرد تهرسید|تهرسیدهای]] تماس سامانهای تعیین نموده است، باید اعداد تماس سامانهای تعیین شود. |
||
* و در حالتی که با یک ABI سیستمعاملی کامل سروکار داریم، قالب دودویی |
* و در حالتی که با یک ABI سیستمعاملی کامل سروکار داریم، قالب دودویی [[آبجکت فایل]]، کتابخانه برنامه، و غیره. |
||
== ABI های کامل == |
== ABI های کامل == |
||
یک ABI کامل، مثل استاندارد سازگاری دودویی اینتل (iBCS) این امکان را فراهم می سازد تا یک برنامه از یک سیستمعامل که از آن ABI پشتیبانی می کند، بدون هیچ دستکاری روی هر سامانه دیگر مشابه (پشتیبانی کننده از ABI) اجرا گردد، برای این موضوع باید کتابخانه های مشترک لازم وجود داشته باشد، و پیشنیازهای مشابه برآورده گردد. |
یک ABI کامل، مثل [[:en:Intel_Binary_Compatibility_Standard|استاندارد سازگاری دودویی اینتل]] (iBCS) این امکان را فراهم می سازد تا یک برنامه از یک سیستمعامل که از آن ABI پشتیبانی می کند، بدون هیچ دستکاری روی هر سامانه دیگر مشابه (پشتیبانی کننده از ABI) اجرا گردد، برای این موضوع باید کتابخانه های مشترک لازم وجود داشته باشد، و پیشنیازهای مشابه برآورده گردد. |
||
دیگر ABI ها جزییاتی مثل دستکاری نام C++، انتشار حالت |
دیگر ABI ها جزییاتی مثل [[دستکاری نام|دستکاری نام C++]]، انتشار حالت [[رسیدگی به استثناء|استثنا]]، و قراداد تماسگیری بین کامپایلرها در یک بنسازه را استاندارد سازی می کند، اما نیازی به سازگاری بین بنسازهایی ندارد. |
||
== ABI های توکار == |
== ABI های توکار == |
||
یک واسط دودویی کاربردی توکار {{به انگلیسی|embedded-application binary interface}} با کوتهنوشت EABI قراردادهای استانداردی برای قالب |
یک واسط دودویی کاربردی توکار {{به انگلیسی|embedded-application binary interface}} با کوتهنوشت EABI قراردادهای استانداردی برای [[قالب پرونده]]، انواع داده، استفاده از ثبات، سازماندهی [[پشته تماس|فریم پشته]]، و قراردادن پارامتر تابعی یک برنامه نرمافزاری توکار، برای استفاده با یک [[:en:Embedded_operating_system|سیستمعامل توکار]] را تعیین می کند. |
||
کامپایلرهایی که از EABI پشتیبانی می کنند، |
[[کامپایلر|کامپایلرهایی]] که از EABI پشتیبانی می کنند، [[آبجکت کد|آبجکت کدی]] می سازند که با کد تولید شده دیگر کامپایلرهای مشابه سازگار است، این موضوع به توسعهدهنده ها امکان پیوند کتابخانههای ساخته شده با یک کامپایلر را با آبجکت کد تولید شده با یک کامپایلر دیگر می دهد. توسعهدهندگانی که کد [[زبان اسمبلی]] خودشان را می نویسند هم ممکن است بخواهند با کد اسمبلی تولید شده با کامپابلر سازگار، واسط سازی انجام دهند. |
||
EABI ها برای بهینه سازی کارایی در داخل منابع محدود یک سامانه توکار طراحی شده اند. بنابراین، EABI ها، بیشتر انتزاع هایی که بین کد کاربر و هسته در سیستمعامل های پیچیده وجود دارد را حذف می کنند. برای مثال از پیوند پویا جلوگیری می شود، تا اجرایی کوچکتری ایجاد شود، و بازگذاری سریعتر شود، همچنین استفاده از ثبات های ثابت، به ما امکان ایجاد پشته ها و تماس هسته ای فشرده تر را می دهد، و اجرای برنامه کاربردی در حالت مجوزدهی شده، امکان دسترسی مستقیم به عملیات های سخت افزاری سفارشی بدون تغییر مسیر بواسطه تماس به یک درایور دستگاه را می دهد. انتخاب EABI می تواند روی کارایی تاثیر بگذارد. |
EABI ها برای بهینه سازی کارایی در داخل منابع محدود یک سامانه توکار طراحی شده اند. بنابراین، EABI ها، بیشتر انتزاع هایی که بین کد کاربر و هسته در سیستمعامل های پیچیده وجود دارد را حذف می کنند. برای مثال از [[پیونددهنده پویا|پیوند پویا]] جلوگیری می شود، تا اجرایی کوچکتری ایجاد شود، و بازگذاری سریعتر شود، همچنین استفاده از ثبات های ثابت، به ما امکان ایجاد پشته ها و تماس هسته ای فشرده تر را می دهد، و اجرای برنامه کاربردی در حالت مجوزدهی شده، امکان دسترسی مستقیم به عملیات های سخت افزاری سفارشی بدون تغییر مسیر بواسطه تماس به یک درایور دستگاه را می دهد. انتخاب EABI می تواند روی کارایی تاثیر بگذارد. |
||
EABI هایی که امروزه زیاد استفاده می شوند شامل: |
EABI هایی که امروزه زیاد استفاده می شوند شامل: [[پاورپیسی|PowerPC]]، [[معماری آرم|Arm]] EABI و [[معماری میپس|MIPS]] EABI هستند. پیاده سازی های نرم افزاری خاص مثب کتابخانه C ممکن است محدودیت های اضافی را تحمیل کند، و این موجب ایجاد یک ABI واقعی تر (با غیرانتزاعی تر) می شود؛ یک مثل GNU OABI و EABI برای ARM است که هردو آنها زیرمجموعه ARM EABI هستند. |
||
== منابع == |
== منابع == |
نسخهٔ ۲۸ ژانویهٔ ۲۰۲۱، ساعت ۱۵:۱۶
یک میانای دودویی کاربردی یا واسط دودویی کاربردی (به انگلیسی: application binary interface) در علوم رایانه، با کوتهنوشت ABI یک واسط است که بین دو «پودمان برنامه دودویی» وجود دارد. معمولا یکی از این پودمان ها یک کتابخانه یا وسیله سیستمعامل است، و دیگری یک برنامه است که توسط یک کاربر در حال اجرا است.
یک ABI در واقع دارد نحوه دسترسی به ساختمان داده یا رویه محاسباتی را در کد ماشین تعریف می کند، که این کد ماشین یک قالب سطح پایین و وابسته به سخت افزار است. در مقابل این دیدگاه، مفهوم API است که این دسترسی را در کد منبع تعریف می کند، که کد منبع یک قالب نسبتا سطح بالا، مستقل از سختافزار، و معمولا انسان-خواندنی است. یک بخش معمول از یک ABI تعریف قرارداد تماسگرفتن است، که تعیین می کند که چگونه داده به عنوان ورودی ارائه گردد، یا به عنوان خروجی، از رویه های محاسباتی خوانده شود. قراردادهای تماسگیری x86 مثالهایی در این زمینه اند.
یک مفهوم پیوسته با ABI (که می تواند استانداردسازی شود یا نشود)، کارهای نویسنده یک کامپایلر، سیستمعامل، یا کتابخانه است. با این حال، یک برنامهنویس کاربردی موقعی که «یک برنامه را به صورت مخلوطی از چند زبان برنامهنویسی می نویسد» یا حتی موقعی که «یک برنامه نوشته شده به یک زبان را با چند کامپالر متفات کامپایل می کند» با ABI ها سروکار دارد.
توصیف
ABI ها شامل این جزییات هستند:
- مجموعه دستورالعمل یک پردازنده (با جزییاتی مثل ساختار فایل ثبات، سازمان پشته، انواع دسترسی به حافظه و غیره).
- اندازه، چیدمانها، و ترازهای انواع داده اصلی که پردازه می تواند به آنها به صورت مستقیم دسترسی یابد.
- قرارداد تماس، که نحوه ارسال آرگومان های تابع، و بازیابی مقادیر بازگشتی را کنترل می کند. مثلا این موارد را کنترل می کند:
- آیا همه پارامترها باید روی پشته قرار گیرند یا بعضی از آنها در ثبات قرار گیرند
- کدام ثبات برای کدان عملکرد تابعی استفاده شود؛
- آیا اولین پارامتر تابعی قرارگرفته روی پشته، اول یا آخر روی پشته نشانده شده است.
- یک برنامهکاربردی چگونه باید با سیستمعامل تماس سامانهای بگیرد، و اگر ABI تماسهای سامانهای مستقیم را به جای تماسهای رویهای به تهرسیدهای تماس سامانهای تعیین نموده است، باید اعداد تماس سامانهای تعیین شود.
- و در حالتی که با یک ABI سیستمعاملی کامل سروکار داریم، قالب دودویی آبجکت فایل، کتابخانه برنامه، و غیره.
ABI های کامل
یک ABI کامل، مثل استاندارد سازگاری دودویی اینتل (iBCS) این امکان را فراهم می سازد تا یک برنامه از یک سیستمعامل که از آن ABI پشتیبانی می کند، بدون هیچ دستکاری روی هر سامانه دیگر مشابه (پشتیبانی کننده از ABI) اجرا گردد، برای این موضوع باید کتابخانه های مشترک لازم وجود داشته باشد، و پیشنیازهای مشابه برآورده گردد.
دیگر ABI ها جزییاتی مثل دستکاری نام C++، انتشار حالت استثنا، و قراداد تماسگیری بین کامپایلرها در یک بنسازه را استاندارد سازی می کند، اما نیازی به سازگاری بین بنسازهایی ندارد.
ABI های توکار
یک واسط دودویی کاربردی توکار (به انگلیسی: embedded-application binary interface) با کوتهنوشت EABI قراردادهای استانداردی برای قالب پرونده، انواع داده، استفاده از ثبات، سازماندهی فریم پشته، و قراردادن پارامتر تابعی یک برنامه نرمافزاری توکار، برای استفاده با یک سیستمعامل توکار را تعیین می کند.
کامپایلرهایی که از EABI پشتیبانی می کنند، آبجکت کدی می سازند که با کد تولید شده دیگر کامپایلرهای مشابه سازگار است، این موضوع به توسعهدهنده ها امکان پیوند کتابخانههای ساخته شده با یک کامپایلر را با آبجکت کد تولید شده با یک کامپایلر دیگر می دهد. توسعهدهندگانی که کد زبان اسمبلی خودشان را می نویسند هم ممکن است بخواهند با کد اسمبلی تولید شده با کامپابلر سازگار، واسط سازی انجام دهند.
EABI ها برای بهینه سازی کارایی در داخل منابع محدود یک سامانه توکار طراحی شده اند. بنابراین، EABI ها، بیشتر انتزاع هایی که بین کد کاربر و هسته در سیستمعامل های پیچیده وجود دارد را حذف می کنند. برای مثال از پیوند پویا جلوگیری می شود، تا اجرایی کوچکتری ایجاد شود، و بازگذاری سریعتر شود، همچنین استفاده از ثبات های ثابت، به ما امکان ایجاد پشته ها و تماس هسته ای فشرده تر را می دهد، و اجرای برنامه کاربردی در حالت مجوزدهی شده، امکان دسترسی مستقیم به عملیات های سخت افزاری سفارشی بدون تغییر مسیر بواسطه تماس به یک درایور دستگاه را می دهد. انتخاب EABI می تواند روی کارایی تاثیر بگذارد.
EABI هایی که امروزه زیاد استفاده می شوند شامل: PowerPC، Arm EABI و MIPS EABI هستند. پیاده سازی های نرم افزاری خاص مثب کتابخانه C ممکن است محدودیت های اضافی را تحمیل کند، و این موجب ایجاد یک ABI واقعی تر (با غیرانتزاعی تر) می شود؛ یک مثل GNU OABI و EABI برای ARM است که هردو آنها زیرمجموعه ARM EABI هستند.