[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. 자바스크립트가 인터프리터 언어이다 라는 공식 명세는 없습니다. 하지만 굳이 구분을 한다면,

    1. 해석하고 사용하기 위해서는 노드나 브라우저가 필요하기 때문에(컴파일언어에 없는 특징)
    2. 해석단계에서 "실행할때, 소스 코드 읽어들이냐, 아니면 추가적인 여러단계를 거치냐 "라는 기준에 의해 모든 엔진이 인터프리터라고 할수 있다고 생각합니다.

    수고하세요

  • 일단 보통 java도 컴파일 언어라고 한다는 점 알아두시구요...

    본문의 설명이 아주 맞는 말입니다.
    각 용어의 의미를 이해하시면 됩니다.
    인터프리트 : 코드를 읽어나가면서 해석하여 실행하는 것.
    컴파일 : 어떤 언어로 작성된 코드를 다른 언어로 바꾸는 것.

    그러니까 java는 코드를 바이트 코드라는 다른 언어로 컴파일한 후 jvm이 바이트 코드를 인터프리트하여 실행하는 것입니다.
    js도 마찬가지 과정을 거칩니다.
    js 코드를 바로 읽어 실행하는 것 보다 좀 더 기계에 친화적인 언어로 컴파일한 후 그 결과물을 인터프리트하는 것이죠.
    다만 보통은 js를 인터프리터 언어라고 하니까 괜히 컴파일 언어다!라고 하시면 귀찮아지실 수 있습니다.

    위키에서도 설명이 되어있네요.

    자바스크립트 엔진은 전통적인 인터프리터일 수도 있고, 특정한 방식으로 바이트코드로 JIT 컴파일을 할 수 있다.

    이렇게 컴파일과 인터프리트 과정이 모두 들어가는 이유는 양쪽의 장점을 모두 얻기위해서 입니다.
    컴파일은 오래걸리는 대신 그 결과물의 실행 속도가 빠르고 인터프리터 언어는 컴파일 과정이 없으니 그만큼 시간 절약이 되어 잦은 코드 수정이 쉽다는 장점이 있죠.

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

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

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

(ಠ_ಠ)
(ಠ‿ಠ)