Ózin-ózi ózgertetuǵın kod

Kompyuter iliminde, **ózin-ózi ózgertetuǵın kod (SMC** yamasa **SMoC)** — bul orınlanıw waqtında óziniń kórsetpelerin ózgertetuǵın kod — ádette kórsetpeler jolınıń uzınlıǵın qısqartıw hám ónimlilikti arttırıw ushın yamasa basqa jaǵdaylarda qaytalanatuǵın uqsas kodtı azaytıw, solay etip qollap-quwatlawdı ańsatlastırıw ushın. Bul termin ádette ózin-ózi ózgertiw qasaqana bolǵan kodqa ǵana qollanıladı, buferdiń tolıp ketiwi sıyaqlı qáte sebepli kodtıń tosınarlı ózgeriw jaǵdaylarında emes.

Ózin-ózi modifikaciyalaytuǵın kod bar kórsetpelerdiń ústin qayta jazıwdı yamasa orınlanıw waqtında jańa kod generaciyalawdı hám basqarıwdı sol kodqa ótkiziwdi óz ishine alıwı múmkin.

Ózin-ózi ózgertiw shárttiń neshe ret tekseriliwi kerekligin azaytıw ushın tiykarınan qollanılatuǵın «bayraq ornatıw» usılı hám shártli programma tarmaqlanıwına alternativa retinde qollanıladı.

Bul usıl hár bir kirgiziw/shıǵarıw cikli ushın qosımsha esaplaw shıǵınların talap etpey, testlew/debaglaw kodın shártli túrde shaqırıw ushın jiyi qollanıladı.

Modifikaciyalar tómendegishe orınlanıwı múmkin:

* **tek inicializaciya waqtında ǵana** – kirgiziw parametrlerine tiykarlanıp (bul process kóbinese programmalıq támiynattı 'konfiguraciyalaw' dep sıpatlanadı hám apparatlıq támiynat terminlerinde baspa sxemalar ushın jamperlerdi ornatıwǵa biraz uqsas). Programmaǵa kiriw noqatların ózgertiw ózin-ózi ózgertiwdiń ekvivalent janapay usılı bolıp tabıladı, biraq bir yamasa bir neshe alternativ kórsetpeler jolınıń birge bar bolıwın talap etedi, bul programma kólemin arttıradı.
* **orınlanıw dawamında** («jedel») – orınlanıw waqtında erisilgen belgili bir programma jaǵdaylarına tiykarlanıp

Hár qanday jaǵdayda da, ózgerisler tikkeley mashina kodı kórsetpeleriniń ózine, bar bolǵan kórsetpelerdiń ústinen jańaların jazıw arqalı orınlanıwı múmkin (mısalı: salıstırıw hám tarmaqlanıwdı shártsiz tarmaqlanıwǵa yamasa alternativ túrde 'NOP'qa ózgertiw).

IBM System/360 arxitekturasında hám onıń z/Architecture-ǵa shekemgi miyrasxorlarında EXECUTE (EX) kórsetpesi óziniń maqsetli kórsetpesiniń ekinshi baytın 1-registrdiń tómen dárejeli 8 biti menen logikalıq túrde basıp ótedi. Bul haqıyqıy saqlawdaǵı kórsetpe ózgertilmegenine qaramastan, ózin-ózi ózgertiw effektin beredi.

## Tómen hám joqarı dárejeli tillerde qollanıw
Ózin-ózi ózgertiw programmalastırıw tiline hám onıń kórsetkishlerge yamasa dinamikalıq kompilyator yamasa interpretator «dvijoklarına» kiriwdi qollap-quwatlawına baylanıslı hár túrli usıllar menen ámelge asırılıwı múmkin:

* bar kórsetpelerdiń (yamasa opkod, registr, bayraqlar yamasa adresler sıyaqlı kórsetpelerdiń bólimlerin) ústin qayta jazıw
* yadta tutas kórsetpelerdiń yamasa kórsetpeler izbe-izliginiń tikkeley dúziliwi
* derek kodı operatorların dúziw yamasa ózgertiw, keyin «mini kompilyaciya» yamasa dinamikalıq interpretaciya (eval operatorına qarań)
* pútkil programmanı dinamikalıq túrde jaratıw hám sońınan onı orınlaw

