Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
ExBuf[ptr] := 123;movzx eax,w,[000454770]
mov b,[eax][00040476F],07B ptr := 12;mov w,[000454770],0000Cyuriy.nasretdinov$ time sh compile-run.sh
?
real 0m0.922s
user 0m0.853s
sys 0m0.041s
>+>+>+>+>++<[>[<+++>-
>>>>>
>+>+>+>+>++<[>[<+++>-
>>>>>
>+>+>+>+>++<[>[<+++>-
>>>>>
>+>+>+>+>++<[>[<+++>-
>>>>>
+++[->+++++<]>[-]<
<<<<<
]<<]>[-]
<<<<<
]<<]>[-]
<<<<<
]<<]>[-]
<<<<<
]<<]>.gcc -o bfc bfc.c && ./bfc test.bf test && ./test
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char *argv[])
{
if(argc == 1)
{
printf("Usage: %s input_file [out_file]\n", argv[0]);
return -1;
}
char *inp_file = argv[1], *out_file = "a.out.c";
if(argc >= 3)
{
out_file = (char*)malloc(strlen(argv[2]) + 3);
strcpy(out_file, argv[2]);
strcat(out_file, ".c");
}
FILE *fp = NULL;
if(!strcmp(inp_file,"-")) fp = stdin;
else fp = fopen(inp_file, "rb");
if(!fp)
{
perror("Could not open input file");
return -2;
}
FILE *out_fp = fopen(out_file, "wb");
if(!out_fp)
{
perror("Could not create/open output file");
return -3;
}
const char *write_str = "";
#define HEAD "#include <stdio.h>\n#include <stdlib.h>\nint main(void) { int *p = (int*)malloc(100000*sizeof(int)); "
#define FOOT "}"
fwrite(HEAD, sizeof(HEAD)-1, 1, out_fp);
while(!feof(fp))
{
switch(fgetc(fp))
{
case '>': write_str = "++p;"; break;
case '<': write_str = "--p;"; break;
case '+': write_str = "++(*p);"; break;
case '-': write_str = "--(*p);"; break;
case '.': write_str = "putchar(*p);"; break;
case ',': write_str = "*p = getchar();"; break;
case '[': write_str = "while (*p) {"; break;
case ']': write_str = "}"; break;
default: write_str = ""; break;
}
fwrite(write_str, strlen(write_str), 1, out_fp);
fputc('\n', out_fp);
}
fwrite(FOOT, sizeof(FOOT)-1, 1, out_fp);
fclose(out_fp);
char *real_out_file = strdup(out_file);
real_out_file[ strlen(real_out_file) - 2 ] = 0; // cut last .c
char *const cc_argv[] = { "cc", "-O3" ,"-o", real_out_file, out_file, NULL };
int pid = fork();
if(pid == 0)
{
execvp("cc", cc_argv);
}
int status = 0;
wait(&status);
unlink(out_file);
if(status == 0)
{
}else
{
printf("Compile failed\n");
return -4;
}
return 0;
}
Предлагаю небольшой тест: берите написанный вами интерпретатор, и запускайте вот этот не хитрый кодДля интереса запустил на моём оптимизирующем трансляторе в PHP. 5,5 минут.
$in=array(103, 114, 102, 103, $id = 0);
$d = array_fill(-65535, 65535, $di = 0);
++$di;
$d[$di++]++;
$d[$di++]++;
$d[$di++]++;
$d[$di]++;
$d[$di+1]+=2;
while ($d[$di])
{
++$di;
while ($d[$di])
{
$d[$di-1]+=3;
$d[$di]--;
$di+=6;
$d[$di++]++;
$d[$di++]++;
$d[$di++]++;
$d[$di]++;
$d[$di+1]+=2;
while ($d[$di])
{
++$di;
while ($d[$di])
{
$d[$di-1]+=3;
$d[$di]--;
$di+=6;
$d[$di++]++;
$d[$di++]++;
$d[$di++]++;
$d[$di]++;
$d[$di+1]+=2;
while ($d[$di])
{
++$di;
while ($d[$di])
{
$d[$di-1]+=3;
$d[$di]--;
$di+=6;
$d[$di++]++;
$d[$di++]++;
$d[$di++]++;
$d[$di]++;
$d[$di+1]+=2;
while ($d[$di])
{
++$di;
while ($d[$di])
{
$d[$di-1]+=3;
$d[$di]--;
$d[$di+=5]+=3;
$d[$di+1]+=$d[$di]*5;
$d[$di]=0;
$d[++$di]=0;
$di-=6;
}
$di-=2;
}
$d[++$di]=0;
$di-=5;
}
$di-=2;
}
$d[++$di]=0;
$di-=5;
}
$di-=2;
}
$d[++$di]=0;
$di-=5;
}
$di-=2;
}
++$di;
flush(print chr($d[$di]));
Немного о JIT-компиляции или пишем оптимизированный интерпретатор Brainfuck