선택 언어 → JavaScript
3.2 효율성
목적 코드의 효율성 → 실행 속도
JavaScript는 기본적으로 Interpreter 언어로서의 성질을 가지지만, 성능상의 최적화를 위해 Compiler 언어의 특성도 같이 가진다.v8엔진을 통해 실행 속도를 개선했다.번역의 효율성 → 컴파일 속도
파싱과 컴파일을 향상시키기 위해 v8은 무엇을 했나?
초기의 v8 엔진은
Full-codegen - 자바스크립트 코드를 컴파일 방식을 통해 중간 단계 없이 바로 머신코드로 번역Crankshaft - Full-codegen 이 만들어준 바이트코드를 최적화된 코드로 컴파일하는 컴파일러→ 이 두가지 컴파일러를 가지고 있었다.
하지만 2015년 도입된 TurboFan은 컴파일 방식을 채택해, 자주 쓰는 코드를 최적화 시키고 기존 코드를 최적화된 코드로 바꾼다.
이때 이 최적화는 인라인캐싱, 히든 클래스 등과 같은 방법을 사용해 최적화 한 후, 이후에 컴파일 할 때 참조하여 속도를 높인다.
→ 이를 JIT 컴파일러라고 한다.
구현의 효율성 → 알고리즘 구현하기 얼마나 편한가
프로그래밍 효율성 → 프로그램 작성이 얼마나 쉬운가
3.3 일반성, 직교성, 획일성
일반성 → 관련 있는 여러 개념들을 일반적인 하나의 개념으로 통합 (예외 X)
JavaScript에는 포인터가 없기 때문에 함수의 인자로 기본 자료형이 들어왔을때 값을 복사한 변수를 새로 메모리에 만들게 된다. → 일반성 저하직교성 → 서로간에 독립적인 개념
JS의 배열은 타입이 고정되어 있지 않다. 같은 배열에 있는 원소 값의 타입은 서로 다를 수 있다.
JS에서는
call by value로 동작한다.call by reference로 동작한다.→ 변수가 가리키는 메모리 공간에 저장되어 있는 값을 복사하여 전달한다는 관점에서 바라볼 때 자바스크립트는 항상 값에 의한 전달call by value만 존재한다고 말할 수 있다.
획일성 → 유사한 것들은 유사하게, 다른 것들은 다르게
3.4 프로그래밍 언어의 기타 설계 원칙
JS는 형 검사를 지원하지 않는다. → 이를 보완하는 TypeScriptReact.jsNext.jsVue.jsAngularNode.jsExpress.jsNest.js