Кіріспе
Нысанға бағдарланған бағдарламалау стилі, мұрагерлік нысандарды қайта пайдалануға негізделген. Прототипке негізделген бағдарламалау – бұл мінез-құлықты қайта пайдалану (мұрагерлік деп аталады) прототип ретінде қызмет ететін қолданыстағы нысандарды қайта пайдалану арқылы жүзеге асырылатын нысанға бағдарланған бағдарламалау стилі. Бұл модель прототиптік, прототипке бағдарланған, сыныпсыз немесе инстанцияға негізделген бағдарламалау деп те аталады. Прототипке негізделген бағдарламалау жалпыланған нысандарды пайдаланады, оларды кейін клондап, кеңейтуге болады. Мысал ретінде жемісті алсақ, "жеміс" нысаны жалпы жемістің қасиеттері мен функционалдығын көрсетеді. "Банан" нысаны "жеміс" нысанынан клондалады, содан кейін бананға тән қасиеттер қосылады. Әрбір жеке "банан" нысаны жалпы "банан" нысанынан клондалады. Бұл сыныпқа негізделген парадигмадан өзгеше, онда "жеміс" класы "банан" класынан мұрагерлік алады. Алғашқы прототипке негізделген бағдарламалау тілдері Director a. k. a. Ani (MacLisp үстінде) (1976–1979) және бір уақытта, бірақ тәуелсіз емес, ThingLab (Smalltalk үстінде) (1977–1981) болды, бұл Кеннет Майкл Канның MIT және Алан Гамильтон Борнингтің Стэнфордтағы PhD жобалары еді (бірақ Алан Кеймен бірге жұмыс істеді). Борнинг "прототип" сөзін 1981 жылғы TOPLAS мақаласында енгізді. Бірден көп іске асырушысы немесе пайдаланушысы бар алғашқы прототипке негізделген бағдарламалау тілі, мүмкін, Yale T Scheme (1981–1984) болды, бірақ Director және ThingLab сияқты бастапқыда ол сыныптарсыз нысандар туралы ғана айтады. Прототиптер атауын және ұғымын танымал еткен тіл Self (1985–1995) болды, ол Дэвид Унгар мен Рэндалл Смит объектіге бағдарланған тіл дизайнындағы тақырыптарды зерттеу үшін әзірлеген. 1990 жылдардың соңынан бастап сыныпсыз парадигма кеңінен танымал болды. Қазіргі кездегі прототипке бағдарланған тілдерге JavaScript (және басқа ECMAScript ішкі жүйелері, мысалы JScript және Flash-тің ActionScript 1.0), Lua, Cecil, NewtonScript, Io, Ioke, MOO, REBOL және AHK жатады. 2010 жылдан бері таза функционалдық прототиптері бар жаңа буын тілдер пайда болды, олар OOP-ті өзінің негізгі бөлігіне дейін азайтады: Jsonnet – миксин мұрагерлігін қолданатын, ішкі прототиптік нысандар жүйесі бар динамикалық, жалқау таза функционалдық тіл; Nix – эквивалентті нысандар жүйесін (Nix "кеңейтулері") сөзбе-сөз екі қысқа функция анықтамасында (плюс көптеген қосымша ыңғайлы функциялар) құрайтын динамикалық, жалқау таза функционалдық тіл. Екі тіл де үлкен үлестірілген бағдарламалық жасақтама конфигурацияларын анықтау үшін қолданылады (Jsonnet тікелей GCL-ден, Google конфигурациялық тілінен шабыттанды, Google барлық орналасуларын осы тілде анықтайды және динамикалық айнымалыларды байланыстыру арқылы ұқсас семантикаға ие). Содан бері Gerbil Scheme сияқты басқа тілдер де ұқсас принциптерге негізделген таза функционалдық, жалқау прототиптік жүйелерді іске асырды.
Prototype based programming is a style of object oriented programming in which behaviour reuse (known as inheritance) is performed via a process of reusing existing objects that serve as prototypes. This model can also be known as prototypal, prototype oriented, classless, or instance based programming. Prototype based programming uses the process generalized objects, which can then be cloned and extended. Using fruit as an example, a "fruit" object would represent the properties and functionality of fruit in general. A "banana" object would be cloned from the "fruit" object and general properties specific to bananas would be appended. Each individual "banana" object would be cloned from the generic "banana" object. Compare to the class based paradigm, where a "fruit" class would be extended by a "banana" class. The first prototype based programming languages were Director a. k. a. Ani (on top of MacLisp) (1976 1979), and contemporaneously and not independently, ThingLab (on top of Smalltalk) (1977 1981), respective PhD projects by Kenneth Michael Kahn at MIT and Alan Hamilton Borning at Stanford (but working with Alan Kay at Xerox PARC). Borning introduced the word "prototype" in his TOPLAS 1981 paper. The first prototype based programming language with more than one implementer or user was probably Yale T Scheme (1981 1984), though like Director and ThingLab initially, it just speaks of objects without classes. The language that made the name and notion of prototypes popular was Self (1985 1995), developed by David Ungar and Randall Smith to research topics in object oriented language design. Since the late 1990s, the classless paradigm has grown increasingly popular. Some current prototype oriented languages are JavaScript (and other ECMAScript implementations such as JScript and Flash's ActionScript 1.0), Lua, Cecil, NewtonScript, Io, Ioke, MOO, REBOL and AHK. Since the 2010s, a new generation of languages with pure functional prototypes has appeared, that reduce OOP to its very core: Jsonnet is a dynamic lazy pure functional language with a builtin prototype object system using mixin inheritance; Nix is a dynamic lazy pure functional language that builds an equivalent object system (Nix "extensions") in literally two short function definitions (plus many other convenience functions). Both languages are used to define large distributed software configurations (Jsonnet being directly inspired by GCL, the Google Configuration Language, with which Google defines all its deployments, and has similar semantics though with dynamic binding of variables). Since then, other languages like Gerbil Scheme have implemented pure functional lazy prototype systems based on similar principles.
Өкілеттік беру
Делегацияны қолданатын прототипке негізделген тілдерде, тілдің орындалу ортасы сәйкестік табылғанға дейін, объекттен оның прототипіне дейінгі делегация сілтемелерінің тізбесін орындау арқылы дұрыс әдісті табуға немесе қажетті деректерді анықтауға қабілетті. Объектілер арасында осы мінез-құлықты бөлісу үшін тек делегация сілтемесі ғана жеткілікті. Сыныптарға негізделген объектілі бағдарламалау тілдеріндегі сынып пен инстанция арасындағы қатынастан өзгеше, прототип пен оның туындылары арасындағы қатынас бала объектісінің осы сілтемеден басқа прототипке жад немесе құрылымдық ұқсастығы болуын талап етпейді. Сондықтан, бала объектісі уақыт өте келе сыныптарға негізделген жүйелердегідей, байланысты прототипінің құрылымын өзгертусіз өзгертіліп, толықтырылуы мүмкін. Сондай-ақ, деректер ғана емес, әдістер де қосылып немесе өзгертілуі мүмкін екенін ескеру маңызды. Осы себепті кейбір прототиптік тілдер деректер мен әдістердің екеуін де "ұялар" немесе "мүшелер" деп атайды.
Бірге тірелу
Конкатентивті прототиптеуде, Kevo бағдарламалау тілінде іске асырылған тәсілде, объектінің клондалған түпнұсқа прототипіне ешқандай көрінетін сілтемелер немесе байланыстар жоқ. Прототиптік (бастапқы) объекті байланыстырудың орнына көшіріледі және делегация болмайды. Осының салдарынан, прототипке енгізілген өзгерістер клондалған объектілерге көрінбейді. Айта кетейік, Cosmos бағдарламалау тілі де осыған ұқсас нәтижеге тұрақты дерек құрылымдарын пайдалану арқылы жетеді. Мұндай жағдайдағы негізгі түсінік айырмашылығы – прототиптік объектіге енгізілген өзгерістер автоматты түрде клондарға таратылмайды. Бұл артықшылық немесе кемшілік ретінде қарастырылуы мүмкін. (Дегенмен, Kevo нысандардың ұқсастығына негізделген өзгерістерді таратуға арналған қосымша қарапайым құралдарды ұсынады – олар отбасылық ұқсастықтар немесе клондық отбасы механизмі деп аталады.) Керісінше, делегацияға негізделген прототиптеу жүйелері деректерді іздеу жылдамдығын арттыру үшін кэштеуді пайдалана алады.
Сын
Сыныпқа негізделген объект модельдерін жақтаушылар, прототипке негізделген жүйелерді сынағанда, көбінесе статикалық типтік жүйелерді жақтаушылардың динамикалық типтік жүйелерге қатысты алаңдаушылықтарына ұқсас алаңдаушылықтарды білдіреді (datatype-қа қараңыз). Әдетте, бұл алаңдаушылықтар дұрыстық, қауіпсіздік, болжамдылық, тиімділік және бағдарламашының бұл жүйемен таныс емеуіне байланысты болады. Алғашқы үш мәселе бойынша, сыныптар көбінесе типтерге ұқсас деп есептеледі (көптеген статикалық типтелген объектіге бағытталған тілдерде олар осы рөлді атқарады) және олардың инстанцияларына, сондай-ақ оларды пайдаланушыларға, олардың белгілі бір тәсілде жұмыс істейтініне кепілдік беру мақсатында ұсынылады. Тиімділік тұрғысынан, сыныптарды жариялау компилятордың көптеген оңтайландыруларын жеңілдетеді, бұл әдістер мен инстанция айнымалыларын тиімді іздеуге мүмкіндік береді. Self тілі үшін, прототипке негізделген жүйелердің кластық жүйелерге қарағанда өнімділігін арттыруға көптеген уақыт әзірлеу, компиляциялау және интерпретациялау техникалары жұмсалды. Прототипке негізделген тілдерге қатысты жиі айтылатын сын – бағдарламалық жасақтаманы әзірлеушілер қауымдастығы олармен таныс емес, тіпті JavaScript-тің танымалдығы мен нарыққа кеңінен енуіне қарамастан. Алайда, JavaScript фреймворктарының көбеюімен және World Wide Web (Желі) дамыған сайын JavaScript-тің күрделі қолданылуымен прототипке негізделген жүйелер туралы білім артып келеді. ECMAScript 6 кластарды JavaScript-тің қолданыстағы прототипке негізделген мұрагерлігінің үстіне синтаксистік қант ретінде енгізді, бұл нысандарды құрудың және мұрагерлікті басқарудың баламалы жолын ұсынады.