تعد البرمجة المحمية ذات الكائنات ذات الكائنات المنخفضة المحمية مع ANSI-C ، والمعروفة باسم PLOOC ['PLU: K] ، مجموعة من قوالب ماكرو C المصممة جيدًا:
ملاحظة: يمكن تعطيل هذه الحماية من خلال تحديد الماكرو
__OOC_DEBUG__لتسهيل التصحيح.
_Generic .ملاحظة: النفقات العامة ما يقرب من الصفر. يستخدم القالب قواعد التجميع القسرية الخاصة بـ ANSI-C لتقديم ميزات موجهة نحو الكائن بأقل تكلفة ضرورية.
- Suitable for both bare-metal and RTOS environments.
- Suitable for both 8-bit and 32-bit MCUs.
مفهوم C (OOC) الموجهة للكائنات ليس جديدًا. هناك العديد من المكتبات ، SDKs ، والقوالب التي تمد ANSI-C بميزات البرمجة الموجهة للكائنات. على الرغم من أن PLOOC تؤكد على انخفاض حجمها في كل من حجم الكود وأداءها ، إلا أن العديد من حلول OOC المستندة إلى الماكرو توفر أيضًا انخفاضًا كبيرًا. لا تجبرك PLOOC على استخدام إدارة ذاكرة الكومة أو البلياردو ، كما أنه لا يوفر ميزات جمع القمامة (GC) ، وترك هذه الخيارات للمستخدم. هذا يجعلها مناسبة حتى للأنظمة 8 بت. على الرغم من أن البعض قد يرى هذا كعلامة ، إلا أنه اختيار تصميم متعمد. لن أجادل حول هذا.
إذن ، ما الذي يميز Plooc حقًا عن الآخرين؟ هل هي ببساطة عجلة إعادة اختراع أخرى؟
الجواب لا.
يقدم Plooc ميزة فريدة تفتقر إليها معظم الحلول الأخرى: فهي تضمن أن أعضاء الطبقة الخاصة خاصة ومحمية حقًا. هذا يعني أنه يتم منع المستخدمين خارج رمز مصدر الفصل من الوصول إلى هؤلاء الأعضاء الخاصين. بدلاً من ذلك ، يرون فقط كتلة صلبة من الذاكرة ، ملثمين كصفيف بايت. نظرًا لأن الفصول الدراسية في C يتم تقليدها بواسطة الهياكل ، فإن PLOOC تنفذ فئات باستخدام بنية مقنعة. كما هو متوقع ، يمكن فقط لعمود مصدر الفئة الوصول إلى الأعضاء الخاصين ، ويمكن فقط لمدونة مصدر الفئة للفئة المشتقة الوصول إلى الأعضاء المحميين في الفئة الأساسية. ومع ذلك ، يمكن للأعضاء العامين الوصول إلى الجميع.
كيف يعمل هذا؟ ربما خمنت ذلك من مصطلح "هيكل مقنع". في الأساس ، إنها خدعة نوع في ملفات الرأس.
تعمل هذه الخدعة بشكل جيد حتى تواجه برنامج التحويل البرمجي الصارم للتحقق من النوع. المثال الأكثر شهرة (أو السمعة) هو IAR ، خاصةً عند تمكين وضع التجميع متعدد الملفات. لا يمكن لأي خدعة من النوع الذي يمكن أن تنجو من الشيكات الصارمة لوضع تجميع IAR متعدد الملفات.
//! The original structure in the class source code
struct byte_queue_t {
uint8_t *pchBuffer;
uint16_t hwBufferSize;
uint16_t hwHead;
uint16_t hwTail;
uint16_t hwCount;
};
//! The masked structure: the class byte_queue_t in the header file
typedef struct byte_queue_t {
uint8_t chMask [sizeof(struct {
uint8_t *pchBuffer;
uint16_t hwBufferSize;
uint16_t hwHead;
uint16_t hwTail;
uint16_t hwCount;
})];
} byte_queue_t;
لجعل هذا العمل ، يجب عليك التأكد من أن رمز مصدر الفئة لا يتضمن ملف رأس الواجهة الخاص به. يمكنك حتى الذهاب إلى أبعد من ذلك إذا كنت جادًا في المحتوى:
//! The masked structure: the class byte_queue_t in the header file
typedef struct byte_queue_t {
uint8_t chMask [sizeof(struct {
uint32_t : 32;
uint16_t : 16;
uint16_t : 16;
uint16_t : 16;
uint16_t : 16;
})];
} byte_queue_t;
ملاحظة: يتم توفير مقتطفات الرمز أعلاه لتوضيح المخطط الأساسي ولكنها ليست عملية ، حيث أن محاذاة الهيكل الأصلي مفقود عند إنشاء صفيف القناع. لحل هذا ، تحتاج إلى استخراج معلومات المحاذاة باستخدام مشغل
__alignof__()وتعيين سمة محاذاة صفيف القناع وفقًا لذلك باستخدام__attribute__((aligned())).
يوفر PLOOC ميزة "الحماية الخاصة" مع مخطط مختلف ، بدلاً من الاعتماد على النوع. يتيح ذلك ذلك لدعم جميع المجمعين C تقريبًا مع تمكين ميزات C99. بصفتي المؤلف ، يجب أن أعترف أن الأمر استغرق وقتًا كبيرًا لمعرفة كيفية التعامل مع الفحص الصارم ، وكان المخطط الأولي قبيحًا وغير بديهي. بفضل المساهمات الملهمة لسيمون تشيان ، استغرق الأمر ثلاثة أشهر أخرى لتحسين PLOOC إلى شيء أنيق وبسيط. كان دعم هنري لونج حاسمًا أيضًا.
أتمنى أن تستمتع بهذا النهج الفريد لتحديات البرمجة الموجهة للكائنات في C.
إذا كان لديك أي أسئلة أو اقتراحات ، فلا تتردد في إخبارنا بذلك.
[08/25/2024] قالب فئة إصلاح ، الإصدار 4.6.4
تحديث readme
إضافة __plooc_malloc_align() و __plooc_free
أضف private_method() و protected_method() و public_method()
إزالة الاعتماد على امتدادات GNU
تغييرات طفيفة أخرى.
[11/02/2022] قالب فئة إصلاح ، الإصدار 4.6.3
[12/05/2022] تحسين التوافق مع آخر لغة C ++ ، الإصدار 4.6.2
[02/01/2022] أضف وحدات الماكرو للمساعد للكومة ، الإصدار 4.6.1
__new_class() و __free_class() لاستخدام malloc ومجانًا مع المُنشئين والمدمرين ، ie xxx_init () و xxxx_depose () .[30/12/2021] تحسين CMSIS-PAC ، الإصدار 4.6.0
[29/12/2021] إضافة CMSIS-Pack ، الإصدار 4.5.9
[28/11/2020] تحديث بسيط ، الإصدار 4.5.7
[05/08/2020] أضف __plooc_class_implement__ و __plooc_class_inherit__ الإصدار 4.5.6
[18/05/2020] قدم كل من النمط القصير والطويل للماكرو ، الإصدار 4.5.5
[16/05/2020] تحديث بسيط ، الإصدار 4.5.4A
[11/05/2020] تحديث بسيط ، الإصدار 4.5.4
[15/04/2020] تحديث __plooc_eval ، الإصدار 4.5.3
[19/02/2020] تحديث صغير لتمكين تحسين بصمة RAM ، الإصدار 4.52
[21/01/2020] تحديث MISC لـ C90 ، الإصدار 4.51
[09/06/2019] إضافة دعم لـ C89/90 ، الإصدار 4.50
[09/05/2019] أضاف الدعم لـ C89/90 ، الإصدار 4.40
[08/15/2019] تم تحديث PLOOC_CLASS_STRICT.H لاستخدام المزيد من بناء الجملة ، الإصدار 4.31
[08/14/2019] قدم الدعم لدعم محدود للحمل الزائد ، الإصدار 4.30
[07/26/2019] تحديث بناء الجملة ، الإصدار 4.21
[07/24/2019] أضاف قالب فئة OOC جديد ، الإصدار 4.20
[07/12/2019] تحديث بسيط ، الإصدار 4.13
[05/30/2019] تحديث بسيط ، الإصدار 4.12
[05/02/2019] تحسن الكفاءة ، الإصدار 4.11
[05/01/2019] توافق تحسين ، الإصدار 4.04
[04/20/2019] تحميل Plooc إلى Github ، الإصدار 4.03
[04/17/2019] تم تحميل PLOOC إلى Github ، الإصدار 4.01
كتبت مكتبة PLOOC بواسطة Gorgonmeducer (王卓然) [email protected] وسيمون تشيان (钱晓晨) https://github.com/versaloon بدعم من هنري لونج [email protected].
يتم إصدار مكتبة PLOOC بموجب ترخيص مفتوح المصدر Apache 2.0 الذي يسمح لكل من الاستخدام التجاري وغير التجاري دون قيود. الشرط الوحيد هو أن الاعتمادات ويرد في الرمز المصدر وفي الوثائق لمنتجك.
يتبع نص الترخيص الكامل:
/*****************************************************************************
* Copyright(C)2009-2019 by GorgonMeducer<[email protected]> *
* and SimonQian<[email protected]> *
* with support from HenryLong<[email protected]> *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); *
* you may not use this file except in compliance with the License. *
* You may obtain a copy of the License at *
* *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
****************************************************************************/
| الوحدة النمطية | التناقض |
|---|---|
| بلوك | Gorgonmeducer |
| plooc_class.h | Gorgonmeducer ، سيمون تشيان |
| plooc_class_strict.h | Gorgonmeducer |
| PLOOC_CLASS_BACK_BOX.H | Gorgonmeducer |
| plooc_class_simple.h | سيمون تشيان |
| PLOOC_CLASS_SIMPLE_C90.H | Gorgonmeducer |
| الوحدة النمطية | التناقض |
|---|---|
| كيفية تحديد الفصل | Gorgonmeducer |
| كيفية الوصول إلى الأعضاء المحميين | Gorgonmeducer |
| كيفية تنفيذ تعدد الأشكال | Gorgonmeducer |
لإظهار مدى سهلة الاستخدام PLOOC ، يتم توفير أمثلة لإظهار جوانب مختلفة من طريقة OOPC الجديدة. حاليا ، الأمثلة المتاحة هي:
سيتم إضافة المزيد من الأمثلة لاحقًا ...
هذا المثال يظهر
كيفية تنفيذ التحميل الزائد باستخدام PLOOC
تتطلب دعم C11
LOG_OUT("rn-[Demo of overload]------------------------------rn");
LOG_OUT((uint32_t) 0x12345678);
LOG_OUT("rn");
LOG_OUT(0x12345678);
LOG_OUT("rn");
LOG_OUT("PI is ");
LOG_OUT(3.1415926f);
LOG_OUT("rn");
LOG_OUT("rnShow BYTE Array:rn");
LOG_OUT((uint8_t *)main, 100);
LOG_OUT("rnShow Half-WORD Array:rn");
LOG_OUT((uint16_t *)main, 100/sizeof(uint16_t));
LOG_OUT("rnShow WORD Array:rn");
LOG_OUT((uint32_t *)main, 100/sizeof(uint32_t));
