Aug 11, 2011

애플리케이션 가상화, 과거와 미래

플랫폼 가상화 대 애플리케이션 가상화
가상 머신(VM)은 그 첫 번째 세대로 60년 전에 IBM에서 대규모의 비용이 많이 드는 메인프레임 시스템을 공유하는 하나의 방법으로서 제작되었다. 그리고 비록 그 개념이 현재 IBM 시스템에 적용된다고 하더라도 VM의 대중적인 개념은 확장되었고 가상화 범위 밖의 수많은 영역에 적용되었다.

가상 머신 근원
VM에 대한 전체 가상화를 지원하는 첫 번째 운영 체제는 Conversational Monitor System(CMS)이다. CMS는 전체 가상화 및 반가상화(paravirtualization) 둘 다 지원했다. 1970년대 초반에 IBM은 시스템의 VM 제품군을 도입했으며, 이는 해당 VM Control Program의 위에 여러 단일 사용자 운영 체제—초기 유형 1 하이퍼바이저를 실행했다.
1960년대에 IBM이 대중화한 가상화의 영역은 플랫폼(또는 시스템) 가상화로 알려졌다. 이러한 가상화의 형태로 내재된 하드웨어 플랫폼은 수많은 다른 운영 체제 및 사용자와 이를 공유하기 위해 가상화되었다.
VM의 또 다른 애플리케이션은 머신 독립성의 특성을 제공하는 것이다. 애플리케이션(또는 프로세스) 가상화라는 이러한 양식은 추상화된 환경(애플리케이션용)을 제작하여, 실제 환경에 독립적으로 만든다.

애플리케이션 가상 머신의 측면
애플리케이션 가상화 공간에서 VM은 애플리케이션의 실행에 하드웨어 독립적인 환경을 제공하는 데 사용된다. 예를 들어, 그림 1을 살펴보자. 맨 위에 개발자들이 애플리케이션을 구축하기 위해 사용하는 고급 언어가 있다. 컴파일 프로세스를 통해 이 상위 레벨 코드는 오브젝트 코드라는 중간 표현으로 컴파일된다. 비가상화 환경에서 이 오브젝트 코드(이는 머신 독립적임)는 실제 플랫폼에서 실행을 위한 네이티브 머신 코드로 컴파일된다. 하지만 애플리케이션 가상화 환경에서 오브젝트 코드는 추상 머신 내에서 실행을 제공하기 위해 해석된다. 여기에서 핵심적인 장점은 동일한 오브젝트 코드가 추상 머신(해석기)을 지원하는 어느 하드웨어 플랫폼에서나 실행될 수 있다는 점이다.

그림 1. 플랫폼 독립성을 위한 애플리케이션 VM

오브젝트 코드를 실행하는 이식 가능한 환경을 작성하는 것 외에도 애플리케이션 가상화는 호스트에서 실행하는 다른 애플리케이션과 VM을 격리시키는 환경을 제공한다. 이 설정은 자세한 자원 관리 및 보안과 같은 수많은 장점이 있다.
VM을 위한 오브젝트 코드는 바이트코드라고도 하며, 특히 해석기가 실행하는 명령어 세트를 정의한다. 가상 명령어를 효율적으로 구현한 구현방식에서부터 진화한 바이트코드라는 용어는 단순성과 성능을 위해 단일 바이트로 설정한다.
이제 애플리케이션 가상화에 대한 일부 역사적인 사용을 살펴보고, 일부 현대적인 사용을 알아보자.

