B (programmalastırıw tili)

**B** — bul shama menen 1969-jılı Bell Labs laboratoriyasında Ken Tompson hám Dennis Ritchi tárepinen islep shıǵılǵan programmalastırıw tili.

B tili BCPL tilinen kelip shıqqan hám onıń atı BCPL diń qısqartpası bolıwı múmkin. Tompsonnıń kásiplesi Dennis Ritchi atamanı Tompson Multics te qollanıw ushın proektlestirgen, biraq baylanıslı bolmaǵan aldınǵı Bon programmalastırıw tiline tiykarlanǵan bolıwı múmkin dep boljaǵan.

B sistemalıq hám til programmalıq támiynatı sıyaqlı rekursiv, sanlı emes, mashinaǵa ǵárezsiz qosımshalar ushın proektlestirilgen. Ol tipleri joq til edi, jalǵız maǵlıwmat tipi tiykarındaǵı mashinanıń tábiyiy yad sóz formatı, ol qanday bolıwına qaramastan. Kontekstke baylanıslı, sóz yamasa pútin san yaki yad adresi retinde qaralatuǵın edi.

ASCII qayta islew imkaniyatı bar mashinalar, ásirese Bell Labs qa kelgen DEC PDP-11 keń tarqalǵan sayın, yad sózlerine tıǵılǵan simvol maǵlıwmatların qollap-quwatlaw áhmiyetli boldı. Tildiń tipsiz tábiyatı kemshilik retinde qaraldı, bul Tompson hám Ritchidi jańa ishki hám paydalanıwshı anıqlaytuǵın tiplerdi qollap-quwatlaytuǵın tildiń keńeytilgen versiyasın islep shıǵıwǵa alıp keldi, bul bolsa hámme jerde tarqalǵan C programmalastırıw tiline aylandı.

## Tariyxı
*Kóp SMALGOL sintaksisi bar BCPL semantikası*

*— Ken Tompson,*

Shama menen 1969-jılı Ken Tompson hám keyin Dennis Ritchi B tilin tiykarınan Tompsonnıń Multics proektinde paydalanǵan BCPL tiline tiykarlanıp islep shıqtı. B, negizinde, Tompsonnıń sol waqıttaǵı minikompyuterlerdiń yad sıyımlılıǵına sıydırıw ushın kerek emes dep esaplaǵan hár qanday komponentten tazalanǵan BCPL sisteması boldı. BCPL-dan B-ǵa ótiw sonıń menen birge Tompsonnıń qálewlerine sáykes ózgerislerdi de óz ishine aldı (tiykarınan ádettegi programmanıń bos orın emes belgileriniń sanın azaytıw baǵdarında). BCPL-dıń ádettegi ALGOLǵa uqsas sintaksisiniń úlken bólimi bul process dawamında ádewir ózgertildi. Tayınlaw operatorı := Rutishauzerdiń Superplan tilindegi = belgisine qayttı, al teńlik operatorı = belgisi == menen almastırıldı.

Tompson y-ti x-ke qosıw ushın x =+ y sintaksisin paydalanıp «eki adresli tayınlaw operatorların» qostı (C tilinde operator += dep jazıladı). Bul sintaksis Duglas Makilroydıń TMG implementaciyasınan kelip shıqqan, onda B-diń kompilyatorı birinshi ret ámelge asırılǵan (hám ol TMG-ge ALGOL 68-diń `x +:= y` sintaksisinen kelgen). Tompson bunnan da alǵa ótip, inkrement hám dekrement operatorların (++ hám --) oylap taptı. Olardıń prefiks yamasa postfiks poziciyası mánistiń operand ózgertilmesten aldın yamasa keyin alınatuǵının anıqlaydı. Bul innovaciya B-nıń eń dáslepki versiyalarında bolmaǵan. Dennis Ritchidiń aytıwınsha, adamlar kóbinese olardı DEC PDP-11-diń avto-inkrement hám avto-dekrement adres rejimleri ushın jaratılǵan dep oylaydı, biraq bul tariyxıy jaqtan múmkin emes, sebebi B birinshi ret islep shıǵılǵanda bul mashina joq edi.

For cikliniń útirli noqatlı versiyasın Ken Tompson Stiven Djonsonnıń jumısınan alǵan.

