ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • What is golang (go) ?
    카테고리 없음 2016. 10. 11. 11:52



    구글이 2009년에 만든 프로그래밍 언어. 로버트 그리즈머, 롭 파이크, 켄 톰슨에 의해 디자인되었다. 이름이 이름인만큼 검색이 불편한 경우가 제법 있다. 그래서인지 보통 golang으로도 많이들 이야기한다.

    Go 언어의 사용자들은 고퍼(Gopher)라고 부르며, 고퍼들을 위한 연례행사인 고퍼콘(Gophercon)이 세계 각국에서 매년 열리고있다.

    2016년 8월 현재 최신 버전은 1.7이다. 2009년 11월에 첫 선을 보인 이래, 2014년 1.4버전이 나온데 이어 2015년 8월에 1.5버전이 나왔다. 1.5버전에서는 드디어 Go 컴파일러가 Go로 작성되었다. 그 이전까지는 C언어로 작성, 자기 자신으로 구현된 컴파일러가 생겼다는 것은 개발 속도에 상당한 가속이 붙게 되었다는 의미가 될 수 있다. 2016년 2월 중순에는 HTTP/2가 기본으로 지원되고 템플릿 문법의 개선 등이 이루어진 1.6 버전이 릴리즈되었고, 8월에는 컴파일 속도의 개선, 실행 퍼포먼스 향상, /x/net/context 패키지의 기본 패키지화 등이 이루어진 1.7 버전이 릴리즈되었다.


    전반적으로 C의 영향을 많이 받았으며, 나온 지 5년 동안은 구글에 취직이라도 하지 않는 이상 배워봤자 딱히 쓸 데가 없다는 이유로 새로운 언어에 관심이 많은 덕후얼리어답터 개발자들 사이에서나 알음알음 쓰여지던 정도였지만, 다름아닌 구글이 만든 것이기도 하고 언어 자체가 가진 매력도 있어서 사용자 층이 점차 늘어나는 추세다. 특히 Go 언어를 이용해서 안드로이드와 iOS 앱을 제작할 수 있게 적용 중이다. 또한 Python이 그렇듯 웹 개발에도 쓰이고 있고 특히 서버 사이드 언어로서 좋은 평가를 받고 있다. 또한 Go가 자체적으로 지원하는 라이브러리만으로도 간결하게 웹사이트를 만들어낼 수 있다.


    묘하게도 Go 언어는 중국에서 상대적으로 인기가 제법 있는 편이다.


    Go 언어의 특징은 컴파일 언어이지만 컴파일러의 컴파일 속도가 매우 빨라 인터프리터 언어처럼 쓸 수 있다는 점에 있다. 이는 언어의 문법 구조를 개선함으로써 달성하였다. 컴파일러가 소스 코드를 해석하는 pass 수를 줄여서 달성한 것으로 보인다.

    접근하기 어렵지 않고, 코드 역시 간결하면서도 컴파일 언어답게 높은 성능을 낼 수 있다는 점이 호평을 받는다. 

    자료형 체계에 있어 정적 타입(static type) 검사가 이루어지는만큼, Python 등에 익숙해져 있다가 넘어올 경우 조금 애로사항이 꽃필 수 있다. 간결하게 코드를 작성할 수 있으면서도 풍부한 라이브러리 등의 덕택에 막강한 기능을 쉽게 구현할 수 있다는 것은 

    큰 장점이다.


    그러나 컴파일 언어의 태생적인 한계를 극복한 것은 아니라서 대형 모듈을 이것저것 붙이면 컴파일에 필요한 시간이 있기에 Python 등의 인터프리터 언어보다는 기동할 때에 확실히 반응이 늦다. 물론 컴파일 언어 중에서는 매우 빠른 편이지만 아무래도

    인터프리터 언어의 즉응성까지 바라는 건 무리, 물론 컴파일 언어만큼 실행 시 퍼포컨스는 확실하다.


    또한 Go는 GoRoutine이라는 비동기 매커니즘을 제공한다. 이 비동기 매커니즘은 Erlang에서 영향을 받은 것으로 각각의 고루틴은 병렬로 동작하며 메시지 채널을 통해 값을 주고받는다. 고루틴을 사용하면 이벤트 처리, 병렬 프로그래밍 등이 간단해진다. 단 병렬화된 고루틴의 동기화 문제는 프로그래머가 챙겨 줘야 하며 동기화를 무시할 경우 프로그램이 비정상 종료할 수도 있다. 예를 들어 부모 루틴이

    자식 루틴보다 먼저 끝나버리면 자식 루틴은 OS에 의해 메모리에서 강재로 사출되어 버린다. 단 동기화 방법은 기존 멀티스레드 응용

    프로그램에 비해 매우 간단한 편, 단순히 고루틴으로부터 반환값을 받는 줄을 메인 스레드에 추가하면 된다.


    고루틴은 멀티스레드 매커니즘이지만 자체적인 스케쥴러에 의해 관리되는 경량 스레드이며 OS에서 관리하는 경량 스레드보다 더 경량이다. 따라서 고루틴은 CPU 코어수와 무관하게 수백 수천만 고루틴을 작성해도 성능에 문제가 생기지 않는다. 이는 Erlang도 마찬가지.


    다만 컴파일 언어이므로 바이너리만 배포할 경우 해당 타깃 머신에 맞춰서 컴파일해야 한다. 바이트코드를 생성하는 방식이 아니므로 다중 플랫폼을 지원하려면 소스코드 째로 배포해야 한다. 




    사용사례


    컨테이너 기반 가상화 도구인 Docker를 작성하는데 사용된 언어로 유명하다.


    그리고 전부를 Go로 만든 것은 아니지만, 당연히 구글을 비롯해 드랍박스나 클라우드플레어, 사운드클라우드, 넷플릭스 등에서도 기존의 기능들 중 상당수를 새롭게 Go를 이용해 바꿨다고 한다. 트위치 TV도 많은 부분이 Go로 작성되었다고 하며, 언론사인

    뉴욕 타임즈에서도 Gizmo라는 API 백엔드 서비스를 Go를 이용해 만들어 그 소스를 깃허브에 공개한 바 있고 SpaceX에서도 원격 측정 프로그램에서 Go를 사용한다고 한다. 





    참고 


    컴파일 언어인 덕분에, 속도가 느린 스크립트 언어에서 연산 퍼포먼스가 필요한 부분을 Go로 대체해 넣을 수도 있다. 예를 들면, Go로 만든 코드를 공유 라이브러리로 컴파일해 Ruby에서 FFI를 이용해 컴파일한 .so 파일을 가져와 사용하는 식. PHP에서도

    역시 가능하다. 다만 기본 패키지들 중에서는 성능보다는 편의성에 초점을 맞춘 탓에 극한의 성능을 추구하는 경우라면 사용을 권하기 어려운 것들이 있다. 예를 들어 웹 서버 제작시에 쓰이는 net/http나 html/template 등이 그러한데, 이런 경우엔 기본

    패키지를 대체하는 별도의 패키지를 이용하면 (실제 체감효관느 별론으로 하되 벤치마크상으로는 심지어 수십 배나 수치가 좋아지는 경우도 있다.


    Go 언어의 설계 지향점이 시스템 프로그래밍 언어이므로 실행 퍼포먼스가 중요한 로직을 개발할 때 C언어 대신 사용할 수 있다. 현대의 고성능 컴퓨터 아키텍처가 제공한느 성능을 한계까지 뽑아쓸 수 있게 언어 차원에서 적극적으로 도와주므로 신규 프로젝트를 개발한다면 기존에 C 언어로 갭라해야 했을 부분을 Go 언어로 작성하는 것도 고려해보자. 특히 멀티코어를 적극적으로 사용해야 하는 프로젝트라면 C + OpenMP 조합보다는 Go를 쓰는 게 더 유리하다. 




Designed by Tistory.