가상 머신 역사
애플리케이션 가상화의 가장 초기 사용 중 하나는 Basic Combined Programming Language(BCPL)용으로 1960년대에 나타났다. BCPL는 케임브리지 대학교의 Martin Richards가 개발한 명령형 언어였고 오늘날 사용하는 C 언어로 진화한 B 언어의 선구자이다.
BCPL, 과거와 현재
BCPL이 1966년도부터 생겨났다고 하더라도 이는 제작자인 Martin Richards에 의해 오늘날에도 여전히 활발히 개발되고 있다. BCPL의 첫 번째 컴파일러는 최초로 개발된 시간 공유 운영 체제 중 하나인 Compatible Time Sharing System 아래 IBM 7094 시스템용으로 쓰여졌다. 오늘날 Linux와 같은 다양한 시스템에서 BCPL을 사용할 수 있다.
비록 BCPL이 고급 언어였지만(C와 마찬가지로), 컴파일러가 생성한 중간 코드는 O-code(오브젝트 코드)라고 불렸다. O-code는 실제 머신(VM으로)에서 해석되거나 O-code에서 호스트의 네이티브 머신 언어로 컴파일될 수 있다. 이 기능은 머신 독립성의 맥락에서 수많은 장점을 제공했다. 첫 번째로 실제 머신에서부터 O-code를 추상화하여 이는 다양한 호스트에서 간편하게 해석될 수 있었다. 두 번째로, O-code는 네이티브 머신으로 컴파일될 수 있으며, 이는 O-code를 네이티브 머신 명령어로 변환하는(더 간단한 작업) 하나의 컴파일러 및 여러 컴파일러의 개발을 허용했다. 이 머신 독립성은 머신들에 걸쳐 언어를 이식 가능하게 만들기 때문에 이러한 가용성으로 인해 대중적이 되었다.
1970년대 초반에 샌디에고의 캘리포니아 대학교에서는 컴파일된 Pascal을 실행하기 위한 VM 접근방식을 구현했다. 이들은 중간 표현을 p-code라고 했으며, 이는 Pascal 컴파일러의 개발을 간소화하기 위해 내재된 하드웨어의 독립성을 추구했다(추상 모조 머신 아키텍처에 의존하는 것이 아니라). Forth 언어도 VM을 적용했다. 즉, 이는 영주소(zero-address) 또는 스택 기반 아키텍처이다.
1972년에 Xerox PARC는 실행을 위해 VM에 의존하는 Smalltalk 언어를 도입했다. Smalltalk는 오브젝트의 개념을 근거로 제작된 첫 번째 언어 중 하나이다. Smalltalk와 p-code 둘 다 오늘날 존재하는 가장 중요한 VM 기반 언어 중 하나인 Java 언어에 크게 영향을 주었다. Java는 1995년에 Sun Microsystems가 개발하여 처음 나타났고 Java Virtual Machine을 통해 플랫폼 독립적인 프로그래밍의 개념을 개발했다. 그 이후로 Java 기술은 웹 애플리케이션의 빌딩 블록이 되었다. 서버측 스크립트에서 클라이언트측 애플릿에 이르기까지 Java 기술은 VM 기술의 인식을 제고했고, JIT(Just-In-Time) 컴파일 기술을 사용하여 해석과 네이티브 실행 사이를 연결한 더 새로운 기술을 도입했다.
많은 다른 언어는 VM의 개념을 포함한다. Erlang 언어(Ericsson이 개발함)는 VM을 사용하여 Erlang 바이트코드를 실행하고 소스의 추상 구문 트리로부터 Erlang을 해석한다. 경량 Lua 언어(브라질의 리우데자네이루에서 Pontifical Catholic University에서 개발됨)는 레지스터 기반 VM을 포함한다. Lua 프로그램이 실행될 때, 이는 바이트코드로 변환된 다음에 VM에서 실행된다. 나중에 이 기사는 어느 언어에나 사용될 수 있는 바이트코드 표준을 살펴본다.

오늘날 가상 머신
실제 호스트로 추상을 제공하는 VM의 사용은 역사적으로 일반적인 메소드이고 오늘날 진화하며 애플리케이션을 찾는다. VM의 개념을 미래로 나아가게 하는 몇 가지 더 새로운 오픈 소스 솔루션에 대해 살펴보자.

Dalvik VM
Dalvik은 Android 운영 체제를 위해 Google이 개발한 오픈 소스 VM 기술이다. Android는 모바일 장치를 위해 소프트웨어 스택을 통합하는 수정된 Linux 커널이다(그림 2 참조). 스택 기반 아키텍처에 의존하는 많은 VM 기술과 마찬가지로, Dalvik VM은 레지스터 기반 가상 아키텍처이다(아키텍처 및 명령어 세트에 대 자세한 정보는 참고자료 참조). 비록 스택 기반 아키텍처가 개념적으로 간단하고 효율적일지라도 이는 더 큰 규모의 프로그램과 같이(스택 유지보수로 인해) 새로운 비효율성을 도입할 수 있다.

그림 2. Dalvik 소프트웨어 스택의 간단한 아키텍처

