Skip to main content Link Menu Expand (external link) Document Search Copy Copied

프로그래밍이란?

프로그래밍이란 컴퓨터에게 실행을 요구하는 일종의 커뮤니케이션입니다. 이를 위해 먼저 무엇을 실행하기 원하는지에 대한 정의가 필요합니다. 즉, 프로그래밍에 앞서 문제(요구사항)를 명확히 이해한 후 적절한 문제 해결 방안의 정의가 필요합니다.

프로그래밍이란 0과 1밖에 알지 못하는 컴퓨터가 실행할 수 있는 정도로 정확하고 상세하게 요구사항을 설명하는 작업이며 그 결과물이 코드입니다. 모호하고 대략적인 요구사항을 전달해도 우리의 머리 속에 있는 의도를 정확히 꿰뚫어 완벽히 이해하는 컴퓨터는 존재할 수 없습니다.

또한, 프로그래밍은 변수를 통해 값을 저장하고 참조하며 연산자로 값을 연산, 평가하고 조건문과 반복문에 의한 흐름제어로 데이터의 흐름을 제어하고 함수로 재사용이 가능한 구문의 집합을 만들며 객체, 배열 등으로 자료를 구조화하는 것입니다.

앞다시피 컴퓨터와 사람은 사고, 인지의 방식이 다릅니다. 따라서 문제 해결 방안을 고려할 때 컴퓨터의 입장에서 문제를 바라보아야 합니다. 이때 필요한 것이 Computational thinking입니다. 이에는 논리적, 수학적 사고가 필요하게 되며 해결 과제를 작은 단위로 분해하고 패턴화하여 추출하며 프로그래밍 내에서 사용될 모든 개념은 평가 가능하도록 정의되어야 합니다.

컴파일러와 인터프리터

컴파일러란?

  1. 해당 컴파일러 언어로 작성된 소스 코드를 어셈블리어, 기계어로 변환(번역) 후 링킹 작업을 통해 실행 프로그램을 생성합니다.
  2. 소스코드를 기계어로 번역하는 빌드 과정에서는 인터프리터 언어에 비해 시간이 소요됩니다.
  3. 런타임 상황에서는 이미 기계어로 모든 소스코드가 변환되어 있기 때문에 빠르게 실행됩니다.
  4. 기계어를 통해 프로그램이 실행되기 때문에 프로그램의 소스코드가 유출되기 어렵습니다.
  5. OS마다 기계어가 상이하기 때문에 OS에 따라 작업을 다르게 해줘야 합니다.
  6. 컴파일러가 소스코드를 기계어로 변환시켜주고나서 기계어가 메모리에 적재됩니다.

인터프리터란?

  1. 해당 인터프리터 언어로 작성된 소스 코드를 처음부터 한 라인씩 차례대로 해석하여 실행합니다.
  2. 기계어로 변환하지 않기 때문에 빌드 시간이 없습니다.
  3. 런타임 상황에서는 코드를 한 라인씩 바로 읽어서 실행하기 때문에 번역속도는 빠르지만 프로그램 실행 시 매번 같은 코드를 번역해야하므로 컴파일러 언어에 비해 프로그램 실행 속도가 느립니다.
  4. 컴파일 과정이 없기 때문에 프로그램을 실행시켜야 오류를 알 수 있습니다.
  5. 컴파일 과정이 없기 때문에, 소스 코드가 그대로 실행파일이 되어 메모리에 적재됩니다. 그 이후 런타임시 메모리가 명령어를 실행하기 위해 내부적으로 기계어로 변환하는 과정을 거친다.

자바스크립트는 인터프리터 언어이다.

하지만 컴파일 과정 또한 거칩니다. 단, 자바스크립트 엔진 내부에서 실행중 컴파일이 필요한 경우에 내부에서 컴파일을 합니다. 대표적인 현대 자바스크립트 엔진인 크롬 V8의 모습을 살펴보겠습니다.

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

==> 크롬의 V8 엔진을 포함해 Mozila, Rhino, Firefox도 같은 방식을 사용합니다.

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

자바스크립트의 특징

  1. 자바스크립트는 HTML, CSS와 함께 웹을 구성하는 요소 중 하나로 웹 브라우저에서 동작하는 유일한 프로그래밍 언어입니다.

  2. js는 기존의 프로그래밍 언어에서 많은 영향을 받았습니다.

    기본 문법은 C, Java와 유사하고 Self에서는 프로토타입 기반 상속을, Scheme에서는 일급 함수의 개념을 차용했습니다.

  3. 자바스크립트는 개발자가 별도의 컴파일 작업을 수행하지 않는 인터프리터 언어(Interpreter language)입니다.

    대부분의 모던 자바스크립트 엔진(Chrome의 V8, FireFox의 Spidermonkey, Safari의 JavaScriptCore, Microsoft Edge의 Chakra 등)은 인터프리터와 컴파일러의 장점을 결합하여 비교적 처리 속도가 느린 인터프리터의 단점을 해결했습니다. 인터프리터는 소스코드를 즉시 실행하고 컴파일러는 빠르게 동작하는 머신 코드를 생성하고 최적화합니다. 이를 통해 컴파일 단계에서 추가적인 시간이 필요함에도 불구하고 보다 빠른 코드의 실행이 가능합니다.

  4. js는 명령형, 함수형, 프로토타입 기반 객체지향 프로그래밍을 지원하는 멀티 패러다임 프로그래밍 언어입니다.

    비록 다른 객체지향 언어들과의 차이점에 대한 논쟁들이 있긴 하지만, 자바스크립트는 강력한 객체지향 프로그래밍 능력을 지니고 있습니다. 간혹 클래스(ES6에서 새롭게 도입되었습니다.), 상속, 정보 은닉을 위한 키워드 private가 없어서 객체지향 언어가 아니라고 오해(자바스크립트는 가장 많은 오해를 받는 언어입니다.)하는 경우도 있지만 자바스크립트는 클래스 기반 객체지향 언어보다 효율적이면서 강력한 프로토타입 기반의 객체지향 언어입니다.