En la programación de computadora, una máquina del p-código del o la máquina del pseudo-code del es una especificación de una CPU cuyas instrucciones se esperen ser ejecutados en software algo que en el hardware (IE, interpretado ). Este término se aplica genéricamente a todas tales especificaciones, aunque muchas especificaciones creen su propio nombre (e., el Java utiliza el Octeto-código ), y a las especificaciones particulares (el ser más famoso p-código del UCSD Pascal ).
Aunque el concepto primero fuera ejecutado como O-código para BCPL, circa 1966, el p-código del término primero apareciera en la escena a principios de los años 70. Dos puestas en práctica tempranas de los recopiladores que generaban p-código eran el recopilador de Pascal-p en 1973, por Nori, Ammann, Jensen, Hageli, y Jacobi, y el recopilador de PASCAL en 1975, al lado de Niklaus Wirth .
Los programas que han sido p-código traducido son ejecutados ( interpretado ) por un programa informático que emule al comportamiento de la especificación de la CPU. Si hay suficiente interés comercial una puesta en práctica de hardware de la especificación puede ser construida (e., el Pascal MicroEngine ).
para rápidamente conseguir un recopilador en servicio. La generación del código automático es una de las partes más complicadas de escribir un recopilador. Por la comparación, la generación de p-código es mucho más fácil.
Apremios del tamaño del
. Puesto que el p-código se basa en una máquina virtual ideal, muchas veces el p-código resultante es mucho más pequeño que el mismo programa traducido al código automático.
para los propósitos de depuración. Puesto que se interpreta el p-código, el intérprete puede aplicar muchos cheques runtime adicionales que sean más duros de ejecutar con código nativo.
Algunos artículos de Niklaus Wirth mencionan la mañana - cifrar la variante para el Modula-2 del sucesor de Pascal.
El sistema operativo (BOS) del negocio de los años 80 era un sistema operativo de la cruz-plataforma diseñado para funcionar con exclusivamente programas basados p-código.
El p-Sistema del UCSD era un sistema operativo independiente de la máquina portable basado en p-código.
Algunas instrucciones simples:
Insn. Descripción del apilado del apilado antes después el adi i1 i2 i1+i2 agrega dos números enteros el efecto negativo del medicamento r1 r2 r1+r2 agrega dos reals división del número entero del dvi i1 i2 i1/i2 calidad de miembro determinada del mesón i1 S1 b1; b1 = si i1 es un miembro del S1 constante entera de la carga del ldci i1 i1 movimiento de los movimientos a1 a2 no negación boleana de b1 ~b1
a la tapa del apilado (el puntero de pila ). marca el principio del bastidor de apilado activo (el indicador del capítulo).
El EP señala a la localización más alta del apilado usada en el proceso actual.
También el presente es un área constante, y, debajo de ese, el montón que crece abajo hacia el apilado. NP coloca puntos a la tapa (dirección lo más bajo posible usada) del montón. Cuando el EP consigue mayor que NP, se agota la memoria de la máquina.
El quinto registro, PC, puntos en la instrucción actual en el área de código.
EP - > apilado local SP - >… locals … parámetros … remite (PC anterior) EP anterior acoplamiento dinámico (P. anterior) acoplamiento estático (P. del procedimiento circundante) P. - > valor de vuelta de la función
La secuencia de llamada del procedimiento trabaja como sigue: La llamada se introduce con mst n donde el n especifica la diferencia en niveles de imbricación (recordar que Pascal apoya procedimientos jerarquizados). Esta instrucción la marca del el apilado, es decir reservará las primeras cinco células del bastidor de apilado antedicho, e inicializa el EP anterior, dinámico, y el acoplamiento estático. El llamador después computa y empuja cualquier parámetro para el procedimiento, y entonces ediciones taza n, p para llamar un procedimiento del usuario ( n que es el número de parámetros, p la dirección del procedimiento). Esto ahorrará la PC en la célula del remite, y fijó la dirección del procedimiento como la nueva PC.
Los procedimientos del usuario comienzan con las dos instrucciones 1 ent, i 2 ent, j El primer fija el SP a P. + el i, el EP de los sistemas del segundo a SP + el j . El i esencialmente especifica tan el espacio reservado para los locals (más el número de parámetros más 5), y el j da el número de entradas necesarias localmente para el apilado. El agotamiento de la memoria se comprueba a este punto.
La vuelta al llamador es realizada vía retC con el C dando el tipo de vuelta (i, r, c, b, a como arriba, y p para ninguÌn valor de vuelta). El valor de vuelta tiene que ser almacenado en la célula apropiada previamente. En todos los tipos excepto p, la vuelta dejará este valor en el apilado.
En vez de llamar un procedimiento del usuario (taza), el q del procedimiento estándar se puede llamar con csp q Estos procedimientos estándar son procedimientos de Pascal como el readln del () (" rln" del csp;), pecado del () (" sin" del csp;), el eof () del etc. es peculiar una instrucción del p-Código en lugar de otro.
Éste es el código para la máquina:
comenzar el writeln (“comienzo pl/0”); t: = 0; b: = 1; p: = 0; s: = 0; s: = 0; s: = 0; repetición i: = código; p: = p + 1; conmigo hago caso f de encendido: comenzar t: = t + 1; s: = un extremo; opr: encajonar a de {el operador} 0: comenzar {vuelta} t: = b - 1; p: = s + 3; b: = s + 2; extremo; 1: s: = - s; 2: comenzar t: = T-1; s: = s + s + 1 extremo; 3: comenzar t: = T-1; s: = s - s + 1 extremo; 4: comenzar t: = T-1; s: = s * s + 1 extremo; 5: comenzar t: = T-1; s: = s div s + 1 extremo; 6: s: = ord ( 8: comenzar t: = T-1; s: = ord (s = s + 1) extremo; 9: comenzar t: = T-1; s: = ord (<> de s s + 1) extremo; 10: comenzar t: = T-1; s: = ord (s < s + 1) extremo; 11: comenzar t: = T-1; s: = ord (>= de s s + 1) extremo; 12: comenzar t: = T-1; s: = ord (s > s + 1) extremo; 13: comenzar t: = T-1; s: = ord (<= de s s + 1) extremo; extremo; lod: comenzar t: = t + 1; s: = s + un extremo; sto: comenzar s: = s; ;; t: = extremo T-1; caloría: comenzar {generar la nueva marca de bloque} s + 1: = base (l); s + 2: = b; s + 3: = p; b: = t + 1; p: = a extremo; internacional: t: = t + a; jmp: p: = a; jpc: comenzar si s = 0 entonces p: = a; t: = extremo T-1 extremo {con, caso} hasta p = 0; escribir (“extremo pl/0”); extremo {interpretar}; el procedimiento interpreta; el const stacksize = 500; var p, b, t: número entero; {el programa, base, topstack-se coloca} i: instrucción; {registro de instrucción} s: arsenal del número entero; {datastore} base de la función (l: número entero): número entero; var b1: número entero; comenzar b1: = b; {hallazgo l bajo nivelaciones por abajo} mientras que hace l > 0 comenzar b1: = s; l: = l - 1 extremo; base: = b1 extremo {base};
Esta máquina fue utilizada para funcionar el PL/0 de Wirth, que era un recopilador del subconjunto de Pascal usado para enseñar al desarrollo del recopilador.
.
| Random links: | Ludolf von Alvensleben | De Op. Sys. de vals. 64, No. 2 (Chopin) | Síntesis convergente | Matt Treanor | Caja del principio fijada - El CD escoge la colección del principio |