컴파일러(Compiler)와 인터프리터(Interpreter)의 정확한 정의..
이번학기 프로젝트에 대한 개괄적인 설명이
Source Code 를
Compiler를 거쳐서 object 파일을 만들고
이것을
Assembler를 거쳐서 machine code로 만들고
이것을
Interpreter을 만들어서 실행시키는것
인데요..
목적은 ,이 과정에서
compiler , assembler, Interpreter를 만드는것입니다.
각각의 정확한 정의에 대해 혼란이 생겨서
맞다고 생각되는 정의를 찾아봤는데요..
[컴파일러]
고급언어로 쓰여진 프로그램을 그와 의미적으로 동등하며
컴퓨터에서 즉시 실행될 수 있는 형태의 목적 프로그램으로
바꾸어 주는 번역 프로그램.
[어셈블러]
사용자가 다루기 쉬운 어셈블리언어로 작성된 원시프로그램을
컴퓨터가 직접 이해(인식)할 수 있는 기계어로 작성된 목적프로그램(기계어프로그램)으로 번역 처리하는
언어처리계>의 하나이다.
[인터프리터]
인터프리터는 고급언어로 작성된 원시코드 명령문들을 한번에
한 줄씩 읽어들여서 실행하는 프로그램이다
이상인데요..
핵심만 보자면
컴파일러의 은 원시코드 -> 실행파일이고
어셈블러도 어셈코드 -> 실행파일
인터프리터는 원시코드 -> 바로실행
이 개념인데요..이게 맞다면
위의 프로젝트의 개괄은..
너무 이상한것 아닌가요?
ps :
컴파일러를 컴파일러 + 링커 로 합쳐서 보지 않는 경우도 있는거 같은데요. 이 정의가 의해서 본다고 하더라도
컴파일러의 결과물 object 파일을 어셈블 한다는게 이상하지 않으세요? 그 결과물을 인터프리터가 받는것도 이상하구요..
너무 혼란스럽네요..
설명부탁드립니다.
compiler가 object 파일 대신 assembly 파일을 반환하는
compiler가 object 파일 대신 assembly 파일을 반환하는 것 아닌가요? 어셈을 결과로 반환하는 컴파일러는 종종 봤는데요.
기계어를 실행하는 인터프리터면 가상머신이군요 (..)
- 죠커's blog / HanIRC:#CN
어셈블리 언어는 기계어와 거의 1:1로 대응되지만, 프로그래밍 언어는 실
어셈블리 언어는 기계어와 거의 1:1로 대응되지만, 프로그래밍 언어는 실제 구현과 추상적 구현이 독립되어 있을 수 있습니다.
컴파일러와 인터프리터의 가장 적합한 비유는, 번역과 통역이라 할 수 있습니다. 일단 번역해 놓으면 추가적인 노력 없이 산출된 결과물을 계속 사용할 수 있습니다. 반면에 통역의 경우에는 매번 그때그때 변환하지 않으면 안됩니다.
보통 컴파일러 관련 과목을 배울때는, x86 직접 기계어 코드를 만들기보다는 예전의 하드웨어나 가상의 하드웨어를 가정하여 수업하는 경우가 많다고 알고 있습니다.
아마도 위의 프로젝트에서 compiler는 중간 결과물(e.g. obj파일)을 만드는 일을 하고 assembler는 그 중간 결과물에서 기계어 코드를 만들어내는 역할을 하며, interpreter는 그 기계어 코드를 현재의 기계 위에서 돌릴 수 있도록 에뮬레이션하는 역할을 하겠죠.
compiler는 프로그래밍 언어를 분류할 때 쓰기도 하지만, 컴파일 할 때 거치는 과정인 preprocessing, compilation, assembly, linking 중의 한 단계를 수행하는 프로그램을 말할 때 쓰이기도 합니다. 리눅스 프롬프트 상에서 man gcc 해보면 약간이나마 도움이 되지 않을까 합니다.
답변감사합니다.
그렇군요..
컴파일러 = 번역,
인터프리터 = 통역..
이개념으로 보면 이해가 되네요..
컴파일러의
Output이 반드시 실행파일이어야 한다는것이 아니군요..
답변 감사합니다..
컴파일러,어셈블러,인터프리터모두 구문 해석기를 가지고 있습니다.
컴파일러,어셈블러,인터프리터
모두 구문 해석기를 가지고 있습니다.
하지만 컴파일러나 어셈블러 자체가 실행파일을 만들지 않습니다.구문해석 및 목적파일 또는 맵 생성기 정도로 보시면 되겠습니다.
인터프리터는 일부구문해석과 동시에 결과물이 보여지는 것과 전체구문해석후 결과물이 보여지는것이 있습니다.
이상 짧은 지식이었습니다.
추가질문입니다.
컴파일러책에 나온 정의는
컴파일러 :
어떤 언어(Source Language)로 스여진 프로그램을
입력으로 받아 들여서 대등한 다른언어(Target Language)의 프로그램으로 바꿔주는 프로그램이다. [주로 최종언어(Target Language)는 소스 언어(Source Language)가 아닌 다른 어떤 프로그래밍 언어이거나 , 어떤 컴퓨터의 기계어 일것이다.]
라고 나와있습니다.
인터프리터 :
번역에 의해 목적 프로그램을 만들어 내는 대신 소스 프로그램이 담고있는 연산을 수행하는 것이 인터프리터이다.
이러한 정의를 기준으로 언어처리과정의 한 예을 살펴봤을때
골자가 되는 Source Program
-> 1.Preprocessor(output:소스프로그램)
-> 2.Compiler(output:목적 어셈블리프로그램)
-> 3.Assember(output:재배치 가능 기계코드)
-> 4.Link-Editor / 5.Loader
결과 : 절대 기계 코드
위에서도 알려주셨듯이
preprocessing, compilation, assembly, linking 중의 한 단계를 수행하는 것을 컴파일러라고 한다는 것에 의해
위 과정 1~4 과정 각각을 담당하는
Preprocessor 와 Compiler 와 Assember 와 Link-Editor
이 네가지 모두를 '컴파일러'라고 할 수 있을거 같은데요..
그렇다면
마지막 5번 Loader 부분에서....
Link-Editor에 의해서 최종적으로 하나로 묶인 재배치 가능 코드를
메모리의 적당한 위치에 재배치하는, 다시말해 수행을 하게 되는데요..
'Loader'는
Input 이 재배치 가능 코드인
'인터프리터' 로 볼 수 있는것 아닌가요 ??
답변해주시면 감사하겠습니다.
[quote] preprocessing, compilation, as
으음... 제가 글을 잘못 썼군요.
preprocessor, compiler, assembler, linker 모두를 컴파일러를 칭하는게 아니라 위의 4가지 과정중에서 compile을 행하는 프로그램을 compiler라 부른다는 뜻이었습니다.
그러니까 프로그래밍 언어를 분류할 때도 compiler라는 단어를 쓰지만 컴파일 과정을 분류할때 그중에서 전처리된 소스 코드를 목적파일로 번역하는 프로그램을 칭할때도 compiler란 단어를 쓴다는 거죠.
그리고 그 책에서 그렇게 하라고 한다면(혹은 교수가 그렇게 하라고 한다면) 모를까, 그런 미시적인 것까지 모두 compiler와 interpreter로 분류해서 생각해야 할 필요가 있을까 싶군요. grep가 컴파일러냐 인터프리터냐라고 물으면 난감하지 않습니까?
> 그러니까 프로그래밍 언어를 분류할 때도 compiler라는
>
그러니까 프로그래밍 언어를 분류할 때도 compiler라는 단어를 쓰지만 컴파일 과정을 분류할때 그중에서 전처리된 소스 코드를 목적파일로 번역하는 프로그램을 칭할때도 compiler란 단어를 쓴다는 거죠.
비유를 하자면, 우리는 force를 일반적인 의미의 힘을 의미하는 단어로 씁니다. 그러나 물리에서는 아주 특수한 의미로 force를 씁니다.
맨 처음 올리신 질문은 이번학기 프로젝트를 개괄적으로 설명할 때 쓰인 단어인 compiler가 무슨 뜻인가 하는 것이었습니다. 저는 그래서 compiler가 프로그래밍 언어의 한 형태를 나타낼 때도 쓰지만, 아주 특수한 형태의 프로그램(전처리된 소스 코드를 받아서 중간 목적파일 .o를 만드는 프로그램)을 지칭할 때도 쓴다고 답변한 것입니다. 질문에서 물어보신 compiler는 후자 쪽에 속하는 뜻을 가지고 있지요.
일단 오해하실까봐 적어두지만, 모든 컴파일러가 위에서 적은 preprocessing - compilation - assembly - linking의 4과정을 거칠 필요는 없습니다.
gcc는 컴파일을 수행할 때 하나의 프로그램으로 한번에 처리하는 것이 아니라 위에 적은 4단계의 절차를 거쳐 수행합니다. 그리고 그 각각의 단계를 처리하는 프로그램들이 모두 서로 독립되어 있습니다. 꼭 gcc가 아니라도, 대부분의 c 컴파일러는 대충 비슷한 과정을 거칩니다. 하지만 모든 '컴파일러'가 그런 과정을 거칠 필요는 없습니다. 전처리(preprosessing) 과정을 거칠 필요가 없는 php같은 언어를 컴파일러로 구현한다면 전처리기(preprocesser)는 만들 필요가 없겠죠. 또한 C 컴파일러라 하더라도 compilation과 assembly 과정을 하나로 통합해서 처리할 수도 있습니다(오히려, 대부분의 C언어 입문서에서는 바로 이렇게 설명을 하고 있습니다. 이 두가지가 독립된 경우가 오히려 특별하다 할 수 있죠).
> 'Loader'는 Input 이 재배치 가능 코드인 '인터프리터' 로 볼 수 있는것 아닌가요 ??
두번째로 올리신 질문은 약간 이해하기 힘들군요. 굳이 분류하자면 인터프리터라 할 수도 있겠지만... 프로그래밍 언어가 아닌 모든 프로그램을 compiler와 interpreter로 분류할 필요가 있는지는 의문입니다. Windows XP도 비슷한 일을 해주는데, 이 Windows XP가 컴파일러인가 인터프리터인가 하고 물으면 황당하지 않습니까?
열심히 공부하셔서 자바보다 뛰어난걸 만들어주시기 바랍니다. ^^;
열심히 공부하셔서 자바보다 뛰어난걸 만들어주시기 바랍니다. ^^;
컴파일러 수강하시나 보내요.하핫.. 작년에 저도 들었었는데, yacc
컴파일러 수강하시나 보내요.
하핫.. 작년에 저도 들었었는데, yacc나 bison 같은
툴들이 잘만들어져 있어서, 파서 구현하는 것은
큰 어려움이 했던 기억이 나네요. 뒤에부터 날림으로 하는 바람에..
:D
제가 알기론 분류가 Compile : C 소스등을 파싱하여, As
제가 알기론 분류가
Compile : C 소스등을 파싱하여, Assemble 코드를 만들어낸다
Assemble : Assemble 코드를 object(기계어) 코드로 만들어낸다.
link : Object 코드를 실행파일로 만든다
interpreter : 어떤 대상을 타, 형태로 만들어내지 않고 바로 실행한다. 정리하다보니 저도 헷갈림 헤헤헤
=========================
CharSyam ^^ --- 고운 하루
=========================
답변감사합니다.
이제 좀 개념이 잡히는것 같습니다..
댓글 달기