GObject - GObject

GObject
Tuzuvchi (lar)GNOME loyihasi
Dastlabki chiqarilish11 mart 2002 yil; 18 yil oldin (2002-03-11)
Barqaror chiqish2.64.4 (2020 yil 2-iyul); 4 oy oldin (2020-07-02)) [±][1]
YozilganC
Operatsion tizimO'zaro faoliyat platforma
Mavjud:Ko'p tilli[qaysi? ]
TuriDastur kutubxonasi
LitsenziyaGNU LGPL
Veb-saytishlab chiquvchi.kirish.org/ gobject/ barqaror/
Sifatida GNU C kutubxonasi uchun o'ram sifatida xizmat qiladi Linux yadrosi tizim qo'ng'iroqlari, shuningdek, birlashtirilgan kutubxonalar GLib (GObject, Glib, GM moduli, GThread va GIO ) o'zlarining aniq vazifalari uchun qo'shimcha paket sifatida xizmat qilishadi.

The GLib ob'ektlar tizimi, yoki GObject, a ozod dasturiy ta'minot kutubxonasi ko'chma bilan ta'minlash ob'ekt tizimi va shaffof tillararo o'zaro muvofiqlik. GObject to'g'ridan-to'g'ri ikkalasida ham foydalanish uchun mo'ljallangan C ob'ektga asoslangan C-ga asoslangan API-larni taqdim etish dasturlari va orqali bog'lash shaffof tillararo o'zaro muvofiqlikni ta'minlash uchun boshqa tillarga, masalan. PyGObject.

GObject introspection

Tarix

Faqatgina bog'liq GLib va libc, GObject - bu asos toshi GNOME va davomida ishlatiladi GTK, Pango, ATK va eng yuqori darajadagi GNOME kabi kutubxonalar GStreamer va ilovalar. GTK + 2.0 ga qadar GObject ga o'xshash kod GTK kod bazasining bir qismi bo'lgan. ("GObject" nomi hali ishlatilmagan - umumiy boshlang'ich sinf deb nomlangan GtkObject.)

GTK + 2.0 chiqarilgandan so'ng, ob'ektlar tizimi umumiy yordam dasturi tufayli alohida kutubxonaga chiqarildi. Bu jarayonda ko'pchilikGUI -ning o'ziga xos qismlari GtkObject sinfga ko'chirildi GObject, yangi umumiy sinf. 2002 yil 11 martdan (GTK + 2.0 ning chiqish sanasi) alohida kutubxona sifatida mavjud bo'lgan GObject kutubxonasi hozirda GUI bo'lmagan ko'plab dasturlarda qo'llaniladi. buyruq satri va server ilovalar.

GLib bilan bog'liqlik

GObject o'zining alohida hujjatlar to'plamiga ega bo'lsa ham[3] va odatda o'z-o'zidan tuziladi umumiy kutubxona faylida, GObject uchun manba kodi GLib manba daraxti va GLib bilan birga tarqatiladi. Shu sababli, GObject GLib versiya raqamlaridan foydalanadi va odatda GLib bilan birga paketlanadi (masalan, Debian GObject-ni o'z ichiga oladi libglib2.0 paketli oila).

Turi tizimi

GObject ramkasining eng asosiy darajasida umumiy va dinamik mavjud tizim turi GType deb nomlangan. GType tizimi barcha ob'ektlarning ish vaqti tavsifini beradi yopishqoq kod bir nechta tilni bog'lashni osonlashtirish uchun. Turli tizim har qanday narsani boshqarishi mumkin yagona meros sinf tuzilishi, qo'shimcha ravishda sinflanmagan kabi turlari shaffof bo'lmagan ko'rsatkichlar, torlar va har xil o'lchamdagi butun sonlar va suzuvchi nuqta raqamlari.

Turlar tizimi ro'yxatdan o'tgan har qanday turga tegishli qiymatlarni nusxalash, tayinlash va yo'q qilishni biladi. Bu butun son kabi turlar uchun ahamiyatsiz, ammo ko'plab murakkab ob'ektlar mos yozuvlar hisoblangan, ba'zilari esa murakkab, ammo mos yozuvlar hisoblanmaydi. Tizim mos yozuvlar bilan hisoblangan ob'ektni "nusxa ko'chirganda", odatda, faqat mos yozuvlar sonini ko'paytiradi, murakkab bo'lmagan, mos yozuvlar hisoblanmaydigan ob'ektni (masalan, mag'lubiyat) nusxalashda, odatda haqiqiy nusxasini yaratadi. xotira ajratish.

