Parrot
Parrot 이란?
Parrot은 Perl6를 위해 개발된 register기반의 Virtual Machine(가상머신)이다. 하지만 Parrot bytecode를 생성하는 컴파일러만 만들면 Python,Ruby등 dynamic typed language(동적언어)를 모두 지원할 수 있다. 기존의 Java JVM,.NET CLR같은 VM이 있으나 이것들은 stack기반이고 동적언어의 기능을 100% 지원하지 못하며 본래 static typed language(정적언어)를 위해 개발된것이다.
Virtual Machine Showdown: Stack Versus Registers 에 의하면 register기반은 stack기반 VM보다 명령을 수행하는데 소요되는 인스트럭션을 47% 줄일 수 있고 실행시간도 25.6%정도 빠르다는 연구결과가 나와있다.
참고:
- On the Architecture of the Parrot Virtual Machine OnTheArchOfParrotVM.pdf
- Software Patterns in the Parrot System SoftwarePatternsInParrot.pdf
현재 Parrot위에서 돌아가도록 구현되고 있는 언어들로는 bc,Befunge,Lua,Javascript,Perl6,Plumhead(PHP),Pynie(Python),Ruby, Scheme,Tcl등이 있다. 이것은 궁극적으로 Parrot 기반으로 다양한 언어를 동시에 제한 없이 같이 사용할 수 있게됨을 뜻한다.
- 공식홈페이지: http://www.parrotcode.org/
- Parrot 디자인문서: http://www.parrotcode.org/docs/pdd/
- Perl 6 and the Parrot Virtual Machine http://www.cs.helsinki.fi/u/pohjalai/k05/okk/seminar/Fagerholm-Parrot.pdf
- Parrot Compiler Tools http://www.lohutok.net/talks/compiler_tools.pdf
- 관련정보싸이트: http://www.perlfoundation.org/parrot/, http://en.wikipedia.org/wiki/Parrot_virtual_machine
-
Inside Parrot's Compiler Tools http://www.oreillynet.com/onlamp/blog/2006/03/inside_parrots_compiler_tools.html
Parrot의 구조
내부 데이터 타입
Parrot은 다음과 같은 네종류의 register(또는 데이터 타입)을 가진다.
- I : native 정수형을 저장
- N: native 실수형을 저장
- S: 문자열을 저장
- buffer : 실제 문자열을 저장
- length : 문자열의 길이를 저장
- encoding : 문자열의 인코딩을 저장
- character set : 문자열의 문자셋을 저장
- P: Perl Magic Cookie(PMC)를 저장
Parrot은 앞에서도 말했다시피 Dynamic typed language를 위해 설계되었다. Java같은 언어에서는 정수형변수에 실수를 저장하려고 하면 에러가 나지만 Perl같은 Dynamic typed language에서는 이것이 문제가 안된다. 그러면 Parrot은 무엇이든 변수에 저장할 수 있는데 왜 명시적인 타입을 가지는 저장소가 필요한가라는 질문이 있을 수 있다. 이것은 경우에 따라 편리하게 더 나은 성능을 얻을 수 있게 하는 장치이며 이것은 Just-in-time(JIT)과 관련이있다. 또 Perl에서는 변수가 어떤때는 숫자 어떤때는 문자를 포함할 수 도 있는데 왜 navtive정수,실수를 내부 타입으로 지원하는가 하는 질문이 있을 수 있는데 이것은 필요할때 Perl6는 효율성을 위해 변수의 타입을 지정할 수 있게 하기 때문이다.
PMC(Parrot Magic Cookie)
PMC는 추상화된 데이터구조로 연산,논리연산,문자열처리 method를 자체적으로 가지는 특별한 내부객체로 생각할 수 도 있으며 이것은 정수,실수,문자열같은 기본 데이터 타입,Hash,Array,객체같은 기능을 포함 할 수 있으며 더 나아가 subroutine,coroutine,closure,continuation 같은것도 PMC로 구현된다.
Vtable
PMC가 객체라면 Vtable은 어떤 호출에 대해서 어떻게 처리해야 할 지를 결정하는 PMC안에 있는 함수 포인터라고 생각하면 된다. 이것은 언어별로 적절하게 구현해서 다양한 언어에서 호출할 수 있도록 한다.
Object System
Parrot의 Object System은 두개의 PMC로 이루어지는데 ParrotObject PMC와 ParrotClass PMC로 구현된다.
Parrot의 PMC는 실제로는 Object Sytem이기 때문에 Parrot을 타켓으로하는 각각의 언어는 자신만의 PMC들을 가질 수 있다.
예를들면 Parrot을 위한 Tcl 컴파일러(ParTcl)는 Tcl의 List를 구현한 TclList라는 PMC를 가진다.
프로그래머는 PMC를 Parrot assembly(PASM)언어로 정의할 수 있다. 또 PIR(Parrot Intermediate Representation)이라는것이 있는데 이것은 PASM보다 한단계 높은 언어로 더 쉽게 작성할 수 있고 세부적인 기능을 가진다.
Continuation Passing Style(CPS) - 계산과정 전달
일반적으로 고전적인 시스템에서는 서브루틴이 호출되면 리턴 주소를 stack에 넣고 인자들을 stack이나 register에 넣고 호출하며 리턴될때 리턴값은 인자를 넣었던 방식으로 다시넣고 리턴되면 다시 그 정보를 이용하여 프로그램 수행을 계속한다. 이런 절차를 간단히 하기위해 만들어진것이 CPS이며. Continuation이란 현재 실행되는 서브루틴의 lexical영역과 control stack등을 snapshot하듯이 저장하고 있는 일종의 객체라고 볼 수 있으며 호출되면 그 상태 그대로 완전히 복구된다.
Exceptions
Parrot은 현대적인 프로그램밍 언어가 가지는 특징인 예외처리를 지원한다.
Native Callling Interface(NCI)
Parrot은 C등으로 작성된 Native한 외부 라이브러리,함수를 쉽게 호출할 수 있게 해주는 인터페이스를 가진다.
Garbage Collection
Parrot은 Garbage Collection을 지원한다. 이것은 사용자가 수동으로 메모리를 확보/해지 할 필요가 없다는 뜻이다.
Parrot이 실행할 수 있는 4가지 format
- PIR (Parrot Intermediate Representation) - 사용자 혹은 컴파일러에 의해 생성되고 사람이 읽고 쓸 수 있게 설계되었으며 예를 들면 함수에 파라메터들이 어떻게 전달되는지 등 저수준의 세부사항을 알 필요가 없이 작성할 수 있게되어있다.
- PASM (Parrot Assembly) - PIR보다 더 로우레벨이나 여전히 사람이 읽고 쓰는것이 가능하다. 하지만 작성자는 호출규약이나 레지스터 할당등을 신경써야 한다.
- PAST (Parrot Abstract Syntax Tree) - Parrot이 Abstract Syntax Tree 스타일의 인풋을 받을 수 있게 해주며 이것은 Compiler를 제작하는데 유용하다.
- PBC (Parrot Bytecode) - 위의 3가지 코드는 자동으로 Parrot 내부에서 PBC로 변환 되며 이것은 Parrot에 있어 machine code와 유사한 것이다.
PCT(Parrot Compiler Toos)
- PGE(Parrot Grammar Engine)
- TGE(Tree Grammar Engine)
History
Last edited on 11/14/2008 11:46 by aero
Comments (0)