컴파일러 중간 언어와 최적화 쉽게 설명해 주실분 계시나요?

조회수 750회

이 중간 언어는 최) 라는게 어떤건지 제가 생각하는게 맞는건가요? 예) 힌두어사용 - 중간 언어 - 한국어

원시 프로그램이 어휘 분석기를 통해서 토큰들로 나누어지고 이 토큰들이 구문 분석기를 통해 파스 트리라는 계층적 구조로 생성된다

심볼 테이블은 컴파일 과정에서 사용자 정의 이름에 대한 타입과 속성을 담아두고 의미 분석기나 코드 생성기에서 사용된다.

의미 분석기에서는 타입이 맞는지 구문 분석기에서 잡지 못한 에러를 검사를 하고 정상이면 중간 코드 생성기를 통해서 중간 언어로 변환

이 중간 언어는 최적화를 거친 후

코드 생성기를 통해 기계적 언어로 변환

이 Object는 링커를 통해 실행파일로.....

이게 맞나요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 맞습니다.

    학부생이면 컴파일러 과목을 배울겁니다. 예전에는 드래곤북이라고 용그림 그려진 서적으로 배웠는데...근래는 모르겠군요.

    컴파일러는 크게 프론트엔드, 벡엔드 이렇게 두 타입으로 나눠집니다.

    예를들어 c언어 소스가 있다면...먼저 렉서를 이용해서 토큰화 시킵니다.

    이렇게 토큰화 된 것을 파서를 이용해서 AST(abstract syntax tree) 로 만듭니다.

    이렇게 하는 이유는 쉽게 말해서 문법 오류를 빨리 찾기 위해서 라고 생각해도 됩니다. 즉 c소스는 그냥 텍스트 파일이고 사람마다 코딩컨벤션이 다양할 것 이므로 기계에서 처리하기 편하게 하는 단계라고 이해하면 됩니다.

    보통 여기까지가 프론트엔드의 역활이라고 생각하면 됩니다.

    프론트엔드 결과 ast를 가지고 중간언어로 변환합니다.

    중간언어라는 것이 이해가 안되는 모양인데...자바의 class 파일을 생각하면 됩니다.

    javac 로 컴파일하면 class 파일이 생성되는데 이것이 전형적인 중간언어입니다.

    이렇게 하는 이유는 최적화하기 용이하고 기계어 생성시 빠르게 처리할 수 있기 때문입니다.

    그다음 중간언어의 결과로 벡엔드를 수행하여 obj 파일을 생성합니다.

    여기서 최적화라는 것은 말 그대로 최적화입니다. 중복된 불필요한 연산을 줄인다던가, 성능상의 잇점이 있는 로직으로 변경한다던가 하는 단계입니다.

    자바에서 jvm 을 벡엔드라고 할 수 있습니다.

    swift나 rust 에서 사용하는 llvm 도 벡엔드입니다.

    llvm 이 이해하는 ir(중간언어) 코드를 만들기만 하면 llvm 을 이용하여 바이너리를 얻을 수 있는 겁니다.

    jvm 도 마찬가지로 중간결과인 class 만 생성해내면 jvm에서 동작시킬 수 있습니다. 그래서 scala, kotlin 이런 언어들은 상대적으로 개발하기 용이한 프로트엔드만 개발하면 되는 겁니다.

  • 생 TEXT를 프로그래밍 할 수는 없죠. 프로그래밍 하기 위해서 생 TEXT를 프로그래밍 구조로 중간에 표현한걸 IR 이라고 보시면 될 것 같아요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)