Ushbu asosiy funktsiya amalga oshirish uchun ishlatiladi GV qiymati, turdagi tizim tomonidan ma'lum bo'lgan har qanday turdagi qiymatlarni ushlab turadigan umumiy konteyner turi. Bunday konteynerlar barcha tabiiy qadriyatlar shu erda joylashgan dinamik ravishda yozilgan til muhitlari bilan o'zaro aloqada bo'lganda foydalidir. turi bilan belgilangan konteynerlar.

Asosiy turlari

Hech qanday bog'liq bo'lmagan turlari sinflar deyiladi sinflanmagan. Ushbu turlar, ba'zi bir shakllariga mos keladigan barcha turlar bilan birgalikda ildiz sinfi, sifatida tanilgan asosiy turlari: boshqa barcha turlar olingan turlar. Ular nisbatan yopiq to'plamni tashkil qiladi, ammo o'rtacha foydalanuvchi o'zlarining asosiy turlarini yaratishi kutilmasa ham, imkoniyat mavjud va odatlarni yaratish uchun foydalanilgan sinf ierarxiyalari - ya'ni sinf ierarxiyalari GObject sinf.

GLib 2.9.2 dan boshlab,[4] The sinflanmagan o'rnatilgan asosiy turlari:

  • C ga mos keladigan bo'sh tur bekor (G_TYPE_NONE);
  • imzo qo'yilgan va imzosiz S ga mos keladigan turlari char, int, uzoqva 64-bitli butun sonlar (G_TYPE_CHAR, G_TYPE_UCHAR, G_TYPE_INT, G_TYPE_UINT, G_TYPE_LONG, G_TYPE_ULONG, G_TYPE_INT64va G_TYPE_UINT64);
  • mantiqiy turi (G_TYPE_BOOLEAN);
  • sanash turi va "bayroqlar" turi, ikkalasi ham C ga mos keladi enum turi, ammo ikkinchisining faqat uchun ishlatilishi bilan farq qiladi bit maydonlari (G_TYPE_ENUM va G_TYPE_FLAGS);
  • bitta va ikki aniqlik uchun turlari IEEE suzadi, C ga mos keladi suzmoq va ikki baravar (G_TYPE_FLOAT va G_TYPE_DOUBLE);
  • C ga mos keladigan mag'lubiyat turi char * (G_TYPE_STRING);
  • shaffof bo'lmagan ko'rsatgich turi, C ga mos keladi bekor * (G_TYPE_POINTER).

The sinflangan o'rnatilgan asosiy turlari:

  • misollari uchun asosiy sinf turi GObject, standart sinf meros daraxtining ildizi (G_TYPE_OBJECT)
  • asosiy sinf turiga o'xshash, lekin standartning ildizini ifodalovchi asosiy interfeys turi interfeys meros daraxti (G_TYPE_INTERFACE)
  • uchun turi quti oddiy qiymat ob'ektlarini yoki begona narsalarni mos yozuvlar sonidagi "qutilarga" o'rash uchun ishlatiladigan tuzilmalar (G_TYPE_BOXED)
  • tasvirlash uchun GObject-da ishlatiladigan "parametrlarni aniqlovchi ob'ektlar" uchun turdagi metadata ob'ekt xususiyatlari uchun (G_TYPE_PARAM).

