Практикум «Оптимизирующие компиляторы» (на примере GCC) (1157417), страница 18
Текст из файла (страница 18)
Lex.l%{ /* -*- c -*- = mode for emacs editor/*VMK lexical analysis*/#include#include#include#include#include<stdio.h><memory.h>"ansidecl.h""config.h""system.h"/* Avoid poisoned malloc problem.#undef IN_GCC*/#include "config.h"#include "diagnostic.h"#include "tree.h"/* Token defs.
*/#include "vmk.h"#include "parse.h"%}%%constant{unarybinary {ternary {function{is{yylval.ival = 0; return ARG_NUMBER; }{ yylval.ival = 1; return ARG_NUMBER; }yylval.ival = 2; return ARG_NUMBER; }yylval.ival = 3; return ARG_NUMBER; }return FUNCTION; }return IS; }firstly { return FIRST; }first{ yylval.ival = 0; return PARAM; }second { yylval.ival = 1; return PARAM; }third{ yylval.ival = 2; return PARAM; }zeroonetwothreefourfivesixseven{ yylval.ival = 0; return ZERO_NUMBER; }{ yylval.ival = 1; return SIMPLE_NUMBER; }{ yylval.ival = 2; return SIMPLE_NUMBER; }{ yylval.ival = 3; return SIMPLE_NUMBER;{ yylval.ival = 4; return SIMPLE_NUMBER;{ yylval.ival = 5; return SIMPLE_NUMBER;{ yylval.ival = 6; return SIMPLE_NUMBER; }{ yylval.ival = 7; return SIMPLE_NUMBER;}}}}Практикум «оптимизирующие компиляторы»eightnine{ yylval.ival = 8; return SIMPLE_NUMBER; }{ yylval.ival = 9; return SIMPLE_NUMBER; }ten{eleven {twelve {thirteen{fourteen{fifteen {sixteen {seventeeneighteen{nineteen{twentythirtyfourtyfiftysixtyseventyeightyninety{ yylval.ival = 20; return COMPOSITE_NUMBER; }{ yylval.ival = 30; return COMPOSITE_NUMBER; }{ yylval.ival = 40; return COMPOSITE_NUMBER; }{ yylval.ival = 50; return COMPOSITE_NUMBER; }{ yylval.ival = 60; return COMPOSITE_NUMBER; }{ yylval.ival = 70; return COMPOSITE_NUMBER; }{ yylval.ival = 80; return COMPOSITE_NUMBER; }{ yylval.ival = 90; return COMPOSITE_NUMBER; }hundred {andthenargument{arg{plusminusmuldivyylval.ival = 10; return TENS_NUMBER; }yylval.ival = 11; return TENS_NUMBER; }yylval.ival = 12; return TENS_NUMBER; }yylval.ival = 13; return TENS_NUMBER; }yylval.ival = 14; return TENS_NUMBER; }yylval.ival = 15; return TENS_NUMBER; }yylval.ival = 16; return TENS_NUMBER; }{ yylval.ival = 17; return TENS_NUMBER; }yylval.ival = 18; return TENS_NUMBER; }yylval.ival = 19; return TENS_NUMBER; }return HUNDRED; }{ return AND; }{ return THEN; }return ARGUMENT; }return ARGUMENT; }{ return PLUS; }{ return MINUS; }{ return MUL; }{ return DIV; }[0-9]+ { yylval.ival = atoi( yytext ); return NUM; }[a-zA-Z]+ { yylval.name = yytext; return NAME; }[ \n];.
{ return yytext[0]; }%%int yywrap(){return 1;}Практикум «оптимизирующие компиляторы»Приложение Ж. parce.y/* Grammer file for compiler for toy language.%{#include#include#include#include#include*/"stdio.h""config.h""system.h""tree.h""vmk.h"void yyerror (const char *error_message ATTRIBUTE_UNUSED);int yylex(void);%}%union {tree exp;int ival;char *name;}/* Tree node representing value. *//* Integer value for constant or arg *//* Name of function */%token_table%token <ival> NUM/* Decimal constant. */%token <name> NAME/* Function name. */%token PLUS/* Plus operator */%token MINUS/* Minus operator */%token MUL/* Multiple operator */%token DIV/* Divide operator */%token FIRST%token THEN/* Digits */%token <ival> ZERO_NUMBER%token <ival> SIMPLE_NUMBER%token <ival> TENS_NUMBER%token <ival> COMPOSITE_NUMBER%token HUNDRED%token AND%token%token%token%token%token<ival> ARG_NUMBER<ival> PARAMFUNCTIONISARGUMENT%left MINUS PLUS%left MUL DIVПрактикум «оптимизирующие компиляторы»%type <exp> exp fndef%type <ival> number complex arg_num before_h hundreds%type <name> fname;%expect 0%%input: /* empty */| input func| error ;func:fndef IS exp ';' { build_function ($1, $3); } ;fndef: arg_num FUNCTION fname { $$ = build_function_decl ( $3,$1); } ;arg_num: ARG_NUMBER$1; };{ printf("Arg number: %d\n",$1); $$ =fname: NAME$1; };{ printf("Func name: %s\n",$1); $$ =exp: number{ $$ = build_int_2 ($1, $1 >= 0 ? 0 : -1); }| PARAM{ $$ = get_arg_decl ($1); }| exp PLUS exp {$$ = build (PLUS_EXPR, integer_type_node,$1, $3);}| exp MINUS exp{$$ = build (MINUS_EXPR, integer_type_node, $1,$3);}| exp MUL exp { $$ = build (MULT_EXPR, integer_type_node,$1, $3); }| exp DIV exp {$$=build (TRUNC_DIV_EXPR, integer_type_node,$1,$3); }| FIRST exp THEN { $$ = $2; }| '(' exp ')'{ $$ = $2; }| error{ $$ = error_mark_node; } ;number:{ $$ = 0; }|ZERO_NUMBER { $$ = $1; }|before_h{ $$ = $1; }|hundreds{ $$ = $1; };before_h:||SIMPLE_NUMBERTENS_NUMBERcomplex{ $$ = $1; }{ $$ = $1; }{ $$ = $1; };Практикум «оптимизирующие компиляторы»complex: COMPOSITE_NUMBER| COMPOSITE_NUMBER SIMPLE_NUMBER{ $$ = $1; }{ $$ = $1 + $2; };hundreds: before_h HUNDRED| before_h HUNDRED AND before_h| before_h HUNDRED before_h%%{ $$ = $1 * 100; }{ $$ = $1 * 100 + $4; }{ $$ = $1 * 100 + $3; };Практикум «оптимизирующие компиляторы»Лабораторный практикумКданномуметодическомупособиюприлагаютсяматериалыдляпроведения лабораторного проактикума по следующим разделам:• разработка нового компилятора переднего плана (front end’а);• примеры для изучения работы оптимизатора;• пример описания архитектуры.Исходныекодыwww.roman.nnov.ruпримеровирекомендациидоступнынасайтеПрактикум «оптимизирующие компиляторы»Рекомендуемая литература1.
А. Ахо, Р. Сети, Дж. Ульман, «Компиляторы: принципы, технологии иинструменты», М., «Вильямс», 2001.2. Воеводин В. В. Отображение проблем вычислительной математики наархитектуру вычислительных систем. // Вычислительные методы ипрограммирование, 2000.– Т. 1.– с. 73 - 44.3.
Воеводин Вл.В., Капитонова А.П. Методы описания и классификациивычислительных систем.–М.: Издательство МГУ.– 1994.– 380 с.4. Евстигнеев В. А. Некоторые особенности программного обеспеченияЭВМ с длинным командным словом. // Программирование. – 1991.–№2.– с.69-80.5. Евстигнеев В. А. Применение теории графов в программировании. // Подред.
А. П. Ершова.– М.:Наука. Гл. ред. физ.-мат- лит., 1985.– 352 с.6. Евстигнеев В. А., Касьянов В. Н. Оптимизирующие преобразования враспараллеливающих компиляторах. // Программирование.– 1996.– №6.– с. 12-26.7. Евстигнеев В. А., Касьянов В. Н. Сводимые графы и граф-модели впрограммировании.– Новосибирск: Издательство ИДМИ, 1999.– 288 с.8. Евстигнеев В. А., Серебряков В. А. Методы межпроцедурного анализа(обзор). // Программирование, 1992.– № 3.– с. 4-15.9. Ершов А. П.
Введение в теоретическое программирование (беседы ометоде).– М.: Гл. ред. физ.-мат. лит. изд-ва "Наука".– 1977.– 288 с.10. Касьянов В. Н. Оптимизирующие преобразования программ.– М. –Наука. Гл. ред. физ.-мат. лит., 1988.– 366 с.Практикум «оптимизирующие компиляторы»11. КасьяновВ.Н.Средстваподдержкипримененияграфоввпрограммировании. // Проблемы программирования.– 2000.– №1-2.– с.286-300.12. Касьянов В. Н., Поттосин И.
В. Методы построения трансляторов. –Новосибирск.– Наука, 1986.– 344 с.13. Кузнецов О.П., Адельсон-Вельский Г.М. Дискретная математика дляинженера.– М.: Энергия, 1980.– 344 с.14. Т. Пратт, М. Зелковиц, «Языки программирования: разработка иреализация», СПб.: Питер, 200215. Скворцов С. В. Оптимизация кода для суперскалярных процессоров сиспользованием дизъюнктивных графов.
// Программирование.– 1996,№ 2.– с. 41-52.16. ФранцузовЮ.А.Обзорметодовраспараллеливаниякодаипрограммной конвейеризации. // Программирование.– 1992.– №3.– с.16-30.17. Французов Ю. А. Планирование потока команд с отложеннымраспределением регистров. // Программирование.– 1991, № 1.– с. 58-66.18. Фути К., Судзуки Н. Языки программирования и схемотехника БИС. –М.: Мир.– 1988.– 224 с.19. Шпаковский Г.
И. Метод планирования трасс и архитектура ЭВМ сосверхдлинной командой // ЗРЭ.– 1991.– N 11.– с. 10-27.20. Шпаковский Г. И. Организация параллельных ЭВМ и суперскалярныхпроцессоров. – Мн.: Белгосуниверситет, 1996. – 284 с., ил.21. Allan V., Jones R., Lee R., Allan S. Software Pipelining. // ACM ComputingSurveys.– vol. 27, no. 3.– September 1995.– 90 p.Практикум «оптимизирующие компиляторы»22.
Aho A. V., Sethi R., Ullman J. D. Compilers: Principles, Techniques andTools.– Reading, Mass: Addison-Wesley.– 500 p.– 1986. ISBN 0-20110088-6.23. Bacon D. F., Graham S. L., Sharp O. J. Compiler transformations for highperformance computing // ACM Computing Surveys.– 1994. V. 26. № 4.–PP. 345-420.24. Bala V., Rubin N. Efficient Instruction Scheduling Using Finite StateAutomata. // In Proc. of IEEE Micro-28, 1995. P. 46-56.25.
Bashford S. Code Generation Techniques for Irregular Architectures // Tech.Rep. 596, Universitat Dortmund.– November 1995.– 120 p.26. Beaty S. List Scheduling: Alone, with Foresight, and with Lookahead. // InConf. on Massively Parallel Computing System: the Challenges of GeneralPurpose and Special Purpose Computing. – Ischia, Italy.– May 1994.– p.246-253.27. Briggs P.
Register Allocation via Graph Coloring. // PhD thesis. RiceUniversity, Houston, Texas.– April 1992.– 143 p.28. Case B. Philips Hope to Displace DSPs with VLIW. // MicroprocessorReport, 8(16).– 5 Dec. 1994.– p. 12-15.29. Chen G., Smith M. Global Instruction Scheduling on Machine SUIF // InWorkshop on Interaction between Compilers and Computer Architecture,High Performance Computer Architecture.– N 3.– Feb.
1997.– p. 176-187.30. Ebcioglu K., Altman E. R. DAISY: Dynamic Compilation for 100%Architectural Compatibility. // In Proc. of 24th Intern. Symposium onComputer Architecture (ISCA).– June, 1997.– p. 26–37.31. Ebcioglu K., Nakatani T. A New Compilation Technique for ParallelizingLoops with Unpredictable Branches on a VLIW Architecture. // InПрактикум «оптимизирующие компиляторы»Languages and Compilers for Parallel Computer.– MIT Press, Cambridge,MA, 1990.– p. 213-229.32. Fauth A., Praet J. V., Freericks M.