Uma pequena VM API.

1. Uma pequena VM API.

???
gokernel

(usa Linux Mint)

Enviado em 19/06/2014 - 10:18h


Sem que isso poderá ser útil para quem tem curiosidade em criar linguagens ou virtual machine:

arquivo ( vm.h ):
http://codepad.org/CtcVBOJ1

arquivo ( vm.c ) - A maquina Virtual:
http://codepad.org/7hr8U5pt

arquivo ( micro.c ) - A linguagem:
http://codepad.org/bRL5t7Gt

um pequeno exemplo:



int a = 10, i;

for (i = 0; i < 3; i++)
{
a = a * a;
print a;
}

i = a + 255;
print i;



Expressoes só está implementada ( *, + ) veja a funcao ( atom ) ...

Criei bem pequena para ajudar no aprendizado ...

Para testar a velocidade veja isso:
http://codepad.org/j9FWOpby


Críticas são bem-vindas !!!







  


2. Re: Uma pequena VM API.

???
gokernel

(usa Linux Mint)

Enviado em 21/06/2014 - 10:43h


Só atualizando com expressão e habilitada para utilizar qualquer C tipo ( exceto double ).

arquivo ( vm.h ):
http://codepad.org/cEgDhXoG

arquivo ( vm.c ):
http://codepad.org/9La37gzt


arquivo ( micro.c ):
http://codepad.org/2ttMZjsx

Um pequeno expressao como exemplo:



int a = 10, b = 20, c = 5, d = 3, i, value;

value = a * b + c * d;

print value;

for (i = 1; i < 10; i++)
{
a = a + 5 * 2;

print a;
}

a = 10;
value = a * (5 + 3);

print value;



Um exemplo usando float:



/*
**-------------------------------------------------------------------
**
** Add 2 float example:
**
** FILE:
** add_f.c
**
** COMPILE:
** gcc -c vm.c -O2 -Wall
** gcc add_f.c -o add_f vm.o -O2 -Wall
**
**-------------------------------------------------------------------
*/
#include "vm.h"

int main (int argc, char *argv[])
{
VM *vm;

if ((vm = vmNew()) != NULL) {

vmRun (NULL); // first set the *VM_table[]

vmGen (vm,OP_LOAD_F, (Value)(float)150.00); // INCREMENT sp++
vmGen (vm,OP_LOAD_F, (Value)(float)125.00); // INCREMENT sp++
vmGen (vm,OP_ADD_F, (Value)(long)0); // decrement sp--

// print the float value of sp[0] ( stack top )
//
vmGen (vm,OP_PRINT, (Value)(long)'f');

vmGen (vm,OP_HALT, (Value)(long)0);

vmRun (vm); //<<<<<<<<<< run here >>>>>>>>>>
}

return 0;
}






3. Re: Uma pequena VM API.

???
gokernel

(usa Linux Mint)

Enviado em 22/06/2014 - 07:46h

Olá Sam!

Sim vou/estou usando um baseado no exemplo do livro...

Essa expr() funciona somente com expressões com: * - ( ) ... lógico, falta implementar mais.

O que postei aqui foi somente para dar uma idéia de como fazer "uma linguagem" ... nao vou postar tudo para nao criar dependência ...

OBS: esqueci de colocar os créditos do expr() ...



4. Re: Uma pequena VM API.

???
gokernel

(usa Linux Mint)

Enviado em 23/06/2014 - 11:24h

Só atualizando com chamada de função ( callc ):

arquivo ( vm.h ):
http://codepad.org/Y4xTUxss

arquivo ( vm.c ):
http://codepad.org/VkAs0fZ2

arquivo ( micro.c ):
http://codepad.org/ywZAv8mc


Exemplo script usando chamada de funcao:
Na LIB(interna) existe somente 2 funcoes:
----------------------------------------
int soma_int (int a, int b);
float soma_float (float a, float b);
----------------------------------------



float f;
int i;

f = soma_float (100.00, 255.50);
print f;

