Informatikada interpretator (ingl. interpreter) ‒ bul programmalastırıw yamasa scenariy tilinde jazılǵan kórsetpelerdi aldınnan mashina tilindegi programmaǵa kompilyaciyalawdı talap etpesten tikkeley orınlaytuǵın kompyuter programması. Interpretator ádette programmanı orınlaw ushın tómendegi strategiyalardıń birin paydalanadı:

  1. Derek kodın tallaw hám onıń háreketin tikkeley orınlaw;
  2. Derek kodın tiykarınan ónimli aralıq kóriniske yamasa obyekt kodına awdarıw hám onı dárriw orınlaw;
  3. Kompilyator tárepinen jaratılǵan hám interpretatordıń virtual mashinasına sáykes keltirilgen, saqlanǵan aldınnan kompilyaciyalanǵan bayt kodın tikkeley orınlaw.
W3sDesign interpretator UML dizayn úlgisi

Lisp programmalastırıw tiliniń dáslepki versiyaları hám minikompyuterler menen mikrokompyuterlerdiń BASIC dialektleri birinshi tipke mısal boladı aladı. Perl, Raku, Python, MATLAB hám Ruby − ekinshi tipke mısal, al UCSD Paskal − úshinshi tipke mısal. Derek programmaları orınlawdan aldın kompilyaciyalanadı hám mashinaǵa ǵárezsiz kod retinde saqlanadı, ol keyin orınlaw waqıtında baylanıstırılǵan hám interpretator menen/yamasa kompilyator (JIT sistemaları ushın) tárepinen orınlanadı. Smalltalk hám zamanagóy BASIC hám Java versiyaları sıyaqlı ayırım sistemalar ekinshi hám úshinshi tiplerdi de birlestiredi. Kóplegen tiller ushın, tradiciyada kompilyaciya menen baylanıslı, Algol, Fortran, Cobol, C hám C++ sıyaqlı hár túrli tiptegi interpretatorlar da islep shıǵarıldı.

Interpretaciya menen kompilyaciya − programmalastırıw tilleriniń ámelge asırılatuǵın tiykarǵı eń zárúr usılları bolǵanı menen, olar bir-birine qarama-qarsı emes, óytkeni kóbinese interpretaciyalaw sistemaları da kompilyatorlar sıyaqlı bir qatar awdarma jumısların ámelge asıradı. “Interpretaciyalanatuǵın til” yamasa “kompilyaciyalanǵan til” terminleri sol tildiń tiykarǵı ámelge asırıwınıń sáykesinshe interpretator yamasa kompilyator ekenligin bildiredi. Joqarı dárejeli til ideal jaǵdayda anıq ámelge asırıwlardan ǵárezsiz abstrakciya bolıp tabıladı.

Interpretatorlar 1952-jıldan baslap, sol waqıttaǵı kompyuterlerdegi sheklewler (mısalı, programmanı saqlaw keńisliginiń jetispewshiligi yamasa ózgeriwshi noqatlı sanlarǵa ornatılǵan qollap-quwatlawdıń bolmawı) boyınsha programmalastırıwdı jeńilletiw ushın qollanıldı. Interpretatorlar sonday-aq  tómen dárejeli mashina tilleri arasında awdarıw ushın da qollanıldı, bul kodtı ele de qurılıp atırǵan mashinalar ushın jazıwǵa hám burınnan bar kompyuterlerde testlewge imkaniyat berdi.[1] Birinshi interpretaciyalanǵan joqarı dárejeli til − Lisp. Lisp birinshi ret Stiven Rassel tárepinen IBM 704 kompyuterinde ámelge asırıldı. Rassel Djon Makkartidiń “Simvollarlı ańlatpalardıń rekursiv funkciyaları hám olardıń mashinada esaplanıwı, I-bólim” atamasındaǵı maqalasın oqıdı hám (Makkartidiń hayran qalıwına qaramastan) Lisp eval funkciyasın mashina kodında ámelge asırıw múmkin ekenin túsindi. Nátiyjede Lisp programmaların iske túsiriw ushın paydalanıwǵa bolatuǵın jumıs isleytuǵın Lisp interpretatorı payda boldı, yamasa anıǵıraq aytqanda, “Lisp ańlatpaların bahalaw”.

Ulıwma operaciya

redaktorlaw

