Introducción
En una de las asignaturas que tuve en la facultad se impartía Lisp. Este lenguaje siempre me pareció muy interesante, por su elegancia y simplicidad. En estos últimos meses, cada vez leo mas de Lisp por dos motivos principales, es uno de los lenguajes que se estan montando encima de la máquina virtual Parrot, y el otro motivo, es que algunos colegas me estan liando con Emacs, y el lenguaje de extensión de emacs es una variante de Lisp. Bueno, tambien hay otro motivo fundamental, y es que en todas las maquinas (OSes) que me parecen interesantes hay versiones de lisp, ejemplos: Multics(maclisp), ITS(maclisp), TOPS-10, TOPS-20(interlisp, maclisp), VAX(franz lisp), Apollo(T), etc..
.. Y una de las mejores formas de ver Lisp, es quizas probándolo en arquitecturas antiguas, así que aquí lo vamos a probar en un PDP1. Esta versión de Lisp es del 23 de febrero de 1964, fué escrita por L. Peter Deutsch y es una de las primeras de uso generico y la primera de uso interactivo. Cabe destacar que esta totalmente escrita en ensamblador, y quitando los comentarios y las líneas de separación ocupa unas mil quinientas líneas de código.
Instalación de SIMH
Como es habitual, vamos a usar SIMH para emular el PDP1. Dudo mucho que alguien tenga un PDP1 real, que se sepa, sólo quedan tres sistemas funcionales, y están en el CHM.
Instalar SIMH no tiene ningún problema, salvo que se necesita un directorio BIN y que se necesita enlazar con la libreria “librt”, que por defecto no viene con SIMH.
Es por ello que en vez de un paquete, bajaremos la última versión de SIMH, la compilaremos e instalarlemos en algún lugar que esté en nuestro PATH (por ejemplo /usr/local/bin, cambiar a gusto del consumidor).
Nota: No sólo instalamos el emulador del PDP1, sino la totalidad de emuladores, ya que podríamos hacer uso de ellos más adelante.
mkdir -p ~/emuladores/simh cd ~/emuladores/simh wget http://simh.trailing-edge.com/sources/simhv37-3.zip unzip simhv37-3.zip mkdir BIN mv makefile makefile.orig cat makefile.orig | sed s/c99/"c99 -lrt"/ > makefile make sudo cp BIN/* /usr/local/bin
Estos comandos bajaran la última version de SIMH, compilan los fuentes e instalan los binarios resultantes en /usr/local/bin .
NOTA: Bob Supknik, el autor de SIMH ha anunciado recientemente que va a sacar una nueva versión de SIMH, posiblemente en una semana (hoy es 9 de junio de 2008). La nueva version ya vendrá parcheada…
Con esto ya tendremos el emulador de la máquina PDP1 listo.
Descarga de los fuentes de Lisp1.5
Esta versión de Lisp está disponible como un paquete de software listo para funcionar en el emulador SIMH, así que lo único que tendremos que hacer es descargarlo en nuestro directorio de trabajo y descomprimirlo:
mkdir -p ~/emuladores/pdp1-lisp cd ~/emuladores/pdp1-lisp wget http://simh.trailing-edge.com/kits/lispswre.zip unzip lispswre.zip
En el paquete viene el código fuente del Lisp, el fichero .mac, así como una imagen lista para cargar en el emulador. Me parece más interesante ensamblar el código y crear esa imagen nosotros mismos, ya que viene un ensablador cruzado en el paquete. Tan sólo tenemos que compilar previamente el ensamblador:
rm lisp.rim cc macro1.c -o macro1 ./macro1 lisp.mac
Ejecución de Lisp en la máquina PDP1
Antes de poder usar el emulador con la imagen de Lisp, hay que seguir unos pasos previos, lanzamos el emulador…
pdp1 PDP-1 simulator V3.7-2 sim>
Y tecleamos las secuencias… (tecleamos lo que está en negrita):
set cpu mdv load lisp.rim deposit extm_init 1 run HALT INSTRUCTION, PC: 002353 (CLA LAT CLI) deposit tw 7777 cont HALT INSTRUCTION, PC: 002357 (CLA LAT) deposit tw 400 cont HALT INSTRUCTION, PC: 000005 (STF5) deposit ss 2 save lisp.sav cont
En el momento que tecleemos el ultimo cont, ya estamos el el bucle read-eval, con lo cual ya le podemos pasar expresiones ..
(car (quote (a b c d))) --- detras del ultimo parentesis pulsar espacio a (cdr (quote (a b c d))) (b c d) oblist (d c b a atom car cdr cond cons eq gensym greaterp list minus n umberp stop prin1 quotient rplaca rplacd terpri prog return go s etq sassoc plus times logand logor xeq loc null quote lambda apv al subr expr fsubr fexpr t oblist read eval print nil) (rplaca (quote (nil x y)) (quote (a b))) ((a b) x y)
Para salir del emulador solo hay que pulsar ^e y luego teclear exit:
oblist (atom car cdr cond cons eq gensym greaterp list minus numberp s top prin1 quotient rplaca rplacd terpri prog return go setq sass oc plus times logand logor xeq loc null quote lambda apval subr expr fsubr fexpr t oblist read eval print nil) ^e Simulation stopped, PC: 001133 (SZS5) sim> exit Goodbye paco@linux:~/emuladores/pdp1-lisp$
Para que la próxima vez que queramos jugar con Lisp no haya que teclear la parte de la configuración, podemos aprovechar que hicimos una imagen en lisp.sav, así que únicamente tendremos que restaurarla. Además, se puede automatizar la carga de los parámetros, usando el fichero pdp1.ini:
cat > pdp1.ini restore lisp.sav cont -- tecleamos ^Z paco@linux:~/emuladores/pdp1-lisp$ pdp1 PDP-1 simulator V3.7-2 oblist (atom car cdr cond cons eq gensym greaterp list minus numberp s top prin1 quotient rplaca rplacd terpri prog return go setq sass oc plus times logand logor xeq loc null quote lambda apval subr expr fsubr fexpr t oblist read eval print nil)
Funciones del PDP1 Lisp
- atom
- car
- cdr
- cond x y
- CONS x y
- eq x y
- eval x
- gensym
- greaterp x y
- go
- list
- loc x
- logand x y
- logor x y
- minus x
- null x
- numberp x
- plus x y
- prin1 x
- prog
- quote
- quotient x y
- read
- return
- rplaca
- rplacd
- sassoc
- setq
- stop x
- terpri
- times x y
- xeq c a i
Objetos
- oblist
- nil
- t
- expr
- subr
- fexpr
- fsubr
- apval
Enlaces de interés