본문 바로가기

Computer Science/Design Pattern

[게임 프로그래밍 패턴] 10. 바이트코드 패턴

바이트코드 패턴 (Bytecode Pattern)

203 : 명령어 집합은 실행할 수 있는 저수준 작업들을 정의한다. 명령어는 일련의 바이트로 인코딩된다. 가상 머신은 중간 값들을 스택에 저장해가면서 이들 명령어를 하나씩 실행한다. 명령어를 조합함으로써 복잡한 고수준 행동을 정의할 수 있다.

바이트코드의 사용

  1. 언어가 너무 저수준이라 만드는 데 손이 많이 가거나 오류가 생기기 쉽다.
  2. 컴파일 시간이나 다른 빌드 환경 때문에 반복 개발하기가 너무 오래 걸린다.
  3. 보안에 취약하다. 정의하려는 행동이 게임을 깨먹지 않게 하고 싶다면 나머지 코드로부터 격리해야 한다.

디자인 결정

  1. 스택 기반 VM
    - 명령어가 짧다.
    - 코드 생성이 간단하다.
    - 명령어 개수가 많다.
  2. 레지스터 기반 VM
    - 명령어가 길다.
    - 명령어 개수는 줄어든다.

만들어야 하는 명령어

  1. 외부 원시명령
    - VM 외부 게임코드에 접근. 유저가 볼 수 있는 일들을 처리한다.
  2. 내부 원시명령
    - 리터럴, 연산, 비교, 그 외 스택에 값을 주고받는 명령어들로 VM 내부 값을 다룬다.
  3. 흐름 제어
    - 명령어를 조건에 따라 실행하거나 반복 실행하기 위해 사용한다. 바이트코드 같은 저수준 언어에서는 jump를 활용한다.
  4. 추상화
    - 재사용성을 높이기 위해 프로시저 같은 것을 만든다. VM이 별도의 반환 스택을 관리하며 jump를 활용한다.

데이터의 표현

  1. 단일 자료형
    - 간단하다.
    - 다른 자료형을 다룰 수 없다.
  2. 태그 붙은 변수
    - 값이 자신의 자료형을 안다.
    - 메모리가 조금 더 필요하다.
  3. 태그가 붙지 않은 공용체
    - 작고 빠르다.
    - 안전하지 않다.
  4. 인터페이스
    - 제한이 없다.
    - 객체지향적이다.
    - 번거롭다.
    - 비효율적이다.

바이트코드는 어떻게 만들 것인가?

  1. 텍스트 기반 언어를 정의할 경우
    1. 문법을 정의해야 한다.
    2. 파서를 구현해야 한다.
    3. 문법 오류를 처리해야 한다.
    4. 비-프로그래머들은 쓰기 어려울 것이다.
  2. UI가 있는 저작 툴을 만들 경우
    1. UI를 구현해야 한다.
    2. 오류가 적다.
    3. 이식성이 낮다.