본문 바로가기

Archive/독학기록

[Go] Go언어의 장점 (번역)

728x90
반응형

Go언어의 장점 및 특징

간결한 문법 및 단순함
✔ 병행 프로그래밍 지원(동시성)
✔ 정적타입 및 동적 실행
✔ 간편한 협업 지원(단, Git을 강제하는 부분이 있음)
✔ 컴파일 및 실행속도 빠름
✔ 제네릭 및 예외 처리 미지원
✔ 컨벤션 통일(Go fmt)

 

 

 

 

Go에는 GoRoutine이 있다!



하드웨어 제작자들은 퍼포먼스 향상을 위해 프로세서에 더욱 더 많은 코어를 추가하고 있다. 모든 데이터 센터들은 이런 프로세서에서 돌아가고, 매년 더 늘어난 코어 수를 기대할 만 하다. 여기에 더하여 오늘날의 어플리케이션들은 데이터베이스 연결과 메세지 큐, 캐시 유지를 위해 다양한 마이크로 서비스를 이용하고있다. 그래서 우리가 개발하는 소프트웨어와 프로그래밍 언어는 늘어나는 코어 수의 추이에 맞추어 더욱 쉬운 병행성과 확장성을 지원할 수 있어야 한다.



그러나 대부분의 최신 프로그래밍 언어들은(Java, Python 등) 대부분 90년대 싱글 스레드 환경의 산물이다. 이들 대부분은 멀티 스레딩을 지원한다. 그러나 실질적인 문제점은 동시 실행, 스레딩 잠금, *경쟁 상태 *교착 상태이다. 

 

*경쟁 상태(Race Condition):둘 이상의 입력 또는 조작의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다. 입력 변화의 타이밍이나 순서가 예상과 다르게 작동하면 정상적인 결과가 나오지 않게 될 위험이 있다.) 
*교착 상태(Deadlock): 두 프로세스가 서로 원하는 리소스가 상대방에게 할당되어 있어 두 프로세스는 무한정 기다리게 된다. 멀티 프로그래밍 환경에서 한정된 자원을 사용하려고 서로 경쟁하는 상황이 발생할 수 있다.

 



이러한 문제점들은 해당 언어에서 멀티 스레딩 어플리케이션 제작을 어렵게 만든다.

예를 들어, Java에서 새 스레드를 만드는 것은 메모리 효율적인 방법이 아니다. 모든 스레드가 약 1MB의 힙 메모리(Heap memory; 프로그램 실행 도중에 요구되는 기억 장소를 할당하기 위하여 운영체제에 예약되어 있는 메모리 영역. 프로그램의 프로세스가 사용할 수 있도록 미리 예약 되어 있는 메인 메모리의 영역이다.)를 사용함에 따라 수 천개의 스레드를 돌리게 되면 결국 힙에 엄청난 부하가 걸리게 되고, 결국 메모리 고갈로 인한 셧다운을 야기하게 된다. 또한 2개 이상의 스레드간 통신 역시 매우 어려운 일이 된다.

반면 Go는 멀티 코어 프로세서가 이미 사용 가능했던 2009년에 출시되었다. 이것이 Go가 동시성을 염두에 두고 구축 된 이유이다.  Go에는 스레드 대신 Goroutine이 있다. Goroutine은 힙 메모리의 2KB 정도를 소비한다. 따라서 수백만개의 Goroutine을 언제든 돌릴 수 있는 것이다.

 

 

 

 

 

 

✔ 고 루틴에는 성장 가능한 세그먼트 스택이 있다. 즉, 필요할 때만 더 많은 메모리를 사용한다

✔ 고루틴은 스레드보다 시작 시간이 더 빠르다.

✔ 고 루틴은 채널간 통신의 안전성을 보장하는 기본 요소를 탑재하고 있다

✔ 고 루틴은 데이터 구조를 공유할 때 뮤텍스 잠금(다중 프로세스 동기화 잠금)에 의존하지 않아도 된다

✔ 고 루틴은 OS 스레드와 1:1 매핑되지 않는다. 하나의 고 루틴이 여러개의 스레드에서 실행될 수 있다.

✔ 고 루틴은 적은 수의 OS 스레드로 다중화 된다.

 

 

 

 

 

 

상기한 특징들은 Go를 매우 강력하게 만들어, JAVA, C 및 C++과 같이 동시성을 처리하면서 실행코드를 간결하고 아름답게 유지할 수 있게 된다.

 

 

 

 

 

 

Go는 기본 하드웨어에서 직접 실행된다

Java나 Python같이 고차원적인 언어 대신 C나 C++을 이용할 때 가장 유리한 점은 아무래도 퍼포먼스일 것이다. C나 C++은 컴파일되고 인터프리트 되지 않기 때문이다.

 

 

 

프로세서는 바이너리를 이해한다. 보편적으로 프로젝트를 컴파일 할 때 Java 또는 기타 JVM 기반 언어를 사용하여 어플리케이션을 빌드하면 사람이 읽을 수 있는 코드를 JVM 또는 기본 OS상에서 실행되는 다른 가상 머신에서 이해할 수 있는 바이트 코드로 컴파일하게 된다. 실행되는 동안 가상머신은 이러한 바이트 코드를 해석하고 프로세서가 이해할 수 있는 바이너리로 변환한다. 

 

 

 

 

 

반면에 C/C++은 가상머신 상에서 실행하지 않으므로 싸이클에서 한 단계가 지워진다. 사람이 읽을 수 있는 코드를 바이너리로 직접 컴파일하여 퍼포먼스를 향상시키게 되는 것이다. 

 

 

 

그러나 해당 언어에서 변수를 제거하고 할당하는 것은 사람에겐 고통스러운 작업이다. 대부분의 프로그래밍 언어는 가비지 콜렉터 또는 레퍼런스 카운팅 알고리즘을 사용하여 개체 할당 및 제거를 수행하게 된다.

 