### Assembler tili
Ózin-ózi ózgertetuǵın kodtı assembler tilin paydalanıp ámelge asırıw júdá ápiwayı. Kórsetpeler yadta dinamikalıq túrde jaratılıwı múmkin (yamasa qorǵalmaǵan programma saqlawda bar kodtıń ústinen jazılıwı múmkin), standart kompilyatordıń obyekt kodı retinde generaciyalawı múmkin bolǵan izbe-izlikke ekvivalent. Zamanagóy processorlar menen CPU keshinde esapqa alınıwı kerek bolǵan kútilmegen qosımsha tásirler bolıwı múmkin. Bul usıl kóbinese «birinshi ret» shártlerin testlew ushın qollanılǵan, mısalı, usı sáykes túsindirmeler berilgen IBM/360 assembler mısalında. Ol (N×1)−1 ge kórsetpeler jolınıń uzınlıǵın qısqartıw ushın kórsetpelerdiń ústin qayta jazıwdı paydalanadı, bunda N — fayldaǵı jazıwlar sanı (−1 — qaplawdı orınlaw ushın artıqmashılıq).

```assembly
SUBRTN NOP OPENED     BIRINSHI RET USÍ JERDE ME?

* NOP - bul x'4700'<Opened_adresi>

      OI    SUBRTN+1,X'F0'  AWA, NOP-TÍ SHÁRTSIZ TARMAQLANÍWǴA ÓZGERT (47F0...)

      OPEN   INPUT               HÁM BIRINSHI RET BOLǴANLÍQTAN KIRIW FAYLÍN ASH

OPENED GET   INPUT        NORMAL QAYTA ISLEW USÍ JERDEN DAWAM ETEDI

...
```

Alternativ kod hár ret ótken sayın «bayraqtı» tekseriwdi óz ishine alıwı múmkin. Shártsiz ótiw salıstırıw kórsetpesinen sál tezirek boladı, sonday-aq ulıwma jol uzınlıǵın qısqartadı. Qorǵalǵan yadta jaylasqan programmalar ushın keyingi operaciyalıq sistemalarda bul texnikanı qollanıw múmkin emes edi, sonlıqtan onıń ornına kishi programmaǵa kórsetkishti ózgertiw paydalanılatuǵın edi. Kórsetkish dinamikalıq yadta jaylasadı hám birinshi ótiwden keyin OPEN-di aylanıp ótiw ushın qálegen waqıtta ózgertiliwi múmkin (kishi programmaǵa tikkeley shaqırıw hám baylanıs ornına dáslep kórsetkishti júklew kerek bolıwı jol uzınlıǵına N kórsetpe qosadı – biraq endi kerek bolmaytuǵın shártsiz ótiw ushın sáykes N kemeyiw boladı).

Tómende Zilog Z80 assembler tilindegi bir mısal keltirilgen. Kod «B» registrin [0,5] aralıǵında arttıradı. «CP» salıstırıw kórsetpesi hárbir cikl sayın modifikaciyalanadı.
```nasm
;==========
ORG 0H
CALL FUNC00
HALT
;==========
FUNC00:
LD A,6
LD HL,label01+1
LD B,(HL)
label00:
INC B
LD (HL),B
label01:
CP $0
JP NZ,label00
RET
;==========
```
Ózin-ózi ózgertetuǵın kod geyde mashinanıń kórsetpeler toplamınıń sheklewlerin jeńip ótiw ushın qollanıladı. Mısalı, Intel 8080 kórsetpeler toplamında, registrde kórsetilgen kiriw portınan bir bayt kirgiziw múmkin emes. Kiriw portı kórsetpeniń ózinde, eki baytlı kórsetpeniń ekinshi baytı retinde statikalıq túrde kodlanǵan. Ózin-ózi ózgertetuǵın kodtı paydalanıp, registrdiń mazmunın kórsetpeniń ekinshi baytına saqlaw, sońınan qálegen nátiyjege erisiw ushın ózgertilgen kórsetpeni orınlaw múmkin.

### Joqarı dárejeli tiller
Geypara kompilyaciyalanatuǵın tiller anıq ózin-ózi ózgertetuǵın kodqa ruqsat beredi. Mısalı, COBOL-daǵı ALTER feyili orınlanıw waqtında ózgertiletuǵın tarmaqlanıw kórsetpesi retinde ámelge asırılıwı múmkin. Geypara paketli programmalastırıw usılları ózin-ózi ózgertetuǵın kodtı paydalanıwdı óz ishine aladı. Clipper hám SPITBOL da anıq ózin-ózi ózgertiw ushın imkaniyatlar beredi. B6700 sistemalarındaǵı Algol kompilyatorı operaciyalıq sistemaǵa interfeys usındı, bunda orınlanıp atırǵan kod tekst qatarın yamasa atalǵan disk faylın Algol kompilyatorına ótkere alatuǵın edi hám sońınan proceduranıń jańa versiyasın shaqıra alǵan.

