الكتل (امتداد للغة C)

تُعدّ الكتل امتدادًا غير قياسي أضافته شركة آبل إلى لغات البرمجة C و C++ و Objective-C ، وتستخدم صيغةً شبيهةً بتعبيرات لامدا لإنشاء دوال مغلقة داخل هذه اللغات. يتطلب استخدام هذه الميزة دعمًا من المُصرّف بالإضافة إلى مكتبة وقت التشغيل .

على غرار تعريفات الدوال، يمكن للكتل البرمجية أن تأخذ وسائط، وأن تُعلن عن متغيراتها الخاصة داخليًا. على عكس تعريفات دوال لغة C العادية، يمكن لقيمتها أن تلتقط حالة من سياقها المحيط. يُنتج تعريف الكتلة البرمجية قيمة مبهمة تحتوي على كلٍ من مرجع إلى الكود داخل الكتلة ولقطة للحالة الحالية لمتغيرات المكدس المحلي وقت تعريفها. يمكن استدعاء الكتلة البرمجية لاحقًا بنفس طريقة استدعاء مؤشر الدالة . يمكن إسناد الكتلة البرمجية إلى متغيرات، وتمريرها إلى دوال، والتعامل معها كمؤشر دالة عادي، مع العلم أنه يجب على مبرمج التطبيق (أو واجهة برمجة التطبيقات) وضع علامة على الكتلة البرمجية باستخدام عامل خاص ( Block_copy) إذا كان سيتم استخدامها خارج النطاق الذي عُرّفت فيه. عند إعطاء قيمة للكتلة البرمجية، يمكن تنفيذ الكود الموجود داخلها في أي وقت لاحق عن طريق استدعائها، باستخدام نفس الصيغة المستخدمة لاستدعاء دالة.

طُرحت تقنية Blocks لأول مرة عام 2009 بهدف تسهيل كتابة البرامج لبنية Grand Central Dispatch (libdispatch) متعددة الخيوط. [ 1 ] [ 2 ] إلا أنها لا تعتمد على libdispatch، بل تعتمد على مكتبة وقت تشغيل خاصة بها (أبسط بكثير). تُثبّت مكتبة وقت تشغيل Blocks مسبقًا لأنظمة Mac OS X 10.6 والإصدارات الأحدث، وiOS 4.0 والإصدارات الأحدث. [ 3 ]

نطاق الدعم

يوجد نوعان فقط من المترجمات التي تُنفذ الكتل: فرع أبل الخاص من مجموعة مترجمات جنو (Apple GCC 4.2.1 وLLVM-GCC) وواجهة مترجم Clang LLVM الأصلية . تم التخلي عن Apple GCC منذ عام 2011 تقريبًا (Xcode 4.2). [ 3 ] يُمكن الاطلاع على أحدث وصف لهذا الامتداد اللغوي في وثائق Clang. [ 4 ]

كما ذُكر أعلاه، تحتوي أنظمة تشغيل أبل التي صدرت بعد عام 2009 على بيئة تشغيل مدمجة تعتمد على الكتل. يوفر مشروع LLVM بيئة تشغيل "مستقلة عن النظام المستهدف" من المفترض أن تعمل مع جميع أنظمة التشغيل التي يدعمها LLVM. [ 5 ]

التطبيقات

كما ذكرنا سابقًا، فإن المستخدم الرئيسي للكتل هو libdispatch، والذي يتم استخدامه في مجموعة متنوعة من منتجات Apple مثل مكتبة Swift القياسية.

يُعدّ بناء الجملة الكتلي جزءًا من معيار OpenCL C في الإصدارين 2.0 و3.0. ويُستخدم لإضافة النوى إلى قائمة الانتظار من داخل النوى. [ 6 ] كما تُعرّف مجموعة Khronos لغات برمجة غير متجانسة مبنية على لغة C++، بما في ذلك SYCL وC++ لـ OpenCL. وتستخدم كلتا اللغتين تعابير لامدا القياسية في C++. [ 7 ]

أمثلة

مثال بسيط لالتقاط الحالة القابلة للتغيير في النطاق المحيط هو مكرر نطاق الأعداد الصحيحة : [ 8 ]

/* blocks-test.c */ #include <stdio.h> #include <Block.h> /* نوع الكتلة التي لا تأخذ أي شيء وتعيد قيمة عددية صحيحة */ typedef int ( ^ IntBlock )();دالة إنشاء عداد ( int start , int increment ) { __block int i = start ; return Block_copy ( ^ ( void ) { int ret = i ; i += increment ; return ret ; }); }int main ( void ) { IntBlock mycounter = MakeCounter ( 5 , 2 ); printf ( "الاستدعاء الأول: %d \n " , mycounter ()); printf ( "الاستدعاء الثاني: %d \n " , mycounter ()); printf ( "الاستدعاء الثالث: %d \n " , mycounter ()); /* نظرًا لأنه تم نسخه، يجب تحريره أيضًا */ Block_release ( mycounter ); return 0 ; }

