프로그램 실행 개요
-
프로그램이 AST로 파싱된다.
- 프로그램은 프로그래머가 작성한 다수의 텍스트 파일로 구성.
- 이 텍스트를 컴파일러(compiler)라는 특별한 프로그램이 파싱하여 추상 문법 트리(abstract syntax tree, AST)라는 자료구조로 변환. (AST는 공백, 주석, 탭 등의 결과를 무시)
-
AST가 바이트 코드로 컴파일된다.
- AST를 바이트코드(bytecode)라는 하위 수준의 표현으로 변환.
-
런타임이 바이트코드를 평가한다.
- 바이트코드가 만들어졌으면 런타임(runtime)이라는 다른 프로그램에 바이트코드를 입력해 평가하고 결과를 얻음.
타입스크립트 컴파일과정
타입스크립트가 다른 언어와 다른 점은 컴파일러가 코드를 바이트코드 대신 자바스크립트 코드로 변환한다는 점.
TS (TSC)
1. 타입스크립트 소스 -> 타입스크립트 AST
2. 타입 검사기가 AST를 확인 *
3. 타입스크립트 AST -> 자바스크립트 소스
JS (브라우저, NodeJS, 기타엔진)
4. 자바스크립트 소스 -> 자바스크립트 AST
5. AST -> 바이트코드
6. 런타임이 바이트코드를 평가
- TSC가 타입스크립트 코드를 자바스크립트 코드로 컴파일할 때는 개발자가 사용한 타입을 확인하지 않는다.
- 개발자가 코드에 기입한 타입 정보는 최종적으로 만들어지는 프로그램에 아무런 영향을 주지 않는다.
- 따라서 타입을 바꾸고 개선하고 실험해도 기존의 프로그램이 망가질 염려가 없다.
타입 시스템은 보통 두 가지 종류가 있다.
- 명시적 타입 시스템
- 자동 타입 추론 시스템
-
타입스크립트는 두 가지 시스템에 영향을 받아 두 방식 중 선택할 수 있다.
-
어노테이션(
:
)을 이용하면 타입스크립트에 명시적으로 타입을 지정할 수 있다. -
어노테이션을 사용하지 않으면 타입스크립트가 알아서 타입을 추론한다.
타입스크립트가 타입을 추론하도록 두는 것이 코드를 줄일 수 있는 방법이므로 보통 어노테이션은 생략한다.
타입 시스템 기능 | 자바스크립트 | 타입스크립트 |
---|---|---|
타입 결정 방식 | 동적 | 정적 |
타입 자동 변환 | O | X (대부분) |
타입 확인 시기 | 런타임 | 컴파일 타임 |
에러 검출 시기 | 런타임 (대부분) | 컴파일 타임 (대부분) |
타입은 어떻게 결정되는가?
- 동적 타입 바인딩(dynamic type binding)을 하는 자바스크립트는 프로그램을 실행해야만 특정 데이터의 타입을 알 수 있다.
- 타입스크립트는 점진적으로 타입을 확인하는(gradually typed) 언어다.
- 즉, 타입스크립트는 컴파일 타임에 프로그램의 모든 타입을 알고 있을 때 최상의 결과를 보여줄 수 있지만, 프로그램을 컴파일하는 데 반드시 모든 타입을 알아야 하는 것은 아니다.
- 타입을 지정하지 않은 프로그램이라도 그중 일부 타입을 추론해서 오류를 검출할 수 있지만, 모든 타입을 알지 못하는 상황에서는 많은 오류가 사용자에게 그대로 노출될 수 있다.
- 점진적 타입 확인은 타입을 지정하지 않은 기존 자바스크립트 콛드를 타입을 사용하는 타입스크립트로 마이그레이션 할 때 특히 유용하다.
- 코드를 마이그레이션하는 상황이 아니라면 모든 코드의 타입을 컴파일 타임에 지정하는 것을 목표로 해야한다.
자동으로 타입이 변환되는가?
- 자바스크립트는 약한 타입(weakly typed) 언어다. 유효하지 않는 연산을 수행하면 다양한 규칙을 적용해가며 개발자가 의도한 바를 알아내려 노력하고, 주어진 정보로 최상의 결과를 도출한다.
- 타입스크립트는 유효하지 않은 연산을 수행하면 바로 그 부분을 지적하며, 의도를 명시해야 타입스크립트의 지적을 무사히 통과할 수 있다.
언제 타입을 검사하는가?
-
자바스크립트는 대부분 상황에서 타입이 무엇인지 따지지 않는다.
-
타입스크립트는 컴파일 타임에 코드의 타입을 확인하기 때문에 코드를 실행하지 않고도 에러가 있음을 바로 알 수 있다.
3 + [1]; // [ts] Operator '+' cannot be applied to types '3' and 'number[]. [2365]
에러는 언제 검출되는가?
- 자바스크립트는 런타임에 예외를 던지거나 암묵적 형변환을 수행한다.
참고로 자바스크립트도 프로그램을 파싱하기 때문에 실행 전에 문법 에러와 몇 가지 선택 버그(예: 한 영역에 같은 이름으로 여러
const
를 선언) 등을 검출 할 수 있다.
(바벨(Babel) 같은 도구를 이용하여) 빌드 프로세스에 자바스크립트 파싱 과정을 포함시키면 빌드 타임에 이런 에러를 찾아낼 수 있다. - 타입스크립트는 컴파일 타임에 문법 에러와 타입 관련 에러를 모두 검출한다.
아래와 같이 직접 만들수도 있고 타입스크립트 내장명령어 tsc --init
타입스크립트 프로젝트를 자동으로 설정할 수 있다.
// 예시
{
"compilerOptions": {
"lib": ["ES6", "dom"],
"module": "commonJs",
"outDir": "dist",
"sourceMap": true,
"strict": true,
"target": "ES6"
},
"include": ["src"]
}
tslint --init
명령어는 기본값으로 채워진 tslint.json 파일을 만든다.
빠르게 프로젝트를 설정하기 위한 방법들
- ts-node를 설치한다. 이를 이용하면 명령 한 번으로 타입스크립트를 컴파일하고 실행
- typescript-node-starter 같은 뼈대(scafolding) 제공 도구를 이용해 프로젝트 디렉터리 구조를 빠르게 생성