當前位置:首頁 » 編程語言 » 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語言翻譯成上面這種匯編。