Interpretator ádette orınlay alatuǵın belgili komandalar jıynaǵın hám baǵdarlamashı tárepinen orınlanıwın qálegen tártipte usı komandalardıń dizimin qamtıydı. Hár bir buyrıq (kórsetpe dep te ataladı) baǵdarlamashı mutaciya islegisi keletuǵın maǵlıwmatlardı hám maǵlıwmatlardı mutaciyalaw usılı tuwralı informaciyanı qamtıydı. Mısalı, interpretator Books, 5 dep oqıwı múmkin hám onı Books ózgeriwshisine besti qosıw sorawı retinde túsindiredi.

Interpretatorlarda hár túrli wazıypalardı orınlawǵa qánigelestirilgen kóp túrli kórsetpeler bar, biraq siz kóbinese tiykarǵı matematikalıq operaciyalarǵa, tarmaqlanıwǵa hám yadtı basqarıwǵa arnalǵan interpretator kórsetpelerin tabasız, bul kóbinese interpretatorlardı Tyuring-ti juwmaqlaydı. Kóplegen interpretatorlar sonday-aq shıǵındı jıynawshı menen otladchik penen tıǵız birlestirilgen.

Kompilyatorlar menen interpretatorlar

redaktorlaw
 
Baylanıstırıw procesiniń illyustraciyası. Obyekt fayllar hám statikalıq kitapxanalar jańa kitapxanaǵa yamasa orınlanatuǵın faylǵa biriktirilgen.

Joqarı dárejeli tilde jazılǵan programmalar kompilyator arqalı (hám assembler menen biriktiriwshi) oraylıq processordıń orınlawı ushın mashina kodına awdarıladı yamasa qanday da bir interpretator arqalı tikkeley orınlanadı.

Kompilyatorlar (hám assemblerler) ádette tikkeley mashina kodın islep shıǵarsa da, olardıń kóbinese orınlanıw blokların (yamasa modullerin) anıqlaw hám qayta ornatıw ushın atlar hám tegler menen tolıqtırılǵan obyekt kodı dep atalatuǵın aralıq forma jaratıwı múmkin. Kompilyaciyalanǵan programmalar kóbinese usı kórinistegi modul kitapxanasında saqlanǵan qurılıs blokların (funkciyalar) paydalanadı. Biriktiriwshi, bir orınlanıwshı fayldı qáliplestiriw ushın, (aldınnan jasalǵan) kitapxana faylların qosımshanıń obyekt fayl(lar)ı menen birlestiriw ushın qollanıladı. Orınlanıwshı fayldı generaciyalaw ushın paydalanılatuǵın obyekt fayllar kóbinese hár túrli waqıtta jaratıladı, hám geyde hár túrli tiller tárepinen (birdey obyekt formatın jaratıwǵa qábiletli) islep shıǵarıladı.

Tómen dárejeli tilde (mısalı, assembler) jazılǵan ápiwayı interpretator, joqarı dárejeli tildiń funkciyaların ámelge asıratuǵın uqsas mashina kodı blokları saqlanǵan hám funkciyanıń izlew kestesindegi kiriw sol kodqa silteme bergende orınlanadı. Biraq, joqarı dárejeli tilde jazılǵan interpretator ádette basqa usıldı paydalanadı, mısalı, tallaw teregin jaratıw hám sonnan keyin onı júrgiw, yamasa aralıq programmalıq támiynat anıqlanǵan kórsetpelerdi jaratıw hám orınlaw, yamasa ekewin de ámelge asıradı.

Usılayınsha, kompilyatorlar da, interpretatorlar da ádette derek kodın (tekst faylların) tokenlerge aylandıradı, ekewi de (yamasa bolmaydı) tallaw teregin jaratıwı múmkin, hám ekewi de dárriw kórsetpelerdi jaratıwı múmkin (stek mashinası ushın, tórtlik kod yamasa basqa usıllar arqalı). Tiykarǵı ayırmashılıq shın mánisinde kompilyator sistemasınıń (orınlanǵan yamasa bólek) biriktiriwshi jeke mashına kodı programmanı jaratadı, al interpretator sisteması kerisinshe joqarı dárejeli programma táriyiplegen háreketlerdi ámelge asıradı.

