2012-10-08 13 views
29

En this talk, Chuck Moore (el creador de Forth) hace que algunos, reclamaciones de barrido muy llamativos, como por ejemplo:Ejemplos de aplicaciones Forth muy concisas?

  1. "Todas las aplicaciones que he visto que no lo hice código tiene diez veces más código en , ya que necesita "
  2. 'Acerca de un millar de instrucciones parece correcto para mí hacer cualquier cosa'
  3. " Si está escribiendo código que necesita [variables locales] está escribiendo código no óptima. no utilice variables locales ".

Estoy tratando de averiguar si el Sr. Moore es a) un genio absolutamente brillante o b) un chiflado. Pero esa es una pregunta subjetiva, y no estoy buscando la respuesta a esa pregunta aquí. Lo que estoy buscando son ejemplos de problemas complejos del mundo real que se pueden resolver en "1000 instrucciones o menos" usando Forth y el código fuente que demuestra cómo hacerlo. Un ejemplo que muestre solo una pieza no trivial de un sistema del mundo real estaría bien, pero no muestras de código "de juguete" que podrían duplicarse en 5 o 10 líneas de otro lenguaje de alto nivel, por favor.

Si ha escrito sistemas del mundo real en Forth, utilizando solo una pequeña cantidad de código fuente, pero no está en libertad de mostrar la fuente (porque es de propiedad exclusiva), me gustaría saber de eso. .

+3

He visto una serie de preguntas cerradas donde se argumenta que sollicits debates donde, de hecho, la pregunta se pregunta sobre ejemplos o experiencias del mundo real. ¿Qué es subjetivo, discutible o provocador de discusiones si presento un ensamblador completo de Pentium II en 90 líneas? –

+1

@AlbertvanderHorst Absolutamente. Esto es lo peor de SO. –

Respuesta

29

Y Debes entender que Chuck Moore es un poco diferente que tú y yo. Fue entrenado en una era en la que las computadoras centrales consistían en 16   KB o su equivalente en la memoria del núcleo, y pudo hacer bastantes cosas con las computadoras de la época. Tal vez el mayor éxito de Forth, aparte de su paquete de diseño de chips OKAD-II (no es un error tipográfico), fue un sistema Forth multi-usuario multiusuario responsable de controlar al mismo tiempo los instrumentos de adquisición de datos y el software de análisis/visualización de datos en NRAO en un computadora de tamaño bastante modesto apenas capaz de compilar Fortran código fuente por sí mismo.

Lo que él llama una "aplicación", podríamos considerar como un "componente" de una cosa más grande y más nebulosa llamada aplicación. En términos más generales, es bueno tener en cuenta que una "aplicación" de Moore es más o menos equivalente a una "vista" en una tríada MVC en la actualidad. Para mantener el consumo de memoria pequeño, confía en las superposiciones y en las técnicas de compilación justo a tiempo. Cuando se cambia de una interfaz de programa a otra, generalmente implica recompilar toda la aplicación/vista desde la fuente. Esto sucede tan rápido que no sabes que está sucediendo. Algo así como la forma en que Android recompila el código Dalvik al código nativo ARM cuando activa una aplicación cada vez que lo hace hoy.

En cualquier momento dado, OKAD-II no tiene más de 2.5   KB de código cargado en memoria y ejecutándose. Sin embargo, la fuente en disco para OKAD-II es considerablemente mayor que 2.5   KB. Sin embargo, todavía es significativamente más compacto que su competidor más cercano, SPICE.

