What's With That Name?
자바 스크립트는 자바와는 관련없이, 순전히 마케팅 전략으로 출시된 이름이다. 기존의 무겁고 상대적으로 더 잘 알려진 자바의 대항마 포지션을 획득하기 위해 '자바'라는 이름에 더 가벼운 프로그램이라는 의미로 '스크립트' 라는 단어를 합쳐 만들어졌다고 한다. 한마디로 자바와 자바 스크립트는 기능적인 측면에서 전혀 다른 결을 띄고 있는 언어들이다. 요즘에는 그냥 JS 혹은 ECMA 표준의 전신이라는 의미에서 ECMAScript 라고 불리는 추세이다.
Backwards & Forwards
backwards / forwards compatible 에 대해 알아볼 필요가 있다.
- backwards compatible : 과거에 작성해둔 기능 코드가 현재 브라우저 상에서도 호환이 되는 것.
- forwards compatible : 최신 버전의 기능 코드를 과거의 브라우저 상에서 작성하더라도 일정 부분 호환이 되는 것.
대개 마크업 언어인 HTML 이나 스타일 언어인 CSS 같은 경우, forwards compatible 한 특징을 가지고 있다. 인식되지 않는 기능들이 일부 있다고 해도 skip 하는 것이 다른 기능에 그렇게 큰 영향을 미치지 않기 때문이다. 반면, 프로그래밍 언어인 JS는 유지 보수 측면에서 개발자로 하여금 브라우저가 업데이트 되더라도 코드는 제 기능을 할 수 있다 생각하고 프로그램을 짤 수 있어야 하기 때문에 backwards compatible 하다고 볼 수 있고 그러한 스탠스를 장려하는 것이다.
JS가 forwards compatible 하다면 어떤 일이 일어날까? 최신 문법을 코드에 도입하려 할 때, 엔진이 인식 가능한 것만 부분적으로 받아 들이고 일부는 스킵한다면? 수많은 선언식과 표현식 사이에서 유지, 보수가 어려워지는 건 물론이거니와 프로그램의 안정성을 보장할 수조차 없어질 것이다.
하지만 그렇다고 클린 코드와 커뮤니케이션의 이점을 포기할 수는 없기 때문에 그 갭을 줄이고자 등장한 여러 방안들이 있는데, 그 중에 두 가지로 Transpiling과 Polyfill을 꼽을 수 있다. Babel을 이용한 트랜스파일링은 최신의 문법으로 코드를 작성했을 때, 그 코드를 브라우저의 기준에 맞게 재해석해주는 기능을 말하고 Polyfill은 최신의 api를 브라우저 상에서 지원하지 않을 때 그 대안에 맞게 직접 비즈니스 로직을 작성해주는 것을 의미한다. 개발하는 입장에서는 무엇보다 커뮤니케이션을 통한 생산성을 우선시해야하기 때문에, 최대한 클린 코드를 유지하되 프로그램의 안정성을 위해서 일정 부분에서는 도구를 써야할 필요가 있다.
JS: is it an interpreted script or a compiled program?
JS를 바라보는 시각 중 가장 보편화된 관점은 'JS 는 인터프리터 언어'라는 관점이다. 하지만 본질적으로 보았을 때 JS는 컴파일 언어에 좀 더 가깝다고 봐야 한다. 해당 논점을 가리기 위해서는 interpret 방식과 compile 방식을 통한 에러 핸들링을 비교해볼 필요가 있다.
- interpret 방식은 위에서 한 줄씩 읽어가며 실행하는 구조를 띄고 있다. 때문에 특정한 줄에서 에러가 있는지 파악하기 위해서는 그 전까지의 모든 줄을 실행해야 한다.
- 반면 compile 방식은 크게 파싱 > 컴파일 > 실행 단계로 이루어져 있는데, 해당 코드에 대한 파싱이 이루어지는 단계에서 에러의 여부를 체크하기 때문에 실행 전에 에러를 알아낼 수 있다.
JS가 실행 되기 전까지의 모든 과정을 살펴 보자.
- 개발자가 에디터를 통해 코드 작성을 마친다.
- 코드는 Babel로 웹에 맞는 트랜스파일 과정을 거친다.
- Web pack을 통한 번들링 작업이 이루어지고 그 파일은 JS 엔진으로 전송 된다.
- 엔진은 코드를 추상적 구문 트리로 만들기 위해 파싱하고,
- JIT 컴파일러가 컴퓨터가 이해할 수 있는 이진 코드로 변환한다.
- JS VM이 프로그램을 실행한다.
위 과정을 보았을 때, JS는 컴파일 언어라고 보는 것이 더 합리적인 시각이다.
'Development' 카테고리의 다른 글
[20.12.24] 객관적인 코드 리뷰를 위해 (0) | 2024.01.07 |
---|---|
[20.12.24] YDKJSY - Surveying JS (0) | 2024.01.07 |
[20.12.17] 옵저버 패턴 (1) | 2024.01.06 |
[20.10.03] TDD에 대한 간단한 고찰 (2) | 2024.01.06 |
[19.11.26] TIL, pre course 과제 완료. (1) | 2024.01.06 |