欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      編譯程序和解釋程序[精選多篇]

      時(shí)間:2019-05-14 17:37:13下載本文作者:會(huì)員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《編譯程序和解釋程序》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《編譯程序和解釋程序》。

      第一篇:編譯程序和解釋程序

      編譯程序和解釋程序

      如果一個(gè)程序能夠把某一種語言程序(稱為源語言程序)改造成為另一種語言程序(稱為目標(biāo)語言程序),則這親戚的程序稱為“翻譯程序”。如果源語言是“高級(jí)語言”(諸如FORTRAN、PASCAL等等),而目標(biāo)語言是“低級(jí)語言”(如匯編語言或機(jī)器語言),則這樣的翻譯程序稱為“編譯程序”。

      現(xiàn)在的計(jì)算機(jī)尚不能直接執(zhí)行高級(jí)語言程序。執(zhí)行一個(gè)高級(jí)語言程序大體上要分兩步:第一步,把高級(jí)語言的源程序編譯成低級(jí)語言的目標(biāo)程序;第二步,運(yùn)行這個(gè)目標(biāo)程序。編譯程序的典型工作過程是:輸入源程序,對它進(jìn)行加工處理,輸出目標(biāo)程序。加工處理是非常復(fù)雜的過程,它又可劃分成以下幾個(gè)階段:源程序→詞法分析→語法分析→產(chǎn)生中間代碼→優(yōu)化→目標(biāo)代碼生成→目標(biāo)程序。

      第一階段是詞法分析。承擔(dān)詞法分析任務(wù)的程序稱為“掃描器”。詞法分析的任務(wù)是:對構(gòu)成源程序的字符串進(jìn)行掃描和分解。第二階段是語法分析。承擔(dān)語法分析任務(wù)的程序稱為“分析器”。語法分析的任務(wù)是:根據(jù)語法規(guī)則,把描掃器所提供的結(jié)果分析成各類語法范疇。第三階段是產(chǎn)生中間代碼。承擔(dān)產(chǎn)生中間代碼任務(wù)的程序稱為“中間代碼產(chǎn)生器”。其任務(wù)是:按照語法分析器所識(shí)別出的語法范疇,產(chǎn)生相應(yīng)的中間指令。第四階段是優(yōu)化,即代碼優(yōu)化。優(yōu)化的任務(wù)是對前階段產(chǎn)生的中間代碼進(jìn)行加工變換,以便使生成的目標(biāo)程序,能運(yùn)行得更快更省(省內(nèi)存)。第五階段是目標(biāo)代碼生成。這一階段的任務(wù)是:按照優(yōu)化后的中間代碼和其它有關(guān)信息生成目標(biāo)程序。這種目標(biāo)程序可以在計(jì)算機(jī)上直接執(zhí)行。執(zhí)行這個(gè)目標(biāo)程序,就可得到一個(gè)高級(jí)語言程序的結(jié)果。我們知道,所謂翻譯程序是這樣一種程序,它能夠把用甲語言寫的程序翻譯成與之等價(jià)的用乙語言寫的程序。這里的甲語言是該翻譯程序的源語言,而乙語言則為該翻譯程序的目標(biāo)語言。對于編譯程序而言,源程序是被加工的對象,而目標(biāo)程序是加工后的結(jié)果。

      在計(jì)算機(jī)上執(zhí)行用某種高級(jí)語言寫的源程序,通常有兩種方式:一是編譯執(zhí)行方式,二是解釋執(zhí)行方式。

      采用編譯執(zhí)行方式執(zhí)行源程序時(shí)要分兩大步:編譯和運(yùn)行。編譯中的加工處理過程又可分為五個(gè)階段。

      解釋執(zhí)行方式與編譯執(zhí)行方式是不同的,其根本區(qū)別在于:編譯方式把源程序的執(zhí)行過程嚴(yán)格地分成兩大步:編譯和運(yùn)行。即先把源程序全部翻譯成目標(biāo)代碼,然后再運(yùn)行此目標(biāo)代碼,獲執(zhí)行結(jié)果。解釋方式則不然。它是按照源程序中語句的動(dòng)態(tài)順序,直接地逐句進(jìn)行分析解釋,并立即執(zhí)行。所以,解釋程序是這樣一種程序,它能夠按照源程序中語句的動(dòng)態(tài)順序,逐句地分析解釋并執(zhí)行,直至源程序結(jié)束。與編譯程序一樣,解釋程序也與源語言及計(jì)算機(jī)有關(guān)。同一臺(tái)計(jì)算機(jī)上不同語言的解釋程序是不同的;同一種語言在不同的計(jì)算機(jī)上的解釋程序也可能不同。同一種高級(jí)語言的源程序,它可以采用解釋執(zhí)行方式,也可以采用編譯執(zhí)行方式。例如,BASIC語言有解釋BASIC和編譯BASIC之分。前者執(zhí)行速度慢;后者執(zhí)行速度快。編譯程序和解釋程序都屬于系統(tǒng)程序。

      第二篇:Tiny C 語言編譯程序?qū)嶒?yàn)一 Scanner

      Tiny C語言編譯程序?qū)嶒?yàn)一 Scanner Tiny C語言編譯程序?qū)嶒?yàn)一 Scanner 要求:填寫getToken()函數(shù),完成詞法分析器scan.c。

      約定:

      ? 僅允許整數(shù)類型,不允許實(shí)數(shù)類型

      ? 標(biāo)識(shí)符由大小寫英文字母組成,最多52個(gè)。其識(shí)別按最長匹配原則 ? 整數(shù)后緊跟非數(shù)字,或標(biāo)識(shí)符后緊跟非字母認(rèn)為是一個(gè)新Token開始 ? 由{ }括起來符號(hào)串都認(rèn)為是注釋部分,該部分在詞法分析時(shí)被過濾掉

      ? 識(shí)別出的Token由兩個(gè)變量:currentToken,tokenString識(shí)別,其中currentToken代表Token的類屬,為一個(gè)名為TokenType的枚舉類型,在文件globals.h中定義;tokenString代表Token在程序中出現(xiàn)的形式,即其本來面目。例如整數(shù)10的currentToken值為NUM,而tokenString值為‘10’;標(biāo)識(shí)符i的currentToken值為ID,而tokenString值為‘i’

      typedef enum

      { ENDFILE,ERROR,IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE,/* 保留字 */

      ID,NUM, ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI :=

      = <

      +

      *

      /

      ()

      ;

      } TokenType;

      畫識(shí)別符合TINY C語言構(gòu)詞規(guī)則的DFA。然后用直接編碼的方法構(gòu)造詞法分析器

      /****************************************************/ /* File: scan.c

      */ /* The scanner implementation for the TINY compiler

      */ /****************************************************/ #include “globals.h”

      #include “util.h”

      #include “scan.h”

      typedef enum

      { START, INASSIGN, INCOMMENT, INNUM, INID, DONE } StateType;char tokenString[MAXTOKENLEN+1];static int getNextChar(void)

      //獲得下一字符

      Tiny C語言編譯程序?qū)嶒?yàn)一 Scanner

      static struct

      { char* str;

      TokenType tok;

      } reservedWords[MAXRESERVED]

      = {{“if”,IF},{“then”,THEN},{“else”,ELSE},{“end”,END},{“repeat”,REPEAT},{“until”,UNTIL},{“read”,READ},{“write”,WRITE}};

      //定義保留字表

      static TokenType reservedLookup(char * s)

      //進(jìn)行保留字的匹配 {實(shí)現(xiàn)請自己看scan.c文件}

      /**********************************************/ /* the primary function of the scanner

      */ /* function getToken returns the next token in source file */ /**********************************************/ TokenType getToken(void){ int tokenStringIndex = 0;

      TokenType currentToken;

      //保存被識(shí)別Token的類屬

      StateType state = START;

      //初始狀態(tài)為START

      int save;

      //標(biāo)識(shí)當(dāng)前字符是否保存,如空格,換行符n、TAB符t及注釋中的任何字符

      while(state!= DONE)

      //DONE狀態(tài)表示已識(shí)別出一個(gè)Token

      { int c = getNextChar();

      save = TRUE;

      switch(state)

      { case START:

      if(isdigit(c))

      state = INNUM;

      else if(isletter(c))

      { state=DONE;currentToken=END;state=INID;state=INASSIGN;state=INCOMMENT;else if(c==':')else if(c=='{')else

      }

      break;

      case INCOMMENT:

      if(c=='}')

      Tiny C語言編譯程序?qū)嶒?yàn)一 Scanner

      { state=DONE;currentToken=END;}

      break;case INASSIGN: if(c=='=')

      {

      } else { error();currentToken=ERROR };/* 此處已填寫完整 */ state=DONE;currentToken=ASSIGN;break;

      case INNUM:

      if(!isdigit(c))

      { /* backup in the input */

      ungetNextChar();

      save = FALSE;

      state = DONE;

      currentToken = NUM;

      }

      break;

      case INID:

      if(!isletter(c)){ /* backup in the input */ ungetNextChar();save = FALSE;state = DONE;currentToken =ID;

      break;

      case DONE: //不可能到

      default: /* should never happen */

      fprintf(listing,“Scanner Bug: state= %dn”,state);

      state = DONE;

      currentToken = ERROR;

      break;

      }

      if((save)&&(tokenStringIndex <= MAXTOKENLEN))

      tokenString[tokenStringIndex++] =(char)c;

      if(state == DONE)

      Tiny C語言編譯程序?qū)嶒?yàn)一 Scanner

      { tokenString[tokenStringIndex] = '