**B** é o nome dun linguaxe de programación desenvolvido nos Bell Labs, predecesor do linguaxe de programación C.

Foi maioritariamente un traballo de Ken Thompson con contribucións de Dennis Ritchie. Apareceu primeiro sobre o ano 1969.

Historia
--------

**B** foi esencialmente unha simplificación da linguaxe BCPL, eliminando calquera compoñente que Thompson considerase prescindible de forma que coubese na memoria das minicomputadoras da época.
A linguaxe tamén incluíu algúns cambios de acordo coas preferencias de Thompson (a maioría para reducir o número de caracteres dun programa típico).

Do mesmo xeito que BCPL, B só tiña un tipo de datos, que correspondía cunha palabra de máquina. A maioría de operadores manexábano como un enteiro; por exemplo **+** (suma), **-** (resta), **\*** (multiplicación) ó **/** (división).
Outros operadores tratábano como unha dirección de memoria á que facer referencia: un punteiro.
B ofrecía operadores que permitían obter a dirección dunha determinada variable, ou escribir na dirección apuntada por unha variable punteiro.

As primeiras implementaciones foron para as minicomputadoras PDP-7 e PDP-11 executando versións antigas de UNIX; e para os mainframes de 36 bits Honeywell executando o sistema GCOS.

Evolución
---------

A natureza *sen tipos* de B tiña sentido no Honeywell, na PDP-7 e moitas outras computadoras antigas, pero foi un problema na PDP-11 porque era difícil acceder a tipos de caracteres de datos que a PDP-11 e a maioría de computadoras modernas soportaban. Comezando en 1971, Ritchie fixo cambios á linguaxe ao mesmo tempo que convertía a súa compilador para producir linguaxe de máquina nativo.
O máis notable foi a adición de tipos de datos diferentes para as variables.

Durante 1971 e 1972 B evolucionou primeiro en Novo "B" (*New B*, **NB**) e despois en **C**. Máis tarde, a principios de 1973, foi engadido un preprocesador a petición de Alan Snyder.

O esforzo foi o suficientemente completo neste ano como para que durante o verán o núcleo do sistema UNIX para a PDP-11 fose reescrito en C.

Durante o período 1972-1973 houbo a necesidade de portalo ao Honeywell 635 e ao IBM 360/370, polo que Mike Lesk escribiu o "paquete de E/S portable" que se convertería na "E/S estándar" (*standard I/Ou* ó **stdio**) da linguaxe C.

B continuouse utilizando ata os anos 90 nos mainframes Honeywell e en certos sistemas embedidos por unha variedade de razóns, incluíndo o uso de *hardware* limitado nestes sistemas; librerías extensivas, ferramentas; ou simplemente porque era o suficientemente bo como para facer o traballo.

O enormemente influencial AberMUD foi escrito en B.

Nome
----

B foi enormemente influenciado por BCPL, e o seu nome foi probablemente unha contracción de BCPL "".
Con todo é posible que o seu nome baseouse no linguaxe de programación Bon, unha linguaxe máis antiga e non relacionado con B, deseñado por Thompson para o seu uso en MULTICS.

Exemplos
--------

A seguinte función de exemplo está tomada do *Users' Reference to B* por Ken Thompson:

```
/* A seguinte función imprime un número non-negativo, n, en
   base b, onde 2<=b<=10. Esta rutina utiliza o feito de
   que no xogo de carácteres ANSCII, os digitos 0 a 9
   teñen valores de código secuenciales.
 */

printn(n,b) {
        extrn putchar;
        auto a;

        if(a=n/b) /* asignación, non comprobación de igualdade */
                printn(a, b); /* recursivo */
        putchar(n%b + '0');
}

```

Este programa de exemplo en B utiliza a función anterior para sumar tres números imprimindo por pantalla o resultado.

```
main( ) {
  extrn printn;
  auto a, b, c, sum;

  a = 1; b = 2; c = 3;
  sum = a+b+c;
  printn(sum,10);
}

```

Ligazóns externas
-----------------

* *The Development of the C LanguageArquivado 23 de maio de 2013 en Wayback Machine.*, Dennis M. Ritchie. Pon B no contexto de BCPL e C.
* *Users' Reference to B*, Ken Thompson. Describe a versión para PDP-11.
* *The Programming Language B*, S. C. Johnson & B. W. Kernighan, Technical Report CS TR 8, Bell Labs (Xaneiro 1973). Describe a versión para GCOS.

| * v
* c
* e
Linguaxes de programación |
| --- |
| Baixo nivel | 

|  |  |
| --- | --- |
| Primeira xeración | Código máquina |
| Segunda xeración | Assembly |

 |
| Alto nivel | 

|  |  |
| --- | --- |
| Terceira xeración | 
* A+
* ABC
* Algol
* B
* BASIC
* C
* C++
* C#
* COBOL
* CPL
* D
* E
* Fortran
* Go
* Java
* JavaScript
* Lisp
* Objective-C
* PL/1
* Pascal
* Smalltalk
* Visual Basic .NET

 |
| Cuarta xeración | 
* Clarion
* Clipper
* Clojure
* Common Lisp
* Erlang
* GNU Octave
* Haskell
* Lisp
* Lua
* Julia
* Perl
* PHP
* Prolog
* Python
* R
* Ruby
* Rust
* S
* Scilab
* Stata
* SQL

 |
| Quinta xeración | 
* Mercury
* OPS5
* Prolog

 |

 |
| 
* Ambiente de desenvolvemento
* Metaprogramación
* Programación a nivel funcional
* Programación estruturada
* Programación non estruturada
* Programación imperativa
* Programación modular
* Programación multidimensional
* Orientación a obxectos

 |