타입스크립트
TypeScript는 JavaScript를 타입관련 기능들을 확장한 언어이다.
생겨난이유
Javascript는 초기 탄생시 간단한 웹 조작용으로 개발된 언어이다.
자유도가 높고 유연한 문법으로 간편하게 개발하기 좋은 언어이다.
노드 js가 생겨나고 어디서든 실행할수 있는환경이 만들어진 javascript는 이제 웹 서버, 모바일 앱, 데스트탑 앱 들을 만들수 있게 되었고 대규모 시스템이나 깊이있게 만들어야하는 어플리케이션에서는 자바스크립트의 자유도와 유연한 문법이 단점이 되었다.
타입 시스템
언어에서 사용할수 있는 여러가지 값들을 어떤 기준으로 묶어 타입으로 정할지 결정하고
코드의 타입을 언제 검사할지 어떻게 검사할지 타입과 관련된 지켜야할 규칙들을 모아둔 체계
언어의 타입과 관련된 문법체계이다.
1. 정적 타입 시스템
- 코드 실행전 모든 변수의 타입을 고정적으로 결정함. => 엄격하고 고정적인 시스템
장점: 어플리케이션을 실행하기전에 타입 에러가 검출되어 안정성을 확보 할 수 있다.
단점: 모든 변수에 타입을 지정해줘야 해서 타이핑이 늘어나고 타입 변환 코드들로 인해 코드량이 증가한다.
ex) C, C++, Java
2. 동적 타입 시스템
- 코드를 실행하고 나서 그때 그때 마다 유동적으로 변수의 타입을 결정함. => 자유롭고 유연한 시스템
장점: 타입에 유연성으로 간편하고 타입 변환을 할 필요가 없어 코드량이 줄어든다.
단점: 런타임시 발생되는 타입 관련에러들로인해 안정성이 낮아진다.
ex) Python, javascript
동적 타입 시스템의 문제점
아래 코드는 런타임 시점에 예외가 발생한다..
let a = "hello"; // 문자열
a = 123; // 숫자
a.toUpperCase(); // error
반면 정적 타입 시스템에서는 에초에 컴파일 에러를 발생시켜 실행중에 에러를 만들수 없다.
애플리케이션도 안정적으로 돌아간다.
3. 정적 + 동적 타입 시스템 :: 점진적 타입 시스템 (Gradual Type System)
TypeScript는 동적 타입 시스템과 정적 타입시스템을 혼합하여 사용한다.
실행전 검사를 통한 안정성을 확보하고 자동으로 변수의 타입을 추론하는등 정적, 동적 타입 시스템의 장점을 모두 갖고 있다.
// 변수의 타입을 실행 이전에 결정
// 타입 오류를 실행이전에 검사함.
let a:number = 1;
a.toUpperCase(); // 에러 발생. 실행이 안되게 막는다.
let b = 2; // 타입을 명시하지 않아도 b는 이제부터 number 타입
b.toUpperCase(); // 에러 발생. 실행이 안되게 막는다.
자바스크립트와 타입스크립트의 동작원리
1. JavaScript
자바스크립트는 예전엔 인터프리터 언어라 불려왔다. 코드를 한줄씩 해석하고 별도의 실행파일(바이너리) 파일을 만들지 않았다.
현재의 자바스크립트 엔진(V8, SpiderMonkey 등)은 단순 인터프리터가 아니다.
1) 파싱(Parser)
소스 코드를 AST(Abstract Syntax Tree)로 변환한다.
2) 인터프리터 실행
AST 또는 바이트코드를 빠르게 실행한다.
3) JIT 컴파일
반복 실행되는(핫한) 코드를 감지한다.
해당 코드를 네이티브 머신 코드로 컴파일한다.
이후에는 컴파일된 코드로 고속 실행한다.
즉, 실행 중에 필요한 부분만 컴파일하는 구조이다.
JavaScript -> AST(추상 문법 트리) -> 바이트 코드
AST로 먼저 변환 AST를 바이트 코드로 변환
2. TypeScript
TypeScript -> AST(추상 문법 트리) -> Type Checking -> javascript -> AST(추상 문법 트리) -> 바이트 코드
AST로 먼저 변환