정적 컴파일 언어 vs 동적 컴파일 언어
프로그램이 동작하려면 기계어로 변환해주는 컴파일 과정이 필요하다.
바로 이 컴파일 과정을 언제 할 것이가를 언어를 나누는 기준으로 삼기도 한다.
- 미리 컴파일을 해두면 정적 컴파일 언어
- Runtime 때 컴파일하면 동적 컴파일 언어
정적 컴파일 언어는 윈도우를 예로 들면 .exe파일이 미리 기계어로 변환된 실행파일이다.
- 즉 실행 파일 = 기계어 코드
다음과 같은 장점을 가진다.
- 실행할 때 변환 과정이 필요없어서 빠르다.
- 타입에러를 컴파일 시점ㅇ에서 발견할 수 있어서 타입 안정성이 뛰어나다.
동적 컴파일 언어는 런타임 떄 변환하기 떄문에 프로그램 실행 도중 변환 과정이 필요하므로 정적 컴파일 언어보다 더 느리게 동작한다.
동적 컴파일 언어는 정적 컴파일 언어보다 후에 만들어 졌는데 동적 컴파일 언어는 정적 컴파일 언어에 비해 속도가 더 느리다는 단점이 있음에도 불구하고 왜 만들어졌을까?
이유인 즉슨, 범용성이 좋기 떄문이다.
- 칩셋과 운영체제마다 0과 1로된 바이너리 코드를 표현하는 형식이 달라서 기계어로 변환할 때 각 칩셋에 맞게 변환을 해줘야 한다.
- 아키텍쳐에 따라 (ARM, 인텔) 실행 환경이 달라진다. 다양한 실행환경을 지원하기 위해서는 그 만큼 많은 빌드 과정을 거쳐야 한다.
위와 같은 단점이 존재하여 속도를 희생한 대신 범용성을 얻었다.
Go 언어는 정적 컴파일 언어라서 각 플랫폼에 맞는 실행 파일을 따로 만들어 줘야하나 Go 내부 환경변수만 바꿔서 다양한 플랫폼에 맞도록 실행 파일을 만들 수 있어 비교적 쉽게 대응이 가능하다.
- Go는 정적이라 매우 빠른 실행속도를 자랑함.
약 타입 언어 vs 강 타입 언어
타입 검사를 강하게 하는 언어와 그렇지 않은 언어로 프로그래밍 언어를 나눌 수 있다.
예를 들어 12와 “12”는 엄밀히 다른 타입의 값이다. 만약 “12” + 12를 명령하면 어떻게 될 까?
이는 언어마다 다른데 서로 다른 타입간 연산에 관대한 언어를 **약 타입 언어(weakly typed)**라고 하고 **엄격한 언어(strongly typed)**를 강 타입 언어라고 한다.
Go 언어는 다른 강 타입 언어에서 지원하지 않는 자동 타입 변환까지도 지원하지 않는 최강 타입 언어이다. 그래서 사용하기가 좀 까다로우나 타입이 달라서 발생할 수 있는 문제점이 전혀~ 발생하지 않는다.
가비지 컬렉터 유무
가비지 컬렉터의 유무로 프로그래밍 언어를 나눌 수 있다.
가비지 컬렉터가 있으면 메모리 해제를 자동으로 해주기 떄문에 메모리 관련 문제가 줄어든다는 장점이 있지만 메모리 청소에 CPU 성능을 사용한다는 문제가 있다. 따라서 가비지 컬렉터가 없는 언어가 대체로 더 빠른 성능을 자랑한다.
Go언어는 가비지 컬렉터를 제공한다. 그냥 가비지 컬렉터가 아니라 매우 발전된 형태의 가비지 컬렉터를 제공해서 성능 손실이 크지 않다.
- 물론 가비지 컬렉터가 없는 언어보다는 느리지만 가비지 컬렉터가 있는 언어 중에서는 상위 성능에 속함.
특징표
개념 | 있다/없다 | 설명 |
클래스 | 없다. | 메서드를 가지는 구조체를 지원한다. |
상속 | 없다. | 상속을 지원하지 않는다. |
메서드 | 있다. | 구조체가 메서드를 가질 수 있다. |
인터페이스 | 있다. | 상속은 없지만 인터페이스는 있다. |
익명 함수 | 있다. | 함수 리터럴 이라는 이름으로 제공한다. |
가비지 컬렉터 | 있다. | 고성능 가비지 컬렉터를 제공한다. |
포인터 | 있다. | 메모리 주소를 가리키는 포인터가 있다. |
제네릭 프로그래밍 | 없다. | 지원하지 않는다. |
네임스페이스 | 없다. | 모든 코드는 패키지 단위로 분리된다. |
'Programming > Go' 카테고리의 다른 글
[Golang] 함수 (Function) (1) | 2022.10.29 |
---|---|
[Golang] 연산자 (Operator) (0) | 2022.10.29 |
[Golang] 표준 입출력 (0) | 2022.10.23 |
[Golang] 변수 (0) | 2022.10.22 |
[Golang] 코드 실행과정 (0) | 2022.10.17 |