자바스크립트의 표준화
넷스케이프 커뮤니케이션즈가 개발한 자바스크립트와 마이크로 소프트가 개발한 자바스크립트의 파생버전인 JScript 중, 각자의 브라우저에만 동작하는 기능들을 추가하며 크로스 브라우징 이슈가 발생했다.
1996년 11월, ECMA-International (컴퓨터 시스템 표준 관리 비영리 표준화 기구)에게 자바스크립트의 표준화를 요청하여 표준화를 진행하고, ECMAScript로 명명했다.
표1. ES 버전들의 출시 년도
버전 | 출시 연도 | 특징 |
ES1 | 1997 | 초판 |
ES2 | 1998 | ISO/IEC 16262 국제 표준과 동일한 규격 적용 |
ES3 | 1999 | 정규 표현식, try … catch |
ES5 | 2009 | HTML5와 함께 출현한 표준안. JSON, strict mode, 접근자 프로퍼티, 프로퍼티 어트리뷰트 제어, 향상된 배열 조작 기능( forEach, map, filter, reduce, some, every) |
ES6 | 2015 | let/const, 클래스, 화살표 함수, 템플릿 리터럴, 디스트럭처링 할당, 스프레드 문법, rest 파라미터, 심벌, 프로미스, Map/Set, 이터러블, for … of, 제너레이터, Proxy, 모듈, import/export |
ES7 | 2016 | 지수(**) 연산자, Array.prototype.includes, String.prototype.includes |
ES8 | 2017 | async/await, Object 정적 메서드(Object.values, Object.entries, Object.getOwnPropertyDescriptors) |
ES9 | 2018 | Object rest/spread 프로퍼티, Promise.prototype.finally, async generator, for await … of |
ES10 | 2019 | Object.fromEntires, Array.prototype.flat, Array.prototype.flatMap, optional catch binding |
ES11 | 2020 | String.prototype.matchAll, BigInt, globalThis, Promise.allSettled, null 병합 연산자, 옵셔널 체이닝 연산자, for … in enumeration order |
자바스크립트 성장의 역사
초기 자바스크립트는 웹 서버에서 전달받은 HTML, CSS를 렌더링 하는 수준에 불과했다. (렌더링 - 브라우저에 시각적으로 출력)
Ajax
서버와 브라우저가 비동기 방식으로 데이터를 교환할 수 있는 통신 기능인 Ajax(Asynchronous JavaScript and XML)가 XMLHttpRequest라는 이름으로 1999년 등장했다. 화면 전환 때마다 html 태그 기준으로 전체를 처음부터 다시 렌더링하는 기존 패러다임에서 변경된 부분만 렌더링 하는 방식으로 동작함으로써 빠른 성능과 부드러운 화면 전환을 구현했다.
V8 자바스크립트 엔진
구글이 2008년에 내놓은 빠른 성능의 자바스크립트 엔진이다.
Node.js
2009년 라이언 달이 발표한 구글 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임 환경이다. 브라우저 이외에서도 자바스크립트 동작 가능하게 됐다. 비동기 I/O를 지원하며 단일 스레드 이벤트 루프 기반으로 동작함으로써 요청 처리 성능이 좋다. 따라서 데이터를 실시간으로 처리하기 위해 I/O가 빈번하게 발생하는 SPA(Single Page Application)에 적합하다.
자바스크립트와 ECMAScript
ECMAScript는 자바스크립트의 표준 사양인 ECMA-262를 말하며, 프로그래밍 언어의 값, 타입, 객체와 프로퍼티, 함수, 표준 빌트인 객체 등 핵심 문법 규정. 브라우저 제조사는 해당 사양을 준수해서 내장 엔진을 구현한다. 자바스크립트는 ECMAScript와 브라우저가 별도로 제공하는 클라이언트 사이드 Web API를 아우른다. Web API는 월드 와이드 웹 콘소시엄(W3C)에서 별도의 사양으로 관리한다.
자바스크립트의 특징
개발자가 별도의 컴파일 작업을 수행하지 않는 인터프리터 언어(Interpreter language)이다. 인터프리터는 소스코드를 즉시 실행하고 컴파일러는 빠르게 동작하는 머신 코드를 생성하고 최적화한다.
- 머신 코드 - cpu가 바로 실행할 수 있는 기계어
- 바이트코드 - 특정한 하드웨어가 아니라 가상 머신에서 실행되도록 만든 바이너리 코드
표2. 컴파일러 언어와 인터프리터 언어 비교
단계 구성 | 컴파일 단계 / 실행 단계 | 인터프리트 단계/ 실행 단계 |
단계 분리 | 컴파일 단계 완료 후 실행 단계 수행 | 단계 분리 없이, 한 줄씩 바이트코드 변환 및 실행 |
실행 파일 생성 여부 | 실행 파일 생성 | 실행 파일 생성하지 않음 |
코드 실행 전 처리 | 실행 전, 컴파일 한 번 수행 | 코드 실행마다 인터프리트 과정 반복 수행 |
코드 실행속도 | 컴파일과 실행단계가 분리되어 있으므로 코드 실행속도가 빠름 | 반복 수행되므로 코드 실행 속도가 비교적 느림 |
자바스크립트 실행 환경
브라우저와 노드 런타임 환경은 용도가 다르다. 브라우저는 렌더링이 목적이고, 노드는 브라우저 외부에서 자바스크립트 실행 환경을 제공하는 것이 주된 목적이다. 노드는 ECMAScript 이외의 브라우저가 추가로 제공하는 기능은 호환되지 않는다. 브라우저의 Web API(Client-side APIs)가 아닌 Node.js 고유의 API(Node.js Host APIs)를 지원한다.
참조
- 도서 <자바스크립트 딥다이브> 2장 & 3장
'Language > JavaScript' 카테고리의 다른 글
실행 컨텍스트 뿌시기 part2 (0) | 2023.08.27 |
---|---|
실행컨텍스트 뿌시기. part1 (0) | 2023.08.25 |
[프로토타입] 프로토타입의 이해 (0) | 2022.12.25 |
[객체 기본] new 연산자와 생성자 함수 (0) | 2022.12.24 |
[Class] 게터와 세터 (0) | 2022.12.17 |