A menudo tengo curiosidad acerca de las opiniones de Chuck Moore y encuentro que su interminable esfuerzo por la simplicidad es fascinante. Entonces, en la moda MythBusters, puse a prueba sus afirmaciones tratando de diseñar mi propio sistema de la forma más mínima posible. Me complace informar que está muy cerca de sus afirmaciones, tanto en cuestiones de hardware como de software. Por ejemplo, durante la reunión del Silicon Valley Forth Interest Group (SVFIG) del pasado septiembre, utilicé mi propio Kestrel-2 para generar videos para el mazo de diapositivas. Esto requirió que escribiera un programa de presentación de diapositivas para él, que tomó 4   KB de memoria para el código, y 4   KB para las estructuras de datos del mazo de diapositivas.Con un espacio promedio de seis bytes por palabra de Forth (por razones que no entraré aquí), la estimación de "aproximadamente 1000 (Forth) instrucciones" para la aplicación es casi puntual para lo que Chuck Moore estima sus propias "aplicaciones" " ser.

Si le interesa hablar con los codificadores Forth del mundo real (o lo han hecho en el pasado, como parece serlo cada vez más), y está en el Bay Area, el Grupo de interés de Silicon Valley Forth todavía se reúne cada cuarto sábado del mes, a excepción de noviembre y diciembre, que es el tercer sábado. Si está interesado en asistir a una reunión, aunque solo sea para entrevistar a los codificadores de Forth y obtener una idea de lo que es el "mundo real" Forth, visítenos en meetup.com y acompañe. También actualizamos nuestras reuniones en YouTube, pero no somos muy buenos en eso. Estamos abusando de hardware y software inapropiado para hacer nuestra oferta, ya que tenemos un presupuesto de cero para este tipo de cosas. :)

6

Un ejemplo de cómo puede ser Forth compacta, es screencast de Samuel Falvo Over the Shoulder 1 - Text Preprocessing in Forth (1h 06 min 25 seg, 101   MB, formato MPEG-1 - al menos VLC puede reproducirlo). Alternative source ("Enlaces y recursos" -> "Videos").

+5

He vuelto a utilizar parte del código en ese video en un proyecto posterior, en el que escribí un motor de blog en (32 bits solamente) Adelante. El código resultante es en realidad aún más compacto, ya que pude volver a utilizar algunos otros aspectos del blog. El expansor de macro se encuentra aquí: https://bitbucket.org/kc5tja/unsuitable/src/8739e927fee7/share/unsuitable/response.fs?at=default uso típico es aquí: https: // bitbucket .org/kc5tja/unsuitable/src/8739e927fee7102757d9ceffdb57899367481d4b/share/unsuitable/m-rss.fs? at = default –

25

¡Forth es realmente increíblemente compacto! Las palabras sin parámetros formales (e instrucciones de operando cero en el hardware, por ejemplo, GA144) ahorran mucho. El otro contribuidor principal a su compacidad es la factorización absolutamente implacable del código redundante que ofrece la convención de llamadas y la naturaleza concatenativa.

No sé si se califica como un ejemplo no juguete, pero la implementación Turtle Graphics para la Fignition (en FigForth) está a sólo 307 bytes compilado y cabe en un solo bloque fuente! Esto incluye el punto fijo trigonométrico y todos los comandos normales de tortuga. Este no es el mejor ejemplo de Forth legible debido tratando de meterlo en un solo bloque de origen con los nombres de un solo carácter y tal:

\ 8.8 fixed point sine table lookup 
-2 var n F9F2 , E9DD , CEBD , AA95 , 7F67 , 4E34 , 1A c, 
: s abs 3C mod dup 1D > if 3C swap - then dup E > if 
    -1 1E rot - else 1 swap then n + [email protected] 1+ * ; 

0 var x 0 var y 0 var a 
0 var q 0 var w 
: c 9380 C80 0 fill ; \ clear screen 
: k >r 50 + 8 << r> ! ; 
: m dup q @ * x +! w @ * y +! ; \ move n-pixels (without drawing) 
: g y k x k ; \ go to x,y coord 
: h dup a ! dup s w ! 2D + s q ! ; \ heading 
: f >r q @ x @ y @ w @ r 0 do >r r + >r over + \ forward n-pixels 
    dup 8 >> r 8 >> plot r> r> loop o y ! x ! o r> o ; 