Interpretaciyalanatuǵın tiller menen «mashina kodı» — bul derek tekst bolıp tabıladı hám jedel redaktorlawǵa beyim bolıwı múmkin: SNOBOL-da orınlanıp atırǵan derek operatorları tekst massiviniń elementleri bolıp tabıladı. Perl hám Python sıyaqlı basqa tiller programmalarǵa orınlanıw waqtında jańa kod jaratıwǵa hám onı eval funkciyası arqalı orınlawǵa imkaniyat beredi, biraq bar kodtıń ózgertiliwine ruqsat etpeydi. Ózgeriw illyuziyası (haqıyqıy mashina kodı hesh qanday qayta jazılmasa da) funkciya kórsetkishlerin ózgertiw arqalı ámelge asırıladı, mısalı, usı JavaScript mısalında:
```javascript
var f = function (x) {return x + 1};

    // f-ke jańa anıqlama tayınla:
    f = new Function('x', 'return x + 2');
```
Lisp makrosları sonday-aq programma kodın óz ishine alǵan qatardı analizlemey, orınlanıw waqtında kod generaciyalawǵa imkaniyat beredi.

Push programmalastırıw tili — bul anıq ózin-ózi ózgertiwshi programmalar jaratıw ushın proektlestirilgen genetikalıq programmalastırıw sisteması. Joqarı dárejeli til bolmasa da, ol assembler tili sıyaqlı tómen dárejeli emes.

#### Quramalı modifikaciya
Bir neshe aynalar payda bolmastan aldın, komanda qatarı sistemaları islep turǵan komanda skriptin ózgertiwdi óz ishine alǵan menyu sistemasın usınıwı múmkin edi. Meyli, MS-DOS paketli faylı, MENU.BAT, tómendegini óz ishine aladı:
    :start
    SHOWMENU.EXE
MENU.BAT komanda qatarınan iske qosılǵanda, SHOWMENU ekranda menyudı kórsetedi, múmkin bolǵan járdem informaciyası, qollanıw mısalları hám t.b. menen. Aqıbetinde paydalanıwshı SOMENAME buyrıǵınıń orınlanıwın talap etetuǵın bir tańlaw jasaydı: SHOWMENU MENU.BAT faylın tómendegini óz ishine alatuǵın etip qayta jazıp shıǵıp ketedi:
    :start
    SHOWMENU.EXE
    CALL *SOMENAME*.BAT
    GOTO start
Komanda interpretatorı skript faylın kompilyaciyalap, sońınan onı orınlamaytuǵınlıqtan, ya bolmasa orınlawdı baslamastan aldın pútkil fayldı yadqa oqımaytuǵınlıqtan, ya jazıw buferiniń mazmunına súyenbeytuǵınlıqtan, SHOWMENU shıǵıp ketkende, komanda interpretatorı orınlaw ushın jańa buyrıqtı tabadı (ol SOMENAME skript faylın, SHOWMENU-ǵa belgili bir katalog ornında hám protokol arqalı shaqıradı), hám sol buyrıq tamamlanǵannan keyin, ol skript faylınıń basına qaytadı hám kelesi tańlawǵa tayar bolǵan SHOWMENU-dı qayta aktivlestiredi. Eger menyu tańlawı shıǵıw bolsa, fayl óziniń dáslepki jaǵdayına qayta jazıladı. Bul baslanǵısh jaǵdayda belgi ushın hesh qanday payda bolmasa da, ol yamasa ekvivalent kólemdegi tekst kerek, sebebi komanda interpretatorı kelesi buyrıqtı baslaǵanda kelesi buyrıqtıń bayt poziciyasın eslep qaladı, sonlıqtan qayta jazılǵan fayl kelesi buyrıqtıń baslanıw noqatınıń haqıyqıy baslanıwı bolıwı ushın sáykeslikti saqlawı kerek.

Menyu sistemasınıń qolaylılıǵınan (hám múmkin bolǵan qosımsha imkaniyatlardan) basqa, bul sxema tańlanǵan buyrıq iske qosılǵanda SHOWMENU.EXE sisteması yadta bolmaytuǵının bildiredi, bul yad sheklengen jaǵdayda áhmiyetli artıqmashılıq bolıp tabıladı.

### Basqarıw kesteleri
Basqarıw kestesi interpretatorları bir mániste keste jazıwlarınan alınǵan maǵlıwmat mánisleri arqalı «ózin-ózi ózgertetuǵın» dep esaplanıwı múmkin (olar «IF inputx = 'yyy'» formasındaǵı shártli operatorlarda arnawlı qol menen kodlanǵan ornına).

### Kanal programmaları
Geypara IBM kiriw usılları dástúrli túrde ózin-ózi ózgertetuǵın kanal programmaların paydalanǵan, bunda disk adresi sıyaqlı mánis kanal programması tárepinen silteme etilgen aymaqqa oqıladı, onda ol keyinirek kanal buyrıǵı tárepinen diskke kiriw ushın qollanıladı.

