الوظيفة الجوهرية
تحتاج هذه المقالة إلى مصادر إضافية للتحقق . ( ديسمبر 2009 ) |
في برمجيات الكمبيوتر ، وفي نظرية المترجم، تُعرف الدالة الجوهرية ، والتي تُسمى أيضًا الدالة المضمنة أو الدالة المضمنة ، بأنها دالة ( برنامج فرعي ) متاحة للاستخدام في لغة برمجة معينة، ويتم التعامل مع تنفيذها خصيصًا بواسطة المترجم . وعادةً، قد تحل محل تسلسل من التعليمات المولدة تلقائيًا لاستدعاء الدالة الأصلية، على غرار الدالة المضمنة . [1] وعلى عكس الدالة المضمنة، يتمتع المترجم بمعرفة وثيقة بالدالة الجوهرية وبالتالي يمكنه دمجها وتحسينها بشكل أفضل لموقف معين.
قد تقوم المجمِّعات التي تنفذ الوظائف الجوهرية بتمكينها فقط عندما يطلب البرنامج التحسين ، وإلا فإنها تتراجع إلى التنفيذ الافتراضي الذي يوفره نظام وقت تشغيل اللغة (البيئة).
المتجهات والتوازي
غالبًا ما تُستخدم الدوال الجوهرية لتنفيذ المتجهات والتوازي بشكل صريح في اللغات التي لا تتناول مثل هذه البنيات. تستخدم بعض واجهات برمجة التطبيقات (API)، على سبيل المثال، AltiVec و OpenMP ، الدوال الجوهرية للإعلان عن العمليات القابلة للمتجهات والواعية للمعالجة المتعددة على التوالي أثناء التجميع. يقوم المترجم بتحليل الدوال الجوهرية وتحويلها إلى رياضيات متجهة أو كود كائن متعدد المعالجة مناسب للمنصة المستهدفة . تُستخدم بعض الدوال الجوهرية لتوفير قيود إضافية للمحسن، مثل القيم التي لا يمكن للمتغير أن يفترضها. [2]
حسب لغة البرمجة
سي و سي++
تطبق المجمِّعات الخاصة بلغة C و C++ ، من Microsoft، [3] و Intel، [1] ومجموعة المجمِّعات GNU (GCC) [4] عناصر جوهرية يتم تعيينها مباشرة لتعليمة x86 الفردية وتعليمات البيانات المتعددة ( SIMD ) ( MMX ، و Streaming SIMD Extensions (SSE)، وSSE2 ، وSSE3 ، وSSSE3 ، وSSE4 ، و AVX ، وAVX2 ، و AVX512 ، و FMA ، ...). تسمح العناصر الجوهرية بالتعيين لتعليمات التجميع القياسية التي لا يمكن الوصول إليها عادةً من خلال C/C++، على سبيل المثال، فحص البت.
توفر بعض مُجمِّعات C وC++ عناصر داخلية غير محمولة خاصة بالمنصة. أما العناصر الداخلية الأخرى (مثل العناصر المضمنة في GNU ) فهي أكثر تجريدًا بعض الشيء، وتقترب من قدرات العديد من المنصات المعاصرة، مع تنفيذات احتياطية محمولة على منصات لا تحتوي على تعليمات مناسبة. [5] من الشائع أن تحقق مكتبات C++، مثل glm أو مكتبات الرياضيات المتجهة الخاصة بشركة Sony ، [6] قابلية النقل عبر التجميع الشرطي (بناءً على أعلام المجمِّع الخاصة بالمنصة)، مما يوفر عناصر بدائية عالية المستوى محمولة بالكامل (على سبيل المثال، نوع متجه فاصلة عائمة مكون من أربعة عناصر) مُطابقة لتنفيذات لغة البرمجة منخفضة المستوى المناسبة ، مع الاستفادة من نظام نوع C++ والتضمين؛ ومن هنا تأتي الميزة على الارتباط بملفات كائنات التجميع المكتوبة يدويًا، باستخدام واجهة تطبيق C الثنائية (ABI).
أمثلة
فيما يلي أمثلة على توقيعات الوظائف الجوهرية من مجموعة الوظائف الجوهرية الخاصة بشركة Intel.
uint64_t __rdtsc (); // إرجاع عداد ساعة وحدة المعالجة المركزية الداخلية uint64_t __popcnt64 ( uint64_t n ); // عدد البتات المضبوطة في n uint64_t _umul128 ( uint64_t Factor1 , uint64_t Factor2 , uint64_t * HighProduct ); // 64 بت * 64 بت => 128 بت الضرب __m512 _mm512_add_ps ( __m512 a , __m512 b ); // يحسب a + b لمتجهين من 16 عددًا عشريًا __m512 _mm512_fmadd_ps ( __m512 a , __m512 b , __m512 c ); // يحسب a*b + c لثلاثة متجهات من 16 عددًا عشريًا
[7]
جافا
يحتوي المترجم الفوري لآلة Java الافتراضية HotSpot ( JVM ) أيضًا على عناصر جوهرية لواجهات برمجة تطبيقات Java محددة. [8] العناصر الجوهرية Hotspot هي واجهات برمجة تطبيقات Java قياسية قد يكون لها تنفيذ واحد أو أكثر مُحسَّن على بعض الأنظمة الأساسية.
ب ل/ي
يحدد معيار ANSI/ISO PL/I ما يقرب من 90 وظيفة مدمجة. [9] يتم تجميعها تقليديًا على النحو التالي: [10] : 337–338
- وظائف مدمجة للتعامل مع السلاسل مثل INDEX وLENGTH
- الوظائف الحسابية المضمنة مثل ABS وCEIL وROUND
- الوظائف الرياضية المضمنة مثل SIN وCOS وLOG وERF
- وظائف مدمجة للتعامل مع المصفوفات، على سبيل المثال ANY وALL وPROD
- وظائف مدمجة للتعامل مع الحالات مثل ONCODE وONFILE
- وظائف التحكم في التخزين المضمنة، على سبيل المثال ADDR وPOINTER
- عناصر الإدخال والإخراج المضمنة: LINENO
- وظائف مدمجة متنوعة مثل التاريخ والوقت
لقد أضافت المجمِّعات الفردية ميزات إضافية مضمنة خاصة بهندسة الجهاز أو نظام التشغيل.
يتم التعرف على الوظيفة المضمنة عن طريق ترك اسمها غير معلن والسماح لها بالوضع الافتراضي، أو عن طريق إعلانها BUILTIN. يمكن استبدال الوظيفة التي يوفرها المستخدم بنفس الاسم عن طريق إعلانها كـ ENTRY.
مراجع
- ^ "دليل ومرجع مطوري Intel® C++ Compiler 19.1". وثائق Intel® C++ Compiler . 16 ديسمبر 2019 . تم الاسترجاع في 2020-01-17 .
- ^ فريق Clang (2020). "امتدادات لغة Clang". توثيق Clang 11. تم الاسترجاع في 17 يناير 2020. الوظائف
المضمنة
- ^ MSDN . "Compiler Intrinsics". Microsoft . تم الاسترجاع في 2012-06-20 .
- ^ وثائق GCC. "وظائف مدمجة خاصة بأجهزة مستهدفة معينة". مؤسسة البرمجيات الحرة . تم الاسترجاع في 2012-06-20 .
- ^ "امتدادات المتجهات". استخدام مجموعة GNU Compiler Collection (GCC) . تم الاسترجاع في 2020-01-16 .
- ^ "مكتبات الرياضيات Vector Math وSIMD مفتوحة المصدر من Sony (Cell PPU/SPU/منصات أخرى)". منتدى Beyond3D . مؤرشف من الأصل في 2016-06-24 . تم الاسترجاع في 2020-01-17 .
- ^ إنتل إنتيرنسكس
- ^ Mok, Kris (25 فبراير 2013). "الأساليب الجوهرية في HotSpot VM". Slideshare . تم الاسترجاع في 2014-12-20 .
- ^ لجنة ANSI X3 (1976). لغة البرمجة القياسية الوطنية الأمريكية PL/I .
{{cite book}}:CS1 maint: أسماء رقمية: قائمة المؤلفين ( الرابط ) - ^ IBM Corporation (1995). IBM PL/I for MVS & VM Language Reference .
روابط خارجية
- دليل Intel Intrinsics
- استخدام روتينات milicode، وثائق IBM AIX 6.1