Kompilyator usılayınsha derek kodı semantikasın mashina dárejesine bir ret hám barlıq waqıtqa (yaǵnıy programma ózgertilgenge shekem) aylandırıwǵa imkaniyat bere aladı, al interpretator hár bir operator yamasa funkciya orınlanǵan gezde bul túrlendiriw jumısınıń ayırımların ámelge asırıwı kerek. Biraq, ónimli interpretatorda awdarıw jumısınıń kóplegen bólimi (tiplerdi analizlew hám uqsas) ajıratılıp, programma, modul, funkciya yamasa hátte operator birinshi ret jumıs islegen gezde ǵana orınlanadı, bul kompilyatordıń qalay jumıs isleytuǵına júdá uqsas. Degen menen, kompilyaciyalanǵan programma kóbinese, hár qanday jaǵdaylarda, kóbirek tez jumıs isleydi, bul kompilyatorlar kodtı optimallastırıwǵa arnalǵanlıqtan hám bul ushın jetkilikli waqıttı beriwge boladı. Bul ásirese (kóplegen) dinamikalıq maǵlıwmatlar strukturaları, tekseriwler yamasa tipti tekseriwlersiz ápiwayı joqarı dárejeli tillerge baylanıslı.

Dastúrli kompilyaciyada siltemelerdiń orınlanatuǵın shıǵısı (.exe faylları yamasa .dll faylları yamasa kitapxana, súwretti qarań) ádette ulıwma operaciyalıq sistemada iske qosılǵanda, obyekt kodı modulleri sıyaqlı, biraq bul orın almastırıwdıń ayırmashılıǵı menen almastırıladı yaǵnıy orınlaw waqıtında programma orınlaw ushın júklengende dinamikalıq túrde orınlanadı. Ekinshi jaǵınan, kishi orınlanǵan sistemalarǵa arnalǵan kompilyaciyalanǵan hám baylanıstırılǵan programmalar ádette statikalıq túrde bólingen bolıp, kóbinese NOR flesh yadında qattı kodlanǵan bolıp tabıladı, óytkeni bul jaǵdayda kóbinese ekinshi derekli saqlaw hám operacion sistema bolmaydı.

Tariyxıy jaqtan, kóbinese interpretator sistemaları óz aldına orınlanatuǵın redaktordı qamtıǵan. Bul kompilyatorlar ushın da (kóbinese IDE dep ataladı) kóbirek tarqalǵan bolıp, biraq ayırım baǵdarlamashılar ózleriniń tańlaǵan redaktorın paydalanıwdı hám kompilyatorǵa, biriktiriwshige hám basqa qurallarǵa qol menen jumıs islewdi jaqsı kóredi. Tariyxıy jaqtan, kompilyatorlar interpretatorlardan burın payda boldı, óytkeni sol waqıttaǵı apparatlıq támiynat interpretatordı hám interpretatordıń kodın, sol waqıttıń tipik paket ortalıǵı interpretaciyanıń artıqmashılıqların shekleydi.[2]

Rawajlanıw cikli

redaktorlaw

Programmalıq támiynattı islep shıǵarıw cikli waqtında, baǵdarlamashılar derek kodına jiyi ózgerisler kirgizedi. Kompilyatordı paydalanǵanda, derek kodta ózgeris kiritilgen sayın, baǵdarlamashı kompilyator ózgertilgen derek faylların awdarıw hám barlıq ekilik kod faylların birge baylanıstırıwın kútiwi kerek, sonnan keyin programma orınlanıwı múmkin boladı. Programma úlken bolǵan sayın, kútiw waqtı uzaq boladı. Kerisinshe, interpretatordı paydalanatuǵın baǵdarlamashı azıraq kútedi, óytkeni interpretator ádette tek jumıs islep atırǵan kodtı aralıq kóriniske awdarıwı kerek (yamasa ulıwma awdarılmawı kerek), usılayınsha ózgertiwlerdi testlewge kóbirek waqıttı talap etedı. Nátiyje derek kodın saqlaw hám programmanı qayta júklewde kórinedi. Kompilyaciyalanǵan kod ádette ańsat otladka etilmeydi, óytkeni redaktorlaw, kompilyaciyalaw hám baylanıstırıw izbe-iz procesler bolıp, olardı durıs tártipte hám durıs buyrıqlar jıynaǵı menen ámelge asırıw kerek. Bunıń sebebi, kóplegen kompilyatorlarda sonday-aq Makefile hám programma dep atalatuǵın basqarıwshı járdemshi bar. Makefile kompilyator hám biriktiriwshi buyrıq qatarları hám programma derek kodı faylların dizimleydi, biraq ápiwayı buyrıq qatarı menyusı kirgiziwin qabıl etiwi múmkin (mısalı, "Make 3") ol úshinshi toparǵa (jıynaǵına) kórsetpelerdi tańlaydı, sonnan keyin berilgen derek kodı faylların berip, kompilyatorǵa hám biriktiriwshige buyrıqlar jiberedi.

