컴퓨터프로그래밍

브로드 캐스터 - ... 컴파일러의 종류입니다. 변환 및 방송 프로그램

프로그램뿐만 아니라 사람들은 통역 또는 번역을 필요로 하나의 언어에서 다른 언어로 번역 할 수 있습니다.

기본 개념

프로그램은 계산의 언어 표현 : 나 P → P (i)를 →. 인터프리터는 입력 프로그램 P 일부 입력 (X)에 공급되는 프로그램이다. 이 P의 X에서 수행 I (P, X) = P (X). 하나의 번역기가 (공식 시스템에 표시 할 수 있습니다) 모든 가능한 프로그램을 수행 할 수 있다는 사실은 매우 심오하고 중요한 검색 튜링이다.

프로세서는 기계 언어로 프로그램의 인터프리터입니다. 그들은 쉽게 해석 할 수있는 형태로 변환 할 수 있도록, 높은 수준의 언어에 대한 통역을 쓸 일반적으로 너무 비싸다.

번역자의 일부 종류는 매우 이상한 이름을 가지고 :

  • 어셈블러 기계 언어로 어셈블리 언어 프로그램을 변환합니다.
  • 컴파일러는 낮은 언어에 대한 높은 수준의 언어를 변환합니다.

인 P → X → Q., ∀x - 브로드는 모두 동일한 의미를 가지는 방식으로 T 프로그램 일부 언어 S에서 입력 데이터로서 프로그램을 취하여 생성하는 프로그램이다. P (x)는 Q = (X).

해석 무언가로 전체 프로그램을 방송하면, 실행, 또는 AOT 컴파일 전에 컴파일이라고합니다. AOT 컴파일러를 직렬로 사용할 수 있습니다, 후자는 종종 예를 들어 어셈블러입니다 :

소스 코드 컴파일러 → (번역기) → → 어셈블리 코드 어셈블러 (컴파일러) → → CPU 기계 코드 (인터프리터).

다른 미리 컴파일 부에 의해 실행되는 경우, 프로그램이 방송되는 경우, 조작 또는 동적 컴파일이 일어난다. JIT 컴파일러를 다시하고 다시 소스 코드를 반복하지 않도록 이미 한 일을 기억한다. 그들은 심지어 프로그램 실행 환경의 동작에 따라 적응 컴파일과 재 컴파일을 생성 할 수 있습니다.

대부분의 언어는 컴파일 타임에 코드를 실행하여 런타임에 새로운 코드를 컴파일 할 수 있습니다.

번역 단계

방송 분석하고 합성하는 단계를 포함한다 :

대상 코드 → 소스 코드 분석기 → → → 개념 표현 발생기 (신디사이저).

이것은 이러한 이유 때문이다 :

  • 다른 방법은 적합하지 않습니다. 단어 번역은 단순히 작동하지 않습니다.
  • 좋은 엔지니어링 솔루션 : 당신은 오히려 M × N 단지에 비해 단지 M + N 간단한 프로그램 (polukompilyatorov)를 쓸 필요가 대상으로 M과 N 소스 언어에 대한 번역 (번역자의 총)을 작성합니다.

그러나 실제로, 충분한 매우 드물게 표현 충분히 강력한 개념도 생각할 수있는 모든 소스 및 대상 언어를 포함한다. 일부는이 가까이 올 수 있었지만.

실제 컴파일러는 여러 단계를 통해 전달합니다. 자신의 컴파일러를 만들 때 사람들이 표현하고 발전기를 생성하기 위해 수행 한 모든 노력을 반복 할 필요가 없습니다. 당신은 자바 스크립트 또는 C에서 직접 언어를 번역하고 기존의 자바 스크립트 엔진과 휴식을 할 수있는 C 컴파일러를 이용할 수 있습니다. 또한 기존의 중간 표현하고 사용할 수있는 가상 머신을.

기록 번역기

소스, 대상 및 기준 : - 브로드 세 가지 언어를 포함하는 프로그램 또는 하드웨어입니다. 이들은 아래 원래 좌측, 우측 및 타겟 기지국을 배치하는 T 자 형상으로 기록 될 수있다.

컴파일러의 세 가지 유형이 있습니다 :

  • 브로드는 - 그것은 기본 소스 언어에 해당하는 경우 samokompilyator입니다.
  • 언어를 대상으로 컴파일러는 기본이라고 samorezidentnym입니다.
  • 브로드 - 크로스 컴파일러, 그가 목표로하는 경우 기본 다양한 언어.