Dalvik이 VM 아키텍처이기 때문에, 이는 VM이 이해하는 바이트코드로 컴파일되는 고급 언어에 의존한다. 불필요한 일을 하는 대신에, Dalvik은 애플리케이션 개발을 위한 고급 언어로서 Java 언어에 의존한다. Dalvik도 dx라는 특수 도구에 의존하여 Java 클래스 파일을 Dalvik VM 실행 파일로 변환한다. 성능을 위해 VM은 JIT 컴파일을 비롯하여 추가 최적화를 위해 Dalvik 실행 파일(dex)를 추가로 수정할 수 있으며, 이는 dex 명령어를 네이티브 성능을 위한 네이티브 명령어로 변환한다. 이 프로세스는 동적 변환으로도 알려져 있고 VM 기술의 성능을 높이기 위한 대중적인 기술이다.
그림 2와 같이 Dalvik 실행 파일(VM의 인스턴스와 함께)은 Linux 사용자 공간에서 단일 프로세스로 격리된다. Dalvik VM은 동시에 여러 VM의 실행(독립적인 프로세스로)을 지원하도록 제작되었다.
Dalvik VM은 표준 Java 런타임에서 구현되지 않으므로 이에 대해 라이센스를 상속하지 않는다. 대신에, Dalvik은 Apache 2.0 라이센스에 의해 게시된 클린룸(clean-room) 구현 방식이다.

Parrot
또 다른 흥미로운 오픈 소스 VM 프로젝트는 Parrot이다. Parrot은 동적 언어(유형 시스템을 변경하는 등 컴파일 시 일반적으로 수행되는 런타임 시 특정 조작을 수행하는 언어)를 효율적으로 실행하도록 설계된 또 다른 레지스터 기반 VM 기술이다.
Parrot은 원래 PerI6용 런타임으로 설계되었지만, 이는 많은 언어의 바이트코드의 실행에 유연한 환경이다(그림 3 참조). Parrot은 컴파일러 라이터에 유용한 Parrot Abstract Syntax Tree(PAST), 사람들이나 컴파일러가 자동으로 쓸 수 있는 상위 레벨 표현인 Parrot Intermediate Representation(PIR) 및 중간 이하 표현이지만 사람 및 컴파일러 둘 다에 유용한 Parrot Assembly(PASM)를 비롯하여 몇 가지 입력 양식을 지원한다. 각 양식은 Parrot VM에서 Parrot 바이트코드로 변환되고 실행된다.

그림 3. Parrot VM의 간단한 아키텍처

Parrot은 많은 언어를 지원하지만, 매우 흥미로운 하나의 측면은 함수형 언어에 대한 특정 지원 비롯하여 정적 및 동적 언어에 대한 지원이다. 목록 1은 PASM의 간단한 사용을 보여준다. Ubuntu로 Parrot을 설치하려면 다음과 같이 간단히 apt-get을 사용한다.
sudo apt-get install parrot

다음 세션은 Parrot에서 간단한 문자열 조작 프로그램을 시연한다. 비록 Parrot이 이 코드를 어셈블리로 구현할지라도, 이는 사용될 수 있는 어셈블리보다 훨씬 더 기능이 풍부하다는 점을 확인하자. Parrot에서 명령어는 dest,src 구문을 사용하므로, 목록 1은 텍스트로 로드되는 문자열 레지스터를 보여준다. length 명령어는 문자열의 길이를 판별하고 정수 레지스터로 이를 로드한다. print 명령어는 인수를 표준 출력(stdout)으로 내보내고 concat은 문자열 연결을 구현한다.

목록 1. PASM 예제

$ more test.pasm
set S1, "Parrot"
set S2, "VM"
length I1, S1
print I1
print "\n"

concat S3, S1, S2
print S3
print "\n"

end
$
parrot test.pasm
6
ParrotVM
$

Parrot 내에서 명령어의 풍부한 세트를 발견할 것이다(자세한 내용은 참고자료 참조). 작성자는 최소화에 대해 풍성한 기능을 선택하여, Parrot VM용 컴파일러를 코드하고 빌드하기에 간편하게 된다.
PASM이 제공하는 상위 레벨 추상을 통해서도 PIR은 상위 레벨 프로그래머에게 훨씬 더 편안하다. 목록 2는 PIR로 쓰이고 Parrot VM으로 실행되는 예제 프로그램을 제공한다. 이 예제는 수를 제곱하고 이를 리턴하는 square라는 서브루틴을 선언한다. 이 프로세스는 결과를 인쇄하기 위해 기본 서브루틴으로 호출된다(이를 먼저 실행하기 위해 Parrot에 알려주도록 :main으로 레이블됨).

목록 2. PIR 예제

$ more test.pir
.sub square
.param int arg
arg *= arg
.return(arg)
.end

.sub main :main
.local int value
value = square(19)
print value
print "\n"
.end
$ parrot test.pir
361
$