## Tariyxı
1948-jıl yanvar ayında kórsetilgen IBM SSEC óziniń kórsetpelerin ózgertiw yamasa olardı basqasha aytqanda tap maǵlıwmatlar sıyaqlı qaraw imkaniyatına iye bolǵan. Degen menen, bul imkaniyat ámeliyatta siyrek qollanılǵan. Kompyuterlerdiń dáslepki dáwirlerinde, ózin-ózi ózgertetuǵın kod kóbinese sheklengen yadtı paydalanıwdı azaytıw, yamasa ónimlilikti arttırıw, yamasa ekewin de islew ushın qollanılǵan. Ol sonıń menen birge, kórsetpeler toplamı basqarıw aǵımın ózgertiw ushın tek ápiwayı tarmaqlanıw yamasa ótkizip jiberiw kórsetpelerin usınǵanda, kishi programma shaqırıwların hám qaytıwlardı ámelge asırıw ushın da qollanılǵan. Bul qollanıw ele de geypara ultra-RISC arxitekturalarında, keminde teoriyalıq jaqtan, áhmiyetli bolıp tabıladı; mısalı, bir kórsetpeli toplamlı kompyuterge qarań. Donald Knuttıń MIX arxitekturası da kishi programma shaqırıwların ámelge asırıw ushın ózin-ózi ózgertetuǵın kodtı paydalanǵan.

## Qollanılıwı
Ózin-ózi ózgertetuǵın kod hár túrli maqsetler ushın qollanılıwı múmkin:

* Jaǵdayǵa baylanıslı cikldi yarım avtomat túrde optimallastırıw.
* Júkleme ortalıǵına baylanıslı tezlik ushın dinamikalıq orında kodtı optimallastırıw.
* Orınlanıw waqtında kodtı generaciyalaw yamasa algoritmniń orınlanıw yamasa júklew waqtında qánigelesiwi (bul, mısalı, real waqıttaǵı grafika tarawında keń tarqalǵan), mısalı, ulıwma sortlaw utilitası — belgili bir shaqırıwda sıpatlanǵan gilt salıstırıwın orınlaw ushın kod tayarlaw.
* Obyekttiń ishki jaǵdayın ózgertiw yamasa jabıwlardıń joqarı dárejeli qurılısın simulyaciyalaw.
* Kishi programma (kórsetkish) adresin shaqırıwdı dúzetiw, ádette dinamikalıq kitapxanalardıń júkleniw/inicializaciya waqtında orınlanadı, ya bolmasa hárbir shaqırıwda, kishi programmanıń parametrlerine onıń ishki siltemelerin olardıń haqıyqıy adreslerin paydalanıw ushın dúzetiw (yaǵnıy, janapay ózin-ózi ózgertiw).
* Neyroevolyuciya, genetikalıq programmalastırıw hám basqa evolyuciyalıq algoritmler sıyaqlı evolyuciyalıq esaplaw sistemaları.
* Keri injenerliktiń aldın alıw (dizassambler yamasa debagger paydalanıw arqalı) yamasa virus/shpionlıq programmalıq támiynatın skanerlew programmalıq támiynatı hám uqsasları tárepinen anıqlanıp qalıwdan qashıw ushın kodtı jasırıw.
* Yadtıń 100%-in qaytalanatuǵın opkodlardıń aylanatuǵın úlgisi menen toltırıw, barlıq programmalar menen maǵlıwmatlardı óshiriw ushın, yamasa apparatlıq támiynattı sınaqtan ótkeriw yamasa RAM testlerin orınlaw ushın.
* Orınlanıw waqtında dekompressiya etilip, orınlanatuǵın kodtı qısıw, mısalı, yad yamasa disk keńisligi sheklengen jaǵdayda.
* Geypara júdá sheklengen kórsetpeler toplamları belgili bir funkciyalardı orınlaw ushın ózin-ózi ózgertetuǵın kodtı paydalanıwdan basqa ilaj qaldırmaydı. Mısalı, tek «teris bolsa alıw hám tarmaqlanıw» «kórsetpesin» ǵana paydalanatuǵın bir kórsetpeli toplamlı kompyuter (OISC) mashinası ózin-ózi ózgertetuǵın kodtı paydalanbastan janapay kóshiriwdi (C tilindegi «*a = **b» ekvivalentine uqsas bir nárse) isley almaydı.
* Júklew. Dáslepki mikrokompyuterler kóbinese ózleriniń júklewshilerinde ózin-ózi ózgertetuǵın kodtı paydalanǵan. Júklewshi hár ret qosılǵanda aldıńǵı panel arqalı kirgizilgenlikten, júklewshiniń ózin ózgertiwi áhmiyetsiz edi. Degen menen, hátte búgingi kúnde de kóp júklewshiler ózin-ózi qayta jaylastıradı, al bir neshewi hátte ózin-ózi ózgertedi.
* Qátelerge shıdamlılıq ushın kórsetpelerdi ózgertiw.

## Derekler

__BÖLİDİMÖNDEMEW__