런타임, 인터프리터 언어와 컴파일러

B__m·2024년 1월 11일
1

런타임이란?

런타임은 프로그램이 실행되는 동안의 환경 또는 그 시간을 의미합니다.

  1. 실행 환경 제공: 런타임 환경은 프로그램이 실행되는 동안 필요한 모든 서비스와 자원을 제공합니다.
    ex) 메모리 관리, I/O, 에러 핸들링 등 …
  2. 코드 해석 및 실행: 프로그램의 코드를 해석하고 실행하는 역할을 합니다.
    • 컴파일 언어에서는 컴파일러가 소스 코드를 기계어로 변환한 후, 이 기계어가 런타임에 실행됩니다.
    • 인터프리터 언어에서는 런타임이 직접 소스 코드를 한 줄 한 줄 해석하고 실행합니다.
  3. 플랫폼 중립성: 특히 인터프리터 언어의 경우, 런타임 환경은 코드가 다양한 플랫폼에서 동일하게 동작하도록 합니다.

그렇다면 컴파일 언어와 인터프리터 언어는 무엇일까요?
또, 자주 발생하는 컴파일 에러와 런타임 에러를 알아봅시다.

컴파일, 컴파일 언어

컴파일은 사람이 이해하는 언어로 작성된 코드를 컴퓨터가 이해할 수 있는 언어(기계어나 바이트 코드)로 변환하는 과정을 말합니다. 이러한 과정을 컴파일 타임 이라고 부르기도 합니다. 그리고 이러한 과정을 실행시켜 주는 것을 컴파일러 라고 합니다.

컴파일 에러와 런타임 에러

컴파일 에러라고 하면 컴파일 하는 과정에서 에러가 생겼다고 볼 수 있습니다. 그렇다면 어떤 부분에서 문제가 생긴 것일까요?

컴파일은 위에서 사람이 이해하는 언어에서 컴퓨터로 이해할 수 있는 언어로 변환하는 과정이라고 했습니다. 소스코드가 잘못 적힌 경우일 것입니다. Syntax Error나 Type Check Error가 바로 컴파일타임에러의 대표적인 예시입니다.

그렇다면 런타임 에러는 런타임이 프로그램을 실행할 때를 뜻하므로, 현재 코드에서는 알 수 없지만 프로그램을 실행했을 때 오류가 발생했다면 그게 런타임 오류라고 할 수 있습니다. 런타임 에러의 예시로는 Divide By Zero Error나 잘못된 배열참조에러메모리 오류, 무한 루프 등이 있습니다.

인터프리터언어

인터프리터 언어는 실행 시점에 코드를 한 줄씩 읽고 해석하여 바로 실행하는 언어입니다.

이는 JavaScript 코드가 컴파일 과정을 거치지 않고, 실행 시간에 코드가 해석되어 즉시 실행한다는 것입니다.

브라우저나 Node.js 와 같은 런타임 환경에서는 JavaScript 엔진이 이러한 해석 과정을 담당하며, 코드의 해석과 실행을 실시간으로 처리합니다.


이제 자바스크립트 런타임은 어떤 환경으로 작동되는 것인지 간단하게 알아보겠습니다.

JavaScript 런타임 환경

런타임 환경은 JavaScript 코드가 실행되는 장소입니다. 주로 두 가지 환경에서 JavaScript 런타임이 작동합니다.

  • 브라우저 런타임:
    웹 브라우저는 각기 다른 JavaScript 엔진(V8, SpiderMonkey, JavaScriptCore …. 등 )을 내장하고 있습니다. 이 엔진들은 JavaScript 코드를 해석하고 실행하는 동시에 DOM 조작, 이벤트 핸들링, AJAX 통신 등 웹 페이지와 상호작용하는 기능을 제공합니다.
  • Node.js 런타임:
    Node.js는 V8 엔진을 사용하여 서버 측에서 JavaScript 를 실행합니다. Node.js 환경은 파일 시스템 접근, 네트워크 통신, 데이터베이스 조작 등 서버 프로그래밍에 필요한 API 를 제공합니다.

아래 그림은 자바스크립트의 런타임 환경입니다.

여기서 자바스크립트 코드가 어떻게 처리되고 실행되는지를 보여줍니다.

