문제

Ruby, Perl 또는 PHP에서와 같이 프로그램에 대해 바이트 코드가 생성되지 않는다고 가정 해 봅시다.이 경우 실행이 1 행 1에 다시 도달 할 때마다 아래 줄 1 행이 다시 해석 되었습니까?

while ($indexArrayMoviesData < $countArrayMoviesData + $countNewlyAddedMoviesData) {
  # do something
}

즉, 루프가 100,000 번 실행되면 해당 라인이 100,000 번 다시 해석됩니다.

그렇다면 바이트 코드 생성은 HE 프로그램의 초기 시작뿐만 아니라 실행 중에도 도움이됩니까? (코드를 다시 상호 해석 할 필요가 없기 때문에)

도움이 되었습니까?

해결책

일반적으로 바이트 코드로 변환되면 바이트 코드가 실행됩니다.

그러나 예를 들어 PHP의 경우 바이트 코드는 모든 요청/페이지보기에서 재생됩니다. 바이트 코드 (또는 PHP의 경우 자주 호출되는 Opcode) 캐시 (예 : Xcache, APC 또는 Eaccelerator)를 설치하지 않는 한.

다른 팁

Perl을 포함한 최근 언어의 경우 코드가 실행되기 전에 사전 컴파일됩니다. 따라서 대부분의 분석 작업은 한 번만 수행됩니다.

이것은 쉘의 경우가 아닙니다. 쉘은 모든 줄을 실행할 때마다 해석합니다.

통역사가 합리적이면 루프 중에 $ countarraymoviesData 또는 $ countnewlyAddedMoviesData가 변경되었는지, 그렇지 않은 경우 합계를 계산하고 유지할 수 있는지 확인합니다.

루프 내에서 값이 업데이트되면, 바이트 코드조차도 추가 작업을 수행하려면 더 효율적이지 않습니다.

매우, 통역사가 거의하지 않을 것입니다. 예를 들어, 나이가 많고 더 이상 하이퍼 카드에 사용되지 않는 하이퍼 카드 통역사가 실제로 코드의 텍스트를 프로그래밍 방식으로 다시 작성할 수 있습니다 (단지 문자열 일뿐입니다!).

바이트 코드를 생성하지 않는 통역사조차도 코드를 먼저 구문 분석 할 수 있습니다. 한 줄씩 해당 라인을 수행하기가 어렵고 한 번에 모든 작업을 수행하기가 훨씬 쉽기 때문입니다. 따라서 정말 간단한 통역사는 기본적으로 트리가 있으며, 두 어린이가있는 "곳"루프에 대한 노드 : 조건부에 대한 "표현보다 적은"표현, 루프 본체에 대한 하나의 블록이 있습니다.

모든 컨설턴트가 알고 있듯이 귀하의 질문에 대한 답은 "의존적입니다"입니다.

해석 된 언어에서는 그 선이 매번 재 해석 될 수 있습니다. 나는 대부분의 껍질이 대략 이런 식으로 처리한다고 생각합니다.

기본의 원래 버전도 이런 식으로 수행했습니다.

대부분의 현재 통역사는 할 것입니다 적어도 텍스트를 매번 재조정 할 필요가 없도록 언어를 토큰 화하십시오. 즉, 기본적인 프로그램과 같은 프로그램입니다

 00010 LET A=42
 00020 DO WHILE A > 0
 00025    LET A = A - 1
 00030 ENDDO

키워드에 대해 최소한 작은 토큰으로 변환하고 변수의 주소로 변환합니다.

 LET    $0003, 42
 LABEL  00020 
 LETEST A, 0
 IFTRUEGOTO   00030
 SUB    $0005, $0003, 1
 GOTO   00020
 LABEL  00030

변환의 상류의 각 단어는 내부적으로 단일 정수입니다. 이렇게하면 변환하기위한 단일 어휘 분석 패스가 있으며, 통역사는 토큰 값을 해석 할 수 있습니다.

물론, 당신이 그렇게 멀리 가면, 당신은 "Gee, 왜 실제 opcodes를 사용하지 않습니까?"라고 생각합니다.

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