문제

나는 프로그래밍 언어가 어떻게 작동하는지 조사해 왔으며 그중 일부는 소위 가상 머신을 가지고 있습니다. 나는 이것이 다른 프로그래밍 언어 내에서 프로그래밍 언어의 어떤 형태의 에뮬레이션 형태이며, 스택으로 컴파일 된 언어가 어떻게 실행되는지처럼 작동한다는 것을 이해합니다. 내가 맞았 어?

내가 한 조항을 사용하여, Bamboozzes가 저를 비난하는 것은 많은 비 컴파일 언어가 "자유주의"유형 시스템으로 변수를 허용한다는 것입니다. 예를 들어 파이썬에서는 다음을 쓸 수 있습니다.

x = "Hello world!"
x = 2**1000

문자열과 큰 정수는 완전히 관련이 없으며 메모리에서 다른 양의 공간을 차지합니다. 그렇다면이 코드는 스택 기반 환경에서 어떻게 표현 될 수 있습니까? 여기서 정확히 어떻게됩니까? X는 스택에서 새로운 장소를 가리키고 이전 문자열 데이터가 참조되지 않습니까? 이 언어는 스택을 사용하지 않습니까? 그렇지 않다면 어떻게 변수를 내부적으로 표현합니까?

도움이 되었습니까?

해결책

아마도 당신의 질문은 "어떻게 동적 언어 일하다?."

간단합니다. 변수 유형 정보를 메모리에 저장합니다. 그리고 이것은 해석 된 언어 또는 JIT 컴파일 언어뿐만 아니라 Objective-C와 같은 기본적으로 컴파일 된 언어로 수행됩니다.

다른 팁

대부분의 VM 언어에서 변수 자체가 스택에 있더라도 변수는 힙의 메모리에 대한 포인터 (또는 참조)로 개념화 될 수 있습니다. 원시 유형 (예 : Java의 int 및 bool)이있는 언어의 경우 스택에도 저장 될 수 있지만 새로운 유형을 동적으로 할당 할 수는 없습니다.

원시 유형을 무시하면 스택에 존재하는 모든 변수에는 실제 값이 힙에 저장되어 있습니다. 따라서 값을 동적으로 재 할당하면 원래 값이 포기되고 (일부 쓰레기 수집 알고리즘을 통해 메모리가 정리) 새로운 값이 새로운 메모리에 할당됩니다.

VM은 언어와 관련이 없습니다. 모든 언어는 VM 위에 실행될 수 있습니다 (Java VM에는 이미 수백 개의 언어가 있습니다).

VM을 사용하면 다른 종류의 "어셈블리 언어"를 실행할 수 있습니다. VM에서 수행 된 모든 것은 CPU에서 수행 할 수 있으므로 VM을 CPU처럼 생각하십시오. (일부는 실제로 하드웨어로 구현됩니다).

레벨이 매우 낮으며 많은 경우 레지스터 기반이 많을수록 기계 수준 수학은 모두 현재 스택 포인터에 비해 위치에 비해 적용됩니다.

정상적인 컴파일 언어를 사용하면 단일 단계에 많은 지침이 필요합니다. a +는 "스택 포인터와 관련된 지점에서 스택 포인터에 대한 항목을 Reg a로 가져 가고 다른 사람을 Reg에 가져옵니다. reg a와 b를 추가하십시오. reg a를 스택 포인터와 관련하여 reg a를 넣으십시오.

VM은 단일의 짧은 명령어로, 기계 언어 (32 또는 64 비트 아키텍처에 따라)에 따라 4 또는 8 바이트 대신 1 ~ 2 바이트 대신 1 ~ 2 바이트 대신 X86의 약 16 또는 32 바이트를 의미해야합니다. 기계 코드의 1-2 바이트. (나는 틀릴 수 있습니다. 마지막 x86 코딩은 80286 시대였습니다.)

Microsoft는 사무실 제품에서 VM을 사용하여 코드의 양을 줄였습니다.

VM 코드를 작성하는 절차는 기본적으로 다른 프로세서 유형 인 기계 언어를 만드는 것과 동일합니다.

VMS는 또한 언어와 매우 밀접하게 관련된 자체 보안, 오류 복구 및 메모리 메커니즘을 구현할 수 있습니다.

여기에 내 설명 중 일부는 요약과 메모리입니다. 바이트 코드 정의를 직접 탐색하고 싶다면 재미 있습니다.

http://java.sun.com/docs/books/jvms/second_edition/html/instructions2.doc.html

많은 'VM이 이와 같은 변수를 처리하는 방법 또는'실제로 메타 데이터로 내려 오는 방법에 대한 핵심은 ... 저장된 메타 정보와 업데이트 된 메타 정보는 VM에 할당 한 다음 올바른 작업을 수행하는 방법을 훨씬 더 잘 처리합니다. 변수.

많은 경우에 이것은 실제로 성능을 방해 할 수있는 오버 헤드 유형입니다. 그러나 현대 구현 등은 옳은 일을하는 데 먼 길을 왔습니다.

특정 질문에 관해서는 - 변수를 바닐라 객체 등으로 취급하는 것 ... 새로운 과제에 대한 메타 정보를 재 할당 / 재평가하는 데 따른 것입니다. 그래서 X는 한 방향으로 볼 수있는 이유입니다.

귀하의 질문의 일부에 답하기 위해 Google Tech는 Python에 대해 이야기합니다, 동적 언어에 관한 질문에 대한 답변이있는 경우; 예를 들어 변수가 무엇인지 (포인터 나 참조가 아니라 Python A 라벨의 경우).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top