Parrot은 높은 효율성도 추구하는 머신 독립적인 애플리케이션의 개발에 풍부한 애플리케이션 가상화 환경을 제공한다. C, Lua, Python, Scheme, Smalltalk 및 기타 등등을 비롯하여 Parrot을 위해 설계된 컴파일러 프론트 엔드를 지원하는 언어를 많이 찾을 수 있다.
위로
애플리케이션 가상 머신의 다른 사용
지금까지 최근 두 개의 예제를 비롯하여 애플리케이션 가상화의 역사적인 사용을 확인했다. Dalvik은 현재 핸드셋 내에서 애플리케이션 개발을 구동하고 있고, Parrot은 정적 및 동적 언어용 컴파일러 라이터에 효율적인 프레임워크를 제공한다. 하지만, 애플리케이션 가상화의 개념은 지금까지 탐색된 접근방식을 넘어 수많은 다른 영역에서 구현된다.
특히 흥미로운 한 가지 사용은 독자가 지금 사용하고 있는 컴퓨터에서 실행하고 있을 가능성이 높다. BIOS 대체인 새로운 Extensible Firmware Interface(EFI)를 사용하는 시스템은 EFI Byte Code(EBC)라고 하는 것에서 펌웨어 드라이버를 구현할 수 있다. 시스템 펌웨어는 EBC 이미지가 로드될 때 호출되는 해석기를 포함한다. 이 개념은 Forth(자체적인 VM을 포함하는 언어)를 사용하는 Sun Microsystem의 Open Firmware에서도 구현되었다.
게임 분야에서 애플리케이션 가상화의 사용은 새로운 것이 아니다. 많은 현대식 게임은 플레이어 외의 캐릭터 작동의 스크립팅 및 바이트코드를 실행하는 언어(예: Lua)를 사용하는 다른 게임 분야를 포함한다. 하지만 게임 분야에서 애플리케이션 가상화의 개념은 실제로는 훨씬 멀리 되돌아간다.
Zork와 같은 텍스트 기반 어드벤처를 도입한 회사인 Infocom은 1979년에 머신 독립 부문에서 가치를 확인했다. Infocom은 Z-machine(이후에 Zork로 이름 지정됨)이라는 VM을 제작했다. Z-machine은 다른 아키텍처로 더 간편하게 포트되는 어드벤처 게임을 허용한 VM이다. 전체 어드벤처를 새 시스템으로 포트하기 위해 보유하는 것이 아니라 해석기가 Z-machine을 표현하는 것으로 포트될 것이다. 이 기능은 다른 언어 지원이 있고 전체적으로 다른 머신 아키텍처를 가질 수 있는 다른 시스템으로 포팅 프로세스를 간소화했다. 비록 Infocom의 목표가 당시의 아키텍처들 사이에 포팅하는 부분에서 골치거리를 완화하는 것이지만, 그들의 작업은 포팅을 계속 간소화했으며 결과적으로 새 세대로 액세스 가능한 이러한 게임들(심지어 모바일 플랫폼에서)을 제작하고 있다.
VM의 다른 게임 애플리케이션은 ScummVM(이는 VM 환경에 Script Creation Utility for Maniac Mansion(SCUMM) 스크립팅 언어를 제공함(1987년에 작성됨))을 포함한다. SCUMM은 그래픽 어드벤처 게임의 개발을 간소화하기 위해 LucasArts가 개발했다. ScummVM은 이제 다양한 플랫폼에서 많은 텍스트 및 그래픽 어드벤처 게임을 하는 데 사용된다.
위로
추가 주제
플랫폼(또는 시스템) 가상화가 우리가 서버와 데스크탑 둘 다 공급하고 관리하는 방법을 변경한 것처럼 애플리케이션 가상화는 호스트 시스템에서부터 애플리케이션을 추상화하는 효율적인 메커니즘을 계속 제공한다. 이러한 접근방식의 인기를 고려하면, 애플리케이션 가상화를 훨씬 더 유연하고 효율적으로 만드는 소프트웨어 및 하드웨어 모두의 진화를 확인하는 것이 흥미로울 것이다.

참고자료
교육
developerWorks에 실린 가상화에 대한 기사 또는 Tim의 모든 기사를 더 찾아보자.

Wikipedia는 VM(플랫폼 및 애플리케이션 모두)에 대해 자세히 학습하는 훌륭한 자원 세트를 제시한다. 특히 p-code machines 전용 페이지 외에도 virtual machines에 대한 페이지를 확인하자.