Tarqatıw

redaktorlaw

Kompilyator derek kodın belgili bir processor arxitekturasına arnalǵan ekilik kórsetpelerge aylandıradı, usılayınsha ol portativligin azaytadı. Bul túrlendiriw tek bir ret, islep shıǵarıwshınıń ortalıǵında ámelge asırıladı hám onnan keyin birdey ekilik fayldı qosımsha túrlendiriwsiz iske qosıw ushın paydalanıwshınıń mashinalarına tarqatıwǵa boladı. Kross-kompilyator kod kompilyaciyalanǵan mashinadan basqasha processorǵa iye bolsa da, paydalanıwshınıń mashinasına ekilik kodtı jarata aladı.

Interpretaciyalanǵan programma derek kodı retinde tarqatıwǵa boladı. Onı hár bir sońǵı mashinada awdarıw kerek, bul kóbirek waqıt talap etedi, biraq programmanıń tarqatıwın mashina arxitekturasınan ǵárezsiz etedi. Degen menen, interpretaciyalanǵan derek kodınıń portativligi maqsetli mashinada haqıyqıy sáykes interpretator bolıwına baylanıslı. Eger interpretatordı derek kodı menen birge jetkiziw kerek bolsa, ulıwma ornatıw procesi interpretatordıń ózi de ornatıw kerek bólimi bolǵanlıqtan, monolitli orınlanıwshını jetkiziwge qaraǵanda quramalılıǵı joqarı.

Interpretaciyalanǵan kodtıń adamlar tárepinen oqıwǵa hám kóshiriwge ańsat ekenligi avtorlıq huqıq kózqarasınan alańlatıwı múmkin. Degen menen, shifrlaw hám jasırıw sistemalarınıń bir qatarı bar. Aralıq kodı, mısalı, bayt kodtı jetkiziw, jasırıwǵa uqsas tásirge iye, biraq bayt kodın dekompilyator yamasa deshifrator járdemi menen dekodlawǵa boladı.

Ónimlilik

redaktorlaw

Interpretatorlardıń baslı kemshiligi, interpretaciyalanǵan programma ádette kompilyaciyalanǵanǵa qaraǵanda, ásten jumıs isleydi. Tezlik ayırımshalıǵı az yamasa úlken bolıwı múmkin; kóbinese bir dárejede hám geyde onnan da kóp. Programmanı interpretatorda iske túsiriw kompilyaciyalanǵan koddı iske túsiriwge qaraǵanda kóbinese uzaq waqıt talap etedi, biraq onı kompilyaciyalaw hám iske túsiriw ushın kerek bolǵan ulıwma waqıttan kóbirek waqıttı talap etilse de, onı interpretaciyalaw tezirek boladı. Bul ásirese kóplegen kóshiriwlerdi qayta islew hám testlew waqtında maqsetli boladı, óytkeni redaktorlaw-interpretaciya-otladka cikli, redaktorlaw-kompilyaciya-ishke qosıw-otladka ciklinen kóbinese qısqa.[3]

Kodtı interpretaciyalaw kompilyaciyalanǵan koddı iske túsiriwge qaraǵanda ástenirek, óytkeni interpretator programmadaǵı hárbir operatordı orınlaw waqtında analizlew kerek, sonnan keyin kerekli háreketti ámelge asıradı, al kompilyaciyalanǵan kod kompilyaciya menen anıqlanǵan turaqlı kontekst ishinde háreketti ámelge asıradı. Bul orınlaw waqtında analiz "interpretativ júkleme" dep ataladı. Interpretatorda ózgeriwshilerge kiriw de ástenirek, óytkeni identifikatorlardı saqlaw orınlarına salıstırıw kompilyaciya waqtında emes, orınlaw waqtında qayta-qayta ámelge asırılıwı kerek.

