자바스크립트의 핵심 개념과 원리를 알아보는 시리즈. 알쓸신자를 시작할게.
가장 먼저 알아볼 주제는 바로, 자바스크립트 엔진이야.
(사실 나도 엔진이라고 하면 자동차 엔진만 떠올랐어...)
하지만, 그 엔진 아니고! 소프트웨어 분야에서는 가장 중요한, 핵심 역할을 하는 특정한 소프트웨어를 '엔진'이라고 불러. 옛날부터 기계 부품 중에서 가장 중요한 게 엔진었잖아? 그만큼 중요하다는 뜻으로 비유하는 말이 굳어진 거지. ('엔진을 만드는 사람 - 엔지니어' 라는 말도 바로 그래서 나온 것..!)
그러니 자바스크립트 '엔진'도 되게 중요할 거 같은 느낌이지?
우리는 아마 자바스크립트를 보면 다 어떻게 읽어야 하는지 알 거야.
const isJavascript = true;
'isJavascript'이라는 이름의 변수에, true 값을 저장하라는 의미의 코드지.
근데 사실 우리가 들고 있는 이 컴퓨터나 스마트폰은 그걸 몰라.
더 정확히 말하면, 그 안에 들어있는 CPU들은 오직 0과 1밖에 이해하지 못해. 이건 우리가 보기에 자바스크립트 문법을 지킨 텍스트일 뿐이고. CPU들은 자바스크립트를 전혀 할줄 모른다고.
만약 우리가 컴퓨터한테 아무런 장치 없이 코드를 전달하면 어떻게 될까?
사람: const isOpen = true (변수에 true 값 저장해!)
컴퓨터: 01011101010111010101110 (뭔소리 하는 거야?)
그런데 실제로는 그런 일이 일어나지 않지.
우리는 자바스크립트 파일(.js)을 작성하고 브라우저나 Node.js에서 실행시키거든. 그러면 무언가 알 수 없는 원리에 의해서, 컴퓨터가 자바스크립트 코드를 이해하고 맞게 실행을 해서 결과를 만들어내잖아?
이게 가능한 이유. 바로 중간에 통역사 역할을 하는 프로그램이 있기 때문이야.
Javascript를 읽어서, 기계가 이해할 수 있는 언어로 만들어주는 프로그램이지.
쉽게 비유하자면,
자바스크립트는 악보, 컴퓨터는 피아노인거야.
악기가 악보를 알아들을 순 없잖아?
'연주자'가 악보를 보고 해석해서, 악기가 알아들을 수 있는 '입력'으로 바꿔줘야 하지.
바로 이 '연주자' 역할을 하는게 자바스크립트 엔진이야.
이게 없으면 자바스크립트라는 프로그래밍 언어는 의미가 없어.
왜냐하면 프로그래밍 언어는 컴퓨터한테 명령을 하려고 있는 건데. 컴퓨터한테 명령을 알아들을 수가 없으니까.
연주자 없이는 악보도 의미가 없는 것처럼 말이지.
그러니 '자바스크립트 엔진'은 엄청나게 중요한 프로그램이다~ 이거야.
간단해. 내가 쓴 코드가 어떻게 통역이 되어서 컴퓨터에게 전달되는지 알고 있어야
1. 더 효율적인 코드를 쓸 수 있고, 2. 결과를 예측하고 버그를 찾아내기가 쉽지.
좋은 자바스크립트 개발자가 되려면, 자바스크립트 엔진의 작동 원리를 어느 정도는 알고 있어야 한다는 거야.
번역 프로그램 중에는 네이버 파파고도 있고, 구글 번역도 있잖아?
자바스크립트 엔진도 굉장히 다양해. 딱 하나의 엔진만 존재하는 건 아니야. 다들 구현하기 나름이거든.
하지만 자바스크립트라는 같은 언어를 엔진마다 다 다르게 해석해버린다면, 엄청난 혼란이 오겠지? 자바스크립트 개발자들이 쓴 코드가 사용자의 기기에서 어떻게 실행될지를 예측하지 못할 테니까.
이건 실제로 일어났던 일이야. 1995년에 당시 최초의 웹 브라우저였던 넷스케이프가 자바스크립트(와 자바스크립트 엔진)를 개발했어.
다음해인 1996년 8월, 마이크로소프트도 파생 버전인 'JScript' 엔진을 만들었지.
근데 넷스케이프와 마이크로소프트가 각자 따로 엔진을 만들다보니, JScript와 자바스크립트의 호환성이 떨어지는 거야. 완전히 다른 건 아니었지만, 일부분만 서로의 브라우저에서 실행이 가능했지.
왜냐하면 회사들 입장에서는 자사 웹 브라우저를 차별화해야 하잖아? 각자 엔진에 자사 브라우저에서만 동작하는 기능을 경쟁적으로 집어넣는 거야.
그러다보니까 자바스크립트로 개발을 해도, 브라우저에 따라 웹 페이지가 정상 동작하지 않는 문제가 생겼어. 개발자들이 엄청 스트레스를 받았겠지?
개발자들은 '이건 아니야!' 외치면서 이런 혼란한 시국을 바로잡기 위해 뭉쳤어. 그래서 '공식 표준'이 등장했지. 이 표준 이름이 바로 ECMAScript.
우리가 지금 쓰고 있는 Javascript의 표준은 ECMAScript야. (엄밀히는 다르지만) 사실상 같은 말이라고 이해하면 돼. 마치 한국어에 표준어 규칙이 정해져있고, 한국어라고 하면 이 표준어를 의미하는 것처럼 말이야.
왜 Javascript라고 부르지 않고 ECMAScript라는 무슨 학술 용어 같은 이름을 쓸까? 상표권 문제 때문이라고 해. 비슷한 이름인 JAVA를 연상시켜서 그런 게 아닐까.
서로 주도권 싸움을 하던 넷스케이프와 마이크로소프트 둘 다 동의할만한 이름이라 그렇다는 말도 있고.
ECMAScript는 1997년에 처음 등장했어. 그 후 계속 버전이 업데이트 되고 있어. 그럴 때마다 자바스크립트에는 새로운 문법이나 기능이 추가되지.
2015년에 업데이트 버전을 ECMAScript 2015이로 불러. (또는 줄여서 ES2015) ECMAScript 2015는 전체 에디션 중 6번째 버전이야. 그래서 ES6라고 부르기도 해. 좀 헷갈리지? 아무튼 ES2015와 ES6은 같은 거야.
ECMAScript 표준은 엔진들이 어떻게 자바스크립트를 해석해야한다라고, 정해주고 있어. 우리가 사용하는 자바스크립트 엔진은 모두 이 표준을 따르는 애들이지.
하지만 표준이 그렇게 자세한 건 아니야. 나머지 부분에서는 각자 자기들만의 방법으로 엔진을 구현해. 덕분에 차이도 있지.
이 엔진을 구현하는 회사들은 대부분 웹 브라우저를 만드는 회사야. 자바스크립트는 웹에서 동작하는 프로그래밍 언어니까. 자바스크립트 엔진을 이 웹사이트를 읽고 사용자에게 보여줘야 하는 웹 브라우저 회사들이 반드시 갖춰야하고. 자바스크립트 엔진이 뛰어나다는 건 그 회사의 웹 브라우저를 쓸 이유가 되기 때문에 열심히 개발하는 거야.
오늘날 가장 유명하고 많이 쓰이는 엔진 4개를 알려줄게.
V8. 구글이 개발하는 엔진. 크롬. 노드JS. 일렉트론에서 사용해. 가장 유명하고 널리 쓰이는 엔진이지.
SpiderMonkey. Mozilla가 개발하고 Firefox 브라우저가 사용하는 엔진.
Charkra. 마이크로소프트가 개발하고, 인터넷 익스플로러가 사용하는 엔진. 하지만 MS엣지는 차크라를 버리고V8으로 갔지.
Javascript Core(JSC). 애플이 개발하는 엔진. 사파리, 리액트 네이티브가 사용해.
다 같은 표준을 따르긴 하지만, 엔진에 따라서 각자 구현 방식이 조금씩 다를 수 있다는 거만 알아두자. 그래서 여전히 같은 자바스크립트 코드를 써도 브라우저마다 실행 결과가 미묘하게 달라지는 일이 발생해. (크로스 브라우징 이슈라고 불러)
근데 꼭 이게 나쁜 건 아닌 것이, 이 엔진 개발사들은 ECSMAScript 표준을 따르는 동시에 자바스크립트를 더 빠르고 효율적으로 실행하는 방법을 계속 고민하고 경쟁하고 있거든. 덕분에 웹브라우저가 점점 더 좋아지는 거지.
이제 자바스크립트 엔진이 뭔지 알았으니, 안을 들여다보자. 이 엔진 안에도 또 가장 중요한 부분이 있거든? 그게 바로 인터프리터와 컴파일러라는 건데, 다음 시간에 알아보자구.