sábado, 23 de octubre de 2010

Los futuros computadores ecológicos.

En el mundo de la computación actual, los actuales computadores que corren en Internet no están optimizados para una amplia gama de aplicaciones que consumen los humanos.

Actualmente hay muchos computadores que son de 32 bits y otros que son de 64 bits. Hay algunos que son de 16 bits, 8 bits y otros raros que no voy a comentar aquí.

La pregunta que viene a continuación es, ¿está optimizada la política de uso de los computadores en el mundo?.

Me viene a sospechar que no está optimizada dicha política, y he venido a publicar este blog ofreciendoles un buen camino global para el mundo. Soy un ingeniero informático muy excepcional que me he tirado la vida estudiando, leyendo y escribiendo para conseguir un fin común de la humanidad.

Muchas compañias de silicio han estado compitiendo en el mercado vendiendo computadores de 32 bits y de 64 bits a los clientes finales. Pero muchos clientes no encuentran la satisfacción de esos computadores del mercado. Muchos se quejan de que los computadores son muy limitados a menos de 4 GiB de memoria física por motivos de unos diseños arquitecturales de los fabricantes. Los fabricantes han estado haciendo remaches y más remaches empeorando aún más la arquitectura final del sistema.

Dichos remaches no han hecho nada más que crear nuevos problemas para los desarrolladores del software con su ineptitud de crear malabarismos en el desarrollo de aplicaciones y además tales remaches causan caidas notables de rendimiento y peores latencias de transferencias de memorias.

Los fabricantes, sabiendo los problemas de los desarrolladores de aplicaciones, han impulsado en seguir adelante con un nuevo diseño de computadores de 64 bits junto con la arquitectura previa de 32 bits integrada.

Pero los desarrolladores se han quejado de que muchos computadores de 64 bits hacen que las aplicaciones chupan mucha memoria, más del 50% usado en promedio con respecto a aplicaciones equivalentes de 32 bits.

Y yo como soy un ingeniero muy inteligente, os publico la tecnología de mi diseño arquitectural de los futuros procesadores ecológicos que durarán para varios siglos con el fin de que los desarrolladores de aplicaciones no tengan que crear malabarismos y a la vez que permitan correr aplicaciones de muy alto nivel de forma muy eficientes.

El computador es un híbrido combinado de 32 bits y de 64 bits, pero siguiendo con una distribución gausiana de las aplicaciones que se corren en el mundo, se asignará un peso de 0.99 a los procesos de 32 bits, y un peso de 0.01 a los de 64 bits.

Es decir, la política óptima y correcta debería ser la más ecológica, es la que debe seguir existiendo masivamente procesos de 32 bits y escasos procesos de 64 bits en todo el globo terrestre, y nunca al revés hasta pasados futuros siglos.

Se asignará ejemplarmente un 95% del área de silicio (o de puertas lógicas) dedicado a la computación de 32 bits, y 5% o menos a la de 64 bits. El motivo es que las aplicaciones de 64 bits son de uso "muy raro" en la mayor parte del tiempo, y con el fin de aprovechar al máximo los escasos y caros recursos de silicio y de electricidad, se le da la mayor parte de su queso a aplicaciones de 32 bits, reservando una ínfima parte de dicho queso para poder ejecutar aplicaciones de 64 bits según la necesidad del usuario.

Las aplicaciones de 64 bits que se ejecutan "raramente" podrían ser ensayos experimentales de cálculo de modelos matemáticos de matrices gigantescas, o exploración del algoritmo de A* que avalancha toda la memoria del computador, o simulación científica de la meteorología, o una consulta a bases de datos gigantescas.

