پرش به محتوا

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

از ویکی‌پدیا، دانشنامهٔ آزاد
محتوای حذف‌شده محتوای افزوده‌شده
جز جایگزینی با اشتباه‌یاب: يک⟸یک، هاي⟸های، پيش⟸پیش، ويژگي⟸ویژگی، مستقيم⟸مستقیم، غير⟸غیر، داراي⟸دارای، بيشتر⟸بیشتر، یاکتابخانه⟸یا کتابخانه، خییره⟸ذخیره، قرارد اد⟸قرارداد، ضعيف⟸ضعیف، صدازننده⟸صدا زننده، قراردهای⟸قراردادهای، هازیر⟸ها زیر، کهیا⟸که یا، بيني⟸بينی، تاخير⟸تاخیر، ثباتوجود⟸ثبات وجود
بدون خلاصۀ ویرایش
خط ۶۳: خط ۶۳:
[[کد ریسه ای]] همه مسئولیت را برای تنظیم و تمیز کردن کد پس از فراخوانی تابع بر روی کد صدا زده شده دارد. کد صدا زده شده چیزی نیست جز فهرست [[زیرروال]] هایی که باید فراخوانی شوند. این باعث می شود تمام تابع تنظیم و تمیز کردن در یک مکان - prolog و epilog تابع - و نه در بسیاری از مکان هایی که عملکرد نامیده می شود. این باعث می شود کد رشته کمترین قرارداد تماس.
[[کد ریسه ای]] همه مسئولیت را برای تنظیم و تمیز کردن کد پس از فراخوانی تابع بر روی کد صدا زده شده دارد. کد صدا زده شده چیزی نیست جز فهرست [[زیرروال]] هایی که باید فراخوانی شوند. این باعث می شود تمام تابع تنظیم و تمیز کردن در یک مکان - prolog و epilog تابع - و نه در بسیاری از مکان هایی که عملکرد نامیده می شود. این باعث می شود کد رشته کمترین قرارداد تماس.