Interpretatordı paydalanǵanda islep shıǵarıw tezligi menen kompilyatordı paydalanǵanda orınlaw tezligi arasında hár túrli kelisiwler bar. Ayırım sistemalar (mısalı, ayırım Lispler) interpretaciyalanǵan hám kompilyaciyalanǵan kodlar bir-birin shaqırıwǵa hám ózgeriwshi mánislerdi ulıwma paydalanıwǵa imkaniyat beredi. Bul interpretatorda bir jumıs tártibi testlenip, otladka etilgennen keyin onı kompilyaciyalawǵa boladı hám usılayınsha basqa tártiplerdi islep shıǵarıw waqtında tez orınlanıwdıń paydasın kóriwge boladı. Kóplegen interpretatorlar derek kodın sol jaǵdayında orınlamaydı, biraq onı kompakt internal formaǵa túrlendiredi. Kóplegen BASIC interpretatorları gilt sózlerdi bir baytlı tokenler menen almastıradı, olardı almasıw kestede kórsetpeni tabıw ushın paydalanıwǵa boladı. Bir neshe interpretatorlar, mısalı, PBASIC interpretatorı, programmanıń yad strukturasın baytqa baǵdarlanǵan emes, al bitke baǵdarlanǵan paydalanıw arqalı programmanıń ıqshamlıq dárejesin jaqsılaydı, bunda buyrıq tokenleri shama menen 5 bitti aladı, nominal túrde “16 bitlik” konstantalar 3, 6, 10 yamasa 18 bitti talap etetuǵın ózgeriwshi uzınlıqtaǵı kodta saqlanadı, al adres operandları "bitli jıljıw" qosıladı. Kóplegen BASIC interpretatorları óziniń tokenlengen ishki kórinisin saqlay aladı hám onı qayta oqıwǵa boladı.

Interpretator kompilyator sıyaqlı birdey leksikalıq analizator menen tallawshını paydalanıwı múmkin hám alınǵan abstrakt sintaksislik teregin interpretaciyalaydı. Keyingisi ushın, C ańlatpalarınan alınǵan sintaksislik tereklerge arnalǵan oyınshıq interpretator ushın maǵlıwmatlar tipiniń anıqlamaları qutıda kórsetilgen.

Regressiya

redaktorlaw

Interpretaciya jaratıwǵa jaramsız, tek orınlaw usılı retinde paydalanıwǵa bolmaydı: interpretatordıń ózin de interpretaciyalawǵa hám t.b. múmkin bolǵanı menen, stektiń túbinde tikkeley orınlanatuǵın programma kerek, óytkeni interpretaciyalanǵan kod, anıqlaması boyınsha CPU orınlay alatuǵın mashina kodına uqsas emes.

Variaciyalar

redaktorlaw

Bayt kod interpretatorları

redaktorlaw

Programmanı orınlawdan aldın ámelge asırılǵan analiz muǵdarına baylanıslı interpretaciyalaw menen kompilyaciyalaw arasında múmkinshilikler spektri bar. Mısalı, Emacs Lisp byte kodqa kompilyaciyalanadı, ol Lisp dereginiń júdá qısılǵan hám optimallastırılǵan kórinisi bolıp tabıladı, biraq mashina kodı emes (sonlıqtan hár qanday apparatqa baylanıslı emes). Bul “kompilyaciyalanǵan” kod keyin byte kod interpretatorı (ózi C tilinde jazılǵan) tárepinen interpretaciyalanadı.  Bul jaǵdayda kompilyaciyalanǵan kod virtual mashinaǵa arnalǵan mashina kodı bolıp, ol apparatqa emes, al byte kod interpretatorında ámelge asırılǵan. Bunday kompilyaciyalanǵan interpretatorlardı geyde kompilyatorlar dep te ataydı.[4][5] Bayt kod interpretatorında hár bir kórsetpe bayt penen baslanadı, sonlıqtan bayt kod interpretatorlarında 256 ǵa shekem kórsetpe boladı, biraq olardıń barlıǵı paydalanılmawı múmkin. Ayırım bayt kodları bir neshe bayttı alıwı múmkin hám ózgermeli túrde quramalılıǵı joqarı bolıwı múmkin.

