반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

DevOps Tasks

Go 란? 본문

GO

Go 란?

데밥스 2023. 12. 26. 23:08
728x90
반응형

작고 귀여운 GO

 

“At the time, no single team member knew Go, but within a month, everyone was writing in Go and we were building out the endpoints.

It was the flexibility, how easy it was to use, and the really cool concept behind Go (how Go handles native concurrency, garbage collection, and of course safety+speed.) that helped engage us during the build.

Also, who can beat that cute mascot!”

— Jaime Enrique Garcia Lopez, Senior Software Development Manager at Capital One



Capital One의 수석 소프트웨어 개발 관리자의 한 마디

 

GO 는 빠르다 🏎️

 

Go 는 C 언어와 비슷한 구문이지만 C 언어의 복잡성을 완화하고 컴파일 속도를 개선하였다.

여기서 Go는 전체적인 헤더 파일을 관리하는 것이 아니라 소스 코드 자체만 관리한다.

그렇기 때문에 Go는 컴파일 언어지만, 컴파일러가 소스 코드 자체를 패키지 했기 때문에 인터프리터 언어와 같이 빠르게 동작하는 것이다.

또한,

Go 는 바이너리 ( 0과 1로 이루어진 이분법으로 실행, 바이트로 저장되는 파일 ) 파일의 실행 속도가 빠르다.

C 언어의 바이너리를 제외한 작업들에서 Go와 C 언어의 성능은 비슷하지만 JS, Python, Ruby 등 다른 언어들에 월등히 빠르다.

 

Go는 간단하다. 

 

 

다른 컴파일 언어 C 언어는 키워드가 37개, C++ 은 84개인 것과 비교할 때 Go는 키워드가 불과 25개이다.

키워드가 적어 복잡하지 않기에 간단하다. 그리고 C 언어 경험이 있다면 Go를 배우고 만드는 것에 대한 장벽이 높지 않다.

 

break     default      func    interface  select
case      defer        go      map        struct
chan      else         goto    package    switch
const     fallthrough  if      range      type
continue  for          import  return     var

 

하지만,

프로그램을 실행하는 데 있어 실행 시간을 줄이기 위해 작게 설계된 언어인 만큼 일부 기능이 생략되어 있다.

제네렉 기능은 없지만 인터페이스와 유사하게 타입 제한자로서 기능을 제공한다.

종종 Runtime과 GC 모두 OS에 디펜던시가 걸린 점들이 있을 수 있다.

728x90

컴파일 언어와 인터프리터 언어를 간단하게 알아본다.

Compiled Language

 

내가 작성한 소스 코드 전체를 컴퓨터가 이해할 수 있는 기계어로 번역한 뒤, 이 번역된 코드를 한 번에 실행하는 두 단계를 거쳐 진행된다.

번역과 실행이 완전히 따로 이루어진다.

이미 컴파일이 된 프로그램이라면 굉장히 빠른 속도로 실행이 가능하고 운영체제 이식성이 낮다.

소스 코드를 컴파일한 후, 기계어를 메모리와 CPU를 통해 읽어 실행하는 방식으로 동작하는 언어로

컴파일 후, 프로세서가 실행할 수 있도록 변환된 기계어 코드를 별도의 파일에 저장된다.

이렇게 컴파일러 언어는 컴파일 단계와 실행 단계로 분리되어 있다.

 

실행에 앞서 컴파일은 단 한 번만 수행된다.

 

실행 시에는 컴파일을 하지 않고 실행만 하면 되므로 코드 실행 속도는 빠르고 개발자가 메모리 및 CPU 같은 하드웨어 측면에 대한 더 많은 제어 권한을 가지고 있으므로 자원을 효율적으로 관리할 수 있다.

 

하지만, 코드 수정이 있을 때마다 빌드 과정을 거치기 때문에 전체적인 개발 기간이 늘어난다.

실행 환경 제약이 있어 지정된 플랫폼에 최적화되어 있다.

반응형

Interpreted Language

 

소스 코드를 컴파일하지 않는다.

런타임 환경에서 문 단위로 코드를 한 줄씩 읽어서 바로 실행하는 방식으로 빌드 과정을 거치지 않기에 별도의 실행 파일이 없다.

코드 수정이 용이하지만, 인터프리트 단계와 실행 단계가 분리되어 있지 않아 코드가 실행될 때마다 인터프리트 과정이 반복 수행하므로 실행 속도가 비교적 느리다.

 

빌드 과정이 없고 바로 실행가능하므로 코드 수정 용이하여 개발 기간 비교적 적다.

플랫폼에 독립적이라는 장점이 있다.

 

하지만, 런타임 환경에서 코드를 해석하고 실행하기에 실행 전에 버그를 발견하기 어렵고 보완할 방법은 있지만 코드의 양이 많아진다.

실행 시마다 인터프리트 과정이 반복 수행하므로 실행 속도가 비교적 느리다는 단점이 있다.

 


 

GO 언어의 장점 및 특징들을 알아본다.

 

가비지 컬렉션 ( GC )

 

 

Go GC

 

C 언어는 메모리를 할당하면 반드시 해제하는 과정이 필요하지만 Go는 알아서 지원해 준다.

Go GC는 삼색 표시 후 쓸어 담기 알고리즘 Tricolor mark and sweep algorithm을 사용한다.

 


goroutine과 gochannel 을 알기 전 Thread의 개념 먼저 알면 좋을 것 같다.

 

 

Thread

 

쓰레드 (Thread) 는 프로그램 내에서 실행 흐름을 의미한다.

프로그램은 일반적으로 하나의 살행 흐름 (Thread) 을 가지지만 경우에 따라 하나 이상의 쓰레드를 갖는 경우도 있다.

이를 멀티 쓰레드라고 한다.

CPU 는 단순한 계산기이다.

주어진 값을 계산만 할 뿐, 이 값이 어디서 왔고, 어디로 가는지는 신경 쓰지 않는다.

멀티 쓰레드인 경우, OS에서 쓰레드를 관리하고, 쓰레드의 개수가 CPU 보다 많은 경우, 쓰레드를 교체해 가면서 CPU를 사용하도록 한다.

이를 컨텍스트 스위칭 ( Context Swtiching ) 이라고 한다.

컨텍스트 스위칭은 하나의 CPU 가 여러 쓰레드를 다룰 때, 쓰레드를 전환시키며 CPU를 사용하도록 하는 것을 의미한다.

이렇게 CS 가 발생하면 전환 비용이 발생하므로 성능이 저하되는 문제가 발생할 수 있다.

반대로, CPU 의 개수가 쓰레드의 개수와 동일하다면, CS 가 발생하지 않으므로 성능에 아무 문제가 발생하지 않는다.


 

Go Routine

goroutine

 

Go 런타임에 의해 관리되는 경량 쓰레드이다.

고루틴을 사용하면 비동기적으로 여러 개의 함수를 실행할 수 있다.

멀티스레드 메커니즘이지만 자체적인 스케줄러에 의해 관리되는 경량 쓰레드이며, OS에서 관리하는 경량 쓰레드보다 훨씬 경량이다.

고 루틴 (경량 쓰레드) 을 만드는 비용은 Thread에 비해 매우 적기 때문에 경량 쓰레드라고 한다.

 

Go Channel

고 루틴을 사용하다가 고 루틴끼리 데이터를 주고받아야 하는 경우 사용한다.

동시에 실행되는 고루 틴들을 연결해 주는 일종의 Pipe이다.

 

이렇게 간단하게 GO 의 특징 및 장점들을 알아보았다.

728x90
반응형