B (lenguaje de programación)

Compartir Imprimir Citar

B es un lenguaje de programación desarrollado en Bell Labs alrededor de 1969 por Ken Thompson y Dennis Ritchie.

B se derivó de BCPL, y su nombre posiblemente sea una contracción de BCPL. El compañero de trabajo de Thompson, Dennis Ritchie, especuló que el nombre podría estar basado en Bon, un lenguaje de programación anterior, pero no relacionado, que Thompson diseñó para usar en Multics.

B se diseñó para aplicaciones recursivas, no numéricas e independientes de la máquina, como software de sistema y lenguaje. Era un lenguaje sin tipo, con el único tipo de datos siendo el formato de palabra de memoria natural de la máquina subyacente, cualquiera que sea. Según el contexto, la palabra se trataba como un número entero o como una dirección de memoria.

A medida que las máquinas con procesamiento ASCII se volvieron comunes, en particular la DEC PDP-11 que llegó a Bell, la compatibilidad con datos de caracteres rellenos en palabras de memoria se volvió importante. La naturaleza sin tipos del lenguaje se vio como una desventaja, lo que llevó a Thompson y Ritchie a desarrollar una versión ampliada del lenguaje compatible con nuevos tipos internos y definidos por el usuario, que se convirtió en el lenguaje de programación C.

Historia

Semántica BCPL con mucha sintaxis SMALGOL

Ken Thompson,

Alrededor de 1969, Ken Thompson y luego Dennis Ritchie desarrollaron B basándose principalmente en el lenguaje BCPL que Thompson usó en el proyecto Multics. B era esencialmente el sistema BCPL despojado de cualquier componente que Thompson sintiera que podía prescindir para que encajara dentro de la capacidad de memoria de las minicomputadoras de la época. La transición de BCPL a B también incluyó cambios realizados para adaptarse a las preferencias de Thompson (principalmente en la línea de reducir la cantidad de caracteres que no son espacios en blanco en un programa típico). Gran parte de la sintaxis típica similar a ALGOL de BCPL cambió bastante en este proceso. El operador de asignación := volvió al = del Superplan de Rutishauser, y el operador de igualdad = fue reemplazado por = =.

Thompson agregó "operadores de asignación de dos direcciones" usando la sintaxis x =+ y para sumar y a x (en C el operador se escribe +=). Esta sintaxis provino de la implementación de TMG de Douglas McIlroy, en la que se implementó por primera vez el compilador de B (y llegó a TMG desde ALGOL 68 de x +:= y sintaxis). Thompson fue más allá al inventar los operadores de incremento y decremento (++ y --). Su posición de prefijo o posfijo determina si el valor se toma antes o después de la alteración del operando. Esta innovación no estaba en las primeras versiones de B. Según Dennis Ritchie, la gente a menudo asumía que se crearon para los modos de dirección de incremento automático y decremento automático del DEC PDP-11, pero esto es históricamente imposible ya que la máquina no #39;t existía cuando B se desarrolló por primera vez.

Ken Thompson tomó prestada la versión de punto y coma del bucle for del trabajo de Stephen Johnson.

B no tiene tipo, o más precisamente tiene un tipo de datos: la palabra informática. La mayoría de los operadores (por ejemplo, +, -, *, /) trataron esto como un número entero, pero otros lo trataron como una dirección de memoria para ser desreferenciada. En muchos otros aspectos, se parecía mucho a una versión anterior de C. Hay algunas funciones de biblioteca, incluidas algunas que se parecen vagamente a las funciones de la biblioteca de E/S estándar en C. En palabras de Thompson: 'B y la antigua C eran lenguajes muy, muy similares excepto por todos los tipos [en C]'.

Las primeras implementaciones fueron para las minicomputadoras DEC PDP-7 y PDP-11 que usaban las primeras Unix y los mainframes Honeywell GE 645 de 36 bits que ejecutaban el sistema operativo GCOS. Las primeras implementaciones de PDP-7 se compilaron en código enhebrado y Ritchie escribió un compilador usando TMG que producía código de máquina. En 1970 se adquirió un PDP-11 y se utilizó código enhebrado para el puerto; un ensamblador, dc, y el propio lenguaje B se escribieron en B para arrancar la computadora. Se produjo una versión anterior de yacc con esta configuración PDP-11. Ritchie se hizo cargo del mantenimiento durante este período.

La naturaleza sin tipo de B tenía sentido en Honeywell, PDP-7 y muchas computadoras más antiguas, pero era un problema en la PDP-11 porque era difícil acceder elegantemente al tipo de datos de caracteres que la PDP-11 y la mayoría de las computadoras modernas las computadoras son totalmente compatibles. A partir de 1971, Ritchie realizó cambios en el lenguaje mientras convertía su compilador para producir código de máquina, sobre todo agregando tipos de datos para variables. Durante 1971 y 1972 B se convirtió en "New B" (NB) y luego C.

B está casi extinguido, ya que fue reemplazado por el lenguaje C. Sin embargo, sigue siendo utilizado en mainframes del GCOS (a partir de 2014) y en ciertos sistemas integrados (a partir de 2000) por una variedad de razones: hardware limitado en sistemas pequeños, bibliotecas extensas, herramientas, problemas de costos de licencia y simplemente ser lo suficientemente bueno para el trabajo. El altamente influyente AberMUD fue escrito originalmente en B.

Ejemplos

Los siguientes ejemplos son de Usuarios' Referencia a B por Ken Thompson:

/* La siguiente función imprimirá un número no negativo, n, a la base b, donde 2 = 0 = 10 Esta rutina utiliza el hecho de que en el conjunto de caracteres ASCII, los dígitos 0 a 9 tienen secuencial valores de código. */printn()n, b) {} extrn putchar; auto a; /* Nota de Wikipedia: la palabra clave automática declara una variable con almacenamiento automático (tiempo de vida es el alcance de la función), no "Mecanizado automático" como en C+11. */ si ()a = n / b) /* asignación, no prueba de igualdad */ printn()a, b); /* recursiva */ putchar()n % b + '0');}
/* El siguiente programa calculará la constante e-2 a aproximadamente 4000 dígitos decimales, e imprimir 50 caracteres a la línea en grupos de 5 personajes. El método es simple conversión de salida de la ampliación 1/2! + 1/3! +... =.111.... donde las bases de los dígitos son 2, 3, 4,... */principal() {}extrn putchar, n, v;auto i, c, col, a;i = col = 0;mientras()i.n)v[i++] = 1;mientras()col.2*n) {}a = n+1;c = i = 0;mientras ()i.n) {}c =+ v[i] *10;v[i++] = c%a;c =/ a--;}putchar()c+'0');si()!()++col%5)putchar()col%50?': '*n');}putchar()'*n*n');}v[2000];n 2000;