[javascript] 자바스크립트는 컴파일언어인가요 인터프리터 언어인가요?
조회수 9353회
안녕하세요. 자바스크립트에서 scope를 공부하면서 아래의 링크의 글을 읽던중 의문이 생겨서 질문을 드립니다.
https://meetup.toast.com/posts/86
function foo() {
console.log(a);
var a = 2;
}
foo();
본문에는 아래와같은 글이 있는데요.
이번에는 undefined가 출력된다. 조금 터무니없다고 느낄 수 있지만, 알고보면 그렇게까지 터무니없는 것은 아니다. 자바스크립트 엔진은 코드를 인터프리팅 하기 전에 그 코드를 먼저 컴파일한다. var a = 2;를 하나의 구문으로 생각할 수도 있지만, 자바스크립트는 다음 두 개의 구문으로 분리하여 본다.
보통 c언어는 컴파일 언어고 java는 인터프리터 언어라고 하잖아요. 위의 본문을 보면 자바스크립트는 인터프리팅도 하고 컴파일도 하는것같은데.. 자바스크립트에는 왜 두가지 기능이 다 있는것인가요? 그리고 자바스크립트는 인터프리터 언어인가요? 컴파일언어인가요?
질문 읽어주셔서 감사합니다 :)
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
안녕하세요!
인터프리터언어인지, 컴파일언어인지 이야기 하기 전에 아래 내용을 봐주셨으면 좋겠습니다. 인용부분에서
자바스크립트 엔진은 인터프리팅 하기 전에 그 코드를 먼저 컴파일한다.
라고 시작하는데요 .. 자바스크립트 코드를 실행하려면 해석엔진이 필요합니다. 자바스크립트는 여러 엔진이 있고, 컴파일러로만 구현된것이 있고, 인터프리터도 있습니다.
- V8엔진(구글, c++): 인터프리터 없이 두개의 컴파일러로 구성되어 있습니다. 크롬이나 노드가 사용합니다.
- Rhino엔진(모질라,java): 이 엔진은 기본적으로 인터프리터, 부분적으로 자바 바이트코드로 컴파일 합니다.
- Monkey 엔진: 최초의 자바스크립트 엔진. 파이어폭스에서 사용되고 있습니다. 이건 컴파일러(JIT(Just in Time) )를 사용하고 있습니다.
예전에는 스크립트 언어에 대해 '이 언어는 인터프리터 언어고, 저 언어는 컴파일 언어다' 이야기할수 있었지만 사실 JIT 컴파일러와 VM의 등장이후 어느정도 경계가 흐려졌다고합니다.
var a = 2;
자바스크립트 엔진은 코드를 인터프리팅 하기 전에 그 코드를 먼저 컴파일한다. var a = 2;를 하나의 구문으로 생각할 수도 있지만, 자바스크립트는 다음 두 개의 구문으로 분리하여 본다.
var a;
a = 2;
답변1. 위 글에 대해 제 해석은 하나의 컴파일러에서 '컴파일한다' 는 파싱과정을 '인터프리팅 하기전에'는 분석과 코드생성 전( lexing or tokenizing) 인것 같습니다.
답변2. 자바스크립트가 인터프리터 언어이다 라는 공식 명세는 없습니다. 하지만 굳이 구분을 한다면,
- 해석하고 사용하기 위해서는 노드나 브라우저가 필요하기 때문에(컴파일언어에 없는 특징)
- 해석단계에서 "실행할때, 소스 코드 읽어들이냐, 아니면 추가적인 여러단계를 거치냐 "라는 기준에 의해 모든 엔진이 인터프리터라고 할수 있다고 생각합니다.
수고하세요
-
일단 보통 java도 컴파일 언어라고 한다는 점 알아두시구요...
본문의 설명이 아주 맞는 말입니다.
각 용어의 의미를 이해하시면 됩니다.
인터프리트 : 코드를 읽어나가면서 해석하여 실행하는 것.
컴파일 : 어떤 언어로 작성된 코드를 다른 언어로 바꾸는 것.그러니까 java는 코드를 바이트 코드라는 다른 언어로 컴파일한 후 jvm이 바이트 코드를 인터프리트하여 실행하는 것입니다.
js도 마찬가지 과정을 거칩니다.
js 코드를 바로 읽어 실행하는 것 보다 좀 더 기계에 친화적인 언어로 컴파일한 후 그 결과물을 인터프리트하는 것이죠.
다만 보통은 js를 인터프리터 언어라고 하니까 괜히 컴파일 언어다!라고 하시면 귀찮아지실 수 있습니다.위키에서도 설명이 되어있네요.
자바스크립트 엔진은 전통적인 인터프리터일 수도 있고, 특정한 방식으로 바이트코드로 JIT 컴파일을 할 수 있다.
이렇게 컴파일과 인터프리트 과정이 모두 들어가는 이유는 양쪽의 장점을 모두 얻기위해서 입니다.
컴파일은 오래걸리는 대신 그 결과물의 실행 속도가 빠르고 인터프리터 언어는 컴파일 과정이 없으니 그만큼 시간 절약이 되어 잦은 코드 수정이 쉽다는 장점이 있죠.-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력