FORTH Un lenguaje diferente Orígenes (1) Orígenes (2) q 1971, radiotelescopio de Kitt Peak q DDP-116 (16k) y H-116 (32k) q Control del radiotelescopio q Adquisición de datos q 4 terminales interactivos q Sistema de desarrollo “in situ” Lenguajes “tradicionales” q Ciclo edición/compilación/ejecución q Las funciones no son “autónomas” q No son verdaderamente extensibles q Preponderancia de la sintaxis q Diseño poco limpio (int *, ++i, 1+2 ) q Compiladores grandes, librerías grandes, entornos grandes q Difíciles de portar Forth q Edición, compilación y ejecución integradas q Las funciones se prueban individualmente q Totalmente extensible q Sintaxis trivial q Diseño nítido q Pequeño y fácil de portar: Forth está escrito en Forth Otras características inusuales q Acceso obligatorio a la máquina virtual q q q q Compilador incremental Forth está escrito en Forth Programar en Forth = diseñar vocabularios Programas compactos como si fuese ensamblador q Facilidad para pasar de bajo a alto nivel Un programa en Forth Obsérvese: q Construcción abajo -> arriba q Una función -> una línea (casi siempre) q Una frase expresa la operación del programa q Cada frase contiene palabras. Cada palabra está definida mediante palabras de más bajo nivel q Cada palabra se compila y comprueba independientemente de la aplicación ¿Dónde está Forth? q Instrumentación científica q OpenBoot de Sun Microsystems q Industria aero-espacial q Implementado en micros con arquitectura de pila q Microcontroladores y otro hardware ¡No parece haber tenido éxito! Sí, pero… q No confundir éxito con mérito q No confundir cantidad con calidad q Forth enseña cosas que los demás no enseñan q Forth no es un lenguaje para “las masas” q Forth “amplifica” la calidad del programador Forth obliga a pensar diferente q Ante todo, obliga a pensar q q q q q Su ideal es la simplicidad Simple no quiere decir trivial Simplicidad tampoco es generalidad Particularidad no resta perfección Un método y un arte: la factorización Las manos en harina q Forth consta de dos pilas y un diccionario q El diccionario se usa para añadir nuevas palabras y buscar palabras existentes q Las pilas para evaluar expresiones, llamar a otras palabras, compilar, ejecutar bucles… Expresiones q12+ q q q q q q q q \ comentario con ‘\’ 34* 13 11 mod 111 56 / 1 3 swap 1 2 drop 6 dup 4 >r r> \ ( 1 3 -- 3 1 ) \ ( 1 2 -- 1 ) \ ( 6 -- 6 6 ) \ ( 2 -- ) \ ( -- 2 ) Extensión del vocabulario q: nip swap drop ; q: over >r dup r> swap ; q: tuck swap over ; q: 2dup over over ; q: rot >r swap r> swap ; q: -rot swap >r swap r> ; \ ( a b -- b ) \ ( a b -- a b a ) \ ( a b -- b a b ) \ ( a b -- a b a b ) \ ( a b c -- b c a ) \ ( a b c -- c a b ) Cálculo de expresiones q dup * q 2dup - -rot + * q q q q ( a -- a^2 ) ( a b -- (a+b)*(a-b) ) dup dup * + 1 + ( x -- x^2+x+1 ) dup 9 + swap 6 - / ( x -- ( (x+9)/(x-6) ) swap dup * -rot 4 * * - ( a b c -- b^2 - 4*a*c ) dup dup 2 - -rot 1 - * * ( a -- a*(a-1)*(a-2) ) Factorización q : 2dup dup dup ; q q q q q q : 1+ 1 + ; : 2* 2 * ; : ^2 dup * ; : ^3 dup ^2 * ; : ^4 dup ^2 swap ^2 * ; : ^ dup 0= if 2drop 1 else over swap 1- recurse * then ; Control de flujo q <flag> if … else … then q <flag> if … then q do … loop q do … <n> +loop q begin … <flag> while … repeat Carácter especial de Forth (1) qC if (n<0) n=0; else if (n>5) n=5; qFORTH 0 max 5 min Carácter especial de Forth (2) ¡No se escribe Forth traduciendo otros lenguajes! q : 0< dup 0 < if drop -1 else drop 0 then ; \ ¡MAL! q : 0< 0 < ; \ ¡BIEN! Carácter especial de Forth (3) Véase q Cadena de formato para printf() q Cadena de formato para (format ) en Lisp Y compárese con la solución Forth <# # #s #> hold Diccionario Mecanismo de extensión q create … does> ü create crea una nueva entrada en el diccionario ü does> asigna a la palabra creada un comportamiento en tiempo de ejecución Extensión, ejemplos q Constantes : const create , does> @ ; Variables, valor inicial a cero : variable create 0 , does> ; q Vectores : vector create dup , cells allot does> dup @ swap cell+ swap ; Extensión, ejemplos $ 45 constant ancho ok $ 10 ancho + . 55 ok $ variable altura ok $ 40 altura ! ok $ 20 altura @ + altura ! ok $ altura @ . 60 ok $ 100 vector X ok Extensión, más ejemplos Extensión para operar con racionales : mcd ?dup if tuck mod recurse then ; : reduce 2dup mcd tuck / >r / r> ; : q+ rot 2dup * >r rot * -rot * + r> reduce ; : q- swap negate swap q+ ; : q* rot * >r * r> reduce ; : q/ >r * swap r> * swap reduce ; Extensión: estructuras 0 constant [struct : field create over , + does> @ + ; : struct] constant ; [struct 20 field autor 40 field titulo 10 field ISBN 4 field precio struct] Libro create milibro Libro allot 34 milibro precio ! Cosas de las que no hablaré q Operadores lógicos q q q q q Operaciones con números enteros dobles Operaciones con reales Operadores mixtos Cadenas Entrada/Salida Más cosas que omito q El compilador puede pararse y arrancarse a voluntad q Existe un mecanismo de compilación diferida q Puede forzarse una palabra para que no sea compilada, sino inmediatamente ejecutada q Ejecución vectorizada q Arcanos de ‘reveal’, ‘postpone’, etc. q Objetos, excepciones, estructuras de datos El camino de la sabiduría 1. 2. 3. 4. 5. 6. Aprender Forth Escribir un Forth en C Escribir un Forth en Forth Escribir un S.O. Forth Escribir en Forth un metacompilador Forth Volver al paso 3 y hacerlo mejor La maestría : INTERPRET ( -- ) BEGIN BL WORD FIND IF EXECUTE ?STACK ABORT" Stack empty" ELSE NUMBER THEN AGAIN ; La maestría : ] ( -- ) BEGIN BL WORD FIND DUP IF -1 = IF EXECUTE ?STACK ABORT" Stack empty" ELSE , THEN ELSE DROP (NUMBER) POSTPONE LITERAL THEN AGAIN ; Referencias q Libros ü “Starting Forth”, Leo Brodie ü “Thinking Forth” Leo Brodie ü “Introducción a Forth” Javier Gil q Implementaciones ü Gforth, SwiftX, kForth, Win32Forth q Organizaciones ü Forth Inc. ü FIG Más referencias Ø Ø Ø Ø Ø Ø Ø Ø http://www.forth.com http://www.forth.org http://forth.gsfc.nasa.gov/ ftp://playground.sun.com/pub/p1275/index.html http://www.forth.com/starting-forth/ http://win32forth.sourceforge.net/ http://home.iae.nl/users/mhx/ http://home.iae.nl/users/mhx/forth_NRAO.pdf Inspirados en Forth q PostScript q http://www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDF q http://www.rightbrain.com/pages/books.html q Joy q ColorForth