JVM 학습 - (F) 프런트 엔드 컴파일 및 최적화

JVM 학습 - (F) 프런트 엔드 컴파일 및 최적화

: 장군은 "컴파일"는 세 가지 주요 측면을 참조 할 수 있습니다 상대적으로 넓은 개념 말했다
1️⃣ 프런트 엔드 컴파일러. 그것은을 .class 파일 변환 프로세스로 된 .java 파일을 참조.
2️⃣ 시간 컴파일러. 이는 차례로 시스템 코드에 바이트 코드의 동작 과정을 의미한다.
3️⃣ 사전 컴파일러. 직접 기계 명령어의 대상 세트와 연관된 바이너리 코드로 컴파일.
최적화 코딩 효율이 프로그래머와 언어 사용자의 행복에 주로 대상으로, 기본적으로 더 여기 효율 조치의 최적화를위한 때문에 여기에 주로 프런트 엔드 컴파일러를 의미하지 않는다.

.javac 컴파일러

JDK보다 표준 라이브러리를 사용하는 것을 제외하고 javac 컴파일러 자체가, 그것은 단지 SRC / 주 / 클래스 / COM /를 의미 일 / * 전체 구조의 javac의 코드의보기에서, 코드, 컴파일 과정은 준비로 나눌 수 있습니다 즉 프로세스와 세 :
1️⃣ 제조 과정 : 주석 플러그 프로세서를 초기화.
공정 2️⃣ 심볼 테이블 및 채우기 구문 분석 :
1. 어휘, 구문 분석, 마커의 문자 세트, 추상 구문 트리 구조로 흐른다. 심볼 테이블 채우기 2. 심볼 주소와 기호 신호가 생성된다.
주석 처리 3️⃣ 주석 플러그 프로세서 : 주석 플러그 프로세서의 실행 스테이지. 만 여기에 당신은 DIY 할 수 있습니다.
4️⃣ 바이트 코드 분석 및 생성 과정에있어서,
레이블을 확인하십시오. 2. 흐름 제어 흐름 분석 데이터. 3. 문법적 솔루션입니다. 4. 바이트 코드 생성.
* 참고 : 3 단계는 새 심볼을 생성 한 경우, 2 단계에서 다시 시작해야합니다.
: 전체 컴파일 과정은 다음과 같이 요약 할 수있다
(제조 방법) : 주석 초기화 프로세서 플러그 - 1.1 공정 : 어휘 분석, 구문 분석 - 1.2 공정 : 기호 테이블에 입력 - 처리 2 : 주석 처리 실행 과정 - 3.1 라벨링 - 3.2 프로세스 : 데이터 흐름 - 3.3 방법 : 솔루션 문법 설탕을 - 3.4 과정 : 생성 바이트 코드를

심볼 테이블 및 채우기 해결

① 형태는 구문 분석
어휘 분석 소스 코드 마커 수집 프로세스에 문자 스트림을 지칭한다. 프로그램을 작성하고 표시가 가장 작은 요소 컴파일 시간 때 문자는 가장 작은 요소입니다.
구문 분석 프로세스는 추상 구문 트리 구성의 토큰의 순서입니다.
추상 구문 트리의 프로그램 표현의 트리 구조를 설명하는 데 사용되는 코드의 구문은, 각각의 노드는 프로그램 코드의 문법 구조를 나타낸다.
② 충진 심볼 테이블
심볼 테이블의 데이터 구조의 세트 및 심볼 이루어지는 기호 주소 정보이다. 출력 프로세스 대기 목록의 제품입니다.

2. 주석 프로세서

JDK6 후 특정 컴파일러 코드 주석 처리로 고급 될 수있다 "플러그인 주석 프로세서"라는 표준 API 세트를 디자인했다. 그것은 플러그인 작업이, 수정, 추상 구문 트리의 요소를 추가, 읽을 수 있도록 컴파일러 플러그인의 집합으로 볼 수있다.

3. 시맨틱 분석은 바이트 코드를 생성

