처음부터 자신만의 바이트코드 Vm 만들기
바이트코드 vm이란 무엇입니까?
바이트코드 vm은 바이너리 코드를 실행하는 프로그램입니다. 프로그램을 실행할 때 컴퓨터에서 수행하는 작업과 유사하지만 기본 실행 파일과 달리 기계 독립적입니다. 그것은 많은 언어에서 사용되는데, 결과를 보여주기 위해 걷는 것보다 빠르고 네이티브 머신 코드 생성에 비해 간단하기 때문입니다.
시작하자
#include <iostream>
#include <vector>
enum Reg{
r1,
r2,
r3,
r4,
r5,
r6,
};
원하는 만큼 추가할 수 있습니다.
enum Opcode{
OP_PRINT,
OP_LOAD,
OP_MOV
};
우리가 만들고 있는 VM은 정말 단순해서 opcode가 3개뿐입니다. 당신은 당신의 자신을 추가하려고해야합니다
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을 구현하고 확장하도록 요청합니다. 읽어 주셔서 감사합니다:)
Reference
이 문제에 관하여(처음부터 자신만의 바이트코드 Vm 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/saptakbhoumik/create-your-own-bytecode-vm-from-scratch-2364텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)