본문 바로가기
Javascript/YDKJS

YDKJS (유돈노JS) Ch1 - 자바스크립트

by ginny. 2024. 8. 29.

ch1. 자바스크립트

- 자바스크립트 이름은 개발자들에게 어필하기위한 마케팅목적으로 고안된 이름. 암호명 모카. 처음엔 넷스케이프에서 라이브스크립트라고 불렀고 공식명칭이 자바스크립트.

- TC39에서 지정하고 ECMA 국제 표준화기구에 의해 공식화된 명칭 ECMAScript.

TC39는 JS의 공식명세(문법,작동방식)를 관리하는 기술운영위원회. 위원회 구성은 유명웹회사출신들이 자원봉사함. 격월로 회의. JS는 버전이 없다.  공식표준JS는 단하나. 어디서나 동일한 JS

JS를 지배하는 웹

-JS구현체를 만들때는 가장 중요한 웹브라우저 환경을 고려할것. 명세서를 웹에 맞춘다.

가급적 특정 JS엔진에 종속되지않으면서 명세서를 준수하는 구현체만 사용하자.

JS지만 JS가 아닌 웹 전용문법

alert()는 명세서에 없지만 모든 웹환경에서 지원하는 함수. JS가 실행되는 환경은 전역스코프에 API를 추가해 자체적으로 상용할수 있는 기능을 제공함. fetch, getCurrentLocation..등등은 JS처럼 보이지만 웹에서만 지원되는 API.

실행환경이 빌트인모듈을 제공해서 개발자가 편리하게 API쓸수있게 해준것.

모든코드가 JS인것은 아닙니다.

개발자 도구는 오직 개발자편의를 위해 만든것. 명세를 정확히 재현하기 위한 도구가 아님. 콘솔의 목적은 개발자가 짧은코드를 입력하고 결과를 즉시 확인하기 위함. 따라서 브라우저 개발자도구의 콘솔이나 node js의 repl이 순수js 작동방식을 보장하지 않는다. 그러니 콘솔의 결과를 신뢰하진 말자

JS의 다양한 얼굴

패러다임. 코드를 어떻게 구조화할것인지 접근방식. 절차적, 객체지향, 함수형

절차적-탑다운,선형적 구조화, 프로시저(코드단위)에 미리 정해진 연산을 작성 (C언어)

객체지향-클래스 기준으로 구조화, 클래스에 로직과 데이터를 정의 (자바,C++)

함수형-함수 단위로 구조화, 순수함수, 함수자체를 값으로 취급 (하스켈)

JS는 다중패러다임언어, 유연한언어. 

하위호환성과 상위호환성

JS는 하위호환성 보장. 한번 유효한 JS문법은 명세서가 변경되도 계속 유효함. 1995년에 작성한 js코드가 지금 브라우저에서도 돌아간다. 실수도 영원히 박제됨. 반면 HTML,CSS는 상위호환성 보장. 옛날코드는 현재에 안돌아갈수도.

간극을 줄이기 위한 노력

2016년엔진에서 ES2019기능으로 작성한 프로그램이 실행이 안됨 > 구엔진과 호환되지 않는 문법은 트랜스파일을 통해 호환성 문제 해결가능. 상위호환성 문제는 트랜스파일러를 사용하면됨. 트랜스파일러가 새로운JS문법을 오래된 문법으로 변환해줌. 바벨을 사용함. 개발자는 새로운문법을 활용한 클린코드를 짜야함. 호환성문제는 도구에 맡기자.

간극을 메우기 위한 방법 찾기

상위호환성 문제가 새로운문법이 아니라 아직 지원하지않는 API메서드때문이라면, 메서드정의를 추가해 이 메서드가 오래된 환경에도 있었던 것처럼 해주는 방법=폴리필.

인터프리터 이해하기

스크립트나 인터프리터언어는 한줄씩 코드가 실행됨. 실행전 사전단계가 없다. 실행되기전까지 오류발견못함. 

실행전 파싱과 컴파일을 거치면 파싱단계에서 오류를 사전에 발견함. 구문오류를 차단하기 좋다. 모든 컴파일언어는 파싱을 거친다. 파싱끝나면 파싱결과인 AST를 실행가능한 코드를 생성하는 작업까지 수행함. JS는 실행전 파싱. 중복된 매개변수명 같이 정적으로 탐지 가능한 오류(초기오류)를 실행전에 차단할 수 있다. >이관점에서 JS는 컴파일언어다

1. 소스코드를 바벨이 트랜스파일. 번들링(번들러 ex웹팩)된 결과를 JS엔진에 전달

2. JS엔진이 전달받은 코드 파싱 > AST

3. AST > 이진바이트코드, JIT컴파일러가 최적화

4. JS가상머신이 프로그램 실행

웹 어셈블리

ASM.js는 JS부분집합. 일관성있는 타입시스템으로 JS런타임 성능최적화에 쓰임.C언어코드를 트랜스파일한것, 타입관련 주석이 자동으로 붙는다는 특징. WASM은 JS아닌개발자들도 JS엔진에서 돌아가는 코드를 쉽게 작성할수있게 해주자는 목적.성능향상을 위한 언어. 실행전 파싱,컴파일없다는게 차이점. 실행직전(AOT)에 이루어짐. WASM은 웹전용기술도, JS도 아니다. 

엄격모드

엄격모드로 작업하면 실수와 문제를 미연에 방지함. 초기오류는 구문오류는 아닌 실행전 컴파일단계에서 잡아내는 오류. ex중복선언. 런타임에 this값을 찾을수없을떄, this에 글로벌객체 대신 undefined를 할당한다.(엄격모드에서)

파일단위, 함수 단위로 적용할수있다. 함수단위 엄격모드는 점진적으로 엄격모드 적용할때만 사용하자.

원본코드가 비엄격모드여도 트랜스파일된 코드는 엄격모드를 준수함! 그러니 상용환경의 JS코드는 거의 모두 엄격모드를 준수하고있다.

ES6모듈은 기본이 엄격모드. 그러니 자동으로 엄격모드를 준수하고 있다.

 

정리

JS는ECMA주최하 TC39위원회가 결정하는 ECMAScript 표준을 구현한 언어. JS는 브라우저 및Nodejs 등 다양한 환경에서 실행된다.

JS는 다중패러다임 언어. 우리원하는대로 절차적,객체지향방식,함수형으로 코드를 작성할수있다.

JS는 컴파일처리되는 언어. JS엔진 및 도구들이 JS코드를 처리하고, 코드실행전 점검, 오류도 보고함

댓글