시맨틱 확인 : 컨텍스트에 대한 추상 구문 트리와 같은 올바른 소스 상관 특성 확인 : 제어 흐름을 점검 입력 검사 데이터를 검사 흐른다.
① 체크 레이블이
포함 된 앞 또한 작은 최적화 상수 폴딩이라고 포함 이미 선언 된 변수, 데이터 유형 및 변수 간의 할당 일치가 있습니다.
② 데이터 및 제어 흐름 분석
되는 프로그램 로직 상기 콘텍스트 확인한다. 모든 제대로 등의 예외 처리를 선택하고있는 경우, 예를 들어 로컬 변수는, 각 경로에있어서의 리턴 값을 가지고 있는지, 사용 전에 할당 여부를 확인, 클래스로드시 데이터 및 제어 흐름의 기본 기능을 볼 수있다 비슷한 분석.
예를 들어, 최종 수정 된 로컬 변수 클래스 파일에서 통상의 로컬 변수이 표현식의 동작에 동일 효과없고, 따라서 유의해야하는 데이터 및 제어 흐름 분석에 오류 유형.
솔루션 문법 설탕 ③
생성 ④ 바이트 코드
만 생성 된 정보를 디스크에 기록 된 바이트 코드의 지시에 (문법의 숫자, 심볼 테이블)의 각 단계의 앞에 컴파일러는 코드 변환 작업의 작은 금액을 추가합니다.
이러한 (AS) 및 클래스 생성자 메소드 강도 생성자를 생성하는 방법.

II. 통사 설탕

문법 설탕 상당한 향상을 제공 할 수 있지만, 효율성을 증가 엄격 문법을 개선하거나 코드가 오류의 가능성을 줄일 수 있습니다.

1. 일반

매개 변수 또는 다형성의 매개 변수 유형의 일반 특성.
①java 및 C # 일반적인
선택의 C # 자바 일반적인 소위 "와이퍼 스타일의 일반적인 유형은" "일반적인 공식을 인스턴스화." 프로그램 소스 코드 내부 중 내부 C #을 제네릭, 중간 언어 표현이나 CLR 컴파일 된 런타임 내부 진짜. 소스 코드에서 자바 언어 일반적인에만 존재는, 일반의 모든 원래의 바이트 코드 노출 된 형태로 대체됩니다.
둘 사이의 비교 :
1️⃣C # 제네릭, 효과의 사용은 여전히 여부를 운용 효율 (클래스 래퍼 자격의 수많은 구조로 이어질 것 때문에 주로 자바 제네릭의) 일반 자바의 전반적인 선두 주자입니다.
유일한 장점은 javac 컴파일러에 개선을해야 2️⃣java 제네릭 제네릭을 달성하는 것입니다. 자바의 기록 요소 (완전한 백 워드 호환성) 자바 제네릭 결과 어디 만이 방법에 사용될 수있다.
제네릭 형식의 정보를 실행할 수 없습니다 3️⃣java 일반적인 때문에 일부 코드가 매우 지루하게합니다.
②java 손실의 우아한 객체 지향 코드 유형
매개 변수가 제네릭 모두와 반환 값이 동일한 경우 일반적인 유형이 후 컴파일되어 있기 때문에 일반적인 만남 과부하,이 코드가 실행 컴파일되지 않습니다 이것은 오버로드 될 수없는 두 개의 동일한 방법 결과 닦는다.
리턴 값의 두 가지 종류가 있지만, 이러한 클래스 파일에 공존 할 수 있기 때문에 서로 다른 리턴 값의 첨가 오버로드 될 수있는 경우에는, 서명 방법은 포함하는 코드 서명 바이트 레벨 특성을 저장하는 데 반환 값. 만 JDK6에서 컴파일 할 수 있습니다.
자동 탐색 사이클 ③ 박스가
"=="포장 상황 연산 발생하지 않으면 동작 및 데이터 타입 변환 프로세스의하지 입력란 것 같다하지 않도록주의해야한다.
* 정수를 사용하는 시도가 비교 [-128,127] = 데이터 만 비교하기 때문에 동일하다.
④ 조건부 컴파일
조건이 컴파일시에 제거됩니다 코드에 만족하지 않고, 바이트 코드는이 코드에 존재하지 않습니다.

출시 여섯 개 원래 기사 · 원 찬양 2 · 조회수 281

추천

출처blog.csdn.net/jacobbbbbbbb/article/details/104228064