合肥生活安徽新聞合肥交通合肥房產生活服務合肥教育合肥招聘合肥旅游文化藝術合肥美食合肥地圖合肥社保合肥醫院企業服務合肥法律

        CS 2210編程代寫、Java程序語言代做

        時間:2023-11-27  來源:合肥網hfw.cc  作者:hfw.cc 我要糾錯



        CS 2210 Programming Project (Part IV)
        Code Generation
        This project is intended to give you experience in writing a code generator as well as bring together
        the various issues of code generation discussed in the text and in class.
        Due date
        The assignment is due December 9th, 2023, 11:59pm. This is the hard deadline and no extensions will be given for this project.
        Project Summary
        Your task is to write a code generator, the final phase of your compiler. It produces (target)
        assembly code for the MIPS R2000 architecture. It takes as input the augmented AST and symbol
        table produced by the previous phases of your compiler. The generated code will be executed using
        SPIM S20, a simulator for the MIPS R2000.
        Code generation will consist of assigning memory addresses for each variable used in the MINIJAVA program and translating subtrees of the AST (intermediate language representation) into
        sequences of assembly instructions that perform the same task.
        Code Generation
        This is the only phase of your compiler which is machine dependent. Examples of assembly code
        programs will be provided on the class webpage.
        The important/interesting issues in generating code for MINI-JAVA are discussed in the following paragraphs. Please refer to chapter 7, 8 and class notes for further details on these issues,
        You can make the following assumptions to simplify the project.
        ˆ Code is generated for the intermediate instructions on a statement-by-statement basis without
        taking into account the context of an intermediate instruction
        ˆ code is generated for the intermediate instructions in the order that they occur within the
        intermediate instruction sequence.
        ˆ You may take advantage of any special instruction of the machine when choosing target
        instructions for a given intermediate instruction.
        ˆ You do not have to any fancy register allocation or optimization on your target code.
        1
        Computing Memory Addresses
        Since address information has not been computed and entered into the symbol table by earlier
        phases, the first task of the code generator is to compute the offsets of each variable name (both
        global and local); that is, the address of each local data object and formal parameter within the
        activation record for the block in which they are declared. This can be done by initializing a
        variable offset at the start of each declaration section, and as each declaration is processed, the
        current value of offset is entered as an attribute of that symbol, and offset is then incremented
        by the total width of that data object (depending on its type).
        The program execution begins with a method called main() being called. Since the language
        has no way to initiate classes, all classes are instantiated when program execution begins. Thus,
        all storage for all classes is allocated globally. The offsets of variables within classes should be
        computed and stored as an attribute of the variable name, typically relative to the start of the class
        or can just be relative to the start of the global storage.
        For simplicity, declarations within a method donot contain any objects whose types are classes.
        That is, local variables can only be of integer type or integer array type.
        Call-by-value parameters will have a width dependent on the type of the parameter (remember
        we are using only integer parameters), whereas call-by-reference parameters will have a width
        equal to ONE word to store an address. The total activation record size of each method should be
        computed at this time and entered in the symbol table as an attribute of the method name.
        The machine architecture must be take into account when computing these widths, that is,
        an integer in the MIPS processor is 4 bytes. Offsets of locals can be implemented as a negative
        offset from the frame pointer while offsets of parameters can be positive from the frame pointer.
        Thus, the computation of offsets of arguments and local variables can be done independently. This
        information will be used upon every reference to the data object in addition to being used in the
        allocation of storage for activation records.
        Handling Structure Data Types
        Storage for an array is allocated as a consecutive block of memory. Access to individual elements
        of an array is handled by generating an address calculation using the base address of the array,
        the index of the desired element, and the size of the elements. You are free to choose the layout of
        elements of an array in your implementation (e.g., row major or column major order).
        Simple Control Flow
        Code for simple control statements, namely conditional and loops in MINI-JAVA, can be generated
        according to the semantics of conventional programming languages using the compare and branch
        instructions of the assembly language. Unique target labels will also have to be generated.
        Method Invocation, Prologues, and Epilogues
        Recursion in MINI-JAVA prevents the use of a static storage allocation strategy. However, the
        language has no features that prevent the deallocation of activation records in a last-in-first-out
        manner. That is, activation records containing data local to an execution of a method, actual
        parameters, saved machine status, and other information needed to manage the activation of the
        2
        method can be stored on a run-time stack. The MIPS assembly language provides the subroutine
        call mechanisms to manipulate the run-time user stack.
        An activation record for a method is pushed onto the stack upon a call to that method, while
        the activation record for the method is popped from the stack when execution of the method is
        finished and control is to be returned to the caller. As MINI-JAVA does not allow dynamic classes
        and arrays, the sizes of all activation records are known at compile time.
        Method calls result in the generation of a calling sequence. Upon a call, an activation record for
        the callee must be set up and control must be transferred to the callee after saving the appropriate
        information in the activation record. For each method, the generated code sequence will consist of
        a prologue, the code for the statements of the method, and the epilogue. Typically, the prologue
        saves the registers upon a method call and allocates space on the stack for local variables, whereas
        the epilogue consists of restoring the saved machine status and returning control to the point in the
        caller immediately after the point of call. The handout on the MIPS assembly language explains
        the instructions used to implement these actions.
        Parameter passing
        In order to correctly handle the formal parameters within the body of the callee, the symbol table
        entry for each formal parameter must include an attribute that indicates the parameter passing
        mode, that is, by-value or by-reference. Remember that we do not pass arrays as parameters. On
        a method invocation, call-by-value parameters are handled by allocating the local store for the size
        of the object in the activation record of the callee and then evaluating the actual parameter and
        initializing the local store within the callee with the value of the actual parameter. All accesses to
        that formal parameter will change the value in the local space, with no effect on the caller. On a
        return, no values are copied back to the caller.
        Call-by-reference parameters are handled by allocating local space in the callee’s activation
        record for the address of the actual parameter and then copying the address of the actual parameter
        into that local space. All accesses to that formal parameter during execution of the callee are indirect
        accesses through this address, having a direct effect on the caller. On return, no action is taken
        other than reclaiming the space.
        Note that MIPS has a convention that the first 4 arguments of a method call are passed in
        register $a0-$a3. You have the option to follow this convention.
        Register Usage
        In the MIPS processor, certain registers are typically reserved for special purposes. You should
        abide by these conventions.
        Possible Functions
        You may want to write the following functions to help in the code generation.
        1. emit call(func name, num arg)/*emit a call instruction; func name: function id lexeme pointer;
        num arg: number of arguments */
        2. emit label(l num)/*emit a definition of a label; l num: label number; example: L=102, code
        generated = “L 102” */
        3
        3. emit goto(operator, l num) /*emit unconditional and conditional jump instructions; operator:
        an operator in the branch-jump group; l num: label number */
        4. emit data(name, type, size) /* emit one data line, which is used for STATIC allocation;
        name: data object id lexeme pointer; type: type width; size: number of elements of above type
        */
        5. emit str(name, str) /* emit a string constant definition line; name: pointer to the name
        lexeme; str: pointer to the str */
        6. emit most(operator, type, num op, op1, op2, op3) /* emit most of the instructions; operator:
        one of the instructions in the general group; type: data type; num op: number of operators 1,
        2 and/or 3; op1...3: operands, op2 and op3 can be omitted depending on num op */
        Run-time Error Detection
        You do not need to generate any run-time checks. Thus you can assume that array bounds are
        within range and scalars are within range.
        Testing your code
        The code generated is MIPS assembly code and should follow the descriptions specified in the
        handout SPIM S20. Samples will be put on the class webpage.
        You can run the generated assembly code on the simulator and check the results. However, the
        correct output does not guarantee that your code is completely correct. You should examine your
        generated code carefully.
        proj4> codeGen < sample1.java
        proj4> spim -asm -file code.s
        ... ...
        or
        proj4> spim
        (spim) load “code.s”
        (spim) step
        [0x00400000] 0x8fa40000 lw $4,0($29)
        (spim) run
        ... ...
        Assignment submission
        Please submit your project in Canvas before the due time. The submission should be a compressed
        file that contains your project source code and readme file (if any).
        請加QQ:99515681 或郵箱:99515681@qq.com   WX:codehelp

        掃一掃在手機打開當前頁
      1. 上一篇:代寫CSC3100 Data Structures
      2. 下一篇:CSCC43代做、R設計編程代寫
      3. 無相關信息
        合肥生活資訊

        合肥圖文信息
        挖掘機濾芯提升發動機性能
        挖掘機濾芯提升發動機性能
        戴納斯帝壁掛爐全國售后服務電話24小時官網400(全國服務熱線)
        戴納斯帝壁掛爐全國售后服務電話24小時官網
        菲斯曼壁掛爐全國統一400售后維修服務電話24小時服務熱線
        菲斯曼壁掛爐全國統一400售后維修服務電話2
        美的熱水器售后服務技術咨詢電話全國24小時客服熱線
        美的熱水器售后服務技術咨詢電話全國24小時
        海信羅馬假日洗衣機亮相AWE  復古美學與現代科技完美結合
        海信羅馬假日洗衣機亮相AWE 復古美學與現代
        合肥機場巴士4號線
        合肥機場巴士4號線
        合肥機場巴士3號線
        合肥機場巴士3號線
        合肥機場巴士2號線
        合肥機場巴士2號線
      4. 幣安app官網下載 短信驗證碼

        關于我們 | 打賞支持 | 廣告服務 | 聯系我們 | 網站地圖 | 免責聲明 | 幫助中心 | 友情鏈接 |

        Copyright © 2024 hfw.cc Inc. All Rights Reserved. 合肥網 版權所有
        ICP備06013414號-3 公安備 42010502001045

        主站蜘蛛池模板: 亚欧色一区W666天堂| 亚洲日韩精品一区二区三区无码| 中文字幕VA一区二区三区 | 乱精品一区字幕二区| 国产亚洲一区二区三区在线不卡 | 久久亚洲色一区二区三区| 日韩精品一区二区三区毛片| 一本久久精品一区二区| 成人精品一区久久久久| 日韩人妻不卡一区二区三区| 精品亚洲AV无码一区二区| 伊人久久大香线蕉av一区| 少妇人妻精品一区二区| 无码一区二区三区中文字幕| 中文字幕一区二区免费| 亚洲电影国产一区| 四虎成人精品一区二区免费网站| 四虎永久在线精品免费一区二区| 亚洲国产精品第一区二区| 免费在线观看一区| 欧洲精品码一区二区三区免费看| 人妻精品无码一区二区三区| 中文字幕一区二区三区在线播放| 天天躁日日躁狠狠躁一区| 国产精品高清视亚洲一区二区| 国精产品一区一区三区| 亚洲一区二区三区在线播放| 日本精品视频一区二区| 无码日韩精品一区二区免费暖暖 | 国产精品日本一区二区不卡视频| 美女毛片一区二区三区四区| 亚洲视频在线一区二区三区| 国产高清在线精品一区小说| 亚洲AⅤ无码一区二区三区在线| 精品久久久久一区二区三区 | 免费一区二区无码视频在线播放| 日本一区二区三区在线视频观看免费| 视频一区二区在线观看| 精品一区二区久久| 激情久久av一区av二区av三区| 国产产一区二区三区久久毛片国语|