un lenguaje diferente - dfists.ua.esdfists.ua.es/~gil/tr-6.pdf · qforthno es un lenguaje para...

37
FORTH Un lenguaje diferente

Upload: vonhan

Post on 15-Oct-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

FORTHUn lenguaje diferente

Orígenes (1)

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

Un programa en Forth

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 (1)qC

if (n<0) n=0;

elseif (n>5)

n=5;

qFORTH0 max 5 min

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

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 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