用c语言编写一个汇编编译器,【提问】最早的汇编语言编译器如何诞生?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

查了资料,如下

汇编。这真的是最早最早的。准确的来说,这和编译器的开发有关,不用说太细,很麻烦怕你不懂。你现在假设第一个编译器是用会变写出来的,它的功能很简单,就是解释简单一种类似于C语言的高级语言,但是这种所谓的高级语言还没有完全拥有C语言的所有特性。只有比较简单核心功能,比如能把文本文件的高级语言转换成机器代码并且执行。有了这个原型之后,就可以用这个编译器来解释简单C程序,就可以用C重写编写一个新的编译器,这样就有更多的C的功能。于是,从此之后就用现有的编译器解释更复杂的语言,用更复杂的语言写出更好的编译器,然后不断这样迭代。这确实是编译器的演变。然后最后一个问题就是当一个新的CPU发明过后,怎么办,需要重写又从汇编开始写编译器吗?答案是不用。假设你有一个CPU A执行一些代码,你用汇编写了一个基础的C编译器,然后用C写出了更复杂的编译器,接受更复杂的C功能,然后不断循环演化。现在你有了CPU B,CPU B和CPU A执行两套完全不同的代码,那如何让CPU B的机器也可以变异C语言呢?因为现在A上面已经可以运行非常复杂的C语言程序了,所以你可以在A上面开发一个编译器把C语言程序转化为CPU B的执行代码。然后用这个程序,直接编译你的C语言编译器,再把这个程序转换到有B命令集的电脑上面,这样你就开发出了B电脑需要的C语言编译器。所以除非你真的是活在非常早起的人类。否在现在的编译器基本上都利用这种原理直接编译已经用C语言或者其它高级语言写好的代码来产生新的编译器就行了。理论上可以只使用C语言来开发C的编译器,不过处于一些历史原因和底层效率等因素的考量,部分代码还是使用汇编来实现的。我举得不过是一个例子,不一定是真实的C语言编译的进化,何况有这么多不同的C语言编译器,每一个的发展历史都有小的不同。但是基本上都是利用了这种编译器编译新的编译器的思想来实现了。而这样回溯回去,最早的编译器只能使用汇编来些。而其实最早的汇编语言的编译器就只能使用机器语言来写了。不过都是先处理简单的转换任务,有了这个核心功能过后,就可以写程序转换更复杂的语法。然后越来越复杂。就有了各种各样的高级语言编译器了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Bison是一个生成器,用于自动生成语法分析器。在使用Bison创建编译器时,我们需要定义语法规则,然后生成语法分析器,再将其与词法分析器结合起来,最终生成编译器。 以下是一个使用Bison将类C语言编写汇编语言的示例: 1.定义语法规则 我们需要定义类C语言的语法规则,这里只列举一部分示例: ``` program: statement_list statement_list: statement | statement_list statement statement: expression_statement | if_statement | while_statement | return_statement expression_statement: expression ';' expression: assignment_expression assignment_expression: unary_expression | assignment_expression assignment_operator unary_expression unary_expression: postfix_expression | unary_operator unary_expression postfix_expression: primary_expression | postfix_expression '[' expression ']' | postfix_expression '(' argument_expression_list ')' | postfix_expression '.' identifier | postfix_expression '->' identifier | postfix_expression '++' | postfix_expression '--' primary_expression: identifier | constant | string | '(' expression ')' ``` 2.生成语法分析器 使用以下命令生成语法分析器: ``` bison -d grammar.y ``` 这将生成一个名为`grammar.tab.c`的C文件和一个名为`grammar.tab.h`的头文件。 3.编写词法分析器 词法分析器用于将代码分解为单词(token)。这里只列举一部分示例: ```c %{ #include "grammar.tab.h" %} %% "if" { return IF; } "else" { return ELSE; } "while" { return WHILE; } "return" { return RETURN; } "int" { return INT; } "char" { return CHAR; } "void" { return VOID; } "(" { return LPAREN; } ")" { return RPAREN; } "{" { return LBRACE; } "}" { return RBRACE; } ";" { return SEMICOLON; } "," { return COMMA; } "+" { return PLUS; } "-" { return MINUS; } "*" { return MULTIPLY; } "/" { return DIVIDE; } "=" { return ASSIGN; } "==" { return EQUAL; } "!=" { return NOT_EQUAL; } "<" { return LESS_THAN; } "<=" { return LESS_THAN_OR_EQUAL; } ">" { return GREATER_THAN; } ">=" { return GREATER_THAN_OR_EQUAL; } "++" { return INCREMENT; } "--" { return DECREMENT; } "[" { return LBRACKET; } "]" { return RBRACKET; } "#" { return HASH; } "include" { return INCLUDE; } "define" { return DEFINE; } "undef" { return UNDEF; } "ifdef" { return IFDEF; } "ifndef" { return IFNDEF; } "endif" { return ENDIF; } "error" { return ERROR; } [0-9]+ { yylval.intval = atoi(yytext); return INT_CONSTANT; } "'"[a-zA-Z]"'" { yylval.charval = yytext[1]; return CHAR_CONSTANT; } [a-zA-Z][a-zA-Z0-9]* { yylval.identifier = strdup(yytext); return IDENTIFIER; } "//" { return COMMENT; } "/*" { return COMMENT_OPEN; } "*/" { return COMMENT_CLOSE; } [ \t\n]+ { /* ignore whitespace */ } . { printf("Unrecognized character: %s\n", yytext); } %% int yywrap() { return 1; } ``` 4.编写汇编代码生成函数 根据语法规则和词法分析器,我们可以编写一个汇编代码生成函数,将类C语言代码转换为汇编代码。以下是一个示例: ```c #include "grammar.tab.h" void generate_assembly_code(char* filename) { FILE* fp = fopen(filename, "w"); // 生成汇编代码 fprintf(fp, ".data\n"); fprintf(fp, "message db 'Hello, world!', 0\n"); fprintf(fp, ".text\n"); fprintf(fp, "global _start\n"); fprintf(fp, "_start:\n"); fprintf(fp, "mov eax, 4\n"); fprintf(fp, "mov ebx, 1\n"); fprintf(fp, "mov ecx, message\n"); fprintf(fp, "mov edx, 13\n"); fprintf(fp, "int 0x80\n"); fprintf(fp, "mov eax, 1\n"); fprintf(fp, "xor ebx, ebx\n"); fprintf(fp, "int 0x80\n"); fclose(fp); } void yyerror(char* s) { printf("Error: %s\n", s); } int main() { yyparse(); generate_assembly_code("output.asm"); return 0; } ``` 以上示例仅用于演示如何使用Bison创建编译器,实际情况下需要根据具体需求编写语法规则、词法分析器和汇编代码生成函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值