当前位置:首页 » 编程语言 » c语言解释器源码
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言解释器源码

发布时间: 2023-01-15 04:00:51

① 当我是 白痴 好了,什么是c语言的解释器

解释器(英语:Interpreter),又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行
预编译器的不同在于它逐行解释运行,与解释执行语言如python相似

② 随便给我一个编程代码带意思谢谢

main()
{
int i,j,k;
printf(" ");
for(i=1;i<5;i++)/*以下为三重循环*/
for(j=1;j<5;j++)
for (k=1;k<5;k++)
{
if (i!=k&&i!=j&&j!=k) /*确保i、j、k三位互不相同*/
printf("%d,%d,%d ",i,j,k);
}
}

③ 先用c语言编写程序源代码然后通过解释器解释执行对吗

先用c语言编写程序源代码然后通过解释器解释执行不对。解释程序是将源程序(如BASIC)作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。

④ 求解释代码,有关用c语言写一个简单的shell解释器的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
#define CMD_LINE 1024
#define PIPE_MAX 16
#define ARG_MAX 10
typedef struct {
char *arg[ARG_MAX];
char *in;
char *out;
} cmd_t;
extern int parse_token(char *buf, cmd_t cmd[]);
extern int parse(char *buf, cmd_t * cmd);
extern int test_parse(cmd_t cmd[], int len);
int main(int argc, char *argv[])
{
char buf[CMD_LINE];
cmd_t cmd[PIPE_MAX + 1];
int fd[PIPE_MAX][2];
int j, i;
int cmd_len, pipe_len;
pid_t pid;
while (1) {
printf("my_shell#"); //打印提示符

fgets(buf, CMD_LINE, stdin); //获得输入
buf[strlen(buf) - 1] = '' //去掉结尾的换行符?
cmd_len = parse_token(buf, cmd);//解析命令
pipe_len = cmd_len - 1; //
if (pipe_len > PIPE_MAX)
continue;
for (i = 0; i < pipe_len; ++i)
pipe(fd[i]); //创建pipe_len个管道
for (i = 0; i < cmd_len; ++i) //创建cmd_len个进程
if ((pid = fork()) == 0) //判断是否为子进程
break; //如果是子进程,跳出for循环
if (pid == 0) { //循环中是子进程代码
if (pipe_len) {
if (i == 0) { //第一个子进程
close(fd[i][0]); //关闭管道的读取端
p2(fd[i][1], 1); //复制管理的写入端为标准输出(标准输出会写入管道)
close(fd[i][1]); //关闭管道的写入端
for (j = 1; j < pipe_len; ++j)
close(fd[j][0]), //关闭无关进程的管道
close(fd[j][1]);
} else if (i == pipe_len) { //第pipe_len个子进程
close(fd[i - 1][1]); //关闭管道的写入端
p2(fd[i - 1][0], 0); //复制管理的读取端为标准输出(标准输入会读取管道)
close(fd[i - 1][0]); //关闭管道的读取端
for (j = 0; j < pipe_len - 1; ++j)
close(fd[j][0]), //关闭无关进程的管道
close(fd[j][1]);
} else { //其他子进程
p2(fd[i - 1][0], 0); //复制管理的读取端为标准输出(标准输入会读取管道)
close(fd[i][0]); //关闭管道的读取端
p2(fd[i][1], 1); //复制管理的写入端为标准输出(标准输出会写入管道)
close(fd[i][1]); //关闭管道的写入端
for (j = 0; j < pipe_len; ++j) {
if ((j != i - 1) //关闭无关进程的管道
|| (j != i))
close(fd[j][0]),
close(fd[j]
[1]);
}
}
}
if (cmd[i].in) { //如果需要,打开输入文件并重定向
int fd = open(cmd[i].in, O_RDONLY);
p2(fd, STDIN_FILENO);
close(fd);
}
if (cmd[i].out) { //如果需要,打开输出文件并重定向
int fd =
open(cmd[i].out,
O_RDWR | O_CREAT | O_TRUNC, 0644);
p2(fd, STDOUT_FILENO);
close(fd);
}
execvp(cmd[i].arg[0], cmd[i].arg); //执行当前命令
fprintf(stderr, "Failed exec "); //执行命令失败后才会执行之后的代码
exit(127);
} //子进程代码结束
/* parent */
for (i = 0; i < pipe_len; ++i)
close(fd[i][0]), close(fd[i][1]);
for (i = 0; i < cmd_len; ++i)
wait(NULL); //等待子进程结束
}
return 0;
}
int parse_token(char *buf, cmd_t cmd[])
{
int n = 0;
#if 1
char *save_p;
char *p = strtok_r(buf, "|", &save_p);//以'|'分割命令将分割后的第一部分给p
while (p != NULL) {
parse(p, &cmd[n++]);
p = strtok_r(NULL, "|", &save_p);//将之后的部分给p,每次给一部分,每调用一次给下一部分
}
#else //下一块语句不被执行
cmd[n].arg[0] = "ls";
cmd[n].arg[1] = "-l";
cmd[n].arg[2] = NULL;
#endif
return n;
}
int test_parse(cmd_t cmd[], int len) //此函数未被调用
{
int i;
for (i = 0; i < len; ++i) {
printf("cmd[%d]:", i);
int j = 0;
while (cmd[i].arg[j])
printf(" %s", cmd[i].arg[j++]);
if (cmd[i].in)
printf(" in:%s", cmd[i].in);
if (cmd[i].out)
printf(" out:%s", cmd[i].out);
printf(" ");
}
return 0;
}
int parse(char *buf, cmd_t * cmd)
{
int i = 0;
cmd->in = NULL;
cmd->out = NULL;
char *p = strtok(buf, " ");//以空格分割命令(此时命令已被|分割过了)
while (p) {
if (*p == '<') { //如果命令以<开头,即需要做输入重定向
if (*(p + 1)) //这种情况是<后无空格直接跟文件名
cmd->in = p + 1;
else //这种情况是<后有空格
cmd->in = strtok(NULL, " ");
} else if (*p == '>') { //如果命令以>开头,即需要做输出重定向
if (*(p + 1)) //这种情况是>后无空格直接跟文件名
cmd->out = p + 1;
else //这种情况是>后有空格
cmd->out = strtok(NULL, " ");
} else
cmd->arg[i++] = p; //这种情况是正常命令或参数
p = strtok(NULL, " ");
}
cmd->arg[i] = NULL;
return 0;
}