Go는 이런 애로사항에 있어 최고의 솔루션을 제공한다. Go는 저레벨 언어인 C, C++처럼 언어를 컴파일한다. 이는 즉, 저레벨 언어와 거의 같은 퍼포먼스를 낸다는 점이다. 또한 가비지 콜렉터를 사용하여 개체를 할당하고 제거한다. 따라서 더이상 malloc () 및 free() 문이 없다. COOL!!

 

 

 

Go로 작성된 코드는 관리가 쉽다

Go는 다른 언어들이 가지고 있는 머리아픈 Syntax가 없다. 매우 간결하고 심플한 Syntax가 특징이다.

 

Go를 디자인한 사람들은 자신들이 "언어"를 만든다는 점을 염두에 두고 있었다. 구글 자체가 방대한 양의 코드를 기반으로 하며 수 천명의 개발자들이 같은 코드를 기반으로 일한다고 생각하면 코드는 당연히 간결하고 이해하기 쉬워야 하며, 하나의 세그먼트가 다른 세그먼트에 끼치는 영향이 작아야 할 것이다. 이러한 연유로 유지보수가 쉽고 수정이 간편한 언어가 필요했던 것이다.

 

이에 따라 Go는 최신 객체지향언어의 다양한 특징을 의도적으로 남겨두었다.

 

✔ 클래스 없음!

모든 것은 패키지로만 나눠진다. Go는 클래스 대신 구조체만 있다.

 

✔ 상속 없음!

상속이 없으면 코드를 쉽게 수정할 수 있다. Java나 Python같은 언어에서 ABC 클래스가 XYZ 클래스를 상속하고, XYZ 클래스를 일부 변경하면 XYZ를 상속하는 다른 클래스에서 부작용이 생길 수 있다. 상속을 제거함으로써 Go는 코드를 쉽게 이해할 수 있게 된다. (코드 조각들을 보는 동안 살펴볼 수퍼 클래스가 없기 때문)

 

 

✔ 생성자 없음!

객체의 초기화를 담당하는 서브루틴

 

✔ 주석 없음!

 

✔ 제네릭 없음!

매개변수화 된 클래스나 인터페이스가 없다

 

✔ 예외 없음!

 

 

 

상기한 특징들이 바로 Go가 다른 프로그래밍 언어와 차별화 되고, 작성 방식이 달라지게 되는 부분이다. 기존의 언어에 익숙한 개발자들은 이 점을 싫어하기도 한다. 물론 이 특징이 없어도 여전히 코드는 작성할 수 있다. 단지 작성해야 할 코드가 2~3줄 정도 더 늘어날 뿐이다. 따라서 긍정적인 측면에서(효율) 봤을 때, 이러한 특징 때문에 꼭 Go를 써야 한다기 보다는 Go를 이용하면 다른 언어로 같은 코드를 작성할 때 좀 더 간결하고 명료한 코드가 산출된다는 점 정도가 되겠다.

 

 

 

위 그래프는 Go가 C나 C++ 만큼의 효율을 자랑하면서도 Ruby와 Python같은 간결한 문법을 유지할 수 있다는 점을 두드러지게 보여준다. 인간도 프로세서도 서로 윈윈하는 방식인것이다. 그럼에도 Go의 Syntax는 굉장히 안정적이다. 2012년 Go 1.0 릴리즈 이후로 쭉 동일한 Syntax를 유지하고 있으므로문법의 효율성 측면에서 다른 언어들을 역주행 하고 있는 것이다.

 

 

 

 

 

 

Go는 Google의 언어

Google의 언어라는 타이틀이 개발자에게 딱히 이득을 주는 것은 아니다. 그러나 Go는 Google에 의해 디자인되고 지원된 언어이다. Google은 세계에서 가장 큰 클라우드 인프라 중 하나를 보유하고 있으며 실시간으로 대규모로 확장되고 있다. 이에따라 확장성 및 효율성 지원 문제를 해결하기 위한 언어를 설계해야 했으며, 이는 자체 서버를 구축하는 동안 직면하게 되는 수 많은 문제들을 해결해나간 언어라는 뜻이 된다.

 

이에 더해 Go는 Adobe, BBC, IBM, Intel 그리고 Medium(한국의 Brunch 같은 곳) 과 같은 대기업에서 적극적으로 수용하고 있는 언어이다. 

 

 

 

정리하며

Go는 다른 객체지향 언어와 매우 상이한 특징을 지녔지만, 최신 언어들 만큼 핫한 언어임에 분명하다. Go는 C및 C++과 같은 높은 퍼포먼스를 내면서도 Java와 Python/Perl 같은 재미와 효율성을 제공한다.

 

Go를 배울 계획이 없는 개발자라 하더라도, 하드웨어 제한으로 인해 개발자는 여전히 고효율의 코드를 작성해야만 한다. 개발자는 하드웨어를 이해하고 그에 따라 프로그램을 최적화해야 하기 때문이다. 최적화 된 소프트웨어는 더 저렴하고 더 느린 하드웨어(ex. IOT 장치)에서 실행될 수 있으며, 최종 사용자 경험에 전반적으로 더 나은 영향을 미칠 수 있게 된다.

 

 

 

 

 

 

원문을 발췌 후 짧은 지식으로나마 번역해 보았습니다.

오역이 있는 부분은 댓글로 피드백 부탁드립니다 :> -이오니

medium.com/@kevalpatel2106/why-should-you-learn-go-f607681fad65

 

Why should you learn Go?

“Go will be the server language of the future.” — Tobias Lütke, Shopify

medium.com

 

 

 

 

 

 

 

 

 

 

 

 

728x90