تابع ذاتی
در مبحث نرمافزار در نظریه کامپایلر یک تابع ذاتی ( انگلیسی:Intrinsic function) (یا تابع درونی) یک تابع (subroutine) است که در یک زبان برنامهنویسی برای استفاده در دسترس است در حالی که پیادهسازی آن بهطور خاص توسط کامپایلر انجام گرفتهاست. معمولاً تابع ذاتی ممکن است جایگزین یک توالی دستورالعمل به صورت خودکار تولید شده باشد مانند توابع تک خط. بر خلاف یک تابع تک خط کامپایلر دانش جامعی دربارهٔ تابع ذاتی دارد و در نتیجه میتواند برای یک وضعیت داده شده آن را بهتر یکپارچه سازی و بهینهسازی کند.
کامپایلرهایی که توابع ذاتی پیادهسازی میکنند بهطور کلی تنها زمانی که یک برنامه درخواست بهینهسازی دارد آنها را فعال میسازد در غیر این صورت به پیادهسازی پیشفرض آن که توسط زبان در زمان اجرا آماده میشود برمی گردد.
توابع ذاتی اغلب برای پیادهسازی صریح برداری سازی و موازی سازی در زبانهایی است که این ساختارها را ندارند استفاده میشود. برخی از رابطهای برنامهنویسی نرمافزار (API) برای مثال AltiVec و OpenMP از توابع ذاتی استفاده میکنند که عملیات vectorizable و multiprocessing-aware را در زمان کامپایل تعریف کنند. کامپایلر توابع ذاتی را پارس میکند و آنها را به وکتور ریاضی یا multiprocessing کد شی مناسب برای پلت فرم هدف تبدیل میکند.
C و ++C
کامپایلر برای C و ++C مایکروسافت[1] اینتل و GNU Compiler Collection GCC[2] توابع ذاتی را طوری پیادهسازی میکنند که در تناظر مستقیم با تک دستورالعمل x86 چند دادهای (MMX Streaming SIMD Extensions (SSE), SSE2 SSE3 SSSE3 SSE4) باشند. Microsoft Visual C++ کامپایلر ویژوال استودیو مایکروسافت از هیچ اسمبلر خطی برای x86-64 پشتیبانی نمیکند.[3][4][5][6] برای جبران کمبود اسمبلی خطی توابع خطی جدیدی اضافه شدهاند که به دستورالعملهای اسمبلی استاندارد متناظر میشوند که بهطور معمول از طریق C/C++ در دسترس نیستند به عنوان مثال بیت اسکن.
برخی از کامپایلرهای C و ++C توابع ذاتی غیرقابل حمل برای پلت فرم خاص ارائه میدهند. دیگر توابع ذاتی (مانند توابع درونی گنو) کمی بیشتر انتزاعی اند در مقایسه با تواناییهای چندین سیستم عامل معاصر قابل حمل با پیادهسازی fall back بر روی سیستم عاملهای بدون هیچ دستورالعمل مناسب. برای کتابخانههای ++C مانند glm یا کتابخانههای بردار ریاضی سونی معمول است که برای رسیدن به قابل حمل بودن از طریق کامپایل شرطی (بر اساس پرچم کامپایلر پلت فرمهای خاص) که بهطور کامل پریمیتیوهای سطح بالای قابل حمل را ارائه میدهد (به عنوان مثال یک نوع بردار ممیز شناور چهار عنصری) در تناظر با پیادهسازیهای زبان برنامهنویسی سطح پایین مناسب در حالی که هنوز هم از نوع سیستم و درون خطیهای ++C بهره میبرد؛ از این رو استفاده لینک دادن بر دستی نوشتن فایل شی اسمبلی با استفاده از (application binary interface (ABI زبان C.
جاوا
این کامپایلر در لحظهٔ ماشین مجازی کانونی جاوا نیز توابع ذاتی برای جاوا apiهای خاص دارد. توابع ذاتی کانونی جاوا apiهای استانداردی هستند که ممکن است به تعداد یکی یا بیشتر پیادهسازی بهینه برای برخی از سیستم عاملها داشته باشد.
منابع
- MSDN (VS2010). "Compiler Intrinsics". Microsoft. Retrieved 2012-06-20.
- GCC documentation. "Built-in Functions Specific to Particular Target Machines". Free Software Foundation. Retrieved 2012-06-20.
- MSDN (VS2012). "Intrinsics and Inline Assembly". Microsoft. Archived from the original on 2 January 2018. Retrieved 2010-04-16.
- MSDN (VS2010). "Intrinsics and Inline Assembly". Microsoft. Retrieved 2011-09-28.
- MSDN (VS2008). "Intrinsics and Inline Assembly". Microsoft. Retrieved 2011-09-28.
- MSDN (VS2005). "Intrinsics and Inline Assembly". Microsoft. Retrieved 2011-09-28.
پیوند به بیرون
- اینتل Intrinsics راهنمای
- با استفاده از milicode روالIBM AIX 6.1 مستندات