B es un lenguaje de programación desarrollado en Bell Labs alrededor de 1969 por Ken Thompson y Dennis Ritchie .
B se deriva 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 su uso en Multics . [nota 1]
B fue diseñado para aplicaciones recursivas, no numéricas e independientes de la máquina, como software de sistemas y lenguajes. [3] Era un lenguaje sin tipos, y el único tipo de datos era el formato de palabra de memoria natural de la máquina subyacente , cualquiera que fuera. Dependiendo del 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 el DEC PDP-11 que llegó a Bell Labs, la compatibilidad con datos de caracteres almacenados en palabras de memoria se volvió importante. La naturaleza sin tipos del lenguaje se consideró una desventaja, lo que llevó a Thompson y Ritchie a desarrollar una versión ampliada del lenguaje que admitía nuevos tipos internos y definidos por el usuario, que se convirtió en el lenguaje de programación C.
Semántica BCPL con mucha sintaxis SMALGOL
—Ken Thompson, [4]
Alrededor de 1969, Ken Thompson [2] y más tarde Dennis Ritchie [3] desarrollaron B basándose principalmente en el lenguaje BCPL que Thompson utilizó en el proyecto Multics . B era esencialmente el sistema BCPL despojado de cualquier componente que Thompson creyera que podía prescindir para adaptarlo a 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 el sentido de reducir la cantidad de caracteres que no son espacios en blanco en un programa típico). [2] Gran parte de la sintaxis típica tipo ALGOL de BCPL sufrió cambios considerables en este proceso. El operador de asignación volvió:=
al Superplan de =
Rutishauser y el operador de igualdad fue reemplazado por .=
==
Thompson agregó "operadores de asignación de dos direcciones" usando x =+ y
sintaxis para agregar 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 la sintaxis de ALGOL 68 ). [2] [5] Thompson fue más allá al inventar los operadores de incremento y decremento ( y ). Su posición de prefijo o postfijo determina si el valor se toma antes o después de la modificació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 fueron creados para los modos de dirección de incremento y decremento automático del DEC PDP-11, pero esto es históricamente imposible ya que la máquina no No existía cuando B se desarrolló por primera vez. [2]x +:= y
++
--
Ken Thompson tomó prestada la versión de punto y coma del bucle for del trabajo de Stephen Johnson . [6]
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 a la que se debe desreferenciar . 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 funciones de la biblioteca de E/S estándar en C. [3]
En palabras de Thompson: "B y el antiguo El antiguo C eran lenguajes muy similares excepto por todos los tipos [en C]". [6]
Las primeras implementaciones fueron para las minicomputadoras DEC PDP-7 y PDP-11 que usaban Unix temprano y mainframes Honeywell GE 645 [7] de 36 bits que ejecutaban el sistema operativo GCOS . Las primeras implementaciones de PDP-7 se compilaron en código subproceso , y Ritchie escribió un compilador usando TMG que producía código de máquina. [8] [9] [10] En 1970 se adquirió un PDP-11 y se utilizó código de subprocesos para el puerto; un ensamblador,corriente continua, y el lenguaje B en sí se escribieron en B para arrancar la computadora. Se produjo una primera versión de yacc con esta configuración de PDP-11. Ritchie se hizo cargo del mantenimiento durante este período. [2] [10]
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 soportan por completo. . A partir de 1971, Ritchie realizó cambios en el lenguaje mientras convertía su compilador para producir código de máquina, en particular agregando tipificación de datos para variables. Durante 1971 y 1972 B evolucionó a "Nueva B" (NB) y luego a C. [2]
B está casi extinto, habiendo sido reemplazado por el lenguaje C. [11] Sin embargo, se sigue utilizando en mainframes del SMOC (a partir de 2014 [actualizar]) [12] y en ciertos sistemas integrados (a partir de 2000 [actualizar]) por diversas razones: hardware limitado en sistemas pequeños, bibliotecas extensas, herramientas, costo de licencia problemas y simplemente ser lo suficientemente bueno para el trabajo. [11] El muy influyente AberMUD fue escrito originalmente en B.
Los siguientes ejemplos son de Users' Reference to B de Ken Thompson: [3]
/* La siguiente función imprimirá un número no negativo, n, en base b, donde 2<=b<=10. Esta rutina aprovecha el hecho de que en el juego de caracteres ASCII, los dígitos del 0 al 9 tienen valores de código secuenciales. */printn ( n , b ) { extrn putchar ; auto a ; /* Nota de Wikipedia: la palabra clave auto declara una variable con almacenamiento automático (la vida útil es el alcance de la función), no "escritura automática" como en C++11. */ if ( a = n / b ) /* asignación, no prueba de igualdad */ printn ( a , b ); /* recursivo */ putchar ( n % b + '0' ); }
/* El siguiente programa calculará la constante e-2 con aproximadamente 4000 dígitos decimales y la imprimirá 50 caracteres por línea en grupos de 5 caracteres. ¡El método es una simple conversión de salida de la expansió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 ; yo = col = 0 ; mientras ( i < n ) v [ i ++ ] = 1 ; mientras ( col < 2 * n ) { a = n + 1 ; c = yo = 0 ; mientras ( 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 ' ); } en [ 2000 ]; n 2000 ;
portal de programación informática
Vi la versión de punto y coma de Johnson del bucle for y la puse en [B], la robé.