un lenguaje diferente - dfists.ua.esdfists.ua.es/~gil/tr-6.pdf · qforthno es un lenguaje para...
TRANSCRIPT
Orígenes (2)
q 1971, radiotelescopio de Kitt Peakq DDP-116 (16k) y H-116 (32k)q Control del radiotelescopioq Adquisición de datosq 4 terminales interactivosq Sistema de desarrollo “in situ”
Lenguajes “tradicionales”
q Ciclo edición/compilación/ejecuciónq Las funciones no son “autónomas”q No son verdaderamente extensiblesq Preponderancia de la sintaxisq Diseño poco limpio (int *, ++i, 1+2 )q Compiladores grandes, librerías grandes, entornos grandesq Difíciles de portar
Forth
q Edición, compilación y ejecución integradasq Las funciones se prueban individualmenteq Totalmente extensibleq Sintaxis trivialq Diseño nítidoq Pequeño y fácil de portar: Forth está escrito
en Forth
Otras características inusuales
q Acceso obligatorio a la máquina virtualq Compilador incrementalq Forth está escrito en Forthq Programar en Forth = diseñar vocabulariosq Programas compactos como si fuese
ensambladorq Facilidad para pasar de bajo a alto nivel
Obsérvese:q Construcción abajo -> arribaq Una función -> una línea (casi siempre)q Una frase expresa la operación del
programaq Cada frase contiene palabras. Cada
palabra está definida mediante palabras de más bajo nivelq Cada palabra se compila y comprueba
independientemente de la aplicación
¿Dónde está Forth?
q Instrumentación científicaq OpenBoot de Sun Microsystemsq Industria aero-espacialq Implementado en micros con arquitectura de
pilaq Microcontroladores y otro hardware
¡No parece haber tenido éxito!
q No confundir éxito con méritoq No confundir cantidad con calidadq Forth enseña cosas que los demás no
enseñanq Forth no es un lenguaje para “las masas”q Forth “amplifica” la calidad del programador
Sí, pero…
Forth obliga a pensar diferente
q Ante todo, obliga a pensarq Su ideal es la simplicidadq Simple no quiere decir trivialq Simplicidad tampoco es generalidadq Particularidad no resta perfecciónq Un método y un arte: la factorización
Las manos en harina
q Forth consta de dos pilas y un diccionarioq El diccionario se usa para añadir nuevas
palabras y buscar palabras existentesq Las pilas para evaluar expresiones, llamar a
otras palabras, compilar, ejecutar bucles…
Expresionesq 1 2 + \ comentario con ‘\’q 3 4 *q 13 11 modq 111 56 /q 1 3 swap \ ( 1 3 -- 3 1 )q 1 2 drop \ ( 1 2 -- 1 ) q 6 dup \ ( 6 -- 6 6 )q 4 >r \ ( 2 -- )q r> \ ( -- 2 )
Extensión del vocabularioq: nip swap drop ; \ ( a b -- b )q: over >r dup r> swap ; \ ( a b -- a b a )q: tuck swap over ; \ ( a b -- b a b )q: 2dup over over ; \ ( a b -- a b a b )q: rot >r swap r> swap ; \ ( a b c -- b c a )q: -rot swap >r swap r> ; \ ( a b c -- c a b )
Cálculo de expresiones
q dup * ( a -- a^2 )q 2dup - -rot + * ( a b -- (a+b)*(a-b) )q dup dup * + 1 + ( x -- x^2+x+1 )q dup 9 + swap 6 - / ( x -- ( (x+9)/(x-6) )q swap dup * -rot 4 * * - ( a b c -- b^2 - 4*a*c )q dup dup 2 - -rot 1 - * * ( a -- a*(a-1)*(a-2) )
Factorización
q : 2dup dup dup ; q : 1+ 1 + ;q : 2* 2 * ; q : ^2 dup * ; q : ^3 dup ^2 * ;q : ^4 dup ^2 swap ^2 * ;q : ^ dup 0= if 2drop 1 else
over swap 1- recurse * then ;
Control de flujo
q <flag> if … else … thenq <flag> if … thenq do … loopq do … <n> +loopq begin … <flag> while … repeat
Carácter especial de Forth (2)
q : 0< dup 0 < if drop -1 else drop 0 then ;\ ¡MAL!
q : 0< 0 < ; \ ¡BIEN!
¡No se escribe Forth traduciendo otros lenguajes!
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
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 ejemplosExtensió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: estructuras0 constant [struct: field create over , + does> @ + ;: struct] constant ;
[struct20 field autor40 field titulo10 field ISBN4 field precio
struct] Librocreate milibro Libro allot34 milibro precio !
Cosas de las que no hablaré
q Operadores lógicosq Operaciones con números enteros doblesq Operaciones con realesq Operadores mixtosq Cadenasq Entrada/Salida
Más cosas que omito
q El compilador puede pararse y arrancarse a voluntadq Existe un mecanismo de compilación
diferidaq Puede forzarse una palabra para que no sea
compilada, sino inmediatamente ejecutadaq Ejecución vectorizadaq Arcanos de ‘reveal’, ‘postpone’, etc.q Objetos, excepciones, estructuras de datos
El camino de la sabiduría
1. Aprender Forth2. Escribir un Forth en C3. Escribir un Forth en Forth4. Escribir un S.O. Forth5. Escribir en Forth un metacompilador Forth6. 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 ;
Referenciasq Librosü “Starting Forth”, Leo Brodieü “Thinking Forth” Leo Brodieü “Introducción a Forth” Javier Gilq Implementacionesü Gforth, SwiftX, kForth, Win32Forthq 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 PostScriptq http://www-cdf.fnal.gov/offline/PostScript/BLUEBOOK.PDFq http://www.rightbrain.com/pages/books.html
q Joyq ColorForth