[JS] JavaScript는 컴파일 언어인가요? 인터프리터 언어인가요?

초이지수·2022년 10월 18일
0

JavaScript

목록 보기
3/4
post-thumbnail

자바스크립트 공부를 하던 중 컴퓨터는 자바스크립트를 어떻게 번역하고 그 내부에서는 어떤 일이 벌어지는지 궁금해졌다. 이제 같이 알아볼까요!?


🙋🏻‍♀️ 언어 번역 과정

원시 프로그램(Source) - 번역(Compile) -> 목적 프로그램(Object) - 링크(Link) -> 로드 모듈(Module) - 로드(Load) -> 실행

번역(Compile)이라는 과정을 거쳐 기계어(Binary Code) 기반인 목적 프로그램(Object Program)이 작성된다.
이 번역을 수행하는 프로그램들이 컴파일러(Compiler)와 어셈블러(Assembler)이다.

  • 컴파일러 : 고급언어(대부분의 프로그래밍 언어)로 작성된 프로그램을 번역하는 프로그램

  • 어셈블러 : 저급언어인 어셈블리어로 작성된 원시 프로그램을 기계어로 번역하는 프로그램

  • 인터프리터 : BASIC, LISP, APL, SNOBOL 등의 언어로 작성된 원시 프로그램을 번역하는 프로그램
    컴파일러와 어셈블러와 다르게 작성된 원시 프로그램 전체를 기계어로 번환하지 않고 줄(행) 단위로 번역 + 실행까지 바로 수행하는 프로그램
    프로그램 전체를 번역하는게 아니라 컴파일러와 다르게 목적 프로그램이 생성되지 않음.

  • 원시 프로그램 : 고급언어나 어셈블리어로 작성된 프로그램

대부분의 고급 언어(C, Java)로 쓰인 프로그램들은 기계어로 된 목적 프로그램으로 변환되기 전에 어셈블리어로 변환된다.


🌍 1. 스크립트 언어

컴퓨터 프로그래밍 언어의 한 종류로, 스크립트 작성 기능을 지원하는 소프트웨어(애플리케이션)을 제어하는 역할을 하는 언어. 스크립트 언어도 대부분 인터프리터 방식을 사용하는 인터프리터 언어라고 할 수 있다.

대표적으로 JavaScript, JSP, Python, Ruby등이 있다.

JavaScript는 웹 환경이 고도화되고 표준화되며 Node.js 런타임 환경 및 Electron 등이 등장하면서 스크립트 언어 자체만으로도 독립적인 프로그램의 개발이 가능해짐에 따라 소프트웨어를 제어하는 언어라고만 정의 할 수 없게 되었다.


☄️ 스크립트 언어의 특징

  • 컴파일 언어에 비해 단순하고 쉬운 문법 구조를 갖고 있다.
  • 컴파일 과정이 없기 때문에 프로그램을 실행시켜야 오류를 알 수 있다.
  • 컴파일 과정이 없기 때문에, 소스 코드가 그대로 실행파일이 되어 메모리에 적재된다. 그 이후 런타임시 메모리가 명령어를 실행하기 위해 내부적으로 기계어로 변환하는 과정을 거친다.

☄️ 인터프리터

  1. 고급 언어로 작성된 프로그램을 한 줄 단위로 번역하고, 번역과 동시에 프로그램을 한 줄 단위로 즉시 실행시키는 프로그램이다.
  2. 프로그램이 직접 실행되므로 목적 프로그램은 생성되지 않음
  3. 줄 단위로 번역, 실행되기 때문에 시분할 시스템에 유용하며 원시 프로그램의 변화에 대한 반응이 빠르다.
  • 시분할 시스템 : 다중프로그래밍을 논리적으로 확장한 개념으로 프로세서를 통해 다중 작업을 교대로 수행한다.
    컴퓨터를 대화식으로 사용하려는 시도에서 탄생했다.
  1. 번역 속도는 빠르지만 프로그램 실행 시 매번 번역해야 하므로 실행 속도는 느리다.
  2. CPU의 사용시간 낭비가 커 복잡한 산술연산 or 복잡한 구조의 프로그램에서는 효율적이지 않을 수 있다.

🌍 2. 컴파일 언어

  • 문법적 제약이 많아, 스크립트 언어에 비해 사용이 어렵다.
  • 규모가 큰 프로그램일 경우 컴파일을 하기 때문에 오랜 시간이 소요된다.
  • 기계어를 통해 프로그램이 실행되기 때문에 프로그램의 소스코드가 유출되기 어렵다.
  • OS마다 기계어가 상이하기 때문에 OS에 따라 작업을 다르게 해주어야 한다.

☄️ 컴파일러

  1. 고급 언어로 작성된 프로그램 전체를 목적 프로그램으로 번역한 후, 링킹 작업을 통해 컴퓨터에서 실행 가능한 실행 프로그램을 생성함.

  2. 번역 실행 과정을 거쳐야 하기 때문에 번역 과정이 번거롭고 시간이 오래걸리지만, 한번 번역한 후에는 다시 번역하지 않으므로 실행 속도가 빠름.

  • C언어, Java가 대표적이다.

  • 링킹 : 여러 개의 코드와 데이터를 모아서 연결하여 메모리에 로드될 수 있고 실행될 수 있는 한 개의 파일로 만드는 작업



🌍 고급언어와 저급언어

고급 프로그래밍 언어와 저급 프로그래밍 언어는 사람이 접근하기 쉬운지 어려운지를 기준으로 나눈다.

  • 고급언어 : 사람들에게 친숙한 언어
  • 저급언어 : 컴퓨터가 이해하기 쉽고 가까운 언어