i = soma_int (1500, 55);
print i;




Exemplo callc: VM API

/*
**-------------------------------------------------------------------
**
** Call a C function with 2 arguments:
**
** FILE:
** callc.c
**
** COMPILE:
** gcc -c vm.c -O2 -Wall
** gcc callc.c -o callc vm.o -O2 -Wall
**
**-------------------------------------------------------------------
*/
#include "vm.h"

#define NAME "soma_int"

int main (void)
{
VM *vm;
int i, v;

if ((vm = vmNew()) != NULL) {

v = 12345;

if ((i = vmFuncFind (NAME)) != -1) {

vmGen (vm, OP_ARG1, LONG(255)); // push argument 1: int
vmGen (vm, OP_ARG2, LONG(v)); // push argument 2: int
vmGen (vm, OP_CALLC, LONG(i)); // call a C function with 2 arguments

vmGen (vm, OP_HALT, LONG(0));

vmRun (vm);
}
else printf ("\nFunction not found: '%s'\n", NAME);
}

return 0;
}



Para mais detalhes veja a instrução ( op_callc: ):

OBS: os argumentos até o momento só funciona como static ( nao com variavel ) ... máximo argumentos 5 ... implementando ainda ...

T+.






5. Re: Uma pequena VM API.

???
gokernel

(usa Linux Mint)

Enviado em 24/06/2014 - 11:31h

Atualizando "final":

arquivo ( vm.h ):
http://codepad.org/dYNySQ0W

arquivo ( vm.c ):
http://codepad.org/jMthpGXw

arquivo ( micro.c ):
http://codepad.org/1f05H146

UM TINY VM MODELO ( tiny.c ):
http://codepad.org/puwt6MHW


Biblioteca C Interna:
--------------------------------
int hello (int a, int b);
int soma_int (int a, int b);
float soma_float (float a, float b);
void info (void);
void clocki (void);
void clocke (void);
--------------------------------

Um pequeno script para teste:


float f, value = 100.00, a = 255.50;
int i;

print value;

for(i=0;i<5;i++){
f = soma_float (value, a);
value = value + 0.77;
print f;
}

i = soma_int (1500, 55);
print i;

info();



----------------------------------------------------------------

Nota sobre o modelo(THREADED) de implementação da VM:

01 - Vantagem:

a - Velocidade:

O principal motivo de implementar esse modelo usando ( THREADED ) foi
para ganhar em velocidade, comparando ao modelo usando ( switch ):

USANDO THREADED PROCESSAMENTO PASSOS:
01: incrementa
02: pula para a instrucao

USANDO SWITCH PROCESSAMENTO PASSOS:
01: incrementa
02: compara
03: pula para a instrucao
04: pula para o inicio ... refazendo o loop


02 - Desvantagem:

a - Tamanho maior de cada instrução:

Usando o modelo ( THREADED ) cada instrucao consome 8 bytes:

Um exemplo THREADED somando 2 longs:
-------------------------------------
LOAD_L : 8 bytes
LOAD_L : 8 bytes
ADD_L : 8 bytes
= 24 bytes
-------------------------------------

Um exemplo usando (switch) somando 2 longs:
-------------------------------------
LOAD_L : 5 byte (1 byte da instrucao + 4 bytes do argumento LONG)
LOAD_L : 5 byte (1 byte da instrucao + 4 bytes do argumento LONG)
ADD_L : 1 byte (1 byte da instrucao)
= 11 bytes
-------------------------------------

----------------------------------------------------------------

NOTA FINAL:
Este tópico tem como objetivo de divulgar uma pequena API ...

Este código é de domínio público sem direito autoral ... então use como quiser e caso "use"( informe os créditos ) ...

Espero que este seja útil para alguem.

Críticas são bem-vindas !!! ...


POR (gokernel - gokernel@hotmail.com) - 24/06/2014 - 11:30
Francisco G. A.

OBS: Só informei o meu nome real para provar que este código é "meu" ... na faculdade ;)

T.







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts