본문으로 바로가기

[Golang] Go는 어떤 언어?

category Programming/Go 2022. 9. 23. 16:06

정적 컴파일 언어 vs 동적 컴파일 언어

프로그램이 동작하려면 기계어로 변환해주는 컴파일 과정이 필요하다.

바로 이 컴파일 과정을 언제 할 것이가를 언어를 나누는 기준으로 삼기도 한다.

  • 미리 컴파일을 해두면 정적 컴파일 언어
  • Runtime 때 컴파일하면 동적 컴파일 언어

정적 컴파일 언어는 윈도우를 예로 들면 .exe파일이 미리 기계어로 변환된 실행파일이다.

  • 즉 실행 파일 = 기계어 코드

다음과 같은 장점을 가진다.

  • 실행할 때 변환 과정이 필요없어서 빠르다.
  • 타입에러를 컴파일 시점ㅇ에서 발견할 수 있어서 타입 안정성이 뛰어나다.

동적 컴파일 언어는 런타임 떄 변환하기 떄문에 프로그램 실행 도중 변환 과정이 필요하므로 정적 컴파일 언어보다 더 느리게 동작한다.

동적 컴파일 언어는 정적 컴파일 언어보다 후에 만들어 졌는데 동적 컴파일 언어는 정적 컴파일 언어에 비해 속도가 더 느리다는 단점이 있음에도 불구하고 왜 만들어졌을까?

이유인 즉슨, 범용성이 좋기 떄문이다.

  1. 칩셋과 운영체제마다 0과 1로된 바이너리 코드를 표현하는 형식이 달라서 기계어로 변환할 때 각 칩셋에 맞게 변환을 해줘야 한다.
  2. 아키텍쳐에 따라 (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