Perl 가상 머신
Perl virtual machinePerl 가상 시스템은 Perl 언어로 작성된 이전에 컴파일된 프로그램을 실행하는 운영 코드 인터프리터로 구현된 스택 기반 프로세스 가상 시스템입니다.opcodes interpreter는 Perl 인터프리터의 일부이며, 1개의 실행 파일에 컴파일러(렉서, 파서 및 옵티마이저)가 포함되어 있습니다.일반적으로 다양한 Unix 계열 시스템에서는 /usr/bin/perl, Microsoft Windows 시스템에서는 perl.exe가 포함됩니다.
실행
동작 코드
Perl 컴파일러는 컴파일된 프로그램을 내부 구조로 메모리에 출력합니다.이 구조는 각 노드가 opcode를 나타내는 트리 그래프로 나타낼 수 있습니다.opcode는 내부적으로 typedef로 표시됩니다.각 opcode에는 다음 / 기타 및 첫 번째 / 형제 포인터가 있으므로 opcode 트리는 루트 노드에서 시작하는 기본 OP 트리 또는 일반적으로 시작 노드에서 실행되는 순서대로 플랫 OP 목록으로 그릴 수 있습니다.Opcodes 트리는 소스 코드에 매핑할 수 있으므로 높은 수준의 소스 [1]코드로 디컴파일할 수 있습니다.
Perl의 opcodes interpreter는 다음 포인터 또는 다른 포인터에 이어 시작 노드에서 실행 순서로 opcode 트리를 이동하는 트리 워커로 구현됩니다.각 opcode는 pp_opname 함수에 대한 함수 포인터를 가진다.즉, say opcode는 내부 Perl API의 pp_say 함수를 호출한다.
Perl 프로그램의 컴파일 단계는 최종 사용자에게는 표시되지 않지만 B:와[2] 같이 B Perl 모듈 또는 기타 특수 모듈로 노출될 수 있습니다.간결한 Perl [3]모듈
실행 순서대로 덤프된 단순한 컴파일된 Hello 월드 프로그램의 예(B::::)간결한 Perl 모듈):
$ perl - MO = Hello , - exec - E ' say " Hello , world " 1 < 0 > 2 < ; > nextstate ( main 46 - e : 1) v : % > { 3 < 0 > pushmark s 4 < $ > const [ PV " Hello , world ! > " s 5 <@ > > ref [ 1 >
일부 opcode(초기, dofile, required)는 Perl 컴파일러 함수를 호출하여 동일한 Perl 가상 머신에 다른 opcode를 생성합니다.
변수
Perl 변수는 global, dynamic(local 키워드) 또는 lexical(my 및 키워드) 중 하나입니다.
글로벌 변수는 stash 및 해당 typeglob을 통해 액세스할 수 있습니다.
로컬 변수는 글로벌 변수와 동일하지만 savestack에 값을 저장하고 나중에 복원하기 위해 특별한 opcode가 생성됩니다.
어휘 변수는 패드리스트에 저장됩니다.
데이터 구조
Perl VM 데이터 구조는 내부적으로 typedef로 표시됩니다.
내부 데이터 구조는 B Perl[2] 모듈 또는 Devel과 같은 다른 특수 도구를 사용하여 검사할 수 있습니다.Peek Perl [4]모듈
데이터형
Perl에는 Perl의 세 가지 주요 데이터 유형인 스칼라 값(SV), 어레이 값(AV), 해시 값(HV)을 처리하는 세 가지 타입이 있습니다.Perl은 Simple Signed Integer Type(IV; 단순 부호 있는 정수 유형), Unsigned Integer(UV; 부호 없는 정수), Floating Point Number(NV; 부동 소수점 번호) 및 String(PV; 문자열)에 대해 특별한 typedef
Perl은 참조 수 중심의 가비지 수집 메커니즘을 사용합니다.SV, AV 또는 HV는 참조 카운트 1부터 수명을 시작합니다.데이터 값의 참조 카운트가 0으로 떨어지면 데이터 값이 파괴되고 메모리를 재사용할 수 있게 됩니다.
기타 유형 정의에는 다양한 개체에 대한 이름 있는 참조를 포함하는 Glob Value(GV), Perl 서브루틴에 대한 참조를 포함하는 Code Value(CV), I/O Handler(IO), 정규 표현에 대한 참조(REGEXP; Perl의 RV 5.11 이전 버전), 컴파일된 레코드 형식의 참조(FM) 등이 있습니다.다른 데이터 타입(RV)에 액세스 합니다.
저장하다
특수 해시 값은 패키지 내에 정의된 모든 변수를 포함하는 해시입니다.이 해시 테이블의 각 값은 Glob Value(GV)입니다.
패드 리스트
Special Array Value는 배열 배열인 패드리스트입니다.서브루틴 내에서 사용되는 모든 어휘 변수 이름(프리픽스 기호 포함)을 포함하는 AV에 대한 0번째 요소.패드 리스트의 첫 번째 요소는 스크래치 패드 AV를 가리키며, 이 요소에는 0번째 행에 명명된 어휘 변수에 해당하는 값이 포함됩니다.서브루틴이 재귀하거나 새 스레드가 생성될 때 패드리스트의 다른 요소가 생성됩니다.
스택
Perl에는 작업 중인 것을 저장하는 스택이 많이 있습니다.
인수 스택
인수는 opcode로 전달되며 인수 스택을 사용하여 opcode에서 반환됩니다.인수를 처리하는 일반적인 방법은 인수를 스택에서 꺼낸 후 결과를 스택으로 되돌리는 것입니다.
마크 스택
이 스택은 각 함수가 사용할 수 있는 인수 스택 내의 위치에 북마크를 저장하기 때문에 함수가 인수 스택 전체를 가져올 필요는 없습니다.
스택 저장
이 스택은 동적으로 범위가 지정된 로컬 변수의 값을 저장 및 복원하기 위해 사용됩니다.
스코프 스택
이 스택은 실제 범위에 대한 정보를 저장하며 디버깅 목적으로만 사용됩니다.
기타 구현
Perl 언어 및 Perl 가상 시스템에 대한 표준화는 없습니다.내부 API는 안정적이지 않은 것으로 간주되며 버전에 따라 변경됩니다.Perl 가상 시스템은 컴파일러에 밀접하게 연결되어 있습니다.
가장 잘 알려진 가장 안정적인 구현은 B::C Perl[5] 모듈입니다.이 모듈은 운영 코드 트리를 C 프로그래밍 언어로 변환하고 자체 트리 워커를 추가합니다.
또 다른 실장은 Acme입니다.Perl::VM Perl[6] 모듈은 Perl 언어로만 코드화된 구현이지만 B:: 모듈을 통해 원래 Perl 가상 머신과 연결되어 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ "B::Deparse - Perl compiler backend to produce perl code".
- ^ a b "B - The Perl Compiler Backend".
- ^ "B::Concise - Walk Perl syntax tree, printing concise info about ops".
- ^ "Devel::Peek - A data debugging tool for the XS programmer".
- ^ "B::C - Perl compiler's C backend".
- ^ "Acme::Perl::VM - A Perl5 Virtual Machine in Pure Perl (APVM)".