BCPL
BCPL ("Lenguaje de programación combinado básico") es un lenguaje de programación procedimental, imperativo y estructurado. Diseñado originalmente para escribir compiladores para otros lenguajes, BCPL ya no es de uso común. Sin embargo, su influencia todavía se siente porque una versión simplificada y modificada sintácticamente 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. BCPL fue implementado por primera vez por Martin Richards de la Universidad de Cambridge en 1967.
Diseño
BCPL fue diseñado para que se pudieran escribir compiladores pequeños y simples; supuestamente, algunos compiladores podrían ejecutarse en 16 kilobytes. Además, el compilador original, escrito en BCPL, era fácil de transportar. BCPL fue, por lo tanto, una opción popular para arrancar un sistema. Una de las principales razones de la portabilidad del compilador radica en su estructura. Se dividió en dos partes: el front-end analizó la fuente y generó el código O, un lenguaje intermedio. El back-end tomó el código O y lo tradujo al código de máquina para la máquina de destino. Solo 1⁄5 del compilador' Era necesario reescribir el código de s para admitir una nueva máquina, una tarea que generalmente tomaba entre 2 y 5 meses-persona. Este enfoque se convirtió en una práctica común más tarde (por ejemplo, Pascal, Java).
El lenguaje es inusual porque solo tiene un tipo de datos: una palabra, un número fijo de bits, generalmente elegido para alinearse con la palabra de máquina de la arquitectura y con la capacidad adecuada para representar cualquier dirección de almacenamiento válida. Para muchas máquinas de la época, este tipo de datos era una palabra de 16 bits. Más tarde, esta elección resultó ser un problema importante cuando se usó BCPL 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 más grandes, como 32 bits o 64 bits.
La interpretación de cualquier valor fue determinada por los operadores utilizados para procesar los valores. (Por ejemplo, +
sumó dos valores, tratándolos como números enteros; !
indirectamente a través de un valor, tratándolo efectivamente como un puntero). Para que esto funcione, la implementación no proporcionó verificación de tipos.
La discrepancia entre la orientación de palabras de BCPL y el hardware orientado a bytes se solucionó de varias maneras. Uno fue proporcionando rutinas de biblioteca estándar para empaquetar y desempaquetar palabras en cadenas de bytes. Posteriormente, se agregaron dos funciones de lenguaje: el operador de selección de campo de bits y el operador de direccionamiento indirecto de bytes infijos (indicado por %
).
BCPL maneja enlaces que abarcan unidades de compilación separadas de una manera única. No hay variables globales declarables por el usuario; en su lugar, hay un vector global, similar a "en blanco común" en Fortran. Todos los datos compartidos entre diferentes unidades de compilación comprenden escalares y punteros a vectores almacenados en un lugar preestablecido en el vector global. Por lo tanto, los archivos de encabezado (archivos incluidos durante la compilación usando la directiva "GET") se convierten en el medio principal para sincronizar datos globales entre unidades de compilación, que contienen "GLOBAL" directivas que presentan listas de nombres simbólicos, cada uno emparejado con un número que asocia el nombre con la correspondiente palabra numéricamente direccionada en el vector global. Además de variables, el vector global contiene enlaces para procedimientos externos. Esto hace que la carga dinámica de las unidades de compilación sea muy sencilla de lograr. En lugar de confiar en el cargador de enlaces de la implementación subyacente, BCPL le da al programador el control del proceso de enlace.
El vector global también simplificó la sustitución o el aumento de las rutinas de biblioteca estándar. Un programa podría guardar el puntero del vector global a la rutina original y reemplazarlo con un puntero a una versión alternativa. La alternativa podría llamar al original como parte de su procesamiento. Esto podría usarse como una ayuda de depuración ad hoc rápida.
BCPL fue el primer lenguaje de programación de llaves y las llaves sobrevivieron a los cambios sintácticos y se han convertido en un medio común para indicar las declaraciones del código fuente del programa. En la práctica, en los teclados limitados de la época, los programas fuente a menudo usaban las secuencias $(
y $)
en lugar de los símbolos {
y }. Los comentarios //
de línea única 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 uno de los tiranos que cree que sabe mejor y establece la ley sobre lo que es y lo que no se permite; más bien, BCPL actúa más como un sirviente que ofrece sus servicios a lo mejor de su capacidad sin quejarse, incluso cuando se enfrenta a absurdos aparentes. El programador siempre se asume que sabe lo que está haciendo y no está lleno de restricciones menores.
Historia
BCPL fue implementado por primera vez por Martin Richards de la Universidad de Cambridge en 1967. BCPL fue una respuesta a las dificultades con su predecesor, el Lenguaje de Programación de Cambridge, más tarde rebautizado como Lenguaje de Programación Combinado (CPL), que fue diseñado a principios de la década de 1960. Richards creó BCPL "eliminando aquellas características del lenguaje completo que dificultan la compilación". La primera implementación del compilador, para IBM 7094 bajo el Sistema de tiempo compartido compatible, se escribió mientras Richards visitaba el Proyecto MAC en el Instituto de Tecnología de Massachusetts en la primavera de 1967. El lenguaje se describió por primera vez en un artículo presentado en el Spring Joint de 1969. Conferencia Informática.
Se rumorea que BCPL originalmente significaba "Lenguaje de programación de Cambridge Bootstrap", pero CPL nunca se creó porque el desarrollo se detuvo en BCPL, y el acrónimo se reinterpretó más tarde para el libro BCPL.
BCPL es el idioma en el que se utiliza la versión original de "Hello, World!" programa fue escrito. El primer MUD también se escribió en BCPL (MUD1).
Varios sistemas operativos se escribieron total o parcialmente en BCPL (por ejemplo, TRIPOS y las primeras versiones de AmigaDOS). BCPL también fue el lenguaje inicial utilizado en el proyecto seminal Xerox PARC Alto, la primera computadora personal moderna; entre otros proyectos, se escribió en BCPL el sistema de preparación de documentos Bravo.
Un compilador temprano, iniciado en 1969, a partir de una cinta de papel del código O del compilador Atlas 2 de Richards, apuntó a la serie ICT 1900. Las dos máquinas tenían diferentes longitudes de palabra (48 frente a 24 bits), diferentes codificaciones de caracteres y diferentes representaciones de cadenas empaquetadas, y el arranque exitoso aumentó la confianza en la practicidad del método.
A fines 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, un dialecto de BCPL se implementó en BBN sin usar el código O intermedio. La implementación inicial fue un compilador cruzado alojado en TENEX PDP-10 de BBN, y se dirigió 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 BBC Micro a mediados de la década de 1980, por Richards Computer Products, una empresa iniciada por John Richards, el hermano de Martin Richards. El Proyecto Domesday de la BBC hizo uso del lenguaje. Las versiones de BCPL para las computadoras Amstrad CPC y Amstrad PCW también fueron lanzadas en 1986 por la casa de software del Reino Unido Arnor Ltd. MacBCPL fue lanzado para Apple Macintosh en 1985 por Topexpress Ltd, de Kensington, Inglaterra.
Tanto el diseño como la filosofía de BCPL influyeron fuertemente en B, que a su vez influyó en C. Los programadores debatieron en ese momento si un eventual sucesor de C se llamaría "D", la siguiente letra del alfabeto, o "P", la siguiente letra en el nombre del idioma principal. El lenguaje más aceptado como sucesor de C es C++ (siendo ++
el operador de incremento de C), 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 cayó gradualmente en desgracia a medida que C se hizo popular en sistemas que no son Unix.
Martin Richards mantiene una versión moderna de BCPL en su sitio web, actualizada por última vez en 2018. 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 él, 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
Si estos programas se ejecutan con Richards' versión actual de Cintsys (diciembre de 2018), LIBHDR, START y WRITEF deben cambiarse a minúsculas para evitar errores.
Imprimir factoriales:
"LIBHDR" LET START() = VALOF $( I = 1 a 5 DO WRITEF("%N! = %I4*N", I, FACT(I)) RESULTIS 0 $) AND FACT(N) = N = 0 - título 1, N * FACT(N - 1)
Cuente las soluciones al problema de N reinas:
"LIBHDR" GLOBAL $( PASO: 200 TODOS: 201 $) LET TRY (LD, ROW, RD) BE TEST ROW = ALL THEN COUNT:= COUNT + 1 ELSE $( LET POSS = ALL > (LD TENIDO TENIDO TENIDO ANTERIOR) UNTIL POSS = 0 DO $( LET P = POSS " -POSS POSS:= POSS - P TRY(LD + P) se realizó 1, ROW + P, RD + P ≤ 1) $) $) LET START() = VALOF $( TODOS:= 1 PARA I = 1 a 12 DO $( COUNT:= 0 TRY(0, 0, 0) WRITEF("%I2-QUEENS PROBLEM HAS %I5 SOLUTIONS*N", I, COUNT) TODOS:= 2 * TODOS + 1 $) RESULTIS 0 $)
Contenido relacionado
ANSI C
Zilog Z80
Compatible con PC de IBM