왜 중요한가?

심지어 이러한 목적을 위해 사용되는 개념은 예를 들어, 널리 사용되기 때문에 당신이 진짜 컴파일러, 그 창조의 기술의 좋은 지식을 결코 경우 :

  • 텍스트 서식;
  • 언어 쿼리 데이터베이스;
  • 고급 컴퓨터 구조;
  • 일반화 된 최적화 문제;
  • GUI를;
  • 스크립트 언어;
  • 컨트롤러;
  • 가상 머신;
  • 기계 번역.

당신이 처리기, 링커, 로더, 디버거 및 프로파일을 작성하려는 경우 또한, 당신은 컴파일러를 작성할 때와 같은 단계를 거쳐야합니다.

또한 언어에 대한 통역의 창조는 복잡하고 모호한의 더 나은 이해를 의미하기 때문에, 더 나은 프로그램을 작성하는 방법을 배울 수 있습니다. 방송의 일반 원칙의 연구는 또한 당신이 좋은 디자이너 언어가 될 수 있습니다. 그래서 어떻게 가파른 효과적으로 이행 할 수없는 경우 언어 문제가 무엇입니까?

종합 기술

컴파일러 기술은 컴퓨터 과학의 다양한 분야를 다루고 있습니다 :

  • 언어의 형식적인 이론 : 문법, 구문 분석, 계산 가능성,
  • 컴퓨터 아키텍처 :. 명령어 세트, RISC 또는 CISC, 파이프 라인 처리 코어 클록주기 등;
  • 프로그래밍 언어의 개념은 예를 들어, 시퀀스 제어, 조건부 실행, 반복, 재귀 기능 분해, 모듈화, 동기화 메타 프로그래밍 범위 일정 서브 타입, 템플릿 출력 형, 원형, 주석 흐름 모나드 사서함을 수행 계속 와일드 카드, 정규 표현 등 등 트랜잭션 메모리, 상속, 다형성, 모드 설정,..;
  • 추상적 인 언어와 가상 머신;
  • 알고리즘 및 데이터 구조 : 정규식 파싱 알고리즘 그래픽 알고리즘, 동적 프로그래밍, 훈련;
  • 프로그래밍 언어 : 구문 (정적 및 동적) 의미론지지 패러다임 (구조, OOP, 기능, 논리, 스택, 병렬 메타 프로그래밍);
  • 생성 소프트웨어 (보통 크고 복잡한 컴파일러) 제이션, 캐싱 컴포넌트 화, API-인터페이스 재사용 동기화.

컴파일러 디자인

실제 번역기의 개발에서 발생하는 문제 중 일부 :

  • 소스 언어 문제. 그것을 컴파일 할 쉽게 사용할 수 있나요? 프리 프로세서가 있습니까? 어떻게 유형은? 도서관이 있습니까?
  • 컴파일러 패스를 그룹화 : 단일 또는 다중 방법은?
  • 최적화의 정도는 원하는. 거의 또는 전혀 최적화와 빠른 속도와 부정한 방송 프로그램은 정상이 될 수 있습니다. 오버 최적화 컴파일러는 둔화되지만, 런타임에 더 나은 코드는 가치가있을 수 있습니다.
  • 오류 검출의 필요 정도. 번역자는 첫 번째 오류에서 중지 할 수 있습니까? 그것은 중지해야합니까? 컴파일러 오류 정정을 신뢰할지 여부?
  • 도구의 가용성. 원래 언어가 매우 작은 수없는 경우, 스캐너 및 발전기 분석기가 필요합니다. 이 발전기, 코드 생성기는하지만, 그들은 그렇게 흔한되지 않습니다.
  • 대상 코드의 종류를 생성합니다. 순수 보충 또는 가상 머신 코드에서 선택하십시오. 또는 바로 그런 LLVM, RTL, 또는 JVM과 같은 인기있는 중간 표현을 생성하는 항목 부분을 작성합니다. 또는 C 또는 자바 스크립트의 소스 코드에서 원본의 번역을합니다.
  • 대상 코드의 형식입니다. 당신은 선택할 수 있습니다 어셈블리 언어, 휴대용 컴퓨터 코드, 기계 코드의 메모리 이미지를.
  • 리 타겟팅. 발전기 세트가 양호 할 경우 공통 입구 부분을 가지고있다. 이러한 이유로 많은 부분의 입력에 대해 하나 개의 발전기를하는 것이 가장 좋습니다.

