在公司做编译器的进来
1 我想问一下,做编译器的公司,一般面试会问些什么问题,要据体点,不要说什么优化,查找表设计,这太泛了。
2 在中间代码生成之前可以做那些优化?
谢谢!!
[解决办法]
不会,友情up
[解决办法]
菜鸟帮顶
[解决办法]
我没有做过,但是在编译器上研究过,我想,至少正则表达式是绝对不能少的。可能会涉及扫lex和yacc吧,其他的就不知道了
[解决办法]
哎,C++之父的教诲为什么这么少人知道呢?
做COMPILER,不要用LEX/YACC
[解决办法]
个人观点:
c/c++基础一定要好,要有比较强的数据结构和算法分析能力 .
yacc/lex 知道一些吧 ,也不用太多,公司也不一定就用这个,
编译原理知道一些,把书复习一下吧,最好自己写过小型编译器,一般大学课程里 会有的.
计算机基础扎实一些吧.如果是unix 下面可能还会用到一些脚本. 有unix/linux 经验
[解决办法]
lex yacc 肯定要会, 虽然真正编译器有可能不会用.
龙虎鲸最好要看看
[解决办法]
偶前不久刚写好个 正则文法和LL1文法的预处理器( 就调用下flex&&bison ), 现在酱紫写代码, 呵呵
#include <stdio.h>
#include <stdlib.h>
#include <x4c/xlexer/xlexer.h>
int x_calc_lex( char**_input , double* lval );
int x_calc ( char* _input , double* result );
typedef double YYSTYPE;
//#define XLALR1_DESTROY_YYSTYPE( __msg__ , __type__ , __var__ )
//#define YY_VERBOSE_TRACE( __arg__ ) printf __arg__
#define XLALR1_LEXER_INPUT( lval ) x_calc_lex( &_input , &lval )
#define YY_FATAL_ERROR( __arg__ ) printf __arg__
#define YY_ERROR( __msg__ ) do { printf( "error : %s\n " , __msg__ ); } while(0);
#include "x_calc_gen_lalr1.inl " /* auto generate by xlalr1 */
/*@
XLALR1_BEGIN file= "x_calc_gen_lalr1.inl "
%start expr ;
%token CONSTANT TKERROR;
%left '+ ' '- ' ;
%left '* ' '/ ' ;
%%
@*/
enum {
X_CALC_RULES_BEGIN = 1 ,
/*@XLALR1@
expr : BEXPR ;
@*/
X_EXPR ,
/*@XLALR1@
PEXPR : CONSTANT | '( ' BEXPR ') ' | '+ ' PEXPR | '- ' PEXPR ;
@*/
X_PEXPR_CONSTANT ,
X_PEXPR_BRCK ,
X_PEXPR_PLUS ,
X_PEXPR_MUNUS ,
/*@XLALR1@
BEXPR : PEXPR | BEXPR '+ ' BEXPR | BEXPR '- ' BEXPR | BEXPR '* ' BEXPR | BEXPR '/ ' BEXPR ;
@*/
X_BEXPR_PEXPR ,
X_BEXPR_ADD ,
X_BEXPR_SUB ,
X_BEXPR_MUL ,
X_BEXPR_DIV ,
X_CALC_RULES_END
};
/*@
XLALR1_END()
@*/
int x_calc( char* _input , double* result )
{
XLALR1_COMMON_PARSER_BEGIN();
XLALR1_CASE( X_EXPR )
*result = YYRVAR(1) ;
break;
XLALR1_CASE( X_PEXPR_CONSTANT )
break;
XLALR1_CASE( X_PEXPR_BRCK )
YYVAL = YYRVAR(2);
break;
XLALR1_CASE( X_PEXPR_PLUS )
YYVAL = YYRVAR(1);
break;
XLALR1_CASE( X_PEXPR_MUNUS )
YYVAL = - YYRVAR(1);
break;
XLALR1_CASE( X_BEXPR_PEXPR )
break;
XLALR1_CASE( X_BEXPR_ADD )
YYVAL = YYRVAR(3) + YYRVAR(1);
break;
XLALR1_CASE( X_BEXPR_SUB )
YYVAL = YYRVAR(3) - YYRVAR(1);
break;
XLALR1_CASE( X_BEXPR_MUL )
YYVAL = YYRVAR(3) * YYRVAR(1);
break;
XLALR1_CASE( X_BEXPR_DIV )
YYVAL = YYRVAR(3) / YYRVAR(1);
break;
XLALR1_COMMON_PARSER_END();
}
int main()
{
char expr_line[64*1024+1];
while( gets( expr_line ) )
{
double result = 0.;
int r = x_calc( expr_line , &result );
if( r )
fprintf( stderr , "x_calc failed : %d\n " , r );
else
printf ( "%s = %lg\n " , expr_line , result );
}
return 0;
}
int x_calc_lex( char**_input , double* lval )
{
#include "x_calc_gen_state.inl " /* auto generate by xlexer */
/*@
XLEXER_BEGIN file= "x_calc_gen_state.inl "
DEC_INT_LIT[0-9]+
EXP_PART[eE][\+-]*{DEC_INT_LIT}
FLT_L1{DEC_INT_LIT}\.?
FLT_L2{DEC_INT_LIT}\.{DEC_INT_LIT}
FLT_L3\.{DEC_INT_LIT}
FLT_L4({FLT_L1}|{FLT_L2}|{FLT_L3}|{DEC_INT_LIT}){EXP_PART}
FLT_LITERAL{FLT_L1}|{FLT_L2}|{FLT_L3}|{FLT_L4}
VALID_SYM [\+\-\*\/\(\)]
WS [[:space:]]+
COMMENT \/\*([^\*]|\*[^/]|\n|\r)*\*\/
%%
@*/
enum {
X_CALC_LEXER_ACTION_BEGIN ,
X_CALC_LEXER_CONSTANT , /*@ XLEXER_CASE {FLT_LITERAL} @*/
X_CALC_LEXER_SYMBOL , /*@ XLEXER_CASE {VALID_SYM} @*/
X_CALC_LEXER_SPACE , /*@ XLEXER_CASE {WS} @*/
X_CALC_LEXER_COMMENT , /*@ XLEXER_CASE {COMMENT} @*/
X_CALC_LEXER_ACTION_END
};
/*@
XLEXER_END()
@*/
#define XLEXER_RETURN( r ) do { *_input = text; return r; } while(0)
char* text = *_input;
*lval = 0.;
while( text && *text )
{
char *last_ac = NULL , *YYTEXT = text ;
int curr = 1 , last_st = 0 , action;
XLEXER_FIND_NEXT_MATCH_0( curr , text , last_st , last_ac );
XLEXER_FIND_ACTION( action , curr , text , last_st , last_ac );
switch( action )
{
case X_CALC_LEXER_CONSTANT:
*lval = atof( YYTEXT );
XLEXER_RETURN( CONSTANT );
break;
case X_CALC_LEXER_SYMBOL:
XLEXER_RETURN( YYTEXT[0] );
break;
case X_CALC_LEXER_COMMENT:
case X_CALC_LEXER_SPACE:
break;
default:
XLEXER_RETURN( TKERROR );
}
}
return 0;
}
[解决办法]
1 我想主要这几类吧
编译优化
算法/数据结构
C/C++
计算机体系结构
2 优化基本上都在IL上做,所以生成IL之前基本不做优化
[解决办法]
universee(吾乃太极语言之父) ( ) 信誉:90 2007-9-20 18:06:05 得分: 0
哎,C++之父的教诲为什么这么少人知道呢?
做COMPILER,不要用LEX/YACC
==================
现在早就是flex/bison的天下了。
能把龙书,拿下就可以了吧