⑤ c语言写脚本解释器

记录大括号!!!
遇到if则判断语句,接下来,然后假设判断式成立,执行if紧跟着的语句,把大括号括起来的当成一个语句,执行下去,如果没有else的话就继续,有else的话跳过else所包含的范围.

⑥ 谁帮我使用C语言编写一个JavaScript脚本解释器急求

这个比价麻烦1)
JS 语法,至少表达式,变量要有。
2)HTML

document.write
需要写在HTML对应的位置。

⑦ C语言采用解释方式将源程序转换为二进制的目标代码吗

不是,C语言采用编译方式将源程序转换为二进制的目标代码。使用C语言编译器来完成。

所谓C语言编译器,就是把编程得到的文件,比如.c,.h的文件,进行读取,并对内容进行分析,按照C语言的规则,将其转换成cpu可以执行的二进制文件。其本质在于对文件的读入,分析,及处理。

C语言编写的程序代码称为源程序,对于计算机本身来说,它并不能直接识别由高级语言编写的程序。C语言程序经C语言编译程序编译后,生成后缀为.obj的二进制文件(称为目标文件)。

此.obj文件必须与系统提供的各种库函数连接起来生成一个后缀为.exe的可执行文件才可以执行。C语言的可执行文件由一系列机器指令构成的。

(7)c语言解释器源码扩展阅读

解释执行和编译执行是计算机语言的执行方式。解释执行由解释器现场解释执行,不生成目标程序。如BASIC便是解释执行,一般解释执行效率较低,低于编译执行。

编译执行由编译程序将目标代码一次性编译成目标程序,再由机器运行目标程序。如:PASCAL,C,C++,delphi等语言。效率高于解释执行。

⑧ 如何用C语言实现C的解释器

将C语言翻译成“汇编”塞到内存里,然后用“虚拟机”来跑这段汇编。

因此我们需要的东西是:

一个虚拟机:用来跑下面这种汇编。

一种汇编:用来描述原来的C语言。

一个“翻译器”:将C语言翻译成上面这种汇编。