JavaScript는 오늘날 웹 개발에 있어 가장 널리 쓰이는 개발 언어입니다. JavaScript를 배우려면 필연적으로 이해해야 하는 것이 ECMAScript라는 개념입니다. 과연 이것은 무엇이며, 어떤 배경에서 만들어졌을까요?

ECMAScript의 정의

ECMAScript는 JavaScript가 어떤 구문으로 작성돼야 하는지, 이들이 어떻게 동작할지에 대해 정해 놓은 내용을 가리킵니다. 우리가 잘 알고 있는 JavaScript는 이 ECMAScript에 기초하고 있는 일종의 방언이며, 이와 같이 ECMAScript를 따르는 언어 중에는 ActionScript나 JScript 등 여러 가지가 있습니다.

ECMAScript는 Ecma 인터내셔널이라는 기구에 의해 제정, 관리되며, 공식적인 명세는 ECMA-262라는 문서를 통해 배포되고 있습니다.

JavaScript와의 차이점

ECMASCript는 JavaScript의 언어 사양을 정의하는 명세이며, JavaScript는 그 명세의 구현체입니다.

여전히 이해하기 어려운 문장입니다. 이해를 돕기 위해 비유를 들어 보겠습니다. 우리에게 익숙한 '쿼티' 키보드는 q, w, e, r, t, y 키로 시작하는 배열을 가진 키보드를 가리킵니다. 하지만 하지만 이 쿼티는 키보드가 윈도우 키나 멀티미디어 키를 포함할지에 대해서는 아무것도 정의하지 않죠.

그렇기 때문에 애플 키보드, 로지텍 키보드 같은 키보드들이 저마다 다른 브랜드에서 만들어졌고, 다른 기능이 탑재돼 있지만 기본적으로 비슷한 키 배열을 갖게 됩니다. 바로 이 키보드들이 쿼티라는 표준을 따르기 때문입니다.

ECMAScript라는 표준은 JavaScript 계열 스크립트 언어의 성질을 규정짓는 역할을 하며, JavaScript는 그 표준을 따라 구성된 언어입니다.

ECMAScript 명세는 어떻게 결정되나요?

위에서 언급한 Ecma 인터내셔널의, TC39라고 하는 기술 위원회(Technical Commitee)가 명세의 업데이트를 관리합니다. 새로운 기능은 TC39 프로세스라고 하는 5단계 과정을 거쳐 다음 버전의 표준에 추가됩니다.

  • 0단계: 허수아비 (strawman)
  • 1단계: 제안 (proposal)
  • 2단계: 초안 (draft)
  • 3단계: 후보 (candidate)
  • 4단계: 완료 (finished)

0단계 '허수아비'

아직 '제안'으로 인정받기 전 상태의 등록된 모든 안건들을 말합니다. 특별한 제한사항이 없으며, TC39 회의에서 논의될 모든 안건은 0단계로 등록됩니다.

1단계 '제안'

위원회가 시간을 들여 본격적으로 의논할 만한 안건임을 나타내는 단계입니다. 다음 단계로 승격시킬 TC39 위원회 내의 담당 멤버가 할당되어야 하고, 이 기능의 필요성 및 해결책, API, 잠재적 문제점 등을 분석한 상세를 제시해야 합니다.

2단계 '초안'

위원회가 실제로 개발되어 표준에 등록될 것이라고 예상하는 제안은 2단계로 승격됩니다. 기능의 의미와 구문, API 등에 대해 형식을 갖춰 작성된 명세 초안이 필요합니다.

3단계 '후보'

솔루션이 완성되었고, 충분한 실사용에 바탕한 피드백이 필요한 단계를 말합니다. 기능에 관련된 모든 사항을 망라하는 완성된 명세가 필요하며, 모든 ECMAScript 편집자들로부터 서명을 받아야 합니다.

4단계 '완료'

기능을 다음 버전의 표준에 추가할 수 있는 상태를 나타냅니다. 주요 케이스들에 대한 단위 테스트가 Test262에 작성되어야 하고, 3단계에서 완성된 명세와 함께 ecma262 저장소에 pull request가 작성되어야 합니다.

지금까지 발표된 ECMAScript 버전들

이 글을 쓴 시점인 2021년 2월 기준으로, ES1부터 ES2020에 이르는 버전이 배포되어 있습니다.

  • ES1 (1997년)
  • ES2 (1998년)
  • ES3 (1999년)
  • ES4 (배포되지 않음)
  • ES5 (2009년)
  • ES6 → ES2015
  • ES2016
  • ES2017
  • ES2018
  • ES2019
  • ES2020
  • ES2021 (아직 배포되지 않음)

ES1부터 ES3까지는 매년 새 버전이 발표되었으며, ES4는 기술적, 정치적 이유로 배포되지 못했습니다. class, interface, packages 같은 새로운 개념을 대량 도입하고자 했던 점, 하지만 이들 새로운 명세가 어떤 반향을 가져올지 예측하기 어려웠다는 점, Microsoft를 비롯한 위원회 멤버들의 반대 등이 그 이유였다고 알려져 있습니다.

배포되지 않은 ES4 명세는 2008년에 ECMAScript Harmony라는 이름의 프로젝트로 분리되고, 이듬해인 2009년엔 ES4와 동시기에 제안되었던 보다 보수적인 업데이트인 ES3.1이 ES5라는 형태로 명세로 추가되었습니다.

언급한 Harmony 프로젝트는 긴 공백기를 거쳐 2015년, ES2015라는 이름으로 완성됩니다. 모듈, 변수, 화살표 함수, 새로운 데이터 유형 등 광범위한 변화를 가져왔으며, 당초 프로젝트의 이름을 따라 ES6 Harmony라고도 알려져 있습니다.

위원회에서는 버전과 배포 연도를 일관된 형태로 유지하고자 ES6를 ES2015라는 이름으로 바꾸었고, 이후 버전부터는 ES7, ES8이 아닌 ES2016, ES2017이라는 이름으로 매년 새 에디션이 발표되고 있습니다. (흔히 ES6를 언급하면서 이후의 버전을 ES7, ES8…이라 부르고 있지만 이는 틀린 명칭입니다.)

또, 아직 정식으로 발표되지 않은 차기 버전의 ECMAScript 명세에 포함될 예정인 4단계 제안들을 가리켜 ES.Next라고 부르고 있습니다.

ECMAScript 5부터 일어난 주요 변화

ES5부터 시작해서 ECMAScript 각 버전마다 어떤 개념이 추가 혹은 변경되었는지 구체적으로 알아보겠습니다.

  • ES5에서 변경된 부분들
  • ES2015(ES6)에서 변경된 부분들
  • ES2016에서 변경된 부분들
  • ES2017에서 변경된 부분들
  • ES2018에서 변경된 부분들
  • ES2019에서 변경된 부분들
  • ES2020에서 변경된 부분들
  • ES2021의 4단계 제안들

(각 항목은 별도의 글로 작성돼 링크를 추가할 예정입니다.)