Tómen dárejeli programmalastırıw tili

**Tómen dárejeli programmalastırıw tili** *([[Inglis tili|ingl]]. A low-level programming language)* − kompyuterdiń kórsetpeler toplamı arxitekturasınan − processor kórsetpelerine strukturalıq jaqtan uqsas til kartasındaǵı buyrıqlar yamasa funkciyalardan júdá az ulıwma abstrakciyanı támiyinlewshi programmalastırıw tili. Ádette bul mashina tili yamasa assembler tiline tiyisli aytıladı. Til menen mashina tili arasındaǵı abstrakciya tómen (demek sóz) bolǵanlıqtan, tómen dárejeli tiller geyde «apparatlıq támiynatqa jaqın» dep táriyiplenedi. Tómen dárejeli tillerde jazılǵan programmalar sistema arxitekturasınıń belgili bir túrine optimallastırılǵanlıqtan, salıstırmalı túrde portativ emes boladı.

Tómen dárejeli tiller kompilyatorsız yamasa interpretatorsız mashina tiline aylandıra aladı − ekinshi áwlad programmalastırıw tilleri assembler dep atalatuǵın ápiwayı processordı paydalanadı hám alınǵan kod tikkeley processorda jumıs isleydi. Tómen dárejeli tilde jazılǵan programmanı yad kóleminiń azlıǵı menen júdá tez orınlawǵa boladı. Joqarı dárejeli tildegi ekvivalent programmanıń ónimliligi tómen hám yadtı kóbirek paydalanıwı múmkin. Tómen dárejeli tiller ápiwayı, biraq baǵdarlamashı este saqlawı kerek kóplegen texnikalıq anıqlamalarǵa baylanıslı paydalanıw qıyın bolıp esaplanadı. Salıstırıw ushın, joqarı dárejeli programmalastırıw tili kompyuter arxitekturasınıń orınlanıw semantikasın programmanıń specifikaciyasınan ajıratıp turadı, bul bolsa islep shıǵıwdı ápiwayılastıradı.

## Mashina kodı

Mashina kodı − kompyuterde tikkeley orınlanatuǵın kod saqlanatuǵın forma. Ol yadta saqlanatuǵın, mánislerdi yad orınlarına jıljıtıw, arifmetikalıq hám logikalıq logika mánislerin testten ótkeriw sıyaqlı operaciyalardı orınlaytuǵın hámde test tiykarında yadtaǵı keyingi kórsetpeni orınlaw yamasa basqa orında kórsetpe beriw.

Mashina kodı ádette yadta ekilik maǵlıwmatlar retinde saqlanadı. Baǵdarlamashılar programmalardı heshqashan derlik mashinalıq kodta jazbaydı; onıń ornına olar assembler tilinde yamasa joqarı dárejeli programmalastırıw tillerinde kod jazadı.

Mashina tillerinde bir neshe programmalar jazılǵanı menen, baǵdarlamashılar kóbinese tiykarǵı yad dampı *(ingl. core dumps)* menen jumıs islew yamasa aldınǵı panelden otladka *(ingl. debug)* arqalı onı oqıwǵa sheber.

Hárbir qatar bir kórsetpege sáykes keletuǵın n-Fibonachchi sanın esaplaw ushın x86-64 mashina kodınıń on altılıq kórinistegi funkciyasına mısal:
 89 f8
 85 ff
 74 26
 83 ff 02
 76 1c
 89 f9
 ba 01 00 00 00
 be 01 00 00 00
 8d 04 16
 83 f9 02
 74 0d
 89 d6
 ff c9
 89 c2
 eb f0
 b8 01 00 00
 c3