: e key 0 vmode cls ; \ end 
: b 1 vmode 1 pen c 0 0 g 0 h ; \ begin 
: t a @ + h ; \ turn n-degrees 

Su uso es extremadamente concisa también.

: sin 160 0 do i i s 4/80 + plot loop ; 

Sine

: burst 60 0 do 0 0 g i h 110 f loop ; 

Burst

: squiral -50 50 g 20 0 do 100 f 21 t loop ; 

Squiral

: circle 60 0 do 4 f 1 t loop ; 
: spiral 15 0 do circle 4 t loop ; 

Spiral

: star 5 0 do 80 f 24 t loop ; 
: stars 3 0 do star 20 t loop ; 

Stars

: rose 0 50 0 do 2 + dup f 14 t loop ; 

Rose

: hp 15 0 do 5 f 1 t loop 15 0 do 2 f -1 t loop ; 
: petal hp 30 t hp 30 t ; 
: flower 15 0 do petal 4 t loop ; 

Flower

(enchufe el blog descarada: http://blogs.msdn.com/b/ashleyf/archive/2012/02/18/turtle-graphics-on-the-fignition.aspx)

+4

Para obtener un verdadero sabor del código Forth loco y conciso, ¡eche un vistazo al código de Chuck Moore! Descargue las herramientas GreenArrays (http://www.greenarraychips.com/home/support/download-02a.html) y busque examinar los bloques fuente (en su editor o en el archivo EVB001-02a.html). – AshleyF

7

Las definiciones del ensamblador polyFORTH/32 VAX/VMS de Forth Inc tomaron unos 8 bloques de fuente. Un ensamblador VAX, en 8K de fuente. Comentado. Todavía estoy sorprendido, 30 años después.

No puedo verificarlo en este momento, pero supongo que el recuento de instrucciones para analizar esas definiciones de CÓDIGO estaría en los cientos más bajos. Y cuando dije 'tomé unos 8 bloques', todavía toma, la aplicación que usa ese núcleo está en vivo y en producción, 30 años después.

+1

Si desea ver un ensamblador igualmente compacto para el Pentium_I más familiar (incluidos el código de 16 bits, coma flotante, byte de sib, modos de direccionamiento, prefijos), consulte el ensamblador integrado para ciforth. Es una versión compacta de los ciasdis bien documentados. Intel es barocco e irregular, aún así está limitado a 15 pantallas.http: //home.hccnet.nl/a.w.m.van.der.horst/ciforth.html –

+1

@AlbertvanderHorst Nice. Y por amable, quiero decir increíble. Con LOCATE no menos. Y con el archivo ci86.lina64.s (que construyó lina, limpio, primero intenté por cierto) sé dónde pasaré mi tiempo de lectura esta noche. Bien hecho, Albert. Gracias por el aviso. –

12

Lo que no se entiende bien en la actualidad es la forma en Forth prevé una aproximación a la codificación que se hizo popular a principios del siglo 21 en asociación con agile methods. Específicamente:

  • Forth introdujo la noción de pequeña codificación método - el uso de objetos pequeños con métodos pequeños. Puede hacer un caso para Smalltalk y Lisp aquí también, pero a fines de la década de 1980 tanto la práctica de Smalltalk como la de Lisp tendían a métodos más grandes y complejos. Forth siempre adoptó métodos muy pequeños, aunque solo sea porque alentaba a hacer mucho en la pila.

  • Forth, incluso más que Lisp, popularizó la noción de que el intérprete era solo un pequeño patrón de software, no un ladrillo del tamaño de una disertación. ¿Tienes un problema que es difícil de codificar? La solución Forth tenía que significaba "escribir un poco de lenguaje", porque así era la programación de Forth.

Forth fue en gran medida producto de las limitaciones de memoria y tiempo, de una era en la que los ordenadores eran increíblemente pequeña y terriblemente lento. Fue un hermoso diseño que le permite construir un sistema operativo y un compilador en una caja de fósforos.

Cuestiones relacionadas