B 언어와 그 다음의 C 언어의 선구자격인 BCPL은 Martin Richards가 1967년에 만들었다. Project MAC의 일부로 최초의 온라인 BCPL 참조 매뉴얼을 읽을 수 있다. 또한 BCPL 홈 사이트에서 최신 버전을 다운로드할 수도 있다.

EFI Byte Code 또는 EBC는 이식 가능한 컴포넌트 드라이브의 해석적 계층을 지정한다. Boot Loaders: Small, Fast System Initialization(Dr. Dobb's, 2010년 9월)에서 EBC 및 UEFI에 대해 자세히 배울 수 있다.

Forth는 비록 1970년대 이후로 나타났지만, VM 언어로서 애플리케이션을 계속 찾고 있다. 항공 우주 과학, 임베드된 시스템 BIOS 및 자원이 드물게 존재하는 다른 애플리케이션에 적용된 Forth를 확인할 것이다. Forth Interest Group에서 Forth에 대해 자세히 배워보자.

Twitter의 developerWorks를 팔로우하고 developerWorks에 대한 Linux 트윗의 피드를 구독하거나 Twitter에서 M. Tim Jones를 팔로우하자.

developerWorks Linux 존에서는 수백 개의 기술자료 목록과 함께, Linux 개발자와 관리자를 위한 다양한 다운로드, 토론 포럼 및 다른 참고자료를 찾을 수 있다.

developerWorks 기술 행사 및 웹 캐스트를 통해 다양한 IBM 제품 및 IT 산업 주제에 대한 최신 정보를 얻을 수 있다.

무료 developerWorks Live! briefing을 통해 최신 IBM 제품 및 도구에 대한 정보뿐만 아니라 IT 업계의 최신 경향까지도 빠르게 확인할 수 있다.

developerWorks on-demand demos에서는 입문자를 위한 제품 설치 및 설정부터 숙련된 개발자를 위한 고급 기능까지 망라된 다양한 데모를 제공한다.

제품 및 기술 얻기
Dalvik은 Android 운영 체제를 위한 VM 환경이다. Dalvik은 Dan Bornstein이 개발했으며 Android의 일부로 Google이 유지보수하고 있다. 바이트코드로 Dalvik 머신에 대해 자세히 알아보자(사용자 문서에서 확인 가능). Android 개발 소개(Frank Ableson저, developerWorks, 2009년 5월)에서 Dalvik에 대해 더 자세히 배울 수도 있다.

Parrot은 Parrot 바이트코드에 대해 다양한 중간 표현을 통해 정적 및 동적 언어를 효율적으로 실행하도록 설계된 VM이다. Parrot은 오픈 소스로 사용 가능하고 수많은 언어로 사용될 수 있다. Parrot의 명령어 세트에 대해 자세히 배우려면 Parrot 내부에서 사용 가능한 opcode를 확인하자.

애플리케이션 VM은 게임 개발 업계에서는 대중적이다. Infocom은 텍스트 어드벤처 게임 부문에서(예: Zork) 이를 최초로 사용한 업체 중 하나이다. Z-machine이라고 하는 Infocom VM 뿐만 아니라 다양한 플랫폼에 존재하는 해석기에 대해 자세히 학습할 수 있다. 또 다른 VM의 애플리케이션은 LucasArts가 그래픽 어드벤처에 사용한 SCUMM이다. SCUMM은 ScummVM으로서 오픈 소스로 구현되었고 새 하드웨어에 이전 게임들을 되살리고 있다.

자신에게 가장한 적합한 방법으로 IBM 제품을 평가해 보자. 평가판 제품을 다운로드하거나, 온라인으로 제품을 사용해 보거나, 클라우드 환경에서 제품을 사용하거나, SOA Sandbox에서 SOA(Service Oriented Architecture)를 효과적으로 구현하는 방법을 배울 수 있다.

토론
developerWorks community에 참여한다. 개발자가 이끌고 있는 블로그, 포럼, 그룹 및 Wiki를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.

필자소개

M. Tim Jones는 임베디드 펌웨어 아키텍트이자 Artificial Intelligence: A Systems Approach, GNU/Linux Application Programming(2판이 나왔다), AI Application Programming(2판이 나왔다), BSD Sockets Programming from a Multilanguage Perspective의 저자이기도 하다. Jones의 공학 배경은 정지 위성을 위한 커널 개발에서 시작해 임베디드 시스템 아키텍처와 네트워크 프로토콜 개발에 이르기까지 다양한 분야를 아우른다. Jones는 콜로라도 주, 롱몬트 소재 Emulex 사에서 컨설턴트 엔지니어로 활약한다.