☄️ 고급언어

사람이 이해하기 쉽게 작성된 프로그래밍 언어

  • 고급언어를 컴퓨터 언어인 기계어로 변환하기 위한 방법으로 컴파일러, 인터프리터 등이 있다.
  • 저급 프로그래밍 언어보다 가독성이 높고 다루기가 간단하다.
  • 저급언어와는 다르게 특정 컴퓨터와 관게없이 독립적으로 프로그램을 만들 수 있다.
  • 기계어로 변환하는 동안 시간이 소요되며 저급언어보다 프로그램 크기가 더 크다.

☄️ 저급언어

컴퓨터가 이해하기 쉬운 이진법으로 이루어진 언어.

  • 컴퓨터가 바로 이행 할 수 있지만 가독성 및 생산성이 낮다.
  • 프로그램 속도가 빠르다.
  • 저급언어에는 기계어와 어셈블리어 등이 있다.

⚡️ 기계어

기계어란 CPU가 직접 해독하고 실행할 수 있는 비트 단위로 쓰인 컴퓨터 언어
기계어는 프로그램을 나타내는 가장 낮은 단계의 개념이다.

  • 기계어는 대부분 어셈블리어를 거쳐 짜여지게 된다.
  • 컴퓨터가 알아들을 수 있는 유일한 프로그래밍 언어

⚡️ 어셈블리어

기계어를 사람이 이해하기 쉬운 기호와 1:1로 대응시켜 기호화한 프로그램 언어.
기호 언어라고도 부른다.

  • 기계와 바로 통신이 가능해 빠르게 기계를 제어할 수 있다.
  • 이진수 패턴을 사용하는 기계어와 비슷하고 최소한의 명령으로 매우 세밀한 명령을 내린다.
  • 하드웨어를 제어하는 형태의 언어로 하드웨어의 구조에 따라 프로그램을 달리 해야한다.

장점

  • 프로그램의 실행 속도가 매우 빠르다. (기계에 바로 명령을 내리기 때문)
  • 프로그램의 크기가 매우 작다. (최소한의 명령을 사용하기 때문)
  • 어떤 프로그램이라도 만들 수 있다. (하드웨어를 직접 제어할 수 있기 때문에 어떤 명령이든 수행 할 수 있다.)

단점

  • 배우기 어렵다.
    고급언어인 C나 Java는 코딩을 할 때 하드웨어적 지식이 필요 없지만, 어셈블리어는 하드웨어 지식이 뛰어나야함.
  • 큰 프로그램을 만들기 힘들다. (세밀한 제어가 필요하기 때문)
  • 프로그램을 짤 때 시간이 오래 걸리고 디버깅도 어렵다. (에러를 직접 찾아야 함)

🙋🏻‍♀️ 그래서 JavaScript는 무슨 언어죠?

1995년 자바스크립트는 유저와의 상호작용을 위해 10일만에 탄생한 언어이다.
HTML 페이지를 동적으로 만드는 것에 목적이 있어 가벼운 인터프리터 언어로 만들어졌다.

자바스크립트는 개발자도구 콘솔에서 스크립트를 작성해 실행하는데 컴파일이 필요하지 않기 때문에 인터프리터 언어이다.

하지만 자바스크립트도 컴파일 과정을 거친다.

구글이 구글맵스를 개발하며 당시 브라우저, 특히 JavaScript 엔진에 한계를 느꼈다.
많은 유저 인터랙션이 필요했고 2009년 이를 커버할 수 있는 V8엔진을 출시했다.

자바스크립트의 성능을 비약적으로 향상시킬 수 있었던 이유는 엔진 내부에서 컴파일 과정을 거치기 때문이다.

엔진이 작동하는 원리로 살펴보자!
1. 엔진이 실행할 JS 파일을 받게 된다.
2. 파싱, AST(Abstract Syntax Tree)를 구축하는 과정을 거친다.
3. 인터프리터가 코드를 읽으며 실행한다.
4. 코드를 수행하는 과정에서 프로파일러가 지켜보며 최적화 할 수 있는 코드를 컴파일러에게 전달해준다.
5. 주로 반복해서 실행되는 코드 블록을 컴파일(최적화)한다.
6. 원래 있던 코드와 최적화된 코드를 바꿔준다.

  • JIT(Just-In-Time)컴파일러 : 코드를 우선 인터프리터 방식으로 실행하고 필요할 때 컴파일을 하는 방법

자바스크립트는 실행되는 플랫폼에 따라 인터프리팅과 컴파일이 혼합되어 사용된다.
이 방식은 자바스크립트의 성능을 크게 향상시켰다.

  • V8엔진(구글, C++) : 인터프리터 없이 두 개의 컴파일러로 구성. node.js가 사용
  • Rhino엔진(모질라, Java) : 기본적으로 인터프리터, 부분적으로 자바 바이트코드로 컴파일
  • Monkey엔진 : 최초의 자바스크립트 엔진. 파이어폭스에서 사용. 컴파일러(JIT(Just In Time)를 사용.

💡 결론!

자바스크립트는 인터프리터 언어이다!!!!!!!!!
자바스크립트 코드를 실행하려면 해석 엔진이 필요하다. 플랫폼에 따라 엔진 내부에서 컴파일 과정을 거친다!!!


profile
닫혀 있어서 벽인 줄 알고 있지만, 사실은 문이다.

0개의 댓글