Los detalles del computador híbrido de 32 bits y de 64 bits son:
  • la unidad de la información será de una palabra de 32 bits en vez de un octeto de 8 bits (Ojo, para datos 32 bits, para código 8 bits). El formato de la dirección de código viene desplazada en 2 bits a la derecha con respecto al de datos.
  • los procesos no tienen modo dual de "bitness" sino que los mismos tendrán instrucciones de 32 bits y de 64 bits
  • los procesos de instrucciones 32 bits podrán direccionarse hasta 16 GiB de memoria virtual de espacio de usuario y 16 GiB de memoria virtual de espacio de kernel usando instrucciones extras de kernel para acceso a (y desde) memoria del kernel. Esto sería 16GiB+16GiB por proceso de instrucciones de 32 bits.
  • otra variante podria ser de asignar 15 GiB al espacio de usuario y 1 GiB al espacio de kernel usando un selector de chequeo de 4 bits (1 de 16) en el nible más significativo de la palabra de dirección de 32 bits, o 15.5 GiB de usuario y 0.5 GiB de kernel usando un selector de chequeo de 5 bits (1 de 32). Así se ahorra del no tener que añadir instrucciones extras de kernel.
  • los procesos de instrucciones de 64 bits podrán direccionar hasta 2^64 palabras de 32 bits o 2^63 palabras de 64 bits.
  • la capacidad de memoria física es ilimitada ¡eureka, nada de malabarismos!, podría ser de varios cientos de GiB de memoria física aunque los procesos de 32 bits sólo direccionan hasta 16 GiB de memoria virtual. Es objetivo común ejecutar varios procesos de 32 bits chupando 16 GiB de memorias virtuales usando cientos de GiB de memoria física.
  • en principio, el tipo de memoria dinámica que se usarán sería DDR3 o posterior, ya que la tensión de alimentación es de 1.5V, cuanto menos es, mejor será ya que menos electricidad se consumirá para más capacidad de memoria. La tendencia tecnológica de los voltajes es siempre hacia la baja para las futuras memorias de ahorro, similar a las bombillas de ahorro.
  • los módulos de memoria DDR3 o posteriores se instalarán en los 8 vientos del procesador (de 3x3 excepto centro), tanto arriba como abajo. En total habrán 16 áreas espaciales para instalar los módulos y deben estar muy pegados al procesador al milímetro para conseguir latencias extremadamente muy bajas, y anchos de bandas muy altos.
  • para instrucciones de 32 bits, se dispondrá un hardware dedicado de TLB y MMU de paginación de hasta 16 GiB + 16 GiB (o su variante) usando páginas de 16 KiB y sólo 2 niveles de paginación cuyo acceso se hará en hardware.
  • para instrucciones de 64 bits, sólo se dispondrá un hardware dedicado de TLB, pero no de MMU de paginación, usando las mismas páginas de 16 KiB. Si la dirección de 64 bits está dentro del rango de 16 GiB (es decir, el valor de la palabra alta de 32 bits de dirección está a 0) entonces se utilizará el hardware de 32 bits para acceder a la palabra de 32 bits o de 64 bits. Pero si la dirección de 64 bits está fuera del rango de 16 GiB (es decir, el valor de la palabra alta de 32 bits de dirección es distinto de 0) entonces se activará la excepción y se accederá por software a través del manejo de memoria del hipervisor. En realidad hay dos hipervisores, uno en el espacio de usuario y otro en el espacio de kernel. La razón de este doble hipervisor es que un doble cambio de contexto usuario->kernel y kernel->usuario es siempre más lento que saltar a la subrutina de manejo de la excepción y volver de ella sin salir del espacio de usuario. El principal requisito es que el proceso de instrucciones de 64 bits debe tener cargado una librería de subrutinas de excepciones para el hipervisor en el espacio de usuario para poder manejar las excepciones "rápidas".
  • una variante extra, para no ralentizar la paginación de 64 bits cuando se usan varios cientos de GiB de memoria virtual, podría ser añadiendo un tercer nivel de direccionamiento en el hardware, pero este añadido es el precio que se paga por añadir más silicio dedicado a la computación de 64 bits. Si se quisiera poner más niveles de direccionamiento en el hardware con menos silicio, mi recomendación sería que se aproveche el mismo demultiplexor en bucle en vez de varios demultiplexores replicados en pipeline, y quizás sea uno de los de 32 bits.
  • la palabra de traducción de dirección de página de ambos modos de "bitness" será de 64 bits en vez de 32 bits con el fin de poder direccionar cientos de GiB de memoria física, y los bits que sobran de dicha palabra podrán ser usados para atributos de control del sistema operativo como podrían ser los contadores de acceso de páginas.
  • la dirección de 32 bits se divide en 10 + 10 + 12 bits, y la de 64 bits en 32 + 10 + 10 + 12 bits sin contar el hardware añadido de tercer nivel. Los demultiplexadores serán pequeños, de 10 y 12 bits, pero los de 12 bits se pueden convertir a demultiplexadores de 10 bits junto con multiplexadores de 2 bits seleccionando 1 de 4 de palabras de 32 bits de 128 bits de la línea. Para el caso de 64 bits, si además de eso, también quiere acceder a palabra de 64 bits, sólo se necesitará un multiplexador de 1 bit seleccionando 1 de 2 de palabras de 64 bits de 128 bits de la línea. Usando sólo demultiplexadores de 10 bits (de 2^10 entradas) y no más, permitirán un acceso muy rápido de puertas de lógicas de silicio.
  • como los demultiplexadores de 10 bits sólo pueden direccionar 2^10 entradas, y las entradas de traducción de dirección son de 64 bits entonces sería un bloque de 8 KiB que no coincide con el marco de página de 16 KiB. No hay problema, un marco de página de 16 KiB puede contener 2 bloques de 8 KiB de indireccionamiento, y aunque a veces sólo se usa un bloque en el marco, el otro bloque consecutivo sin usar sería un hueco que podría ser ocupado posteriormente.
  • al ser un marco de página de 16 KiB grande, esto sería mejor para el TLB tener un mayor espacio de marcos reduciendo así la frecuencia de fallos de páginas.
  • nunca querré páginas grandes de varios MiB como los usados en los procesadores actuales ya que son un malabarismo que no sirve para nada, y además quitan inutilmente espacio en el chip de silicio para tales funcionalidades.
  • el tipo de autómata del computador es hibrido combinado y está basado en [1. pila y acumulador] y [2. banco de registros].
  • El sub-autómata de pila y acumulador servirá para que las instrucciones sean muy compactas, sin operandos, ocupan pocos bytes de código con el fin de aprovechar la localidad espacial y temporal de cachés muy pequeñas de código. Sus importantes registros serán Stack Pointer, Base Pointer (of Stack), Accumulator (que contendrá el valor del tope de pila apuntado por SP) y el Secondary Accumulator (que es el penúltimo de la pila, como segundo operando en muchas instrucciones de operaciones binarias que existen actualmente). Un cambio de SP implica un movimiento de valores de Accumulator y Secondary Accumulator a/desde búffer ventana interna de pila que será automatizado por el hardware de silicio.
  • El sub-autómata de banco de registros será de 16 registros y no más (32 registros ya es una presión inútil de más puertas lógicas de silicio en el núcleo), a saber que según la distribución gausiana, las subrutinas de muchas aplicaciones están muy conformes con tener un banco de 16 registros. De esos 16 registros, hay que descontarlos para los usados del sub-autómata de pila. No me interesa 32 ni más registros del banco porque muchas subrutinas de aplicaciones generalmente no llegan a usar 32 registros, y además, 32 registros significan que hay demasiada presión combinatoria de "registros renombrados" (Register Renaming) en el algoritmo Tomasulo en caso de ser implementado. Y tampoco quiero empeorar la latencia de cambio de contexto con un banco muy grande de registros.
  • la versión más económica y habitual sería un banco compartido de 16 registros de 32 bits y 8 registros de 64 bits. Como dije antes, lo de 64 bits se usa raramente, y en caso de usarse, será por necesidad del usuario.
  • los códigos para las instrucciones serán de clase CISC (en vez de RISC) aprovechando ventajas de una caché pequeña de código, y optimizados en función de la codificación Huffman y de la distribución gausiana de muchas aplicaciones óptimas, y van en unidades de 1 byte. Aunque el Instruction Pointer (IP) es de 32 bits (rara vez o no se usa el IP lento de 64 bits), el acceso a la instrucción es en unidades de bytes y no de palabras de 32-bit, eso significa que el rango de espacio de direcciones virtuales de código será de 4 GiB en vez de 16 GiB comúnmente usado para palabras de datos.
  • las cachés de L1 serán como mínimo 8 KiB de I y 16 KiB de D, pero lo típico sería el doble o el cuadruple para conseguir más rendimiento. Esta asimetría en los tamaños de I y de D se debe a que no querré saturar a una mayor magnitud de IPC (Instructions Per Clock) de cada línea de palabras que se carga desde la caché de I al núcleo. Por eso relajo un poco el IPC y le quito espacio de caché de I para dar más espacio a la caché de D con el fin de reducir la frecuencia de fallos de acceso a datos (que se circulan masivamente) aunque raramente crece la frecuencia de fallos de acceso a códigos (aunque sean muy compactos y en bucles que nos importan mucho, a pesar de la maldad o bondad del Inlining de código creado por compiladores optimizadores).
  • no voy a detallar cómo tienen que ser las cachés L2, L3 y L4, estas decisiones las tomarán los fabricantes. No hay muchos cambios en esta jerarquía de cachés con respecto a las actuales, pero sería buena idea tener un acceso exclusivo de cachés además de un probable acceso inclusivo de cachés.
  • debido a la distribución gausiana de las aplicaciones óptimas, las instrucciones de 32 bits son muy cortas y de latencias mínimas de CPU, pero las instrucciones de 64 bits (que habitualmente se usan poco en la mayor parte del tiempo de computación en el globo terrestre) serán generalmente largas, prefijadas con un byte de escape de control, y de latencias mayores de CPU (más ciclos de reloj por instrucción de CPU frente a los 32 bits).
  • Las ALUs (Arithmetic Logic Units) de 32 bits siempre son más pequeñas y rápidas que las de 64 bits. Más pequeñas implican menos puertas lógicas y menos área de silicio. Esto es un detalle muy importante a considerar cuando se diseña la arquitectura desde cero.
  • Las unidades de coma flotante siempre serán de 64 bits, no se reservará espacio de silicio para los de 32 bits porque es un espacio extra inútil de silicio. Habiendo de 64 bits, ¿para qué querer de 32 bits con el inconveniente de peor acuracia con respecto de 64 bits?. En la distribución gausiana, muchas aplicaciones se conforman con sólo usar reales de 64 bits salvo raras excepciones que necesitan precisiones mayores, de 128 bit o mas.
  • el banco de coma flotante será aparte y de 8 registros de 64 bits de reales. Es posible haber una variante de 16 registros de 64 bits de reales, pero no conozco mucho que se usa masivamente en las aplicaciones de computación numérica. Su autómata podría ser variado, de pila, de acceso directo al registro, o de movimiento circular de datos/resultados reales en el banco.
  • Tampoco se reservará espacio de silicio para los reales de 128 bits porque se asume, según la distribución gausiana, que del 99.99% del tiempo las aplicaciones han ejecutado instrucciones de cálculo de reales de 64 bits, y 0.01% del tiempo de 128 bits. Para no despilfarrar inútilmente el silicio, se recomendará el uso de emulación en software de operaciones de reales de 128 bits, 256 bits, o mas, mejor que en hardware. Tampoco está nada mal seguir así este principio.
  • con la evolución de los lenguajes de programación de muy alto nivel, se recomendaría mucho que se asociara a cada palabra de 32 bits un "tag" de 3 o 4 bits con el fin de hacer más eficiente la ejecución de programas desarrollados con dichos lenguajes de programación de muy alto nivel. Dicho "tag" sólo despilfarra un 9% o 11% de memoria, pero ofrece enormes ventajas de ejecución de programas de alto nivel que incluye capacidades de recolección de basura y chequeo de tipos. Deben haber instrucciones adicionales especiales para acceso eficiente de palabras tageadas en función de los valores de los tags. Aunque las palabras internamente son de 35 o 36 bits, las ALUs seguirán siendo de 32 bits y simuladamente de 64 bits.