컴파일러 아키텍처 : 구성 요소

다음은 (출력 프로그램이 C 또는 가상 머신에서 프로그램 인 경우, 당신은하지 너무 많은 단계가 필요합니다) 네이티브 코드를 생성하는 컴파일러의 주요 기능 구성 요소 :

  • 입력 프로그램 (플로우 마크)의 토큰 스트림으로 변환 스캐너 (어휘 분석기)로 공급된다.
  • 하나의 추상 구문 트리를 구성하는 파서 (파서).
  • 시맨틱 분석기는 의미 정보를 분해 및 오류에 대한 트리 노드를 확인합니다. 추가 특성과 설립 링크와 함께 추상 구문 트리 - 그 결과, 의미 그래프를 만들었습니다.
  • 중간 코드 생성기 (튜플 메인 블록들로 그룹화된다) 플로우 그래프를 구축한다.
  • 기계 독립적 인 코드 최적화는 기본적으로 루틴 내에 남아있는 (기본 단위 내에서) 로컬 및 글로벌 (모든 블록에) 최적화를 모두 실시하고 있습니다. 중복 코드를 줄이고 계산을 단순화합니다. 그 결과, 변형 된 흐름 그래프이다.
  • 생성기 (아마도 비효율적) 오브젝트 파일 어셈블러 가상 레지스터를 생성 직선 송신 제어 코드로 타겟 코드 기본 블록을 결합한다.
  • 기계에 의존 최적화, 링커는 레지스터와 메모리를 할당하고 계획하는 팀이 있습니다. 그것은 파이프 라인의 좋은 사용하여이 어셈블리에서 어셈블리 언어의 변환 프로그램을 수행한다.

또한, 에러 검출 서브 시스템 관리자와 심볼 테이블의 사용.

어휘 분석 (주사)

스캐너는 토큰, 제거 공백, 주석 및 확장 매크로의 스트림으로 스트림 소스 문자로 변환합니다.

스캐너는 종종 고려 경우, 여백, 줄 바꿈 및 임베디드 의견을할지 여부 등의 문제를 발생합니다.

스캔 중에 발생할 수있는 오류, 어휘라고하며 다음과 같습니다 :

  • 알파벳에없는 문자;
  • 단어 나 라인의 문자 수를 초과하는;
  • 하지 폐쇄 기호 또는 문자열 리터럴;
  • 코멘트에서 파일의 끝.

파싱 (구문 분석)

파서는 추상 구문 트리에 토큰의 순서를 변환합니다. 트리의 각 노드는 스스로 트리 노드 이는 많은 이름 필드의 오브젝트로 저장됩니다. 이 단계에서 더 사이클이 없습니다. 당신이 만들 때 파서는 문법 (LL 또는 LR)의 복잡성 수준에주의하고 규칙 동음이 있는지를 확인하는 것이 필요하다. 일부 언어는 의미 분석을 필요로 않습니다.

이 단계에서 발견 된 오류는 구문이라고합니다. 예를 들면 :

  • K = 5 * (7 - Y;
  • J = / 5;
  • X = 56 * 4.

의미 분석

동안 의미 론적 분석 파스 트리 규칙과 연관 부품의 허용 가능성을 확인하기 위해 (내재 형 전환 동작을 삽입 참조 명을 허용 등등. D.) 시맨틱 그래프를 형성.

물론, 여러 다른 언어 규칙의 허용 성 세트. 당신은 자바와 같은 언어를 컴파일 할 경우, 컴파일러는 찾을 수 있습니다 :

  • 그 범위 내에서 여러 변수 선언;
  • 선언 전에 변수에 대한 참조;
  • 선언되어 있지 않은 이름에 대한 참조;
  • 특허권의 침해;
  • 메소드 호출의 인수 과도하거나 불충분 번호;
  • 형식이 일치하지 않습니다.

세대

중간 코드 생성은 기본 블록으로 그룹화 튜플 이루어지는 흐름 그래프를 생성한다.

코드 생성은 실제 기계 코드를 생성합니다. 첫 번째 단계에서 RISC-시스템에 대한 기존의 컴파일러에서는 가상 레지스터의 무한한 수의 어셈블러를 만들 수 있습니다. CISC-기계를 위해 아마 일어나지 않을 것입니다.

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 ko.delachieve.com. Theme powered by WordPress.