이론 정리/Golang

Golang - 고랭 이란??

철매존 2022. 7. 24. 14:48
728x90

프로그래밍 언어

프로그램이란?

원하는 명령을 원하는 순서대로 실행될 수 있도록 적어 놓은 문서를 뜻한다.

프로그래밍은 어떠한 명령을 실행할 때에 결국 컴퓨터 언어로 실행하게 된다.

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

이 컴퓨터 언어로의 변환 시점에 따라 정적 컴파일 언어와 동적 컴파일 언어로 나뉘게 된다.

정적 컴파일 언어

C, C++, Go

정적 컴파일 언어는 Code를 실행하기 전에 미리 기계어로 변환시킨다.(실행 파일 생성)
이 방식의 장점은 미리 기계어로 변환시켜두었기 때문에 한번 변환하게 되면 속도가 빠르게 사용할 수 있다.

동적 컴파일 언어

JS, python 등등..
추가로 Java가 동적 컴파일 언어라고 나와있어서 이상해서 찾아 보았는데, java는 동적/정적의 특성을 모두 가지고 있는 하이브리드 언어이다.

정적 컴파일 언어와 반대로 실행할 때 마다 Code를 기계어로 변환시키는 언어이다.
왜 굳이 한번에 안바꾸고 이거를 쓸까??

-> 굳이 이 느리게 실행되는(한줄한줄) 동적 컴파일 방식(인터프리터)를 사용한 이유는 정적 컴파일 언어에서의 문제를 해결하기 위해서이다.

먼저 opcode라는것이 있는데, 이는 어떤 명령을 대입시켜 둔 코드이다.
그래서 기계언어로의 변환을 위해서는 이 opcode를 사용하게 된다.
한 마디로 기계어로 변환하기 위해서는 이 opcode를 알아야 한다는 것이다.

근데 문제는 이 cpu핀셋을 만드는 회사마다(AMD, Intel ...) opcode가 다르다.
그레서 어떤 컴퓨터에서 실행되느냐에 따라 출력되는 기계어가 달라지게 된다.

그래서 정적 컴파일 언어에서 코드를 변환할 때에는 모든 실행파일을 미리 만들어두게 된다.
AMD용 실행파일, Intel용 실행파일, ARM용 실행파일.... + OS(window / mac / linux ...) + 비트(64bit, 32bit ... )
등등 플랫폼마다 모든 실행파일을 만들어야 한다는 것이다.
그래서 이거 하는게 엄청 복잡하다.

동적 컴파일 언어에서는 동일한 code를 다운받게 되면, 실행되는 시점에 플랫폼을 분석하게 된다.
그 때 만약 실행되는 플랫폼이 64bit AMD windows 라 치면 그에 맞추어 바로 실행하도록 하는 것이다.
이것이 동적 컴파일 언어가 갖는 큰 장점이다.

정적 컴파일 언어로서의 Go언어

위에서 보이듯 동적 컴파일 언어는 정적 컴파일 언어보다 나중에 나왔는데, 이는 정적 컴파일 언어의 단점을 해결하는 언어이기 때문이다.

Go언어는 굉장히 최근 언어인데 불구하고 정적 컴파일 언어이다.
왜 이거는 정적으로 돌아갔을까??

그 이유는 속도를 포기할 수 없기 때문이다.
그리고 요즘은 예전보다 플랫폼이 단순해졌기 때문이다. (OS종류가 적어지고 칩셋 종류가 적어지고 등등....)

그리고 Go언어는 여러 플랫폼에 실행 파일을 편리하게 만들 수 있도록 해준다.


$Env:GOOS = "linux"
-> 환경값을 linux로 만들기

$Env:GOOS = "windows"
-> 환경값을 windows로 만들기

요런 식으로 빌드 단계 이전에 개발자가 환경설정을 바로 바꾸어 줄 수 있다!!


약타입 언어, 강타입 언어

말 그대로

약타입 언어는 타입 검사를 약하게, 강타입 언어는 타입 검사를 강하게 한다.

"12" + 12

예를 들어 이거를 실행했을 때에

약타입 언어는

  • 1212
    • 문자열 + 문자열
  • 24
    • 숫자 + 숫자

이렇게 두가지로 실행될 수 있다. 알아서 프로그램이 변경해 주는데 기준을 사용자는 알기 어렵다.

강타입 언어는 여기서 아예 Error를 출력해 버린다.

물론 약타입 언어에서도 이거를 Error처리해주는 친구가 있다.

강타입 언어로서의 Go언어

Go언어는 이 강타입 언어 중에서도 아주 최고로 잡아버리는 언어이다.

즉, 타입이 조금이라도 다르면 그냥 error를 내버린다.
그래서 좀 귀찮긴 하지만... 혹시나 생길 문제들을 미연에 방지시켜준다는 장점이 있다.
아마 백준 좀 풀어봤으면 이게 좋은 장점이라는것을 알 수 있을 것이다.


Garbage 컬렉터

C, C++은 Garbage 컬렉터가 없고
Java, C#, JS, Python, Go 등등은 Garbage 컬렉터를 가지고 있다.

Garbage컬렉터가 없으면 메모리 사용 이후 소멸시켜야 한다.
그렇지 않으면 Leak, 메모리 사용량이 증가된다.
즉 메모리 관리를 프로그래머가 잘 해주어야 한다는 것이다.

Garbage컬렉터가 있으면 알아서 이것들을 지워줘서 프로그래머가 메모리 관리를 빡빡하게 해줄 필요가 없다.
근데 문제는 프로그램 속도가 느려진다는 단점이 있다.

Garbage컬렉터를 지원하는 Go언어

Go언어 또한 Garbage컬렉터를 지원하는데, 여기서 지원하는 Garbage컬렉터는 매우 빠른 성능을 가지고 있다.

한 번 GC가 돌아서 메모리를 청소하는 데에 1ms 미만의 속도가 걸린다.


정리하자면

Go언어는

  1. 정적 컴파일 언어이다.
    • 그래서 속도가 빠르다.
    • 빌드 이전에 실행 환경을 미리 세팅해 줄 수 있다.
  2. 강타입 언어이다.
    • 그중에서도 매우매우 강하게 잡는 언어이다.
    • 혹시라도 있을 타입 에러를 강하게 잡아준다는 장점이 있다.
  3. GC를 가지고 있다.
    • 메모리 관리를 GC가 해준다.
    • GC의 성능이 굉장하다.

'이론 정리 > Golang' 카테고리의 다른 글

Go의 GC에 대해 (feat. java)  (1) 2022.10.31
Golang의 포인터  (0) 2022.07.24
Golang의 구조체  (0) 2022.07.24
Golang의 배열  (0) 2022.07.24
Golang의 기초  (0) 2022.07.24