Ya se ha detallado este computador ecológico del futuro, pero no está dedicado para aplicaciones que se ejecuten puramente de 64 bits (y ningún proceso de 32 bits) a la eficiencia extrema, aunque puede ejecutarlas a un rendimiento ejemplar del 33%. Por eso, debe tener su "computador hermano" aparte puro de 64 bits dedicado para aplicaciones puras de 64 bits, pero no hay mucha gente que usará mucho este tipo de computador.

En la balanza ejemplar, debe haber futuramente en el globo terrestre 99% de computadores ecológicos híbridos de 32 bits y 64 bits, y 1% de computadores hermanos puros de 64 bits.

Hace tiempo, había diseñado un precursor a éste como un computador abstracto para un intérprete y compilador de un lenguaje de programación de alto nivel que estaba desarrollando. Ahora coexisten juntos, este computador ecológico diseñado y mi intérprete-compilador de alto nivel. No tienen sentido irse por separado, los necesitan mutuamente.


Este diseño durará como mínimo siglos. No conozco un diseño ecológico mejor que el que he diseñado para los próximos siglos que se tenga en cuenta la distribución gausiana de las aplicaciones que corran sobre los computadores de dicho diseño.

En caso de que se salieran los computadores ecológicos de este diseño en el mercado entonces estaríamos contentos todos: los fabricantes, los desarrolladores de aplicaciones, los usuarios de tales computadores, los de Greenpeace, los políticos, la sociedad, la humanidad, etc.