B tipsiz, yamasa anıǵıraq aytqanda, bir maǵlıwmat tipine iye: kompyuter sózi. Kópshilik operatorlar (mısalı, +, -, , /) bunı pútin san retinde qaradı, biraq basqaları onı silteme arqalı anıqlanatuǵın yad adresi retinde qaradı. Basqa da kóplegen jaqtan ol C-diń dáslepki versiyasına júdá uqsas edi. Bir neshe kitapxana funkciyaları bar, sonıń ishinde C-degi standart kirgiziw/shıǵarıw kitapxanasınıń funkciyalarına uqsasları da bar. Tompsonnıń sózleri menen aytqanda: «B hám eski-eski C [C-degi] barlıq tiplerden basqa júdá uqsas tiller edi».

Dáslepki implementaciyalar dáslepki Unix-ti paydalanatuǵın DEC PDP-7 hám PDP-11 minikompyuterleri ushın hám GCOS operaciyalıq sistemasında isleytuǵın Honeywell GE 645 36-bitlik meynfreymler ushın boldı. Eń dáslepki PDP-7 implementaciyaları aǵımlı kodqa kompilyaciyalandı, al Ritchi TMG paydalanıp mashina kodın payda etetuǵın kompilyator jazdı. 1970-jılı PDP-11 satıp alındı hám port ushın aǵımlı kod paydalanıldı; assembler, dc hám B tiliniń ózi kompyuterdi iske túsiriw ushın B tilinde jazıldı. Yacc-tıń dáslepki versiyası usı PDP-11 konfiguraciyası menen payda boldı. Ritchi usı dáwirde texnikalıq xızmet kórsetiwdi óz moynına aldı.

B-nıń tipsiz tábiyatı Honeywell, PDP-7 hám kóplegen eski kompyuterlerde mánili edi, biraq PDP-11-de bul bir mashqala boldı, sebebi PDP-11 hám kópshilik zamanagóy kompyuterler tolıq qollap-quwatlaytuǵın simvol maǵlıwmat tipine ájayıp túrde kiriw qıyın edi. 1971-jıldan baslap Ritchi óziniń kompilyatorın mashina kodın payda etiwge aylandırıp atırǵanda tilge ózgerisler kirgizdi, eń áhmiyetlisi ózgeriwshiler ushın maǵlıwmat tiplestiriwin qostı. 1971 hám 1972-jıllar dawamında B «Jańa B» (NB), sońınan C tiline aylandı.

B tili C tili menen almastırılıp, derlik joq bolıp ketti. Degen menen, ol hár túrli sebeplerge baylanıslı GCOS meynfreymlerinde (2014-jılǵa kelip) hám belgili bir ornatılǵan sistemalarda (2000-jılǵa kelip) qollanıwda dawam etpekte: kishi sistemalardaǵı sheklengen apparatlıq támiynat, keń kitapxanalar, qurallar, licenziya bahasınıń máseleleri hám jumıs ushın jetkilikli dárejede jaqsı bolǵanlıǵı. Úlken tásir kórsetken AberMUD dáslep B tilinde jazılǵan.

## Mısallar
Tómendegi mısallar Ken Tompsonnıń «B paydalanıwshılarınıń qollanbası»nan alınǵan:
```c
/* Tómendegi funkciya teris emes n sanın b tiykarında baspadan shıǵaradı,
bunda 2<=b<=10. Bul procedura ASCII belgi toplamında
0-den 9-ǵa shekemgi sanlardıń izbe-iz kod mánislerine iye ekeninen
paydalanadı. */

printn(n,b) {
extrn putchar;
auto a;
/* Wikipedia eskertpesi: auto gilt sózi avtomat saqlanatuǵın
ózgeriwshini járiyalaydı (ómir múddeti funkciya kólemi),
C++11-degi "avtomat tiplestiriw" emes. */

if(a=n/b) /* tayınlaw, teńlikti tekseriw emes /
printn(a, b); / rekursiv /
putchar(n%b + '0');
}
```

```c
/* Tómendegi programma e-2 konstantanı shama menen
4000 onlıq belgige shekem esaplaydı hám onı qatarına 50 simvoldan
5 simvollı toparlarǵa bólip baspadan shıǵaradı. 
Usıl ápiwayı shıǵarıw konversiyası bolıp tabıladı
1/2! + 1/3! + ... = .111...
bul jerde sanlardıń tiykarları 2, 3, 4, ... */



main() {
   extrn putchar, n, v;
   auto i, c, col, a;

   i = col = 0;
   while(i<n)
      v[i++] = 1;

   while(col<2*n) {
      a = n+1;
      c = i = 0;
      while(i<n) {
         c =+ v[i]*10;
         v[i++] = c%a;
         c =/ a--;
      }
      putchar(c+'0');
      if(!(++col%5))
         putchar(col%50?' ':'*n');
   }
   putchar('*n*n');
}

v[2000];
n 2000;
```


## Derekler

__BÖLİDİMÖNDEMEW__