BCPL ( Basic Combined Programming Language ) es un lenguaje de programación procedimental , imperativo y estructurado . Originalmente concebido para escribir compiladores para otros lenguajes, BCPL ya no se usa comúnmente. Sin embargo, su influencia aún se siente porque una versión simplificada y sintácticamente modificada de BCPL, llamada B , fue el lenguaje en el que se basó el lenguaje de programación C. BCPL introdujo varias características de muchos lenguajes de programación modernos, incluido el uso de llaves para delimitar bloques de código. [ 2 ] BCPL fue implementado por primera vez por Martin Richards de la Universidad de Cambridge en 1967. [ 1 ]
Diseño
BCPL fue diseñado para que se pudieran escribir compiladores pequeños y sencillos; se dice que algunos compiladores podían ejecutarse en 16 kilobytes . Además, el compilador original, escrito en BCPL, era fácilmente portable. Por lo tanto, BCPL fue una opción popular para el arranque de un sistema. Una razón importante de la portabilidad del compilador radicaba en su estructura. Estaba dividido en dos partes: el front-end analizaba el código fuente y generaba código O, un lenguaje intermedio . El back-end tomaba el código O y lo traducía al código máquina para la máquina de destino. Solo era necesario reescribir 1/5 del código del compilador para que fuera compatible con una nueva máquina, una tarea que generalmente tomaba entre 2 y 5 meses -persona . Este enfoque se convirtió en práctica común más adelante (por ejemplo, Pascal , Java ).
El lenguaje es inusual porque solo tiene un tipo de dato : una palabra , un número fijo de bits, generalmente elegido para que coincida con la palabra de máquina de la misma arquitectura de plataforma y con la capacidad suficiente para representar cualquier dirección de almacenamiento válida. Para muchas máquinas de la época, este tipo de dato era una palabra de 16 bits. Esta elección resultó ser un problema importante cuando BCPL se utilizó en máquinas en las que el elemento direccionable más pequeño no era una palabra, sino un byte , o en máquinas con tamaños de palabra mayores, como de 32 o 64 bits.
La interpretación de cualquier valor estaba determinada por los operadores utilizados para procesarlos. (Por ejemplo, +sumar dos valores, tratándolos como enteros ; !indirectamente a través de un valor, tratándolo efectivamente como un puntero). Para que esto funcionara, la implementación no proporcionaba ninguna comprobación de tipos .
La discrepancia entre la orientación a palabras de BCPL y el hardware orientado a bytes se abordó de varias maneras. Una de ellas fue proporcionando rutinas de biblioteca estándar para empaquetar y desempaquetar palabras en cadenas de bytes. Posteriormente, se añadieron dos características del lenguaje: el operador de selección de campo de bits y el operador de indirección de byte infijo (denotado por %). [ 3 ]
BCPL gestiona las vinculaciones entre unidades de compilación independientes de una forma única. No existen variables globales declarables por el usuario; en su lugar, hay un vector global, similar al "espacio común vacío" de Fortran . Todos los datos compartidos entre las distintas unidades de compilación consisten en escalares y punteros a vectores almacenados en una ubicación predefinida del vector global. De este modo, los archivos de cabecera (archivos incluidos durante la compilación mediante la directiva "GET") se convierten en el principal medio para sincronizar los datos globales entre las unidades de compilación, y contienen directivas "GLOBAL" que presentan listas de nombres simbólicos, cada uno asociado a un número que vincula el nombre con la palabra correspondiente en el vector global. Además de variables, el vector global contiene vinculaciones para procedimientos externos. Esto simplifica enormemente la carga dinámica de unidades de compilación. En lugar de depender del cargador de enlaces de la implementación subyacente, BCPL otorga al programador el control del proceso de enlace.
El vector global también facilitaba la sustitución o extensión de rutinas de la biblioteca estándar. Un programa podía almacenar el puntero a una rutina existente en el vector global y reemplazarlo por un puntero a una implementación alternativa. La rutina de reemplazo podía, a su vez, invocar a la original durante su ejecución. Este uso de punteros a funciones para interceptar y extender el comportamiento de las rutinas es análogo a las técnicas descritas en la interposición y el enganche de funciones, y en ocasiones se empleaba como método de depuración ad hoc .
BCPL fue el primer lenguaje de programación con llaves , y estas sobrevivieron a los cambios sintácticos y se convirtieron en un medio común para denotar instrucciones en el código fuente de los programas. En la práctica, en los teclados limitados de la época, los programas fuente a menudo usaban las secuencias $(y $)o [y ]en lugar de los símbolos {y . Los comentarios} de una sola línea de BCPL, que no fueron adoptados por C , reaparecieron en C++ y más tarde en C99 .//
El libro BCPL: El lenguaje y su compilador describe la filosofía de BCPL de la siguiente manera:
La filosofía de BCPL no es la de un tirano que cree saberlo todo y dicta las reglas sobre lo que está permitido y lo que no; más bien, BCPL actúa como un servidor que ofrece sus servicios lo mejor que puede sin quejarse, incluso ante lo que parece absurdo. Se da por sentado que el programador sabe lo que hace y no se ve limitado por restricciones insignificantes. [ 4 ]
Historia
BCPL fue implementado por primera vez por Martin Richards de la Universidad de Cambridge en 1967. [ 1 ] BCPL fue una respuesta a las dificultades con su predecesor, Cambridge Programming Language, luego renombrado Combined Programming Language (CPL), que fue diseñado durante los primeros años de la década de 1960. Richards creó BCPL "eliminando aquellas características del lenguaje completo que hacen que la compilación sea difícil". La primera implementación del compilador, para el IBM 7094 bajo el Compatible Time-Sharing System , fue escrita mientras Richards visitaba el Proyecto MAC en el Instituto Tecnológico de Massachusetts en la primavera de 1967. El lenguaje fue descrito por primera vez en un artículo presentado en la Spring Joint Computer Conference de 1969 .
Se rumorea que BCPL originalmente significaba "Bootstrap Cambridge Programming Language" (Lenguaje de Programación de Cambridge Bootstrap), pero CPL nunca se creó ya que el desarrollo se detuvo en BCPL, y el acrónimo fue posteriormente reinterpretado para el libro de BCPL.
BCPL es el lenguaje en el que se escribió el programa original "Hello, World!" . [ 5 ] El primer MUD también se escribió en BCPL ( MUD1 ).
Varios sistemas operativos se escribieron parcial o totalmente en BCPL (por ejemplo, TRIPOS y las primeras versiones de AmigaDOS ). BCPL también fue el lenguaje inicial utilizado en el proyecto Xerox PARC Alto . Entre otros proyectos, el sistema de preparación de documentos Bravo se escribió en BCPL.
Un compilador inicial, creado en 1969 a partir de una cinta de papel con el código O del compilador Atlas 2 de Richards , estaba dirigido a la serie ICT 1900. Ambas máquinas tenían longitudes de palabra diferentes (48 frente a 24 bits), codificaciones de caracteres diferentes y representaciones de cadenas empaquetadas diferentes; y el éxito del proceso de creación aumentó la confianza en la viabilidad del método.
A finales de 1970, existían implementaciones para Honeywell 635 y Honeywell 645 , IBM 360 , PDP-10 , TX-2 , CDC 6400 , UNIVAC 1108 , PDP-9 , KDF 9 y Atlas 2. En 1974, se implementó un dialecto de BCPL en BBN sin utilizar el código O intermedio. La implementación inicial fue un compilador cruzado alojado en los PDP-10 TENEX de BBN , y estaba dirigido directamente a los PDP-11 utilizados en la implementación de BBN de los IMP de segunda generación utilizados en ARPANET .
También hubo una versión producida para el BBC Micro a mediados de la década de 1980, por Richards Computer Products, una empresa fundada por John Richards, hermano de Martin Richards. [ 6 ] El proyecto BBC Domesday utilizó el lenguaje. En 1986, la empresa de software británica Arnor Ltd. también lanzó versiones de BCPL para los ordenadores Amstrad CPC y Amstrad PCW. En 1985, Topexpress Ltd., de Kensington, Inglaterra, lanzó MacBCPL para el Apple Macintosh.
Tanto el diseño como la filosofía de BCPL influyeron fuertemente en B , que a su vez influyó en C. [ 7 ] Los programadores de la época debatían si un eventual sucesor de C se llamaría "D", la siguiente letra del alfabeto, o "P", la siguiente letra del nombre del lenguaje padre. El lenguaje más aceptado como sucesor de C es C++ ( siendo el operador de incremento++ de C ), [ 8 ] aunque, mientras tanto, también existe un lenguaje de programación D.
En 1979, existían implementaciones de BCPL para al menos 25 arquitecturas; el lenguaje fue cayendo gradualmente en desuso a medida que C se popularizó en sistemas que no eran Unix.
Martin Richards mantiene una versión moderna de BCPL en su sitio web, actualizada por última vez en 2023. [ 9 ] Esta se puede configurar para ejecutarse en varios sistemas, incluidos Linux, FreeBSD y Mac OS X. La distribución más reciente incluye bibliotecas de gráficos y sonido, y hay un manual completo. Continúa programando en ella, incluso para su investigación sobre el seguimiento automatizado de partituras musicales .
Un tipo MIME informal común para BCPL es text/x-bcpl .
Ejemplos
Hola Mundo
Richards y Whitby-Strevens [ 10 ] proporcionan un ejemplo del programa "¡Hola, mundo!" para BCPL utilizando un encabezado de sistema estándar, 'LIBHDR':
OBTENER "LIBHDR" LET START() BE WRITES("Hola, Mundo") Otros ejemplos
Si estos programas se ejecutan utilizando la versión actual de Cintsys de Richards (diciembre de 2018), LIBHDR, START y WRITEF deben cambiarse a minúsculas para evitar errores.
Imprimir factoriales:
OBTENER "LIBHDR" DEJE COMENZAR() = VALOR DE $( PARA I = 1 A 5 HACER ESCRIBIR("%N! = %I4*N", I, HECHO(I)) RESULTADOS 0 $) Y HECHO(N) = N = 0 -> 1, N * HECHO(N - 1) Contar soluciones al problema de las N reinas :
OBTENER "LIBHDR" GLOBAL $( CANTIDAD: 200 TODOS: 201 $) SEA QUE INTENTE(LD, FILA, RD) SER FILA DE PRUEBA = TODOS ENTONCES CONTEO := CONTEO + 1 DE LO CONTRARIO $( SEA POSS = ALL & ~(LD | ROW | RD) HASTA QUE POSS = 0 HAGA $( SEA P = POSIBLE Y -POSIBLE POSEER := POSEER - P INTENTAR(LD + P << 1, FILA + P, RD + P >> 1) $) $) DEJE COMENZAR() = VALOR DE $( TODOS := 1 PARA I = 1 A 12 HACER $( CONTEO := 0 INTENTAR(0, 0, 0) ESCRIBIR("%I2-EL PROBLEMA DE LAS REINAS TIENE %I5 SOLUCIONES*N", I, CONTAR) TODOS := 2 * TODOS + 1 $) RESULTADOS 0 $) Referencias
- 1 2 3 "Martin Richards (Premio Pionero de la Informática 2003)" . IEEE Computer Society . Consultado el 24 de noviembre de 2017 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ https://www.cl.cam.ac.uk/~mr10/bcplman.pdf Guía del usuario de BCPL Cintsys y Cintpos, 2.1.4 Corchetes de sección
- ↑ "Clive Feather sobre CPL y BCPL" . www.lysator.liu.se . Consultado el 1 de marzo de 2024 .
- ↑ Richards, Martin; Whitby-Strevens, Colin (1980). BCPL: El lenguaje y su compilador . Cambridge University Press. pág. 5. ISBN 978-0521785433.
- ↑ BCPL , Archivo de jerga
- ↑ "Desarrollo técnico de Reuters: Glosario - THE BARON" . www.thebaron.info .
- ↑ Kernighan, Brian W.; Dennis M. Ritchie (1978). El lenguaje de programación C. Bell Telephone Laboratories. pág. 2. ISBN 0-13-110163-3.
- ↑ Historia de C++ Recuperado el 12 de diciembre de 2017
- ↑ Martin Richards. "BCPL/README (distribución de BCPL Cintcode)" .
- ↑ Richards, Martin; Whitby-Strevens, Colin (1980). BCPL: El lenguaje y su compilador . Cambridge University Press. pág. 8. ISBN 978-0521785433.
Lecturas adicionales
- Martin Richards, Manual de referencia de la Biblioteca Pública de Cambridge (BCPL) , archivado el 11 de junio de 2015 en Wayback Machine (Memorándum M-352, Proyecto MAC , Cambridge, MA, EE. UU., julio de 1967).
- Martin Richards, BCPL: una herramienta para la escritura de compiladores y la programación de sistemas ( Actas de la Conferencia Conjunta de Computación de Primavera , Vol. 34, págs. 557-566, 1969)
- Martin Richards, Arthur Evans, Robert F. Mabee, Manual de referencia de la BCPL (MAC TR-141, Proyecto MAC , Cambridge, MA, EE. UU., 1974)
- Martin Richards, Colin Whitby-Strevens, BCPL, el lenguaje y su compilador (Cambridge University Press, 1980) ISBN 0-521-28681-6
Enlaces externos
- Distribución de BCPL de Martin Richards
- Manual de referencia de la Biblioteca Pública de Columbia Británica de Martin Richards, 1967. Archivado el 11 de junio de 2015 en Wayback Machine por Dennis M. Ritchie.
- Entrada de BCPL en el archivo de jerga.
- Puerto x86 de Nordier & Associates
- Manual ArnorBCPL (1986, Amstrad PCW / CPC )
- Cómo evolucionó BCPL a partir de CPL, Martin Richards
- El libro de Ritchie, The Development of the C Language, incluye comentarios sobre la influencia de BCPL en C.
- Guía del usuario de Cintsys y Cintpos de la BCPL
- Manual de referencia de BCPL, 1975, Centro de Investigación Xerox Palo Alto
- Historia de la informática en el Reino Unido
- Lenguajes de programación procedimental
- Lenguajes de programación creados en 1967
- Lenguajes de programación estructurados
- lenguajes de programación de sistemas
- Laboratorio de Informática de la Universidad de Cambridge