Esta publicación ha sido redactada desde España para un mundo más ecológico y eficiente.

10 comentarios:

  1. * otra variante de traducción de direcciones: 1+10+10+11 de páginas de 8 KiB (en vez de 10+10+12 de páginas de 16 KiB) usando un doble registro rápido integrado en CPU (0..8GiB,8..16GiB) de tercer nivel de paginación con el fin de reducir la presión de selección de palabra de un offset interno del marco de página.

    ResponderEliminar
  2. * en vez de 16GiB+16GiB de user space y kernel space con la inconveniencia de instrucciones extras, se me ha ocurrido una simplificación usando una de estas opciones razonablemente prácticas:

    a) usando un AND (o NAND, OR o NOR, de lógica directa o invertida) de 5 bits:
    * 15.5 GiB user data + 0.5 GiB kernel data
    * 3.875 GiB user code + 0.125 GiB kernel code

    b) usando un AND (o NAND, OR o NOR, de lógica directa o invertida) de 6 bits:
    * 15.75 GiB user data + 0.25 GiB kernel data
    * 3.9375 GiB user code + 0.0625 GiB kernel code

    Así podré usar las mismas instrucciones de acceso a memoria para esta separación de espacios de memoria virtual de cada proceso.

    Como se ve, el espacio para código y datos de kernel es muy pequeño, ya lo sé, esto es normal ya que en muchos sistemas operativos, el kernel casi siempre ha sido pequeño tanto en el monolítico como en el microkernel.

    ResponderEliminar
  3. Las instrucciones CISC compactadas al nivel de bytes usando 8 KiB de caché L1 podría ser casi equivalente a instrucciones RISC al nivel de palabras de 32 bits usando 32 KiB de caché L1.

    Esto supone una gran mejora de eficiencia energética, de fabricación, de velocidad de acceso, de menor número de puertas lógicas de caché L1 y de menor área de de silicio.

    El pequeño inconveniente es que la generación de código compacto para una máquina basada en pila no es tarea sencilla, pero esto podría estar resuelto con el uso de un compilador optimizador de alto nivel.

    ResponderEliminar
  4. Sería una recomendación de que el procesador sea de clase "Big Endian" porque es un procesador optimizado, dedicado y orientado a redes, y probablemente a escala masiva.

    Muchos textos de RFCs de pilas TCP/IP, de IPv4, IPv6, y otros, explicitan sus formatos en "Big Endian" generalmente.

    La tendencia de muchos programadores es desarrollar aplicaciones de web para máquinas remotas más que desarrollar aplicaciones de GUI para máquinas pegadas directamente al usuario.

    También es posible desarrollar aplicaciones de GUI por web. Así que la filosofía de redes gana por goleada a las otras filosofías.

    ResponderEliminar
  5. Si en el caso de que faltaran más códigos de 1 byte para cada una de todas las instrucciones entonces se podrían utilizar bytes de escape de control como prefijos de instrucciones.

    O reducir el tamaño del banco de 16 registros a 8 registros.

    El formato de instrucción basado en banco de registros es generalmente de la forma dest <- dest op src. No es necesaria la forma dest <- src1 op src2 porque resulta que su instrucción sería larga, y con lo que hay de la anterior forma es suficiente.

    Y en cuanto a los acumuladores de pila, podrían ser 2 (Acc1, Acc2) o 3 (Acc1, Acc2, Acc3) con su movimiento automático equivalente al del tope de una pila.

    Los registros SP y BP estarán fuera del banco de registros porque generalmente no operan frecuentemente con los registros del banco.

    Los posibles casos de bancos podrían ser así:
    a) Acc1, Acc2, R1, R2, R3, R4, R5, R6.
    b) Acc1, Acc2, Acc3, R1, R2, R3, R4, R5.
    c) como a) con R7 .. R14 en banco de 16 registros accesibles directamente o a través de instrucciones prefijadas (depende del espacio disponible de códigos de instrucciones).
    d) como b) con R6 .. R13 igualmente.

    Un banco de 8 registros es más económico que de 16 registros, pero la elección depende de varios factores del diseño y de rendimiento.

    ResponderEliminar
  6. Se pueden construir prototipos experimentales de este diseño con una FPGA grande y cara, aunque no consiguen el mismo nivel de eficiencia de un microprocesador fabricado directamente en silicio a medida.

    ResponderEliminar
  7. La tendencia de este mismo prototipo de procesador ecológico es el aumento progresivo del número de núcleos (cores) sin necesidad de modificar el software de aplicaciones salvo el del kernel. Será un sistema SMP masivo de núcleos.

    Conforme aumenta el número de núcleos, aumentará el tamaño del bus, y por consiguiente, tendrá su malla de conexionado para conectarse con las amplias memorias dinámicas (DRAMs).

    El tamaño del bus viene limitado por la tecnología de fabricación, la física electromagnética, etc.

    Al final será un monstruo simple, de gran capacidad y muy ecológico para dicho propósito general.

    ResponderEliminar
  8. Los algoritmos de aplicaciones de compresión como Deflate/Deflate64 (usados en gzip y zip), rar, y lzma (usados en 7z) están orientados a bytes en vez de a palabras de 32 bits.

    Como no hay instrucciones de este procesador orientadas a bytes, se tendría que usar macros de varias instrucciones para simularlas equivalentemente, y sería un poco ineficiente.

    Por eso, se necesita añadir pocas instrucciones especializadas con acceso a memoria en unidades de 1 byte en vez de palabras 32 bits para sólo el propósito de rendir eficientemente las aplicaciones de compresión y descompresión de datos y de contenidos audiovisuales.

    El pequeño inconveniente es que el rango máximo de acceso a memoria de datos sería de 4 GiB en vez de 16 GiB, pero para estas aplicaciones multimedia, 4 GiB ya es más que suficiente, e incluso se puede transferir bloques de memoria de sobre 4 GiB con ciertos malabarismos de implementación en software que no son del todo ineficientes.

    Las instrucciones especializadas a escoger dependen de la implementación compacta en ensamblador de los algoritmos de Deflate, Deflate64, LZMA, rar, DCT, IDCT, JPEG, MPEG2, MPEG4, XviD, etc. que resultarán ser de uso mas común.

    ResponderEliminar
  9. El conjunto de instrucciones de este procesador todavía no es definitivo. Sólo falta intentar asimilarlo con el conjunto de instrucciones de la máquina virtual (VM) de Smalltalk que es un lenguaje orientado a objetos puro de herencia simple.

    La VM de Smalltalk más simple está basada en pila. Su pila contiene un apilamiento de contextos o marcos de pila que están enlazados entre sí, similar a las pilas de lenguajes variantes de Algol, Simula, Pascal, etc.

    En cada invocación de método, un nuevo contexto es creado como agregado en la pila, y consta (además de otras variables internas) principalmente de un número fijo de variables locales temporales y una pilita de trabajo (es una pila local en el interior de la misma pila para almacenar los datos transitorios de las operaciones de la VM).

    Antes comenté que el procesador constaba de un par (o trío) de registros basado en pila y unos cuantos registros del banco. Pues ahora consta de 3 partes en vez de 2:
    1. Par (o trío) de registros basado en pila que seguirá siendo válido para la pilita del contexto actual de la VM, y mismamente relativo al SP (Stack Pointer).
    2. Unos cuantos registros del banco.
    3. Unos cuantos registros simulados que son accedidos a la pila como argumentos y variables locales temporales del contexto actual de la VM cuyos desplazamientos son cortos, y relativos al BP (Base Pointer). Suponer que el rango maximo de desplazamiento es desde -128 hasta 127, aunque es comunmente habitual usar desde -16 hasta 15, o su variante similar e irregular -32 hasta 223. Los desplazamientos negativos son para acceder a argumentos de métodos, y los desplazamientos positivos son para acceder a variables locales temporales de métodos.

    Para la tercera parte, se necesitará añadir instrucciones especializadas.

    De esta forma, se conseguiría una ejecución eficiente de la VM de Smalltalk.

    He omitido una cuarta parte que es sobre el acceso indirecto de las variables locales temporales de los bloques que van entre corchetes de Smalltak. Creo que no se necesita una cuarta parte en silicio porque se puede hacerla simulada usando las ya existentes instrucciones de las 3 partes.

    ResponderEliminar
  10. Será definitivamente "Big Endian".

    Sería probable que se añadiera unas pequeñas modificaciones basadas en la investigación de la máquina virtual de Scheme, sobre todo en lo referente a "call/cc" ("call with continuations") que tiene que manejar pilas infinitas.

    ResponderEliminar