Baqlaw kesteleri −  kompilyaciya basqıshınan ótiwi zárúr emes − byte kod interpretatorlarına uqsas usıl menen arnawlı interpretatorlar arqalı sáykes algoritmli basqarıw aǵımın kórsetedi.

Aǵımlı kod interpretatorları

redaktorlaw

Aǵımlı kod interpretatorları byte kod interpretatorlarına uqsas, biraq baytlar ornına olar kórsetkishlerdi qollanadı. Hár bir "kórsetpe" − múmkin parametrler menen birge funkciyaǵa yamasa kórsetpeler izbe-izligine silteme beretuǵın sóz bolıp tabıladı. Aǵımlı kod interpretatorı kórsetpelerdi alıp, olardıń silteme bergen funkciyalardı shaqıradı yamasa birinshi kórsetpeni alıp, oǵan sekiriwdi ámelge asıradı hám hár bir kórsetpeler izbe-izligi keyingi kórsetpege silteme beriw menen sekiriwdi ámelge asıradı. Byte kodtan ayırmashılıǵı, qoljetimli yad penen adres keńisliginen basqa, hár túrli kórsetpelerdiń sanında ónimli sheklew joq. Aǵımlı kodtıń klassikalıq mısalı, Open Firmware sistemalarında qollanılatuǵın Forth kodı: derek tili “F kodına” kompilyaciyalanadı (byte kod), ol keyin virtual mashina tárepinen interpretaciyalanadı.

Abstrakt sintaksislik terek interpretatorları

redaktorlaw

Interpretaciya menen kompilyaciya arasındaǵı spektrde taǵı bir usıl derek kodın optimallastırılǵan abstrakt sintaksislik terekke (AST) túrlendiriw, sonnan keyin bul terek strukturasına sáykes programmanı orınlaw yamasa onı anıq waqıtta jergilikli koddı generaciyalaw ushın qollanıw bolıp tabıladı. Bul usıl menen hár bir gápti tek bir ret tallaw kerek boladı. Byte kodqa qaraǵanda artıqmashılıq retinde, AST global programma strukturasın hám operatorlar arasındaǵı qatnaslardı saqlaydı (bul byte kod kórinisinde joǵaladı) hám qısılǵanda kompakt kórinisti támiyinleydi.[6] Usılayınsha, AST-nı anıq waqıtta kompilyatorlar ushın byte kodtan jaqsı aralıq format retinde usınıs etildi. Sonday-aq, bul sistemaǵa orınlaw waqtında jaqsı analizdi ámelge asırıwǵa imkaniyat beredi.

Degen menen, interpretatorlar ushın, byte kod interpretatorına qaraǵanda, AST kóbirek júklemeni payda etedi, óytkeni sintaksis penen baylanıslı túyinler paydalı jumıs islemeydi, az izbe-iz kórinis (kóbirek kórsetkishlerdiń ótiwin talap etedi) hám terekke barıwdıń shıǵınların payda etedi.

  1. Bennett, J. M.; Prinz, D. G.; Woods, M. L. (1952). "Interpretative sub-routines". Proceedings of the ACM National Conference, Toronto. 
  2. „Why was the first compiler written before the first interpreter?“. Ars Technica (8-noyabr 2014-jıl). Qaraldı: 9-noyabr 2014-jıl.
  3. „Compilers vs. interpreters: explanation and differences“ (en). IONOS Digital Guide. Qaraldı: 16-sentyabr 2022-jıl.
  4. „4. Kleincomputer - Eigenschaften und Möglichkeiten“,Mikroelektronik in der Amateurpraxis, 3 (de), Berlin: Úlgi:İll, Leipzig, 1987 — 222 bet. 7469332. ISBN 3-327-00357-2. 
  5. (in de) Basic-Compreter für U880. 1984. 
  6. Kistler, Thomas; Franz, Michael (February 1999). "A Tree-Based Alternative to Java Byte-Codes". International Journal of Parallel Programming 27 (1): 21–33. doi:10.1023/A:1018740018601. ISSN 0885-7458. http://oberon2005.oberoncore.ru/paper/mf1997a.pdf. Retrieved 2020-12-20. 

Ádebiyatlar

redaktorlaw
  • Aycock, J. (June 2003). "A brief history of just-in-time". ACM Computing Surveys 35 (2): 97–113. doi:10.1145/857076.857077. 

Sırtqı siltemeler

redaktorlaw