크게 세 부분으로 나누어 설명하자면

  1. HeapStack: 자바스크립트의 메모리 할당이 일어나는 곳입니다. ''은 객체와 같은 동적으로 할당된 메모리를 저장하고, '스택'은 함수의 호출을 관리합니다.
  2. Web APIs: 브라우저가 제공하는 API들로, 자바스크립트 엔진 외부에서 비동기적인 작업을 처리합니다.
  3. Event Loop와 Callback Queue: 비동기 작업이 완료되면, 그 결과를 처리할 콜백 함수가 콜백 큐에 쌓입니다. 이벤트 루프는 호출 스택이 비어 있을 때 콜백 큐에서 함수를 꺼내 실행합니다.

이러한 시스템을 통해 JavaScript는 비동기 작업을 효율적으로 처리할 수 있습니다.


런타임 환경에서 실행되는 인터프리터 언어의 한계

  1. 성능 지연 : 인터프리터 언어는 실행 시간에 코드를 해석하기 때문에, 컴파일 언어에 비해 느릴 수 있습니다. 실행 전 컴파일 단계가 없어 해석 과정이 실행 때마다 발생합니다.
  2. 자원 사용 : 런타임 환경은 프로그램 실행을 위해 추가 메모리와 CPU 시간을 필요로 합니다. 가비지 컬렉션 같은 메모리 관리 기능이 유용하지만 시스템 자원을 추가로 사용합니다.
  3. 최적화의 한계: 인터프리터 언어는 컴파일 언어에 비해 최적화의 범위가 제한적입니다. 컴파일러는 전체 코드에 대한 최적화를 할 수 있지만, 인터프리터 언어는 실행 중인 코드 부분에 대해서만 최적화를 수행합니다.
  4. 실시간 오류 발견: 인터프리터 언어는 실행 중에만 오류를 감지합니다. 반면 컴파일 언어는 코드를 기계어로 변환하는 과정에서 문법적 오류를 미리 찾아낼 수 있습니다.

동적 타입 언어 JavaScript vs 정적 타입 언어 TypeScript

TypeScriptJavaScript의 단점 중 하나인 동적으로 타입을 지정하는 특징을 보완합니다.

동적 타입 지정이란, 변수의 타입이 런타임, 즉 실행 시간에 결정되는 것으로 JavaScript는 대표적인 동적 타입 언어입니다.

배우기 쉽고 유연한 장점이 있지만 동시에 런타임 에러 발생 가능성을 지니고 있습니다.

하지만 TypeScript는 정적 타입 언어로 변수의 타입을 명시적으로 지정해서 사용합니다.

컴파일 단계에서 타입 체크를 하기 때문에 코드 작성 중 타입 오류를 방지하는 타입 체킹 기능인 ‘타입 어노테이션’을 활용 하여 에러를 빠르게 발견할 수 있게 도와주기 때문에 코드를 수정하고 나서 버그가 생기는 것을 방지할 수 있습니다.

인터프리터 언어 JavaScript 와 컴파일 언어 TypeScript

JavaScriptTypeScript는 언어 해석 과정에서 차이를 보입니다.

JavaScript는 인터프리터 언어로, 소스코드를 한 줄씩 읽으면서 명령을 즉시 처리합니다. 이 방식은 코드가 바로 실행되어 컴파일 언어에 비해 빠른 실행이 가능한 장점을 가지고 있습니다.

반면에 TypeScript는 컴파일 언어의 특성을 갖고 있습니다.

컴파일 언어는 소스코드 전체를 컴퓨터가 이해할 수 있는 기계어로 변환한 후 실행하는 언어입니다. 이 과정은 인터프리터 언어에 비해 시간이 더 소요되지만, 변환된 소스코드가 이미 기계어로 되어 있기 때문에 런타임 상황에서는 빠른 실행이 가능합니다.


이렇게 런타임 환경의 중요성과 언어가 코드를 해석하고 실행하는 다양한 방식을 살펴보았습니다.

동적 타입 JavaScript 와 정적 타입 TyprScript 사이에서, 각각의 언어가 가진 장점을 최대한 활용하여 효율적이고 안정적인 코드를 작성하는 것이 중요합니다.

두 언어가 어떻게 서로를 보완하며 개발자들에게 더 나은 도구를 제공하는지 이해함으로써, 효과적이고 효율적인 솔루션을 구축할 수 있습니다.


참조: https://www.elancer.co.kr/blog/view?seq=183#:~:text=JavaScript%EC%99%80%20TypeScript%EB%8A%94%20%EC%96%B8%EC%96%B4,%EB%B9%A0%EB%A5%B4%EB%8B%A4%EB%8A%94%20%EC%9E%A5%EC%A0%90%EC%9D%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EB%8B%A4.

0개의 댓글