## Assembler tili
Ekinshi áwlad tilleri mashina kodınıń ústinde bir abstrakciya dárejesin támiyinleydi. TX-0 hám PDP-1 sıyaqlı kompyuterlerde kodlawdıń dáslepki kúnlerinde MIT xakerleriniń birinshi islegeni assembler jazıwı edi.
Assembler tiliniń semantikası yamasa formal táriyipi az, ol tek adam oqıy alatuǵın simvollardı, sonıń ishinde simvollıq adreslerdi operaciyalıq kodlarǵa, adreslerge, sanlı konstantalarǵa, qatarlarǵa h.t.b. salıstırıw bolıp tabıladı. Ádette, bir mashina kórsetpesi mnemotexnika dep atalatuǵın jıynaw kodınıń bir qatarı retinde usınıladı. Assemblerler basqa obyekt faylları menen baylanısa alatuǵın yamasa ózbetinshe júklenetuǵın obyekt faylların jaratadı.

Kóplegen assembler kórsetpelerdiń ulıwma izbe-izligin jaratıw ushın makroslardı beredi.

Mısal: Joqarıdaǵıday Fibonachchi sanlar kalkulyatorı, biraq AT&T sintaksisin x86-64 qollanatuǵın assembler tilinde:
```asm
fib:
 movl %edi, %eax ; put the argument into %eax
 testl %edi, %edi ; is it zero?
 je .return_from_fib ; yes - return 0, which is already in %eax
 cmpl $2, %edi ; is 2 greater than or equal to it?
 jbe .return_1_from_fib ; yes (i.e., it's 1 or 2) - return 1
 movl %edi, %ecx ; no - put it in %ecx, for use as a counter
 movl $1, %edx ; the previous number in the sequence, which starts out as 1
 movl $1, %esi ; the number before that, which also starts out as 1
.fib_loop:
 leal (%rsi,%rdx), %eax ; put the sum of the previous two numbers into %eax
 cmpl $2, %ecx ; is the counter 2?
 je .return_from_fib ; yes - %eax contains the result
 movl %edx, %esi ; make the previous number the number before the previous one
 decl %ecx ; decrement the counter
 movl %eax, %edx ; make the current number the previous number
 jmp .fib_loop ; keep going
.return_1_from_fib:
 movl $1, %eax ; set the return value to 1
.return_from_fib:
 ret ; return
```
Bul kod mısalında x86-64 processorınıń registrleri atalǵan hám tikeley basqarıladı. Funkciya x86-64 sistemasına arnalǵan V System qosımshasınıń ekilik interfeysine sáykes %edi ishinen óziniń 32 bitlik argumentin júkleydi hám onı tamamlanǵansha %eax, %ecx, %esi hám %edi registrlerindegi mánislerdi qayta islew arqalı esaplawdı orınlaydı hám qaytaradı. Assembler tilinde mánisti qaytarıw túsinigi joq ekenin este saqlań. Nátiyje %eax registrinde saqlanǵanlıqtan, taǵı da System V qosımshasınıń ekilik interfeysine sáykes, ret kórsetpesi stektiń joqarı 64 bitlik elementin óshiredi hám keyingi kórsetpeni sol orınnan alıwǵa alıp keledi (bul kórsetpe ádette usı funkciyanı shaqırǵan kórsetpeden keyingisi), funkciyanıń nátiyjesi %eax ishinde saqlanadı. x86-64 assembler tili funkciyaǵa mánislerdi beriw yamasa funkciyadan mánislerdi qaytarıw ushın heshqanday standart ornatpaydı (hám is júzinde funkciya túsinigi joq); olar anıq kórsetpeler toplamına arnalǵan System V ABI sıyaqlı programmanıń ekilik interfeysi arqalı anıqlanadı.

Bunı C tilindegi birdey funkciya menen salıstırıń:
```c
unsigned int fib(unsigned int n)
{
 if (!n)
 {
 return 0;
 }
 else if (n <= 2)
 {
 return 1;
 }
 else
 {
 unsigned int f_nminus2, f_nminus1, f_n; 
 for (f_nminus2 = f_nminus1 = 1, f_n = 0; ; --n)
 {
 f_n = f_nminus2 + f_nminus1;
 if (n <= 2)
 {
 return f_n;
 }
 f_nminus2 = f_nminus1;
 }
 }
}
```
Bul kod strukturası boyınsha assembler tiliniń mısalına uqsas, biraq abstrakciya jaǵınan aytarlıqtay ayırmashılıqlar bar:

