자바스크립트에서 선언은 자바스크립트 엔진에게 변수에 대한 정보를 알려주고 메모리 확보를 진행합니다. 그리고 var타입의 경우는 undefined로 초기화까지 수행합니다.
변수 호이스팅( Variable Hoisting )이란?
// undefined 출력
console.log(num1);
{
var num1;
}
자바스크립트는 인터프리터 언어로서 모든 코드를 맨 위에서 한 줄씩 실행되기 때문에 위 코드는 정상적으로 수행되지 않을것 처럼 보이지만 실제로는 undefined를 출력합니다. 자바스크립트 엔진은 런타임(runtime) 이전에 변수 선언을 포함한 모든 선언문을 소스코드에서 찾아내 먼저 실행 후 각 선언문들을 자신이 속한 스코프 레벨의 최상단으로 끌어 올려진 것처럼 동작하는데 이러한 자바스크립트 고유의 특징을 변수 호이스팅이라고 합니다. ( var 데이터 타입은 함수 레벨 스코프만 인식하기 때문에 블록 레벨 스코프는 무시합니다. )
1995년, 약 90%의 시장 점유율로 웹 브라우저 시장을 지배하고 있던 넷스케이프 커뮤니케이션즈는 웹 페이지의 보조적인 기능을 수행하고 인터랙티브하게 만들기 위해 브라우저에서 동작하는 경량 프로그래밍 언어를 도입하기로 결정하였고 그래서 탄생한 것이 바로 브랜든 아이크 ( Brendan Eich ) 가 10일 만에 개발한 자바스크립트입니다.
자바스크립트 표준화
자바 스크립트의 파편화 방지 및 모든 브라우저에서 정상적으로 동작하는 표준화된 자바스크립트를 위해서 1996년 11월, 넷스케이프 커뮤니케이션즈는 컴퓨터 시스템의 표준을 관리하는 비영리 표준화 기구인 ECMA( European Computer Manufacturers Association ) 인터내셔널에 자바스크립트의 표준화를 요청 후 1997년 7월, ECMA-262라 불리는 표준화된 자바스크립트(ECMAScript 1) 사양이 완성되었고 상표권 문제로 "ECMAScript로" 명명되었습니다. 이후 1999년 "ECMAScript 3( ES3 )" 이 공개된 이후 ES5, ES6 등이 출시되었습니다.
자바스크립트 성장의 역사
초창기 자바스크립트는 웹페이지의 보조적인 기능을 수행하기 위해 한정적인 용도로 사용되었습니다. 2008년에 구글이 V8 자바스크립트 엔진을 출시하면서 훨씬 좋은 퍼포먼스를 가진 자바스크립트 엔진을 선보였으며 이는 자바스크립트가 더욱 발전할 수 있는 계기가 되었습니다.
Node.js
Node.js는 2009년 "라이언 달 ( Ryan Dahl )" 이 발표한 Node.js는 브라우저의 자바스크립트 엔진에서만 동작하던 자바스크립트를 브라우저 이외의 환경에서도 동작할 수 있도록 구글의 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런 타임입니다.
Node.js는 다양한 플랫폼에 적용할 수 있지만 서버 사이드 애플리케이션 개발에 주로 사용되며 이에 필요한 모듈, 파일 시스템, HTTP 등 빌트인 API를 제공합니다.
Node.js의 등장으로 자바스크립트는 브라우저를 벗어나 서버 사이드 애플리케이션 개발에서도 사용할 수 있는 범용 프로그래밍 언어가 되었으며, 현재는 크로스 플랫폼을 위한 가장 중요한 언어로 주목받고 있습니다.
자바스크립트와 ECMAScript
ECMAScript는 자바스크립트 표준 사양인 ECMA-262를 말하며, 프로그래밍 언어의 값, 타입, 객체와 프로퍼티, 함수, 표준 빌트인 객체 등 핵심 문법을 규정한 것을 말합니다. 각 브라우저 제조사는 ECMAScript 사양을 준수해서 브라우저에 내장되는 자바스크립트 엔진을 구현합니다.
자바스크립트는 일반적으로 프로그래밍 언어로서 기본 뼈대를 이루는 ECMAScript와 브라우저가 별도 지원하는 클라이언트 사이드 Web API, 즉 DOM, BOM, Canvas, XMLHttpRequest, fetch, requestAnimationFrame, SVG, Web Storage, Web Component, Web Worker 등을 아우르는 개념입니다.
클라이언트 사이드 Web API는 ECMAScript와는 별도로 W3C( World Wide Web Consortium )에서 별도의 사양으로 관리하고 있습니다.
0과 1 또는 어셈블리어를 저급 언어( Low-level programming language )라고 합니다.
고급 언어( High-level programming language )
C/C++, C#, Java, Python, JavaScript, Ruby 등과 같이 사람의 언어와 가까운 언어를 고급 언어( High-level programming language )라고 합니다.
저급 언어와 고급 언어와의 관계
컴퓨터는 0과 1만 이해할 수 있습니다. 하지만, 대부분의 개발자들은 0과1이 아닌 C/C++, C#, Java, Python, JavaScript, Ruby 등의 고급 언어로 개발을 합니다.
그렇기 때문에 고급 언어들은 컴파일 또는 인터프리트를 통해서 저급 언어로 변환하여 컴퓨터에게 작성한 로직을 수행하도록 명령합니다.
컴파일 언어( Compiled language )란?
컴파일 언어는 컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행되는 고급 언어이며 대표적으로 C/C++ 이 있습니다.
컴파일 언어로 작성된 소스 코드를 저급 언어로 변환하는 과정을 컴파일( Compile )이라고 합니다.
컴파일 언어는 컴파일 과정에서 개발자가 작성한 소스 코드 전체를 훑어보며 소스 코드에 문법적인 오류는 없는지 확인하며 문법적으로 하나라도 오류가 발견되면은 컴파일에 실패하게 됩니다.
컴파일 방식
전처리
전처리 단계는 매크로 언어들을 치환하는 단계입니다.
컴파일러
고급 언어를 저급 언어인 어셈블리어로 번역됩니다.
어셈블러
어셈블리어를 컴퓨터가 이해할 수 있는 0과 1로 구성된 바이너리 코드로 번역됩니다.
링커
바이너리 코드로 번역된 각각의 목적 파일들을 링킹 과정으로 거쳐서 하나의 실행 파일로 만듭니다.
인터프리터 언어
인터프리터 언어는 인터프리터에 의해 소스 코드가 한 줄씩 저급 언어로 번역되어 실행되는 언어를 말합니다.
소스 코드를 한 줄씩 번역하여 실행하기 때문에 컴파일 언어처럼 소스 코드 전체를 저급 언어로 변환하는 시간을 기다릴 필요가 없습니다.
한 줄씩 인터프리터에 의해서 저급 언어로 번역되어 실행되기 때문에 소스 코드에 문제가 있더라도 문제가 있는 소스 코드 라인을 만나기 전까지는 정상적으로 실행됩니다.
컴파일 언어 vs 인터프리터 언어
컴파일 언어는 컴파일 과정을 거쳐서 소스 코드 전체를 저급 언어로 번역한 후 실행되기 때문에 인터프리터 언어보다 실행 속도는 빠릅니다. 하지만, 인터프리터 언어는 컴파일 과정을 기다릴 필요 없이 즉시 한 줄씩 번역하면서 실행할 수 있다는 장점이 있기 때문에 어떤 언어가 좋고 나쁘다고는 할 수 없습니다.
C/C++ 처럼 확실한 컴파일 언어도 있지만 Python, JavaScript 등과 같은 언어들은 인터프리터 언어이면서 컴파일 언어의 속성을 보이기 때문에 명확하게 구분되지 않는 경우도 있습니다.