처음부터 자신만의 바이트코드 Vm 만들기

19709 단어 bytecodecppvm
여러분, 안녕하세요! 이 튜토리얼에서는 자신만의 바이트코드 vm을 생성하는 방법을 보여드리고자 합니다. 이 튜토리얼에서는 레지스터 vm을 만들 것입니다. 레지스터 vm은 결과가 특정 레지스터에 저장되는 vm입니다.

바이트코드 vm이란 무엇입니까?



바이트코드 vm은 바이너리 코드를 실행하는 프로그램입니다. 프로그램을 실행할 때 컴퓨터에서 수행하는 작업과 유사하지만 기본 실행 파일과 달리 기계 독립적입니다. 그것은 많은 언어에서 사용되는데, 결과를 보여주기 위해 걷는 것보다 빠르고 네이티브 머신 코드 생성에 비해 간단하기 때문입니다.

시작하자


  • 필요한 헤더 파일을 포함합니다.

  • #include <iostream>
    #include <vector>
    


  • 결과가 저장될 레지스터를 정의합니다.

  • enum Reg{
        r1,
        r2,
        r3,
        r4,
        r5,
        r6,
    };
    


    원하는 만큼 추가할 수 있습니다.
  • VM이 지원하는 opcode를 정의합니다. opcode는 수행할 작업을 지시하는 명령입니다.

  • enum Opcode{
        OP_PRINT,
        OP_LOAD,
        OP_MOV
    };
    


    우리가 만들고 있는 VM은 정말 단순해서 opcode가 3개뿐입니다. 당신은 당신의 자신을 추가하려고해야합니다
  • 실제 VM 코드

  • class VM{
        private:
            std::vector<int> m_code;//stores the code
            int m_memory[6];//stores the data
        public:
            VM(std::vector<int> code){
                m_code = code;
            }
            void run(){
                size_t pc = 0;
                while(pc < m_code.size()){
                    switch(m_code[pc]){
                        case OP_PRINT:{
                            //OP_PRINT <reg>
                            //print the value of the register
                            auto reg=m_code[pc+1];//reg is the register that has the required data
                            auto data=m_memory[reg];//data is the value of the register
                            std::cout << data << std::endl;
                            pc += 2;
                            break;
                        }
                        case OP_LOAD:{
                            //OP_LOAD <reg> <value>
                            //load the value into the register
                            auto reg=m_code[pc+1];//reg is the register where the data will be stored
                            auto data=m_code[pc+2];//data is the value that will be stored
                            m_memory[reg] = data;
                            pc += 3;
                            break;
                        }
                        case OP_MOV:{
                            //OP_MOV <reg1> <reg2>
                            //move the value of the register2 into the register1
                            auto reg1=m_code[pc+1];//reg1 is the register where the data will be stored
                            auto reg2=m_code[pc+2];//reg2 is the register that has the required data
                            m_memory[reg1] = m_memory[reg2];
                            pc += 3;
                            break;
                        }
                        default:
                            std::cout << "Unknown opcode: " << m_code[pc] << std::endl;
                            return;
                    }
                }
            }
    };
    


    참고:- 이 VM은 학습용이므로 매우 빠르거나 실용적이지 않습니다.
  • 드라이버 코드

  • 
    int main(){
        std::vector<int> code = {
            OP_LOAD , r1 , 1 ,//$r1 = 1
            OP_LOAD , r2 , 2 ,//$r2 = 2
            OP_MOV , r3 , r1 ,//$r3 = $r1
            OP_PRINT , r3 ,//print $r3
            OP_PRINT , r2 ,//print $r2
            OP_PRINT , r1 ,//print $r1
        };
        auto vm=VM(code);
        vm.run();
    }
    


    전체 코드




    #include <iostream>
    #include <vector>
    
    enum Reg{
        r1,
        r2,
        r3,
        r4,
        r5,
        r6,
    };
    
    enum Opcode{
        OP_PRINT,
        OP_LOAD,
        OP_MOV
    };
    
    class VM{
        private:
            std::vector<int> m_code;//stores the code
            int m_memory[6];//stores the data
        public:
            VM(std::vector<int> code){
                m_code = code;
            }
            void run(){
                size_t pc = 0;
                while(pc < m_code.size()){
                    switch(m_code[pc]){
                        case OP_PRINT:{
                            //OP_PRINT <reg>
                            //print the value of the register
                            auto reg=m_code[pc+1];//reg is the register that has the required data
                            auto data=m_memory[reg];//data is the value of the register
                            std::cout << data << std::endl;
                            pc += 2;
                            break;
                        }
                        case OP_LOAD:{
                            //OP_LOAD <reg> <value>
                            //load the value into the register
                            auto reg=m_code[pc+1];//reg is the register where the data will be stored
                            auto data=m_code[pc+2];//data is the value that will be stored
                            m_memory[reg] = data;
                            pc += 3;
                            break;
                        }
                        case OP_MOV:{
                            //OP_MOV <reg1> <reg2>
                            //move the value of the register2 into the register1
                            auto reg1=m_code[pc+1];//reg1 is the register where the data will be stored
                            auto reg2=m_code[pc+2];//reg2 is the register that has the required data
                            m_memory[reg1] = m_memory[reg2];
                            pc += 3;
                            break;
                        }
                        default:
                            std::cout << "Unknown opcode: " << m_code[pc] << std::endl;
                            return;
                    }
                }
            }
    };
    
    
    int main(){
        std::vector<int> code = {
            OP_LOAD , r1 , 1 ,//$r1 = 1
            OP_LOAD , r2 , 2 ,//$r2 = 2
            OP_MOV , r3 , r1 ,//$r3 = $r1
            OP_PRINT , r3 ,//print $r3
            OP_PRINT , r2 ,//print $r2
            OP_PRINT , r1 ,//print $r1
        };
        auto vm=VM(code);
        vm.run();
    }
    


    컴파일 및 실행



    다음 명령을 사용하여 컴파일합니다clang++ file.cpp -o output. 그런 다음 실행합니다./output. 콘솔에 출력이 표시되어야 합니다.

    결론



    보시다시피 VM은 구현이 정말 간단합니다. 자체 VM을 구현하고 확장하도록 요청합니다. 읽어 주셔서 감사합니다:)

    좋은 웹페이지 즐겨찾기