تجميع وتنفيذ

$ clang -fblocks blocks-test.c # نظام التشغيل Mac OS X $ ./a.out الاستدعاء الأول: 5 الاستدعاء الثاني: 7 الاستدعاء الثالث: 9

لا يُعد وقت تشغيل الكتل جزءًا من مكتبة (مكتبات) C المرتبطة افتراضيًا على بعض الأنظمة. في هذه الحالة، يلزم الربط صراحةً بهذه المكتبة.

$ clang -fblocks blocks-test.c -lBlocksRuntime # لينكس

يُعد وقت التشغيل جزءًا من وقت تشغيل Clang، ولكنه لا يُثبّت أحيانًا مع clangالحزمة. يتوفر وقت تشغيل مستقل مُستخرج من compiler-rt. [ 9 ]

العلاقة بالوظائف المتداخلة في GCC

تتشابه الكتل ظاهريًا مع امتداد GCC للغة C لدعم الدوال المتداخلة ذات النطاق المعجمي . ومع ذلك، لا يجب استدعاء الدوال المتداخلة في GCC، على عكس الكتل، بعد انتهاء النطاق الحاوي، لأن ذلك سيؤدي إلى سلوك غير محدد . [ 10 ]

تستخدم الدوال المتداخلة في GCC حاليًا إنشاءً ديناميكيًا لـ thunks قابلة للتنفيذ على معظم البنى عند أخذ عنوان الدالة المتداخلة. في معظم البنى (بما في ذلك x86 )، تُنشأ هذه الـ thunks على المكدس، مما يتطلب وضع علامة "قابل للتنفيذ" على المكدس. تُعتبر المكدسات القابلة للتنفيذ عمومًا ثغرة أمنية محتملة. لا تتطلب الكتل استخدام thunks قابلة للتنفيذ، لذا فهي لا تعاني من هذا الضعف. من ناحية أخرى، تُقدم الكتل نوعًا جديدًا تمامًا للمؤشر، بينما مؤشرات الدوال المتداخلة في GCC هي مؤشرات دوال عادية ويمكن استخدامها مباشرةً مع التعليمات البرمجية الموجودة.

انظر أيضاً

مراجع

  1. "Grand Central Dispatch" (ملف PDF) (موجز تقني). شركة آبل . 3 سبتمبر 2009. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 20 سبتمبر 2009. تم الاطلاع عليه بتاريخ 9 يونيو 2009 .
  2. سيراكوزا، جون (1 سبتمبر 2009). "نظام التشغيل ماك أو إس إكس 10.6 سنو ليوبارد: مراجعة آرس تكنيكا: بلوكس" . آرس تكنيكا .
  3. 1 2 "مواضيع برمجة الكتل" . مطور أبل . شركة أبل . تم الاسترجاع في 2011-03-08 .
  4. "امتدادات لغة Clang: الكتل" . مشروع LLVM . تم الاسترجاع في 20 يناير 2013 .
  5. "مكتبة وقت التشغيل "compiler-rt" . compiler-rt.llvm.org .
    • منشي، آفتاب، محرر. (13 يوليو 2013). "مواصفات OpenCL C. الإصدار 2.0. مراجعة الوثيقة 11" (ملف PDF) . مجموعة عمل كرونوس OpenCL. ص  173. مؤرشف من الأصل (ملف PDF) بتاريخ 5 نوفمبر 2013. تم الاطلاع عليه بتاريخ 23 يوليو 2013 .
    • "مواصفات OpenCL™ C" . registry.khronos.org .
  6. "SYCL – برمجة غير متجانسة أحادية المصدر بلغة C++ لـ OpenCL" . مجموعة كرونوس . 21 يناير 2014. مؤرشف من الأصل في 18 يناير 2021. تم الاطلاع عليه في 24 أكتوبر 2016 .
  7. بنغتسون، يواكيم. "البرمجة باستخدام لغة C Blocks على أجهزة أبل" . مؤرشف من الأصل بتاريخ 15 نوفمبر 2017. تم الاطلاع عليه بتاريخ 17 سبتمبر 2009 .
  8. "mackyle/blocksruntime: standalone blocks runtime" . تم الاطلاع عليه بتاريخ 15 يناير 2020 .
  9. "الوظائف المتداخلة: استخدام مجموعة مترجمات GNU (GCC)" .
  • "الكتل المنطقية (PLBlocks)" . جوجل كود. 2009. تم الاطلاع عليه بتاريخ 26-01-2021 . بيئة التشغيل ومجموعة الأدوات لاستخدام الكتل في iPhone 2.2+ و Mac OS X 10.5 (ذات أهمية تاريخية فقط)