본문 바로가기
자습

Go 언어 초보가 정리하는 Go 특징

by litaro 2020. 12. 18.

https://blog.golang.org/gopher

아... 난 언어에 재능이 없는데... 또 새로운 언어를 배워야한다니 마음이 무겁다. 하지만 뭐 원래 사용하는 언어도 어차피 깊이 모르는데 새로 언어 공부하나 기존 언어 공부하나 별반 다를게 없다고 생각하니 또 마음이 편안하기도 하다. ㅋㅋㅋ 

Google이 만든 Go 언어는 이미 주변 동료들이 개인적으로도 많이들 공부하고 쓰고 있는 언어라 대충 어떤 언어인지는 주워들어 알고는 있지만. 제대로 공부해본적은 없다. 이번에 제대로 공부해보자~!!

Go 언어의 특징

1. Cross-platform (High performance)

Go 언어는 compile 언어다. 내가 경험한 언어는 Java와 Python. 이들과 비교해본다면

Java vs. Go : 둘다 compile 언어인데 다른 것은 Java는 Runtime을 설치해야하는데 비해 Go는 native binary 형태로 빌드되어 바로 실행된다. (windows에서는 .exe로, linux에서는 ELF로 빌드된다.

Go vs. Python: Python은 script 언어, Go는 compile 언어. script언어는 실행하는 시점에 JIT 컴파일러로 컴파일되어 실행되어 compile 언어에 비해 성능이 느리다. 

사실 나도 Go에 대해 많이 들은것은 빠른 성능이었다.

얼마나 다른가? 검색해보니 이미 훌륭한 분들이 benchmark 결과를 내놓았다. ^^

tech.ssut.me/http-server-benchmark/

 

HTTP Server Benchmark

This is a benchmark with comparative of performance of various well known web servers. Web servers these days are fast enough, and I think not many people opt for the fastest web server, but instead are interested in that. So I made a simple benchmark to s

tech.ssut.me

www.softkraft.co/golang-vs-python/#binary-search

 

Golang vs. Python — Which One to Choose?

The internet is filled with great codes. They form the bedrock on which various infrastructures are built. Even the very platform you are reading this on is built with a dedication to creating great codes. While the average user isn’t going to take note

www.softkraft.co

오우~ 어떻게 측정했는지는 잘 모르지만... 확실히 Go가 내가 사용했던 Python보다는 확실히 빠르구나!! compile 언어의 위력이구나...

2. Concurrency Mechanism 

Go 하면 또 많이 듣는 얘기가... Goroutines 와 Channels. 

잘 이해가 안되서 또 찾아보니 참고하기 좋은 블로그가 ^^ 있었다. 참 훌륭한 분들~

blog.nindalf.com/posts/how-goroutines-work/

 

How Goroutines Work · Krishna's words

Introduction to Go If you are new to the Go programming language, or if the sentence “Concurrency is not parallelism” means nothing to you, then check out Rob Pike’s excellent talk on the subject. Its 30 minutes long, and I guarantee that watching it

blog.nindalf.com

tech.ssut.me/goroutine-vs-threads/

 

Goroutines vs Threads

Google이 Go 언어를 만들어낸 이후 많은 시스템 관리용 유틸리티, 서버가 Go로 짜여지기 시작했고 매 업데이트마다 엄청난 성능 향상과 발전으로 이제 어디서든 Go 언어로 짜여진 프로그램을 쉽게

tech.ssut.me

보통 동시에 여러 일을 하기 위해서 언뜻 든 생각은 multi thread였다. JAVA에서 써봤던... threadpool을 설정해서 thread를 여러개 돌리는 것 말이다. goroutines과 무엇이 다른지 와닿지 않았는데,

"Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once."

동시성과 병렬구조는 다른 것이다. 병렬구조는 여러가지 일을 동시에 하는 것이고. 동시성은 동시에 여러 일을 다루는 것이다. 동시성은 논리적 개념, 병렬구조는 물리적 개념. 병렬구조는 싱글 프로세스에서는 불가능하다. 하지만 동시성은 싱글프로세스에서도 가능하다. 

https://golangbot.com/concurrency/

Goroutines vs. Thread

Memory : Java Thread의 경우 1Mb 를 필요로 하는데 비해 Goroutines는 2Kb만 있으면 된다. 결국 Java의 경우는 많은 Thread를 생성하면 OutOfMemoryError 가 날 확률이 높다.

Setup and teardown: Thread를 setup하고 teardown하는데 OS에 요청을 하고 돌려줘야하기에 runtime에 의해 생성되고 정리되는 Goroutine에 비해 상대적으로 비용이 많이 든다. 

Switching: Thread간 switcing은 관련된 모든 register (6 general purpose registers, PC (Program Counter), SP (Stack Pointer), segment registers, 16 XMM registers, FP coprocessor state, 16 AVX registers, all MSRs etc....아 ㅠㅠ 뭔지 잘 모르겠...) 를 save/restore하는데 비해 Goroutines는 3개의 register (Program Counter, Stack Pointer and DX)만 save/restore하면 된다. 그러니 상대적인 cost가 낮아지게 된다.

Goroutines의 동작

M:N Thread 모델을 이용해서 multi-core도 쓰고 cotext swiching 속도도 잡도록 해서 성능을 높혔다. 그리고 개발자는 아랫단이 어떻게 구현했는지 알 필요 없이 사용할 수 있도록 Goroutines 와 Channels 개념으로 API를 제공한다. (오~ 좋아~!!)

한번은 Go 개발자 얘기를 듣는것이 좋다고한다. (영어라... slide 위주로~ ^^) 따로 공부해서 정리해야겠다.

www.youtube.com/watch?v=f6kdp27TYZs

3. Garbage Collection

Go에는 pointer가 있고 그 얘기는 memory 정리를 해야한다는 것. 아. 예전 C 잠깐 해볼 때 이 memory 해제가 제일 골치 아팠었는데 --;;. 다행히 Go는 Garbage Collector가 실행파일에 있어서 자동으로 정리해준다. 좋아~!

4. Simplicity

Python과 다른점이 type을 정의해야하고 또 C와도 다른점이 Stongly-typed 언어라는것.  C에서는 int 와 float 과의 계산시 int를 float로 형전환을 알아서 해준다면, GO에서는 에러를 발생시키때문에 프로그램에서 명시적으로 형전환을 해줘야한다. 이 부분이 관점에 따라서 불편할 수 도 있지만 Type을 혼합해서 사용한 것으로 인해 디버깅을 해본 사람이라면 이 부분도 차라리 명확해서 장점이 될 수 있다. 

또 재밌는 것은 대소문자 구분으로 public, private을 구분하는 것이다. Python과 Java 의 경우 Scope가 private, public, protected 로 되어있고 명시적으로 표시하는데 비해서 Go는 대문자는 public (다른 package에서 접근 가능), 소문자는 private (같은 package에서 접근 가능) 이라 simple하다. 하지만 두가지 scope만 제공하는 것을 단점으로 드는 사람도 많다. 같은 package안에서는 막을 방법이 없으니 잘 모르는 다른 개발자가 아무 생각없이 같은 package에 건드리면 안되는 data 를 변경하는 경우도 있다는 것이다. 

gofmt 를 제공해서 서로 다른 formating 을 정의하는데 시간을 소비할 필요가 없다.

 

일단 기본적으로 그동안 주워들은 Go 의 특징을 정리해봤다. 이제 세부적인 문법과 사용법에 대해 공부해야겠다~