Managed Lanaguage
메모리 관리를 언어상에서 알아서 해주는 언어
특정 런타임 환경 내에서, 프로그램을 생성하도록 설계된 언어.
인터프리터나 VM을 지원하고, 프로그램의 코드가 이 위에서 동작하도록 설계되어 있음. (소스코드 컴파일 & 동작)
VM은 메모리 관리(Garbage Collecotr) 역할을 수행한다. => Java나 Python 을 사용할 때, 메모리에 대한 생각은 하지 않고 작성한다.
=> JAVA, Python, C#, Javascript
Unmanaged Language
사용자가 직접적으로 하드웨어 CPU, Memory 를 관리할 수 있다.
VM과 같은 런타임 환경의 관리를 받지 않는 언어.
일반적인 컴파일 수행 >> bytecode 생성 >> 실행파일 생성
=> C, C++
[컴파일 과정]
C, C++
소스코드 -> 전처리기 -> 컴파일러 (정적 컴파일) -> 링커 -> 실행파일 -> 실행
컴파일 타임 런타임
Java
JVM(Java Virtual Machine)
소스코드 -> 컴파일러 (정적 컴파일) -> .class files (중간파일) ->
컴파일 타임
실행 (JVM 동작) -> Just-In Compiler (동적 컴파일) -> NativeCode
런타임
Python
Python Interpreter(CPython, PyPy)
소스코드 -> Python Interpreter (동적 컴파일, 인터프리팅) -> 실행
컴파일 과정
소스코드(Input) -> 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 -> 실행파일(Output)
전처리기: 소스코드 자체에 대한 수정
컴파일러: 소스코드를 어셈블리 코드로 번역
어셈블러: 어셈블리 코드를 목적코드로 번역
링커: 생성된 목적코드들을 링킹하여 실행파일 생성
컴파일타임 & 런타임
컴파일타임 : 실행파일이 만들어지는 순간까지
런타임 : 실행파일이 실행된 후의 시간대
소스코드(Input) -> 전처리기 -> 컴파일러 -> 어셈블러 -> 링커 -> 실행파일(Output) -> 실행
컴파일타임 런타임
정적타입 언어 (Static Typed Language)
컴파일 시에 변수의 타입이 결정되는 언어
=> C, C++, Java, C#
=> 타입 에러로 인한 문제를 컴파일 타임에 해결할 수 있기 때문에 안정성이 높다.
=> 컴파일 시에 미리 타입을 결정하기 때문에 실행속도가 빠르다.
string cake = "cheeseCake";
int score = 1000;
동적타입 언어 (Dynamic Typed Language)
런타임 시 자료형이 결정되는 언어
=> Python, JavaScript, Ruby
=> 자료형이 런타임에 결정되기 때문에, 소스코드 작성 시 자료형을 명시적으로 지정해줄 필요가 없다. >> 유연성이 높다
=> 코드 작성이 효율적이다.
a = 1
b = []
c = 'cheese'