* Kiriw (parametr n) apparatlıq támiynatta heshbir saqlaw ornın kórsetpeytuǵın abstrakciya bolıp tabıladı. Is júzinde, C kompilyatorı kirgiziw ushın saqlaw ornın anıqlaw ushın kóplegen itimal shaqırıw konvenciyalarınıń birine ámel etedi. 
* f_nminus2, f_nminus1 hám f_n lokal ózgeriwshi mánisleri apparatlıq támiynatta heshqanday arnawlı saqlaw ornın kórsetpeytuǵın abstrakciyalar bolıp tabıladı. C kompilyatorı olardı maqsetli arxitektura ushın qalay saqlaw kerekligin sheshedi. 
* Qaytarıw funkciyası qaytarılatuǵın mánisti kórsetedi, biraq onıń qalay qaytarılatuǵının kórsetpeydi. Hár qanday anıq arxitekturaǵa arnalǵan C kompilyatorı mánisti qaytarıwdıń standart mexanizmin ámelge asıradı. x86 arxitekturasına arnalǵan kompilyatorlar ádette (biraq bárhama emes) assembler tiliniń mısalındaǵıday mánisti qaytarıw ushın %eax registrin paydalanadı (assembler tili mısalınıń avtorı x86-64 konvenciyası ushın System V qosımshasınıń ekilik interfeysin paydalanıwdı tańlaǵan, biraq assembler tili bunı talap etpeydi).

Bul abstrakciyalar C kodın C kompilyatorında jazılǵan hár qanday arxitekturada ózgertiwsiz kompilyaciyalawǵa imkaniyat beredi. x86 assembler tiliniń kodı x86-64 arxitekturasına hám sol arxitektura ushın System V qosımshasınıń ekilik interfeysine tiyisli.

## Joqarı dárejeli tillerde tómen dárejeli programmalastırıw
1960 hám 1970-jıllardıń ayaǵında PL/S, BLISS, BCPL, keńeytilgen ALGOL hám ESPOL (Burroughs sistemaları ushın) hám C sıyaqlı tómen dárejeli programmalastırıw funkciyalarına belgili bir dárejede kiriwdi óz ishine alatuǵın joqarı dárejeli tiller engizildi. Bul usıldıń biri ornatılǵan jıynaw kodı usı imkaniyattı qollaytuǵın joqarı dárejeli tildi engizgen. Usı tillerdiń ayırımları sonıń menen bir qatarda arxitekturaǵa ǵárezli kompilyatordı optimallastırıw direktivaları, kompilyatordıń maqsetli processor arxitekturasın paydalanıw usılın retlewge imkaniyat beredi.

C sıyaqlı til joqarı dárejeli bolǵanı menen, ol basqa tiller sıyaqlı yadtı basqarıw imkaniyatın tolıǵı menen alıp taslamaydı. Python sıyaqlı joqarı dárejeli tilde baǵdarlamashı interpretator menen mashina arasındaǵı abstrakciyaǵa baylanıslı yadqa tikkeley kire almaydı. Usılayınsha, C yadtı bólistiriw (malloc) sıyaqlı qurallar arqalı yadtı basqarıw quralların kórsetiwde kóbirek basqarıwǵa imkaniyat beredi.

Bunnan basqa, joqarıda silteme berilgenindey, keyingi C blogı GNU kompilyatorınan alınǵan hám C-diń ornatılǵan islep shıǵıw imkaniyatın kórsetedi. GCC hújjetine sáykes bul ápiwayı kóshiriw hám qosıw kodı. Bul kod C sıyaqlı ulıwma joqarı dárejeli til menen onıń orta/tómen dárejeli esaplawshı bólimi assemblerdiń óz-ara tásirin kórsetedi. Bul C tilin tómen dárejeli tilge aylandırmasa da, bul qurallar óz-ara tásirlerdi tikkeley túrde kórsetedi. 
```c
int src = 1;
int dst;

asm ("mov %1, %0\n\t"
 "add $1, %0"
 : "=r" (dst) 
 : "r" (src));

printf("%d\n", dst);
```


## Derekler