Forth

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