Pemrograman berorientasi objek rendah-overhead yang dilindungi dengan ANSI-C, yang dikenal sebagai PLOOC ['Plu: K], adalah seperangkat templat makro C yang dipoles dengan baik yang:
Catatan: Perlindungan ini dapat dinonaktifkan dengan mendefinisikan makro
__OOC_DEBUG__untuk memfasilitasi debugging.
_Generic .Catatan: Overhead hampir nol. Template sepenuhnya menggunakan aturan kompilasi ANSI-C yang diberlakukan untuk memberikan fitur yang berorientasi objek dengan biaya yang diperlukan minimal.
- Suitable for both bare-metal and RTOS environments.
- Suitable for both 8-bit and 32-bit MCUs.
Konsep C (OOC) berorientasi objek bukanlah hal baru. Ada banyak perpustakaan, SDK, dan templat yang memperluas ANSI-C dengan fitur pemrograman berorientasi objek. Meskipun Plooc menekankan overheadnya yang rendah dalam ukuran dan kinerja kode, banyak solusi OOC berbasis makro juga menawarkan overhead rendah. Plooc tidak memaksa Anda untuk menggunakan manajemen memori tumpukan atau kumpulan, juga tidak menyediakan fitur pengumpulan sampah (GC), menyerahkan opsi -opsi ini kepada pengguna. Ini membuatnya cocok bahkan untuk sistem 8-bit. Sementara beberapa orang mungkin melihat ini sebagai kelemahan, ini adalah pilihan desain yang disengaja. Saya tidak akan berdebat tentang ini.
Jadi, apa yang benar -benar membedakan Plooc dari yang lain? Apakah ini hanyalah roda lain yang diciptakan kembali?
Jawabannya adalah tidak.
Plooc memperkenalkan fitur unik yang tidak dimiliki sebagian besar solusi lain: memastikan bahwa anggota pribadi kelas benar -benar pribadi dan terlindungi. Ini berarti bahwa pengguna di luar kode sumber kelas dicegah untuk mengakses anggota pribadi ini. Sebaliknya, mereka hanya melihat blok memori yang solid, bertopeng sebagai array byte. Karena kelas di C ditiru oleh struktur, PLOOC mengimplementasikan kelas menggunakan struktur bertopeng. Seperti yang diharapkan, hanya kode sumber kelas yang dapat mengakses anggota pribadi, dan hanya kode sumber kelas dari kelas yang diturunkan yang dapat mengakses anggota yang dilindungi dari kelas dasar. Namun, anggota publik dapat diakses oleh semua orang.
Bagaimana cara kerjanya? Anda mungkin telah menebaknya dari istilah "struktur bertopeng." Pada dasarnya, ini adalah trik tipe-cheating di file header.
Trik ini bekerja dengan baik sampai bertemu dengan kompiler pengecekan tipe yang ketat. Contoh paling terkenal (atau terkenal) adalah IAR, terutama ketika mode kompilasi multi-file diaktifkan. Tidak ada trik tipe-cheating yang dapat bertahan dari pemeriksaan ketat dari mode kompilasi multi-file 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;
Untuk membuat ini berfungsi, Anda harus memastikan bahwa kode sumber kelas tidak termasuk file header antarmuka sendiri. Anda bahkan dapat melangkah lebih jauh jika Anda serius tentang konten:
//! 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;
Catatan: Cuplikan kode di atas disediakan untuk menggambarkan skema yang mendasarinya tetapi tidak praktis, karena penyelarasan struktur asli tidak ada saat membuat array topeng. Untuk menyelesaikan ini, Anda perlu mengekstrak informasi penyelarasan menggunakan
__alignof__()operator dan mengatur atribut penyelarasan array mask yang sesuai dengan menggunakan__attribute__((aligned())).
PLOOC menyediakan fitur "perlindungan pribadi" dengan skema yang berbeda, daripada mengandalkan tipe-cheating. Ini memungkinkannya untuk mendukung hampir semua kompiler C dengan fitur C99 diaktifkan. Sebagai penulis, saya harus mengakui bahwa butuh waktu yang cukup untuk mencari cara untuk menangani pengecekan tipe yang ketat, dan skema awalnya jelek dan berlawanan dengan intuisi. Berkat kontribusi yang menginspirasi Simon Qian, butuh tiga bulan lagi untuk memperbaiki Plooc menjadi sesuatu yang elegan dan sederhana. Dukungan Henry Long juga penting.
Saya harap Anda menikmati pendekatan unik ini terhadap tantangan pemrograman yang berorientasi objek di C.
Jika Anda memiliki pertanyaan atau saran, jangan ragu untuk memberi tahu kami.
[08/25/2024] Perbaiki Template Kelas, Versi 4.6.4
ReadMe yang diperbarui
Tambahkan __plooc_malloc_align() dan __plooc_free
Tambahkan private_method() , protected_method() dan public_method()
Hapus ketergantungan pada ekstensi GNU
Perubahan kecil lainnya.
[11/02/2022] Perbaiki Templat Kelas, Versi 4.6.3
[12/05/2022] Meningkatkan kompatibilitas dengan bahasa C ++ terbaru, versi 4.6.2
[02/01/2022] Tambahkan macro helper untuk tumpukan, versi 4.6.1
__new_class() dan __free_class() untuk menggunakan malloc dan bebas bersama dengan konstruktor dan destruktor, yaitu xxxx_init () dan xxxx_depose () .[30/12/2021] Peningkatan CMSIS-PAC, Versi 4.6.0
[29/12/2021] Tambahkan CMSIS-PACK, Versi 4.5.9
[28/11/2020] Pembaruan Kecil, Versi 4.5.7
[05/08/2020] Tambahkan __plooc_class_implement__ dan __plooc_class_inherit__ versi 4.5.6
[18/05/2020] Memperkenalkan gaya makro pendek dan panjang, versi 4.5.5
[16/05/2020] Pembaruan Kecil, Versi 4.5.4a
[11/05/2020] Pembaruan Kecil, Versi 4.5.4
[15/04/2020] UPDATE __PLOOC_EVAL, Versi 4.5.3
[19/02/2020] Pembaruan kecil untuk mengaktifkan optimasi jejak kaki RAM, versi 4.52
[21/01/2020] Pembaruan Lain untuk C90, Versi 4.51
[09/06/2019] Menambahkan dukungan untuk C89/90, Versi 4.50
[09/05/2019] Menambahkan dukungan untuk C89/90, Versi 4.40
)
[08/14/2019] memperkenalkan dukungan untuk dukungan terbatas untuk kelebihan, versi 4.30
[07/26/2019] Pembaruan Sintaks, Versi 4.21
[07/24/2019] Menambahkan Template Kelas OOC baru, Versi 4.20
[07/12/2019] Pembaruan Kecil, Versi 4.13
[05/30/2019] Pembaruan Kecil, Versi 4.12
[05/02/2019] Efisiensi meningkat, versi 4.11
[05/01/2019] Kompatibilitas Meningkatkan, Versi 4.04
[04/20/2019] Unggah Plooc ke GitHub, Versi 4.03
[04/17/2019] Diunggah PlooC ke GitHub, Versi 4.01
Perpustakaan Plooc ditulis oleh GorgonMeducer (王卓然) [email protected] dan Simon Qian (钱晓晨) https://github.com/versaloon dengan dukungan dari Henry Long [email protected].
Perpustakaan PLOOC dirilis di bawah lisensi open source Apache 2.0 yang memungkinkan penggunaan komersial dan non-komersial tanpa batasan. Satu -satunya persyaratan adalah bahwa kredit diberikan dalam kode sumber dan dalam dokumentasi untuk produk Anda.
Teks lisensi lengkap mengikuti:
/*****************************************************************************
* 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. *
* *
****************************************************************************/
| modul | Contrinutor |
|---|---|
| PLOOC.H | GorgonMeducer |
| PLOOC_Class.h | GorgonMeducer, Simon Qian |
| PLOOC_Class_strict.h | GorgonMeducer |
| PLOOC_Class_back_box.h | GorgonMeducer |
| PLOOC_Class_Simple.h | Simon Qian |
| Plooc_Class_Simple_c90.h | GorgonMeducer |
| modul | Contrinutor |
|---|---|
| Bagaimana mendefinisikan kelas | GorgonMeducer |
| Cara mengakses anggota yang dilindungi | GorgonMeducer |
| Bagaimana menerapkan polimorfisme | GorgonMeducer |
Untuk menunjukkan bagaimana PLOOC mudah dan mudah digunakan, contoh disediakan untuk menunjukkan berbagai aspek dari metode OOPC baru. Saat ini, contoh yang tersedia adalah:
Lebih banyak contoh akan ditambahkan nanti ...
Contoh ini menunjukkan
Cara mengimplementasikan kelebihan menggunakan PLOOC
Membutuhkan dukungan 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));
