Prototipke tiykarlanǵan programmalastırıw
Prototipke tiykarlanǵan programmalastırıw — bul minez-qulıqtı qayta paydalanıw (miyrasxorlıq dep te ataladı) prototipler retinde xızmet etetuǵın bar obyektlerdi qayta paydalanıw processi arqalı ámelge asırılatuǵın obyektke baǵdarlanǵan programmalastırıw stili. Bul model sonday-aq prototipli, prototipke baǵdarlanǵan, klassız yamasa instanciyaǵa tiykarlanǵan programmalastırıw dep te ataladı.
Prototipke tiykarlanǵan programmalastırıw ulıwmalastırılǵan obyektler processin qollanadı, olardı keyin klonlaw hám keńeytiw múmkin. Mısal retinde miyweni alsaq, «miywe» obyekti ulıwma miywelerdiń qásiyetlerin hám funkciyaların bildiredi. «Banan» obyekti «miywe» obyektinen klonlanadı hám bananlarǵa tán ulıwma qásiyetler oǵan qosıladı. Hárbir jeke «banan» obyekti ulıwma «banan» obyektinen klonlanadı. Bunı klassqa tiykarlanǵan paradigma menen salıstırıń, onda «miywe» klassı «banan» klassı menen keńeytiledi.
Tariyxı
Birinshi prototipke tiykarlanǵan programmalastırıw tilleri Director (MacLisp tiykarındaǵı Ani dep te ataladı) (1976-1979) hám oǵan zamanlas, biraq ǵárezsiz bolmaǵan ThingLab (Smalltalk tiykarında) (1977-1981) boldı, olar sáykes túrde Kennet Maykl Kanniń MIT-tegi hám Alan Hamilton Borningtiń Stenfordtaǵı (biraq Alan Key menen Xerox PARC-ta islesken) PhD proektleri edi. Borning 1981-jılı ACM Transactions on Programming Languages and Systems (TOPLAS) jurnalındaǵı maqalasıda bul kontekstte «prototip» sózin birinshi ret kirgizdi. Biraq, esletip ótemiz, bul ekewi de 1975-1976 jılları Vinograd hám Bobrovtıń KRL tilinen ilhamlanǵan, olar «prototip» hám (kóplegen) «miyrasxorlıq» sózlerin hám túsiniklerin «Bilimlerdi kórsetiw»diń baylanıslı kontekstinde, programmalar ushın emes, al maǵlıwmatlar ushın kirgizgen edi, bul bolsa óz gezeginde 1974-jılǵı Minskidiń Freymler koncepciyasına tiykarlanǵan edi. Birden kóp implementatorı bolǵan birinshi prototipke tiykarlanǵan programmalastırıw tili, bálkim, Yale T Scheme (1981-1984) boldı, biraq Director hám ThingLab sıyaqlı, ol dáslep klasslarsız obyektler haqqında ǵana aytatuǵın edi. Prototiplerdiń atın hám túsinigin keń tarqatqan til Self (1985-1995) boldı, onı Devid Ungar hám Rendall Smit obyektke baǵdarlanǵan til dizaynı boyınsha izertlewler alıp barıw ushın islep shıqtı.
1990-jıllardıń aqırınan baslap klassız paradigma barǵan sayın ataqlı bola basladı. Házirgi prototipke baǵdarlanǵan tillerdiń ayırımları: JavaScript (hám JScript hám Flash-tiń ActionScript 1.0 sıyaqlı basqa ECMAScript implementaciyaları), Lua, Cecil, NewtonScript, Io, Ioke, MOO, REBOL hám AHK.
2010-jıllardan baslap, OBP-nı onıń eń tiykarǵı ózegine shekem qısqartatuǵın taza funkcional prototipleri bar tillerdiń jańa áwladı payda boldı: Jsonnet — bul miksin miyrasxorlıǵın qollanatuǵın ornatılǵan prototip obyekt sisteması bar dinamikalıq jalqaw taza funkcional til; Nix — bul ekvivalent obyekt sistemasın (Nix «keńeytpeleri») tek eki qısqa funkciya anıqlamasında (hám basqa da kóp qolaylı funkciyalar menen) dúzetuǵın dinamikalıq jalqaw taza funkcional til. Ekewi de úlken tarqatılǵan programmalıq támiynat konfiguraciyaların anıqlaw ushın qollanıladı (Jsonnet tikkeley Google óziniń barlıq jaylastırıwların anıqlaytuǵın hám uqsas semantikaǵa iye, biraq ózgeriwshilerdiń dinamikalıq baylanısı bar GCL, Google Konfiguraciya Tili, tárepinen ilhamlanǵan). Sol waqıttan berli, Gerbil Scheme sıyaqlı basqa tiller uqsas principlerge tiykarlanǵan taza funkcional jalqaw prototip sistemaların ámelge asırdı.
Dizayn hám implementaciya
Etimologiyalıq jaqtan, «prototip» «birinshi quyma» degen mánisti bildiredi («quyma» óndiris mánisinde). Prototip — bul basqa obyektlerdi kóshiriw hám ózgertiw arqalı jaratıwǵa bolatuǵın anıq zat. Mısalı, Kilogrammnıń Xalıqaralıq Prototipi — bul haqıyqatında bar bolǵan anıq obyekt, onnan jańa kilogramm-obyektlerdi kóshiriw arqalı jaratıwǵa boladı. Salıstırmalı túrde, «klass» — bul obyektler tiyisli bolıwı múmkin bolǵan abstrakt zat. Mısalı, barlıq kilogramm-obyektler KilogramObject klasına kiredi, bul MetricObject klasınıń ishki klassı bolıwı múmkin, hám solay dawam etedi.
JavaScripttegi prototipli miyrasxorlıq Duglas Krokford tárepinen tómendegishe táriyiplenedi:
Siz prototip obyektlerin dúzesiz, sońınan … jańa instanciyalardı dúzesiz. JavaScriptte obyektler ózgermeli, sonlıqtan biz jańa instanciyalardı tolıqtırıp, olarǵa jańa maydanlar hám metodlar bere alamız. Olar keyin jáne de jańa obyektler ushın prototip bola aladı. Bizge kóp uqsas obyektler dúziw ushın klasslar kerek emes… Obyektler obyektlerden miyras aladı. Bunnan da kóbirek obyektke baǵdarlanǵan ne bolıwı múmkin?[1]
Prototipke tiykarlanǵan programmalastırıwdıń tárepdarları onıń baǵdarlamashını bir topar mısallardıń minez-qulqına itibar qaratıwǵa hám tek keyinirek bul obyektlerdi keyin klasslarǵa uqsas usılda qollanılatuǵın arxetiplik obyektlerge klassifikaciyalaw haqqında qáweterleniwge májbúr etetuǵının aytadı[2]. Kóp prototipke tiykarlanǵan sistemalar orınlanıw waqtında prototiplerdiń ózgertiliwin xoshametleydi, al tek júdá az klassqa tiykarlanǵan obyektke baǵdarlanǵan sistemalar (dinamikalıq obyektke baǵdarlanǵan sistema, Common Lisp, Dylan, Objective-C, Perl, Python, Ruby yamasa Smalltalk sıyaqlı) programma orınlanıp atırǵanda klasslardıń ózgertiliwine ruqsat beredi.
Derlik barlıq prototipke tiykarlanǵan sistemalar interpretaciyalanatuǵın hám dinamikalıq tiplestirilgen tillerge tiykarlanǵan. Biraq, statikalıq tiplestirilgen tillerge tiykarlanǵan sistemalar texnikalıq jaqtan múmkin. Prototype-Based Programming[3] kitabında talqılanǵan Omega tili bunday sistemanıń mısalı bolıp tabıladı, biraq Omega veb-saytına sáykes, hátte Omega da tek ǵana statikalıq emes, kerisinshe onıń «kompilyatorı bul múmkin bolǵan jerde hám programmanıń nátiyjeligin arttırıwı múmkin bolǵanda statikalıq baylanıstı paydalanıwdı tańlawı múmkin».
Obyekt qurılısı
Prototipke tiykarlanǵan tillerde anıq klasslar joq. Obyektler tikkeley basqa obyektlerden prototip qásiyeti arqalı miyras aladı. Prototip qásiyeti Self hám JavaScriptte prototype dep, yamasa Io-da proto dep ataladı. Jańa obyektlerdi qurıwdıń eki usılı bar: ex nihilo («hesh nárse den») obyekt jaratıw yamasa bar obyektti klonlaw arqalı. Birinshisi belgili bir formadaǵı obyekt literalı arqalı qollap-quwatlanadı, bunda obyektler orınlanıw waqtında {...} sıyaqlı arnawlı sintaksis arqalı anıqlanıp, tikkeley ózgeriwshige beriliwi múmkin. Kóp sistemalar hár túrli klonlawdı qollap-quwatlasa da, ex nihilo obyekt jaratıw onsha keń tarqalmaǵan[4].
Klassqa tiykarlanǵan tillerde, jańa instanciya klasstıń konstruktor funkciyası, yaǵnıy obyekttiń aǵzaları (qásiyetleri hám metodları) ushın yad blogın ajıratatuǵın hám sol blokqa silteme qaytaratuǵın arnawlı funkciya arqalı qurıladı. Konstruktor argumentleriniń qosımsha jıynaǵı funkciyaǵa beriliwi múmkin hám ádette qásiyetlerde saqlanadı. Nátiyjedegi instanciya klasta anıqlanǵan barlıq metodlar menen qásiyetlerdi miyras etip aladı, bul klass uqsas tipli obyektlerdi qurıw ushın bir túrli shablon retinde xızmet etedi.
Ex nihilo obyekt jaratıwdı qollap-quwatlaytuǵın sistemalar jańa obyektlerdi bar prototipten klonlamastan basınan jaratıwǵa múmkinshilik beredi. Bunday sistemalar bar obyektlerge silteme bermesten jańa obyektlerdiń qásiyetlerin hám minez-qulıqların belgilew ushın arnawlı sintaksis usınadı. Kóp prototip tillerinde ádette Object dep atalatuǵın túbir obyekt bar, ol orınlanıw waqtında jaratılǵan basqa barlıq obyektler ushın standart prototip retinde belgilenedi hám obyekttiń táriyipin qatar retinde qaytaratuǵın toString() funkciyası sıyaqlı kerekli metodlardı óz ishine aladı. Ex nihilo obyekt jaratıwdıń bir paydalı tárepi — jańa obyekttiń orın (qásiyetler hám metodlar) atlarınıń joqarı dárejeli Object obyekti menen atlar keńisligi dawlarınan saqlanıwın támiyinlew. (JavaScript tilinde, bunı bos prototipti paydalanıp islewge boladı, yaǵnıy Object.create(null).)
Klonlaw — bul jańa obyekttiń bar obyekttiń (onıń prototipiniń) minez-qulqın kóshiriw arqalı qurılatuǵın processin bildiredi. Jańa obyekt sonnan keyin dáslepki obyekttiń barlıq qásiyetlerine iye boladı. Usı noqattan baslap, jańa obyektti ózgertiwge boladı. Ayırım sistemalarda nátiyjedegi tuwındı obyekt óziniń prototipine anıq baylanıstı (delegaciya yamasa uqsaslıq arqalı) saqlap qaladı hám prototiptegi ózgerisler onıń klonında da sáykes ózgerislerdiń payda bolıwına alıp keledi. Kevo sıyaqlı Forth-ke uqsas programmalastırıw tili sıyaqlı basqa sistemalar prototipten ózgerislerdi bul usılda tarqatpaydı hám onıń ornına klonlanǵan obyektlerdegi ózgerisler avtomat túrde tuwındılarǵa tarqalmaytuǵın kóbirek biriktiriwshi modelge ámel etedi.
// JavaScripttegi haqıyqıy prototipli miyrasxorlıq stiliniń mısalı.
// Literal obyekt belgilewi {} arqalı obyekt jaratıw.
const foo = { name: "foo", one: 1, two: 2 };
// Basqa obyekt.
const bar = { two: "two", three: 3 };
// Object.setPrototypeOf() ECMAScript 2015-te kirgizilgen metod.
// Ápiwayılıq ushın, tómendegi qatar qollanılǵan
// dvijokke qaramastan isleytuǵının kóz aldımızǵa keltireyik:
Object.setPrototypeOf(bar, foo); // foo endi bar-dıń prototipi.
// Eger biz endi bar-dan foo-dıń qásiyetlerine kiriwge háreket etsek,
// biz tabısqa erisemiz.
bar.one; // 1-ge sheshiledi.
// Tuwındı obyekttiń qásiyetleri de qoljetimli.
bar.three; // 3-ke sheshiledi.
// Jeke qásiyetler prototip qásiyetlerin kóleńkeledi.
bar.two; // "two"-ǵa sheshiledi.
bar.name; // Tásirlenbegen, "foo"-ǵa sheshiledi.
foo.name; // "foo"-ǵa sheshiledi.
Basqa mısal:
const foo = { one: 1, two: 2 };
// bar.[[prototype]] = foo
const bar = Object.create(foo);
bar.three = 3;
bar.one; // 1
bar.two; // 2
bar.three; // 3
Delegaciya
Delegaciyanı paydalanatuǵın prototipke tiykarlanǵan tillerde, til orınlanıw ortalıǵı sáykeslik tabılǵanǵa shekem delegaciya kórsetkishleri izbe-izligin (obyektten onıń prototipine) qadaǵalap, durıs metodtı jiberiwge yamasa durıs maǵlıwmat bólegin tabıwǵa qábiletli. Obyektler arasında bul minez-qulıqtı bólisiwdi ornatıw ushın tek ǵana delegaciya kórsetkishi kerek. Klassqa tiykarlanǵan obyektke baǵdarlanǵan tillerdegi klass penen instanciya arasındaǵı baylanıstan ózgesheligi, prototip penen onıń tuwındıları arasındaǵı baylanıs tuwındı obyekttiń bul baylanıstan basqa prototip penen yad yamasa strukturalıq uqsaslıqqa iye bolıwın talap etpeydi. Solay etip, tuwındı obyekt klassqa tiykarlanǵan sistemalardaǵı sıyaqlı tiyisli prototipiniń strukturasın qayta shólkemlestirmesten waqıt ótiwi menen ózgertiliwin hám tolıqtırılıwın dawam ete aladı. Sonday-aq, tek maǵlıwmatlar ǵana emes, al metodlardıń da qosılıwı yamasa ózgertiliwi múmkinligin atap ótiw áhmiyetli. Usı sebepten, ayırım prototipke tiykarlanǵan tiller maǵlıwmatlardı da, metodlardı da «slotlar» yamasa «aǵzalar» dep ataydı.
Konkatenaciya
Konkatenativ prototiplewde — Kevo programmalastırıw tili tárepinen ámelge asırılǵan usıl — obyekt klonlanǵan dáslepki prototipke kórinetuǵın kórsetkishler yamasa siltemeler joq. Prototip (ata-ana) obyekti baylanıstırılıwdıń ornına kóshiriledi hám delegaciya joq. Nátiyjede, prototipke kirgizilgen ózgerisler klonlanǵan obyektlerde sáwlelenbeydi. Aytpaqshı, Cosmos programmalastırıw tili turaqlı maǵlıwmatlar strukturaların paydalanıw arqalı sol nátiyjege erisedi[5].
Bul dúziliw astındaǵı tiykarǵı konceptual ayırmashılıq — prototip obyektke kirgizilgen ózgerislerdiń klonlarǵa avtomat túrde tarqalmawı. Bul artıqmashılıq yamasa kemshilik retinde qaralıwı múmkin. (Biraq, Kevo obyektler toparı arasında olardıń uqsaslıǵına tiykarlanıp ózgerislerdi járiyalaw ushın qosımsha primitivlerdi usınadı — shańaraq uqsaslıqları yamasa klon shańaraǵı mexanizmi dep ataladı[6] — bul delegaciya modelinde ádettegidey taksonomiyalıq shıǵısına tiykarlanbaǵan.) Geyde delegaciyaǵa tiykarlanǵan prototiplewdiń tuwındı obyektke kirgizilgen ózgerislerdiń ata-ana obyekttiń keyingi iskerligine tásir etiwi múmkin degen qosımsha kemshiligi bar ekenligi de aytıladı. Biraq, bul másele delegaciyaǵa tiykarlanǵan modelge tán emes hám JavaScript sıyaqlı delegaciyaǵa tiykarlanǵan tillerde joq, olar tuwındı obyektke kirgizilgen ózgerislerdiń bárqulla tuwındı obyekttiń ózinde hám hesh qashan ata-analarda jazılıp qalmawın támiyinleydi (yaǵnıy, tuwındınıń mánisi ata-ananıń mánisin ózgertiwdiń ornına onı kóleńke túsiredi).
Ápiwayılastırılǵan implementaciyalarda, konkatenativ prototiplew delegaciyaǵa tiykarlanǵan prototiplewge qaraǵanda tezirek aǵza izlewge iye boladı (sebebi ata-ana obyektler shınjırın qadaǵalaw kerek emes), biraq kerisinshe kóbirek yad paydalanadı (sebebi ata-ana obyektine silteme beretuǵın bir orın bolıwdıń ornına barlıq orınlar kóshiriledi). Biraq, quramalılıraq implementaciyalar bul máseleni sheshe aladı, biraq tezlik penen yad arasında kompromissler talap etiledi. Mısalı, konkatenativ prototiplewi bar sistemalar artqı fonda maǵlıwmatlardı bólisiwge múmkinshilik beriw ushın jazıw-waqtında-kóshiriw implementaciyasın paydalana aladı — hám bunday usıl haqıyqatında Kevo tárepinen qollanıladı[7]. Kerisinshe, delegaciyaǵa tiykarlanǵan prototiplewi bar sistemalar maǵlıwmatlardı izlewdi tezletiw ushın keshlewdi paydalana aladı.
Sın
Prototipke tiykarlanǵan sistemalardı sınǵa alatuǵın klassqa tiykarlanǵan obyekt modelleriniń tárepdarları kóbinese programmalastırıw tilleri ushın statikalıq tip sistemalarınıń tárepdarlarınıń dinamikalıq tip sistemalarına baylanıslı táshwishlerine uqsas táshwishlerge iye (maǵlıwmatlar tipin qarań). Ádette, bunday uwayımlar durıslıq, qáwipsizlik, aldınnan boljaw múmkinshiligi, ónimlilik hám baǵdarlamashınıń tanıs emesligi menen baylanıslı.
Birinshi úsh punkt boyınsha, klasslar kóbinese tiplerge analog retinde qaraladı (kóp statikalıq tiplestirilgen obyektke baǵdarlanǵan tillerde olar sol roldi atqaradı) hám ózleriniń instanciyalarına hám olardıń instanciyalarınıń paydalanıwshılarına belgili bir usılda minez-qulıq kórsetetuǵın shártnamalıq kepillikler beriw ushın usınıladı.
Ónimdarlıqqa kelsek, klasslardı járiyalaw nátiyjeli metod hám instanciya-ózgeriwshi izlewdi rawajlandırıwǵa múmkinshilik beretuǵın kóp kompilyator optimallastırıwların ápiwayılastıradı. Self tili ushın, prototipke tiykarlanǵan sistemalardıń ónimdarlıǵın klassqa tiykarlanǵan sistemalarǵa salıstırǵanda jaqsılaw ushın islep shıǵıw, kompilyaciyalaw hám interpretaciyalaw usılların rawajlandırıwǵa kóp waqıt jumsalǵan.
Prototipke tiykarlanǵan tillerge qarsı aytılatuǵın ulıwma sın — bul programmalıq támiynat islep shıǵıwshılar jámiyetshiliginiń JavaScripttiń ataqlılıǵına hám bazarǵa kirip barıwına qaramastan, olar menen tanıs emesligi. Biraq, JavaScript freymvorklarınıń keń tarqalıwı hám Pútkil dúnya júzlik tordıń (Web) jetilisiwi menen JavaScripttiń quramalı paydalanılıwı arqalı prototipke tiykarlanǵan sistemalar haqqında bilim artıp barmaqta[8]. ECMAScript 6 JavaScripttiń bar prototipke tiykarlanǵan miyrasxorlıǵınıń ústine sintaksislik qant retinde klasslardı kirgizdi, bul obyektlerdi jaratıwdıń hám miyrasxorlıqtı basqarıwdıń alternativ usılın usındı[9].
Derekler
- ↑ Crockford, Douglas «Prototypal Inheritance in JavaScript». Qaraldı: 22-iyun 2021-jıl.
- ↑ Taivalsaari, Antero „Section 1.1“,. Classes vs. Prototypes: Some Philosophical and Historical Observations, 1996 — 44–50 bet.
- ↑ Blaschek, Günther „Section 2.8“,. Omega: Statically Typed Prototypes — 177 bet.
- ↑ Dony, Christophe; Malenfan, Jacques; Bardou, Daniel „Section 1.2“,. Classifying Prototype-based Programming Languages — 17 bet.
- ↑ «Object-Oriented Programming» (en). GitHub. Qaraldı: 4-sentyabr 2023-jıl.
- ↑ Antero Taivalsaar. «Simplifying JavaScript with Concatenation-Based Prototype Inheritance» (en). Tampere University of Technology (2009). — „Kevo implemented a pure concatenation-based object model in which new objects were created by copying and the namespaces of all the objects were always fully self-contained. … Furthermore, Kevo had an internal clone family mechanism that made it possible to track the “genealogy” of changes among groups of objects, so that changes to individual objects could be propagated to other objects when necessary.“. 13-avgust 2011-jılda túp nusqadan arxivlendi. Qaraldı: 11-mart 2015-jıl.
- ↑ Taivalsaari, Antero. Kevo, a prototype-based object-oriented programming language based on concatenation and module operations.
- ↑ "Prototypal Object-Oriented Programming using JavaScript" (in en-US). 2016-04-26. https://alistapart.com/article/prototypal-object-oriented-programming-using-javascript.
- ↑ «Classes». JavaScript reference. Mozilla Developer Network. Qaraldı: 9-fevral 2016-jıl.