Turlar tizimi tomonidan avtomatik ravishda o'rnatilishi mumkin bo'lgan turlar deyiladi aqlga sig'maydigan. Ushbu turlarning muhim xarakteristikasi shundaki, har qanday misolning birinchi baytlarida doimo ko'rsatgich mavjud sinf tarkibi (shakli virtual jadval ) misol turi bilan bog'liq. Shu sababli, har qanday aqlga sig'maydigan turni tasniflash kerak. Qarama-qarshi ravishda, har qanday sinflanmagan tur (masalan tamsayı yoki mag'lubiyat) aqlga sig'maydigan bo'lishi kerak. Boshqa tomondan, ko'pincha sinflangan turlar aqlga sig'maydi, ammo ba'zilari, masalan, interfeys turlari, bunday emas.

Hosil qilingan turlar

O'rnatilgan GObject fundamental turlaridan kelib chiqqan turlar to'rt toifaga bo'linadi:

Sanab o'tilgan turlar va "bayroqlar" turlari
Umuman olganda, har bir sanab o'tilgan tur va har bir butun songa asoslangan bitfild tipi (ya'ni, har biri) enum turi) ob'ekt tizimiga tegishli bo'lgan biron bir tarzda foydalanishni xohlaydi - masalan, ob'ekt mulk turi sifatida - tizim tizimida ro'yxatdan o'tishi kerak. Odatda, ushbu turlarni ro'yxatdan o'tkazishda g'amxo'rlik qiladigan boshlang'ich kodi chaqirilgan avtomatlashtirilgan vosita tomonidan ishlab chiqariladi glib-mkenums[5] va alohida faylda saqlanadi.
Boxed turlari
To'liq sinf sinflarini yaratish uchun juda sodda bo'lgan ba'zi ma'lumotlar tuzilmalari (barcha qo'shimcha xarajatlar bilan) hali ham tizim tizimida ro'yxatdan o'tishlari kerak bo'lishi mumkin. Masalan, biz qo'shadigan sinfimiz bo'lishi mumkin fon rangi xususiyati, uning qiymatlari o'xshash strukturaning misollari bo'lishi kerak tuzilmaviy rang { int r, g, b; }. Subklassga kirmaslik uchun GObject, biz yaratamiz quti turi ushbu tuzilmani namoyish qilish va nusxalash va bo'shatish funktsiyalarini taqdim etish. GObject, oddiy GLib ma'lumotlar turlarini o'raydigan bir nechta quti turlariga ega. Boxed turlari uchun yana bir foydalanish - bu tipik tizim aniqlay oladigan va qanday qilib nusxa ko'chirishni va bo'shatishni biladigan etiketli konteynerga begona narsalarni o'rash usuli sifatida.
Shaffof bo'lmagan ko'rsatgich turlari
Ba'zan nusxa ko'chirmaslik yoki mos yozuvlar bilan hisoblash yoki bo'shatish kerak bo'lmagan narsalar uchun, hatto quti turi ham bo'ladi haddan tashqari ko'tarish. Bunday ob'ektlarni GObject-da ularni shaffof bo'lmagan ko'rsatgichlar sifatida ko'rib chiqish orqali ishlatish mumkin (G_TYPE_POINTER), ko'rsatgichlar ob'ektning ma'lum bir turiga murojaat qilishlari kerakligini hujjatlashtirgan holda, bu haqda boshqa hech narsa aytilmagan bo'lsa ham, hosil bo'lgan ko'rsatgich turini yaratish yaxshi fikr.
Sinf va interfeys turlari
GObject dasturining aksariyat turlari sinflar bo'ladi - so'zning odatdagi ob'ektga yo'naltirilgan ma'nosida - to'g'ridan-to'g'ri yoki bilvosita ildiz sinfidan olingan, GObject. Bundan tashqari, klassikadan farqli ravishda interfeyslar mavjud Java -style interfeyslari, amalga oshirilgan usullarni o'z ichiga olishi mumkin. GObject interfeyslarini shunday ta'riflash mumkin aralashmalar.

Xabar tizimi

GObject xabar almashish tizimi ikkita qo'shimcha qismdan iborat: yopilish va signallari.

Yopish
GObject-ning yopilishi a-ning umumlashtirilgan versiyasidir qayta qo'ng'iroq qilish. C va C ++ tillarida yozilgan yopilishlar, shuningdek o'zboshimchalik bilan tillar (bog'lanishlar mavjud bo'lganda) mavjud. Bu (masalan) Python va Java-da yozilgan kodni GObject yopilishi orqali chaqirishga imkon beradi.
Signallar
Signallar yopilishning asosiy mexanizmi. Ob'ektlar signallarni tinglovchilarni tipdagi tizim bilan ro'yxatdan o'tkazadilar, ma'lum bir signal va berilgan yopilish o'rtasidagi xaritani ko'rsatadilar. Ro'yxatdan o'tgan signal chiqarilgandan so'ng, ushbu signal yopiladi. GTK-da barcha mahalliy GUI hodisalari (masalan, sichqoncha harakati va klaviatura harakati) tinglovchilarga potentsial harakat qilishlari uchun GObject signallarini yaratishi mumkin.

Sinfni amalga oshirish

Har bir GObject klassi kamida ikkita tuzilma tomonidan amalga oshiriladi: the sinf tarkibi va instansiya tuzilishi.

Sinf tarkibi
Sinf tuzilishi quyidagilarga mos keladi vtable C ++ sinfining. U superklassning sinf tuzilishidan boshlanishi kerak. Shundan so'ng, u funktsiyalar ko'rsatkichlari to'plamini o'z ichiga oladi - har biri uchun bitta virtual usul sinfning. Sinf a'zolariga taqlid qilish uchun sinfga xos o'zgaruvchilardan foydalanish mumkin.
Namuna tuzilishi
Har bir ob'ekt nusxasi uchun bitta nusxada mavjud bo'ladigan misol tuzilishi, ning tuzilishi bilan boshlanishi kerak superklass (bu barcha misollar sinf tuzilishiga ko'rsatgich bilan boshlanishini ta'minlaydi, chunki barcha asosiy aqlga sig'maydigan turlar ushbu xususiyatga ega). Superklassga tegishli ma'lumotlardan so'ng, struktura C ++ a'zosi o'zgaruvchilariga mos keladigan har qanday misolga xos o'zgaruvchilarni o'z ichiga olishi mumkin.

GObject ramkasida sinfni aniqlash juda katta miqdorni talab qiladigan murakkab qozon kodni, masalan, turdagi quyma makrolarning qo'lda ta'riflari va noaniq turdagi ro'yxatdan o'tish uchun afsonalar. Bundan tashqari, C tuzilmasi "public", "protected" yoki "private" kabi kirish modifikatorlariga ega bo'lmasligi sababli, vaqtinchalik echimlarni ta'minlash uchun foydalanish kerak kapsulalash. Shaxsiy ma'lumotlarga ko'rsatgichni kiritish odatiy deb nomlangan yondashuvlardan biri hisoblanadi _priv - instansiya tarkibida. The xususiy tuzilma umumiy sarlavha faylida e'lon qilinishi mumkin, lekin faqat dastur faylida aniqlanadi, chunki bu shaxsiy ma'lumotlar foydalanuvchilar uchun shaffof emas, lekin bajaruvchi uchun shaffofdir. Agar xususiy tuzilma GType bilan ro'yxatdan o'tgan bo'lsa, u avtomatik ravishda ob'ekt tizimi tomonidan ajratiladi. Darhaqiqat, buni kiritish shart emas _priv ko'rsatgich, agar kishi afsonadan foydalanishga tayyor bo'lsa G_TYPE_INSTANCE_GET_PRIVATE har safar shaxsiy ma'lumotlar kerak bo'lganda.

Ushbu ba'zi bir murakkabliklarni hal qilish uchun bir nechta yuqori darajadagi tillar mavjud manbadan manbaga kompilyatsiya qilish ga GObject-ga. The Vala dasturlash tili foydalanadi C # - uslub sintaksisiga va oldindan qayta ishlangan vanil C kodi. GObject Builder yoki GOB2, eslatuvchi shablon sintaksisini taklif qiladi Java.

Foydalanish

C va GObject kombinatsiyasi ko'pgina muvaffaqiyatli narsalarda qo'llaniladi bepul dasturiy ta'minot kabi loyihalar GNOME ish stoli, GTK asboblar to'plami va GIMP tasvirni manipulyatsiya qilish dasturi.

Ko'pgina GObject dasturlari to'liq C tilida yozilgan bo'lsa ham, GObject tizimi ko'plab boshqa tillarning mahalliy ob'ekt tizimlariga yaxshi mos keladi, masalan. C ++, Java, Yoqut, Python, Umumiy Lisp va .NET /Mono. Natijada, uni yaratish odatda nisbatan og'riqsizdir tilni bog'lash GObject ramkasidan foydalanadigan yaxshi yozilgan kutubxonalar uchun.

GObject kodini birinchi navbatda C tilida yozish, ammo nisbatan tushunarli. Kutubxonani o'rganish uchun juda ko'p vaqt talab etiladi va tajribaga ega dasturchilar yuqori darajadagi ob'ektga yo'naltirilgan tillar ko'pincha S-da GObject bilan ishlashni biroz zerikarli deb biladi, masalan, subklass yaratish (hattoki shunchaki subklass GObject) ko'p miqdorda yozishni va / yoki nusxalashni talab qilishi mumkin qozon plitasi.[6] Biroq, foydalanish Vala, asosan GObject bilan ishlashga mo'ljallangan va C ga o'giradigan til, GObject bilan ishlashni yoki GObject asosidagi kutubxonalarni yozishni yoqimli qilishi mumkin.

Garchi ular aslida bo'lmasa ham birinchi darajali ob'ektlar (GType-da haqiqiy metatiplar mavjud emas), metaobektlar kabi sinflar va interfeyslar ish vaqtida GObject dasturlari tomonidan yaratilgan va ular uchun yaxshi yordam beradi introspektsiya. Introspektiv imkoniyatlardan til biriktirish va foydalanuvchi interfeysi dizayn dasturlari kabi foydalaniladi Glade yuklash kabi ishlarni bajarishga ruxsat berish umumiy kutubxona bu GObject sinfini taqdim etadi - odatda ba'zi bir turlari vidjet, Glade-da va keyin sinfning barcha xususiyatlari ro'yxatini oling.

Boshqa ob'ekt tizimlari bilan taqqoslash

GObject C uchun asosan to'liq ob'ekt tizimini taqdim etganligi sababli[iqtibos kerak ], kabi C tilidan olingan tillarga alternativa sifatida qaralishi mumkin C ++ va Maqsad-C. (Garchi ikkalasi ham o'zlariga tegishli ob'ekt tizimlaridan tashqari boshqa ko'plab xususiyatlarni taklif qilsa ham.) C ++ va GObject o'rtasidagi osongina kuzatiladigan farq shundaki, GObject (Java kabi) qo'llab-quvvatlamaydi ko'p meros.[7]

GObject-dan foydalanish GLib g_malloc () xotirani ajratish funktsiyasi, C kutubxonasidan farqli o'laroq, xotira tugashi bilan dasturning so'zsiz chiqishiga olib keladi. malloc (), C ++ s yangi va boshqa oddiy xotira taqsimlovchilari, bu dasturga shunchaki buzilmasdan xotiradan tashqarida bo'lgan vaziyatlarni engish yoki hatto ularni to'liq tiklashga imkon beradi.[8] Bu cheklangan xotira oldida chidamlilik muhim bo'lgan yoki juda ko'p yoki juda katta ob'ektlar bilan ish olib boriladigan dasturiy ta'minotga GObject-ni kiritishga qarshi ishlaydi. G_try_new () xotirani ajratish ehtimoli katta bo'lganida ishlatilishi mumkin (masalan, katta ob'ekt uchun), lekin bu ajratish kodning boshqa joylarida ishlamay qolishiga yo'l qo'ymaydi.[9]

Yana bir muhim farq shundaki, C ++ va Objective-C alohida tillar bo'lsa-da, GObject qat'iyan kutubxonadir va shu sababli yangi sintaksis yoki kompilyator aqlini kiritmaydi. Masalan, GObject-ga asoslangan C kodini yozishda tez-tez aniq bajarish kerak bo'ladi raddiya.[iqtibos kerak ] Demak, oddiy S dan ajratilgan til sifatida qaraladigan "GObject bilan C", C ob'ektivga o'xshash, ammo C ++ dan farqli o'laroq, oddiy S ning ustki to'plamidir.

Standart bo'lmagan platformalarda ABI barcha C ++ kompilyatorlari bo'ylab ishlaydigan (odatda bunday emas, chunki Itanium ABI yoki Microsoft ABI ta'qib qilinadi), bitta C ++ kompilyatori bilan tuzilgan kutubxona har doim boshqasi bilan tuzilgan kutubxonani chaqira olmaydi.[iqtibos kerak ] Agar bunday muvofiqlik zarur bo'lsa, C ++ usullari oddiy C funktsiyalari sifatida eksport qilinishi kerak, bu qisman C ++ ob'ekt tizimining maqsadini engib chiqadi.[iqtibos kerak ] Muammo qisman yuzaga keladi, chunki har xil C ++ kompilyatorlari har xil turlaridan foydalanadilar mangling nomlari eksport qilingan barcha belgilarning o'ziga xosligini ta'minlash. (Bu kerak, chunki, masalan, ikki xil sinf bir xil nomlangan a'zo funktsiyalariga ega bo'lishi mumkin, bitta funktsiya nomi bo'lishi mumkin haddan tashqari yuklangan bir necha marta yoki bir xil nomlangan funktsiyalar har xil ko'rinishda bo'lishi mumkin ism maydonlari, lekin ob'ekt kodi bir-biriga o'xshashliklarga yo'l qo'yilmaydi.)[iqtibos kerak ] Aksincha, C har qanday ortiqcha yuklanish yoki nomlar oralig'ini qo'llab-quvvatlamagani uchun, C kutubxonalari mualliflari odatda eksport qilingan nomlarining global o'ziga xosligini ta'minlash uchun aniq prefikslardan foydalanadilar.[iqtibos kerak ] Demak, ob'ektga yo'naltirilgan bo'lishiga qaramay, Cda yozilgan GObject-ga asoslangan kutubxona qaysi kompilyator ishlatilishidan qat'iy nazar har doim bir xil tashqi belgilar nomlaridan foydalanadi.

Ehtimol, eng chuqur farq GObject-ning signallarga bo'lgan ahamiyati (chaqiriladi) voqealar boshqa tillarda).[iqtibos kerak ] Ushbu ta'kidlash GObject-ning GUI asboblar to'plamining ehtiyojlarini qondirish uchun maxsus ishlab chiqilganligidan kelib chiqadi. Ko'pgina ob'ektga yo'naltirilgan tillar uchun signal kutubxonalari mavjud bo'lsa-da, GObject misolida u ob'ekt tizimiga o'rnatilgan. Shu sababli, odatdagi GObject ilovasi signallarni GObject bo'lmagan dasturga qaraganda ancha katta darajada ishlatishga moyil bo'ladi. komponentlar juda ham ko'p kapsulalangan va oddiy C ++ yoki Java-dan foydalanadiganlardan ko'ra qayta foydalanish mumkin.[iqtibos kerak ][kimga ko'ra? ] Agar foydalanayotgan bo'lsangiz glibmm /gtkmm, Glib / GTK-ga rasmiy ravishda C ++ o'ramlari, aka-uka loyihasi libsigc ++ standart C ++ yordamida asosiy GObject signallaridan qulay foydalanish imkonini beradi. Albatta, signallarning boshqa dasturlari deyarli barcha platformalarda mavjud, ammo ba'zida qo'shimcha kutubxona kerak bo'ladi, masalan, Boost.Signals2 uchun C ++.

Shuningdek qarang


Adabiyotlar

  1. ^ Yoqilgan, Filipp (2020 yil 2-iyul). "glib 2.64.4". GNOME ftp-relizi (Pochta ro'yxati). Olingan 14 avgust 2020.
  2. ^ "Introspektsiya, xulosa". Gnome Developer, Dasturlash bo'yicha ko'rsatmalar - Maxsus How-Tos. Olingan 9 avgust 2020.
  3. ^ "GObject ma'lumotnomasi".
  4. ^ "GObject ma'lumotnomasi - barqaror".
  5. ^ "glib-mkenums, GObject ma'lumotnomasi".
  6. ^ "Yangi GObject-ni qanday aniqlash va amalga oshirish kerak". gnome.org. Olingan 27 iyul 2013.
  7. ^ "c ++ - Nima uchun GObject tizimi yaratilgan?". Stack overflow. Olingan 2019-11-16.
  8. ^ "Xotirani ajratish: GLib ma'lumotnomasi". developer.gnome.org. Olingan 2019-11-16.
  9. ^ "Xotirani ajratish: GLib ma'lumotnomasi". developer.gnome.org. Olingan 2019-11-17.

Tashqi havolalar