در مبحث نرم افزار در نظریه کامپایلر یک تابع ذاتی ( انگلیسی:Intrinsic function) (یا تابع درونی) یک تابع (subroutine) است که در یک زبان برنامه نویسی برای استفاده در دسترس است در حالی که پیاده سازی آن به طور خاص توسط کامپایلر انجام گرفته است. معمولاً تابع ذاتی ممکن است جایگزین یک توالی دستورالعمل به صورت خودکار تولید شده باشد مانند توابع تک خط. بر خلاف یک تابع تک خط کامپایلر دانش جامعی دربارهٔ تابع ذاتی دارد و در نتیجه می تواند برای یک وضعیت داده شده آن را بهتر یکپارچه سازی و بهینه سازی کند.
اینتل Intrinsics راهنمای
با استفاده از milicode روالIBM AIX 6.1 مستندات
کامپایلرهایی که توابع ذاتی پیاده سازی می کنند به طور کلی تنها زمانی که یک برنامه درخواست بهینه سازی دارد آن ها را فعال می سازد در غیر این صورت به پیاده سازی پیش فرض آن که توسط زبان در زمان اجرا آماده می شود برمی گردد.
توابع ذاتی اغلب برای پیاده سازی صریح برداری سازی و موازی سازی در زبان هایی است که این ساختارها را ندارند استفاده می شود. برخی از رابط های برنامه نویسی نرم افزار (API) برای مثال AltiVec و OpenMP از توابع ذاتی استفاده می کنند که عملیات vectorizable و multiprocessing-aware را در زمان کامپایل تعریف کنند. کامپایلر توابع ذاتی را پارس می کند و آن ها را به وکتور ریاضی یا multiprocessing کد شی مناسب برای پلت فرم هدف تبدیل می کند.
کامپایلر برای C و ++C مایکروسافتاینتل و GNU Compiler Collection GCC توابع ذاتی را طوری پیاده سازی می کنند که در تناظر مستقیم با تک دستورالعمل x86 چند داده ای (MMX Streaming SIMD Extensions (SSE), SSE2 SSE3 SSSE3 SSE4) باشند. Microsoft Visual C++ کامپایلر ویژوال استودیو مایکروسافت از هیچ اسمبلر خطی برای x86-64 پشتیبانی نمی کند. برای جبران کمبود اسمبلی خطی توابع خطی جدیدی اضافه شده اند که به دستورالعمل های اسمبلی استاندارد متناظر می شوند که به طور معمول از طریق C/C++ در دسترس نیستند به عنوان مثال بیت اسکن.
اینتل Intrinsics راهنمای
با استفاده از milicode روالIBM AIX 6.1 مستندات
کامپایلرهایی که توابع ذاتی پیاده سازی می کنند به طور کلی تنها زمانی که یک برنامه درخواست بهینه سازی دارد آن ها را فعال می سازد در غیر این صورت به پیاده سازی پیش فرض آن که توسط زبان در زمان اجرا آماده می شود برمی گردد.
توابع ذاتی اغلب برای پیاده سازی صریح برداری سازی و موازی سازی در زبان هایی است که این ساختارها را ندارند استفاده می شود. برخی از رابط های برنامه نویسی نرم افزار (API) برای مثال AltiVec و OpenMP از توابع ذاتی استفاده می کنند که عملیات vectorizable و multiprocessing-aware را در زمان کامپایل تعریف کنند. کامپایلر توابع ذاتی را پارس می کند و آن ها را به وکتور ریاضی یا multiprocessing کد شی مناسب برای پلت فرم هدف تبدیل می کند.
کامپایلر برای C و ++C مایکروسافتاینتل و GNU Compiler Collection GCC توابع ذاتی را طوری پیاده سازی می کنند که در تناظر مستقیم با تک دستورالعمل x86 چند داده ای (MMX Streaming SIMD Extensions (SSE), SSE2 SSE3 SSSE3 SSE4) باشند. Microsoft Visual C++ کامپایلر ویژوال استودیو مایکروسافت از هیچ اسمبلر خطی برای x86-64 پشتیبانی نمی کند. برای جبران کمبود اسمبلی خطی توابع خطی جدیدی اضافه شده اند که به دستورالعمل های اسمبلی استاندارد متناظر می شوند که به طور معمول از طریق C/C++ در دسترس نیستند به عنوان مثال بیت اسکن.
wiki: تابع ذاتی