کد ریسه ای تمام آرگومنت های مربوط به پشته را منتقل می کند. تمام مقادیر برگشتی در پشته بازگشته اند. این باعث می شود پیاده سازی ساده از قرارداد فراخوانی هایی که مقادیر های بیشتری در ثبات ها دارند، کندتر شود. با این حال، پیاده سازی کد ریسه ای که چندین مقدار پشته بالا را در رجیستر ها ذخیره می کند - به ویژه، آدرس بازگشت - معمولا سریع تر از قرارداد های فراخوانی است که همیشه آدرس بازگشت به پشته را push و popمی کند. <ref><div> براد رودریگز. [http://www.bradrodriguez.com/papers/moving1.htm "حرکت به جلو، قسمت 1: تصمیم گیری طراحی در هسته چهارم"] . نقل قول: "در 6809 یا Zilog Super8 DTC سریعتر از STC است." </div></ref> <ref><div> آنتور اورتل [http://www.complang.tuwien.ac.at/forth/threading/ "سرعت روش های مختلف ارسال تفسیر"] . </div></ref> <ref><div> متیو زالسکی. [http://www.cs.toronto.edu/~matz/dissertation/matzDissertation-latex2html/node7.html "YETI: یک مترجم پیشرفته قابل گسترش"] . فصل 4: طراحی و اجرای تفسیر کارآمد. نقل قول: "اگرچه مترجمان مستقیم-رشته شناخته شده دارای ویژگی های پیش بينی شاخه ضعیف هستند ... تاخیر تماس و بازگشت ممکن است بیشتر از یک حرکت غیر مستقیم باشد." </div></ref>
کد ریسه ای تمام آرگومنت های مربوط به پشته را منتقل می کند. تمام مقادیر برگشتی در پشته بازگشته اند. این باعث می شود پیاده سازی ساده از قرارداد فراخوانی هایی که مقادیر های بیشتری در ثبات ها دارند، کندتر شود. با این حال، پیاده سازی کد ریسه ای که چندین مقدار پشته بالا را در رجیستر ها ذخیره می کند - به ویژه، آدرس بازگشت - معمولا سریع تر از قرارداد های فراخوانی است که همیشه آدرس بازگشت به پشته را push و popمی کند. <ref> براد رودریگز. [http://www.bradrodriguez.com/papers/moving1.htm "حرکت به جلو، قسمت 1: تصمیم گیری طراحی در هسته چهارم"] . نقل قول: "در 6809 یا Zilog Super8 DTC سریعتر از STC است." </ref> <ref> آنتور اورتل [http://www.complang.tuwien.ac.at/forth/threading/ "سرعت روش های مختلف ارسال تفسیر"] . </ref> <ref> متیو زالسکی. [http://www.cs.toronto.edu/~matz/dissertation/matzDissertation-latex2html/node7.html "YETI: یک مترجم پیشرفته قابل گسترش"] . فصل 4: طراحی و اجرای تفسیر کارآمد. نقل قول: "اگرچه مترجمان مستقیم-رشته شناخته شده دارای ویژگی های پیش بينی شاخه ضعیف هستند ... تاخیر تماس و بازگشت ممکن است بیشتر از یک حرکت غیر مستقیم باشد." </ref>


=== PL / I ===
=== PL / I ===
خط ۶۹: خط ۶۹:


== منابع ==
== منابع ==
{{پانویس|۲|چپ‌چین=بله}}
<references group=""></references>


== پیوند به بیرون ==
{{چپ‌چین}}
* SC Johnson ، [[دنیس ریچی|DM Ritchie]] ، [https://www.bell-labs.com/usr/dmr/www/clcs.html گزارش تکنولوژی محاسبات شماره 102: مراحل تماس با زبان C] ، [[آزمایشگاه‌های بل|آزمایشگاه بل]] ، سپتامبر 1981
* SC Johnson ، [[دنیس ریچی|DM Ritchie]] ، [https://www.bell-labs.com/usr/dmr/www/clcs.html گزارش تکنولوژی محاسبات شماره 102: مراحل تماس با زبان C] ، [[آزمایشگاه‌های بل|آزمایشگاه بل]] ، سپتامبر 1981
* [http://www.ibm.com/developerworks/library/l-ppc/ مقدمه ای بر مونتاژ در PowerPC]
* [http://www.ibm.com/developerworks/library/l-ppc/ مقدمه ای بر مونتاژ در PowerPC]
* [https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/LowLevelABI/000-Introduction/introduction.html راهنمای مکالمه تلفنی مک OS X ABI]
* [https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/LowLevelABI/000-Introduction/introduction.html راهنمای مکالمه تلفنی مک OS X ABI]
* [http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf روش استاندارد تماس با معماری ARM]
* [http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf روش استاندارد تماس با معماری ARM]
* [http://www.bravegnu.org/gnu-eprog/c-startup.html برنامه نویسی جاسازی شده با Toolchain گنو، بخش 10.] [http://www.bravegnu.org/gnu-eprog/c-startup.html راه اندازی C]
* [http://www.bravegnu.org/gnu-eprog/c-startup.html برنامه نویسی جاسازی شده با Toolchain گنو، بخش 10.] [http://www.bravegnu.org/gnu-eprog/c-startup.html راه اندازی C]
{{پایان چپ‌چین}}
[[رده:زیرروال‌ها]]
[[رده:زیرروال‌ها]]
[[رده:صفحات با ترجمه بازبینی‌نشده]]
[[رده:صفحات با ترجمه بازبینی‌نشده]]

نسخهٔ ‏۱ فوریهٔ ۲۰۱۹، ساعت ۲۳:۵۰

در علومهای رایانه ای ، یک قرارداد فراخوانی یک طرح در سطح پیاده سازی است برای نشان دادن آن که در یک زیرروال نحوه گرفتن پارامتر ها از صدا زننده ی آن ها و نحوه برگرداندن نتیجه به چه صورت است

تفاوت ها در پیاده سازی های مختلف شامل مکان پارامترها، مقادیر بازگشتی ، آدرس های بازگشت و نحوه وظایف آماده سازی برای فراخوانی تابع و بازگرداندن محیط پس از آن بین صدا زننده (caller)و صدا زده شده(callee) می شود.

قراردادهای فراخوانی ممکن است به یک استراتژی ارزیابی زبان برنامه نویسی خاص مربوط باشند، اما اغلب آنها بخشی از آن (یا برعکس) نیستند، زیرا استراتژی ارزیابی معمولا در سطح انتزاعی تری(بالاتری) تعریف شده است و به عنوان بخشی از زبان دیده میشود به جای جزئیات پیاده سازی (سطح پایین) یک زبان خاص کامپایلر.

تغییرات

قرارداد های فراخوانی ممکن است در موارد زیر متفاوت باشند:

  • پارامترها، مقادیر بازگشتی و آدرسهای برگشتی (در ثبات ها، در پشته فراخوانی، ترکیبی از هر دو یا در سایر ساختارهای حافظه) قرار می گیرند
  • منظور که در آن آرگومان های واقعی برای پارامترهای رسمی منتقل می شوند (یا بخشی از یک آرگومان بزرگ یا پیچیده)
  • چطور یک مقدار بازگشتی(احتمالا طولانی یا پیچیده) از صدا زده شده به صدا زننده (در پشته، در یک ثبات یا درون پشته) تحویل داده می شود
  • چگونگی وظیفه تنظیم و تمیز کردن پس از یک فراخوانی تابع بین صدا زننده و صدا زده شده تقسیم می شود
  • این که چگونه فراداده های توصیف کننده المان ها پاس داده میشوند
  • جایی که مقدار اشاره گربه قاب(frame pointer) قبلی ذخیره شده است، که برای بازگرداندن اشاره گر به قاب هنگامی که روال به پایان می رسد (در پشته قاب یا در برخی از ثبات ها )
  • چگونگی اختصاص دادن متغیر های محلی میتواند بخشی از قرار داد فراخوانی باشد (زمانی که صدا زننده برای صدا زده شده اختصاص میدهد)

در برخی موارد، تفاوت ها زیر نیز شامل موارد می شوند:

  • قراردادهایی که در آن ثبات ها می توانند به طور مستقیم توسط تابع صدا زده شده مورد استفاده قرار گیرد، بدون رزرو قبلی (در غیر این صورت به عنوان جزئیات ABI در نظر گرفته میشود )
  • کدام ثبات ها به عنوان تغییرپذیر(volatile) در نظر گرفته شود و اگر تغییر پذیر باشد باید توسط صدا زده شده بازگردانی نشود (اغلب به عنوان جزئیاتABI در نظر گرفته میشود)

تنوع کامپایلر

اگر چه برخی زبان در واقع ممکن است این تا حدی در مشخص زبان برنامه نویسی مشخصات (یا در برخی اجرای محوری)، پیاده سازی های مختلف از جمله زبان (به عنوان مثال مختلف کامپایلر ) به طور معمول ممکن است هنوز هم استفاده از کنوانسیون های مختلف تماس، اغلب انتخاب. دلایل این کار عملکرد، سازگاری مکرر با توافقنامه های دیگر زبان های محبوب (با توجه به یا بدون دلایل فنی)، و محدودیت ها یا قراردادهای اعمال شده توسط "سیستم عامل های مختلف" (ترکیبی از معماری CPU و سیستم عامل ) است.

تنوع معماری

معماری های CPU همیشه دارای بیش از یک قرارداد فراخوانی ممکن هستند. با تعداد زیادی از ثبات های کلی و سایر ویژگی ها، پتانسیل چند قرارداد فراخوانی زیاد است ، اگر چه برخی   معماری به طور رسمی مشخص شده است که فقط از یک قرارداد فراخوانی استفاده کند که توسط معمار ارائه شده است.

x86 (32 بیتی)

معماری x86 از قراردادهای فراخوانی مختلفی استفاده می کند. با توجه به کم بودن ثبات ها ، قراردادهای فراخوانی x86 اغلب آرگومان را در پشته منتقل می کنند، در حالی که مقدار بازگشتی (یا اشاره گر به آن) در یک ثبات منتقل می شود. برخی از قراردادها از ثبات ها برای چند پارامتر اول استفاده میکنند که ممکن است باعث بهبود عملکرد و سریعتر شدن برای زیرروال - برگ (یعنی روال هایی که با روشی دیگر تماس نداشته اند و نیازی به بازنگری ندارند ) که مکررا استفاده میشود شود.

مثال فراخوانی:

 push EAX            ; pass some register result
 push byte[EBP+20]   ; pass some memory variable (FASM/TASM syntax)
 push 3              ; pass some constant
 call calc           ; the returned result is now in EAX

ساختار callee معمولی: ( برخی یا همه (به جز ret) دستورالعمل های زیر ممکن است در روش های ساده بهینه سازی شوند )

calc:
  push EBP            ; save old frame pointer
  mov EBP,ESP         ; get new frame pointer
  sub ESP,localsize   ; reserve place for locals
  .
  .                   ; perform calculations, leave result in EAX
  .
  mov ESP,EBP         ; free space for locals
  pop EBP             ; restore old frame pointer
  ret paramsize       ; free parameter space and return

PowerPC

معماری PowerPC دارای تعداد زیادی از ثبات ها است، بنابراین اکثر توابع می توانند تمام آرگومنت ها را در رجیسترها برای فراخوانی های تک مرحله ای منتقل کنند. آرگومانت های اضافی در پشته منتقل می شوند و برای آرگومنت های رجیستر-پایه(مقادیری باید در رجیستر ذخیره شود )همیشه فضای مناسب در پشته تخصیص داده میشود تا فراخوانی تابع در موارد فراخوانی چند مرحله ای(بازگشتی)راحت تر شودو ثبات ها باید ذخیره شوند. همچنین در توابع variadic مانند printf() ، جایی که پارامترهای تابع باید به صورت آرایه قابل دسترسی باشند. تنها یک قرارد فراخوانی برای تمام زبانهای رویه ای استفاده می شود.

SPARC

معماری SPARC ، بر خلاف اکثر معماری های RISC ، بر روی ثبات های پنجره ای ساخته شده است . 24 ثبات قابل دسترسی در هر پنجره ثبات وجود دارد: 8 ثبات در (in) , 8 ثبات ثبات محلی هستند و 8 تا ثبات (out).

ثبات "in" برای ارسال آرگومنت ها به تابع مورد نظر استفاده می شود و هر آرگومنت اضافی باید بر روی پشته قرار گیرد . با این حال، فضا همیشه توسط تابع صدا زده شده اختصاص داده می شود برای مدیریت سرریز احتمالی ثبات پنجره ای، متغیرهای محلی، و (در SPARC 32 بیتی) بازگشت ساختار بر اساس ارزش(by value). برای فراخوانی یک تابع، یک مکان که در آن آرگومنت ها قرار میگیرد ثبات های پنجره ای out هستند ؛ هنگامی که تابع نامیده می شود، ثبات "out" تبدیل به ثبات"in" می شود و تابع فراخوانی شده به آرگومنت های موجود در ثبات "in" دسترسی دارد . هنگامی که تابع صدا زده شده تمام میشود، مقدار برگشتی را در اولین ثبات "in" قرار میدهد، که تبدیل به اولیت ثبات "out " میشود هنگام برگشتن از تابع فراخوانی شده.

ملاحظات پیاده سازی

این تغییر پذیری باید در هنگام ترکیب ماژول های نوشته شده در چندین زبان یا هنگام فراخوانی سیستم عامل یا کتابخانهAPI ها از یک زبان غیر از آن که در آن نوشته شده باشد، در نظر گرفته شود. در این موارد، باید مراقبت های ویژه ای را برای هماهنگ کردن قراردادهای فراخوانی مورد استفاده توسط صدا زننده و صدا زده شده انجام شود. حتی یک برنامه که از یک زبان برنامه نویسی استفاده میکند, می تواند از قراردادهای فراخوانی چندگانه یا انتخاب شده توسط کامپایلر، برای بهینه سازی کد یا برنامه نویس مشخص شده استفاده کند.

کد ریسه ای

کد ریسه ای همه مسئولیت را برای تنظیم و تمیز کردن کد پس از فراخوانی تابع بر روی کد صدا زده شده دارد. کد صدا زده شده چیزی نیست جز فهرست زیرروال هایی که باید فراخوانی شوند. این باعث می شود تمام تابع تنظیم و تمیز کردن در یک مکان - prolog و epilog تابع - و نه در بسیاری از مکان هایی که عملکرد نامیده می شود. این باعث می شود کد رشته کمترین قرارداد تماس.

کد ریسه ای تمام آرگومنت های مربوط به پشته را منتقل می کند. تمام مقادیر برگشتی در پشته بازگشته اند. این باعث می شود پیاده سازی ساده از قرارداد فراخوانی هایی که مقادیر های بیشتری در ثبات ها دارند، کندتر شود. با این حال، پیاده سازی کد ریسه ای که چندین مقدار پشته بالا را در رجیستر ها ذخیره می کند - به ویژه، آدرس بازگشت - معمولا سریع تر از قرارداد های فراخوانی است که همیشه آدرس بازگشت به پشته را push و popمی کند. [۱] [۲] [۳]

PL / I

قرارداد فراخوانی پیش فرض برای برنامه های نوشته شده در زبان PL / I تمام آرگومان را با مرجع منتقل می کند (by reference)، هرچند ممکن است قراردادهای دیگر مشخص شود. رفتار کردن با آرگومنت ها برای کامپایلرها و سیستم عاملها مختلف متفاوت است، اما معمولا آدرسهای آرگومنت ها توسط یک لیست آرگومنت در حافظه منتقل می شوند. یک آدرس نهایی یا پنهان ممکن است به یک منطقه منتقل شود تا حاوی مقدار بازگشتی باشد. به دلیل طیف گسترده ای از داده های پشتیبانی شده توسط PL / I، توصیفگر داده نیز ممکن است برای تعریف پاس داده شود ، به عنوان مثال، طول رشته های کاراکتر یا بیت، ابعاد و طول آرایه ها . آرگومنت های ساختگی آرگومنت هایی هستند که یا ثابت هستند یا با نوع ورودی ای که انتظار میرود متفاوت اند.

منابع

  1. براد رودریگز. "حرکت به جلو، قسمت 1: تصمیم گیری طراحی در هسته چهارم" . نقل قول: "در 6809 یا Zilog Super8 DTC سریعتر از STC است."
  2. آنتور اورتل "سرعت روش های مختلف ارسال تفسیر" .
  3. متیو زالسکی. "YETI: یک مترجم پیشرفته قابل گسترش" . فصل 4: طراحی و اجرای تفسیر کارآمد. نقل قول: "اگرچه مترجمان مستقیم-رشته شناخته شده دارای ویژگی های پیش بينی شاخه ضعیف هستند ... تاخیر تماس و بازگشت ممکن است بیشتر از یک حرکت غیر مستقیم باشد."

پیوند به بیرون