이 포스팅을 먼저 썼어야 했을 것 같지만.. 앞선 포스팅들에서 ES2022, TS39 Process 등에 대해 알아봤었는데 그럼 ECMAScript 는 무엇인가? 에 대해 이번 포스팅에서 다뤄보도록 하겠습니다.
- ECMAScript ?
Wiki 의 문구를 그대로 인용하자면, ECMAScript 란 ES 라고도 불리우며 Ecma International 이 ECMA-262 기술 규격에 따라 정의하고 있는 표준화된 스크립트 프로그래밍 언어를 뜻합니다. (링크)
ECMAScript 는 Javascript 의 표준화를 위해 만들어졌습니다. 액션스크립트와 J스크립트 등의 다른 구현체도 포함하고 있다고 하며, Node.js 에서도 약간의 설정을 통해 ECMAScript 를 사용할 수 있습니다.
즉 ECMAScript 는 Javascript 표준화를 만들어졌으며, 반대로 말하면 Javascript 가 ECMAScript 의 준수하면서 그외의 추가적인 기능을 제공하는 언어라고 할 수 있을 것 같습니다. 용어가 좀 헷갈릴 수 있는데 ECMA-262 가 기술 규격을 의미하고, ECMAScript 도 그 ECMA-262 에 의해 정의된 프로그래밍 언어이자 스크립트 언어가 준수해야할 지침, 규칙등을 제공한다고 보면 되겠습니다.
시간상 Javascript 는 1996년에 나왔고, 1997년에 ECMAScript 가 표준화를 위해 튀어나왔지만 이미 그때부터 Javascript 는 ECMAScript 의 스펙을 따르고 있었다 하네요. 마치 서로가 서로를 참조하는 관계인 것 같습니다.
- ES5, ES6, .. ES12 ?
그럼 그동안 흔하게 접해왔던 ES5, ES6, ES12 이런 용어는 이전 포스팅에서도 살짝 얘기했지만 결국 ECMA-262 기술 규격의 개정판 번호라고 할 수 있겠습니다. ECMA-262 6번째 에디션이 ES6, 7번째 에디션이 ES7 이런식으로 버저닝되는 것 입니다.
Wiki 에서 에디션 관련 항목을 보면 이런식의 history 를 갖고 있습니다.
현재는 개정판이 매년 나오고 있지만, 초창기에는 그러지 않았네요. 각 버전별 특징을 아래에서 간략히 보도록 하겠습니다. (링크)
ES1 (1997) / ES2 (1998) / ES3 (1999)
- 이때엔 각 개정판 별로 큰 특징이 있다기보단 현재의 Javascript 에서도 기본 기능인 Prototype, Primitive value, Hositing, Scope 등의 내용을 담고 있습니다.
ES4 (버려짐)
- 왜 버려졌는진 모르겠지만 공식 페이지에서도 관련 자료가 존재하지 않는다고 나오네요..
ES5 (2009~2011)
- Array.prototype 에서 forEach, map, filter 등의 다양한 메서드를 지원하게 됐습니다.
- JSON 을 지원합니다.
- strict mode 를 지원합니다.
ES6 (2015)
- let, const 키워드를 지원합니다.
- arrow function (화살표 함수) 을 지원합니다.
- Promise 가 도입되었습니다.
- module 사용, class 정의, lexical scope, iterator 와 generator, 구조분해 등을 지원하게 되었습니다.
- 현재 개발시 가장 많이 쓰는 기능들이 대부분 이때 추가되었던 것 같습니다.
ES7 (2016)
- 이때부터 TC39 산하에서 출시된 첫번째 개정판입니다.
- 제곱 연산자를 지원하고, Array.prototype 에 includes 메서드가 추가되었습니다.
ES8 (2017)
- async - await 를 통해 향상된 비동기 프로그래밍 환경을 제공하게 되었습니다.
- Shared Memory 와 Atomics 라는 개념에 대해 소개하는데, parallel CPU 상에서 잘 정의된 실행 순서를 보장하는 atomic 작업을 사용해 멀티 에이전트 프로그램이 통신할 수 있는 새로운 메모리 모델에 대해 얘기하고 있습니다.
- 또한 Object.values, Object.entires 등의 새로운 static 메서드를 제공합니다.
ES9 (2018)
- Object rest/spread properties 기능을 제공한다고 되어있는데 사실 그 전부터 쓴 것 같지만 ES9 에서 정식 스펙이 되었나봅니다.
- AsyncIterator 에 대해 소개하고 있는데 for 문을 for await (const item of [..]) 와 같이 사용할 수 있는 문법입니다.
- Promise.prototype 에 finally 가 추가되었습니다.
- 정규표현식에 dotAll flag, named capture groups, unicode property escapes, look-behind assertion 등의 기능이 추가되었다고 합니다. 정규표현식을 자주 안써서 별 관심은 안가던 섹션이었는데, 나중에 한번 어떤 기능인지 보도록 하겠습니다.
ES10 (2019)
- Array.prototype 에 flat, flatMap 메서드가 추가되었습니다.
- Object.prototype.fromEntries, String.prototype.trimStart, trimEnd 등이 추가되었습니다.
ES11 (2020)
- 정규표현식에 matchAll 메서드가 추가되었습니다.
- import module 을 비동기로 사용할 수 있습니다.
- BigInt 가 도입되었습니다.
- Promise.allSettled 가 추가되었습니다.
ES12 (2021)
- replaceAll 메서드를 지원합니다.
- Promise.any 가 추가되었습니다.
- AggregateError 라는 새로운 타입의 에러가 추가되었습니다.
아래 버전으로 내려올 수록 약간은 생소한 기능들이 있는 걸 봐선, 그간 ECMAScript 의 기능들에 너무 신경을 안써왔던 것 같아 반성을 하게 되네요. ES9 정도부터는 개별 포스팅으로 각 기능에 대해 알아보도록 하겠습니다.
- Javascript Engine
자바스크립트 엔진은 여러 종류가 있는데 사실 저한텐 크게 중요한 내용은 아니라 생각하지만 ECMAScript 때문에 잠깐 얘기하게 되었습니다. 일반적으로 엔진 종류는 흔히 아는 Google Chrome 의 v8, Firefox 의 SpiderMonkey, MS Edge 의 Chakra 등이 있습니다.
얘기하고자 하는 바는 각 자바스크립트 엔진 별로 지원하는 ECMAScript 가 다릅니다. 웹 브라우저의 자바스크립트 엔진이 자바스크립트 언어를 다 이해할 수 있긴 하지만 각 브라우저 별로 엔진이 다르다보니 이해하는 능력에 차이가 생깁니다.
얼마나 잘 이해하느냐에 따라 (엔진이 어떤 ECMAScript 에 호환성을 갖고 있냐에 따라) 기능에 약간씩 차이를 갖게 되고 이는 즉ECMAScript 개정판이 새로 튀어나왔다고 해서 모든 자바스크립트 엔진이 해당 버전의 새로운 기능을 지원하게 되는 것이 아니라 각자의 개발 조직에 달려 있습니다.
그 외에는 자바스크립트 엔진이 얼마나 자바스크립트 언어를 효율적으로 처리하고 있는지에 따라 퍼포먼스가 다르다는 점이 있습니다.
'Backend > Javascript' 카테고리의 다른 글
ES10 (ES2019) (0) | 2022.02.27 |
---|---|
ES9 (ES2018) (0) | 2022.02.19 |
TC39 Process (0) | 2022.02.07 |
ES2022 (0) | 2022.01.30 |
Javascript 내장 클래스 확장 (0) | 2021.12.25 |