티스토리 뷰

2009년 10월말에 구글이 발표한 새로운 프로그램 언어 Go(또는golang)는 빠른 경량 언어로 알려져 있습니다. 구글의 GO는 2009년 당시 테스트단계 버전을 넘어서 본격적으로 구글의 메인 언어로 자리를 잡아가고 있고 구글의 Enterprise app engine에 탑제되면서 본격적인 성장 단계로 접어들고 있습니다. 

2009년 10월에 나온 구글의 Go 언어는 불과 4개여월 만에 많은 개발자들에게 큰 인기를 끌기 시작하면서 Java와 같이 세계를 지배하게 될 언어로서의 가능성을 타진 받기 시작하고 있는데요. 이렇게 개발자들 사이에서 관심을 끌게 된 이유는 역시 구글에서 만들었다는 점과  언어 개발을 위해 천재와 전설들이 모였다는 이유만으로도 충분히 주목 받기에 합당한 프로젝트 였습니다. 




구글의 Go 프로그래밍 언어 드림팀 결성
그럼 좀더 이 GO언어에 대해 설명을 드리자면 Go는 구글이 개발한 가비지 컬렉션 기능이 있는 컴파일, 병행성(concurrent) 프로그래밍 언어입니다. Go의 초기 디자인은 2007년 9월 21일로 거슬러 올라가는데 로버트 그리즈머, 롭 파이크, 켄 톰슨이 Inferno 분산 운영체제와 관련된 작업을 하다가 시작되었다고 알려져 있습니다.

이후 러스콕스와 이안타일러가 추가로 투입되면서 명실공히 드림팀의 면모를 갖추어 갑니다. 

이 팀을 드림팀으로 부르는 이유는 그들의 남다른 경력때문이기도 합니다. 구글 직원인 로버트 그리스머는 썬(Sun Microsystems)에서 자바 핫스팟 컴파일러(Java HotSpot compiler) 개발과 크롬 브라우저에서 자바스크립트 엔진 개발에 참여한 천재 개발자중 한명입니다.

그가 크롬팀에 합류하면서 크롬 브라우저의 성능이 급격하게 업그레이드 되면서 속도 전쟁에서 타 웹브라우저를 앞서는 원동력을 만든 인물인 것이죠. 

켄톰슨은 오늘 작고한 데니스 리치와 함께 Unix창조한 인물이기도 하며 유닉스를 만든 공로로 SW 분야의 노벨상이라 할 수 있는 튜링상(Turing Award)를 수상하기도 했기 때문입니다. C언어는 작고한 데니스 리치가 B언어를 개선해 C언어로 만들었고 이에 도움을 준 사람이 바로 켄 톰슨이라고 알려져 있습니다. 

또, 롭파이크는 롭 파이크는 국내에서는 프로그래밍 수련법(원서 <The Practice of Programming>)의 저자로 더 잘 알려져 있으며 현재 널리 사용되고 있는 UTF-8을 개발한 사람입니다. 이 외에 분산 운영체제를 개발했고 개발언어와 관련해서는 동시성을 지원하는 개발언어인 NewSqeak을 개발한 경력이 있는 것으로 알려져 있습니다. 
 
러스 콕스는 프로그래밍 천재로 유명한데 1997년도 부터 러스 콕스를 ‘수년에 걸쳐 세계 최고 수준 컴퓨터 프로그래머’로 각종 언론에 소개되었다는 점입니다. 대학 진학 전에 이미 세계 최고 수준의 프로그래머로 인정 받았는데 이는 USACO(USA Computing Olympiad) 및 IOI(International Olympiad in Informatics)에 미국을 대표해 출전한 이력 때문이기도 합니다. 운영체제, 컴파일러, 알고리즘 등 다양한 분야에 논문을 쓰기도 했을 정도로 다방면에서 천재적인 능력을 보여주는 인물입니다. 

 



GO언어의 시작
GO가 세상에 알려진 시기는 위에서 설명 드렸듯 2009년말입니다. Go언어 출시와 함께 다양한 매체에서 Go 탄생에 대해 뜨거운 관심을 받게 됐는데 위에서도 잠시 설명을 드렸듯 구글에 의해 만들어 졌다는 후광 효과를 보게 됩니다.

이로인해 자연스럽게 엔지니어들에게 알려지기 시작했지만, 기대와 함께 우려를 같이 표하기도하면서 역사적 출발을 시작합니다. 

이런 기대 때문인지는 모르겠지만 2009년 TIOBE에 의해 Go 언어는 올해의 개발언어상을 꼽힙니다. 이 상때문인지는 몰라도 소개되자마자 세계 프로그래밍 랭킹 13위에 당당하게 올라서기도 합니다. 하지만 이후 특별한 이슈가 없어서 프로그래밍 언어 랭킹에서는 그다지 존재감을 발휘하진 못했습니다. 
 


Go언어의 꿈
Go언어가 처음 설계되던 때부터 공식적인 방향은 일종의 시스템 개발 분야에 특화 된 언어로 소개됩니다. 웹서버, 웹브라우저, 웹로봇, 검색엔진, 컴파일러, OS등 시스템 단에서 좋은 성능을 유지하는 쪽으로 개발되고 있습니다.

또, go 언어는 C와 비슷한 성능을 내도록 설계되 C/C++로 개발돼 온 분야 손 쉽게 대체하는데 목적을 두고 있습니다. 여기에 자바와 파이썬의 장점을 흡수해 궁극의 꿈의 프로그래밍 언어가 되는 것을 목표로 한는 로드맵을 살짝 엿보이기도 했습니다. 

특히 최근 발표에 따르면 더이상 시스템 개발에만 치중하지 않고 다양한 분야에서 활용 될 수 있도록 기능을 확장하겠다고 합니다. 출시 1년후 여러 시스템에서 테스트해 본 결과 시스템 개발 이상의 환경에서도 꽤 의미있는 결과물을 얻어 낼 수 있는 성능을 보여준다고 판단한 것 같습니다.

구글에선 이미 서비스에 적용하기도 했는데 첫 적용 사례가 바로 구글 앱 엔진(Google App Engine) 입니다. 적용을 통해 많은 개발자들에게 관심을 불러일으켰고 실제 레퍼런스도 조금씩 얻어내며 파이썬이나 자바 같은 언어에도 뒤지지 않는 성능을 보여주는 언아라는 것을 입증해 가고 있습니다.

 


초기 프로젝트 시작
화이트 보드에 새로운 언어에 대한 스케치를 하면서 초기 20% 파트타임 프로젝트로 시작하였다가 2008년 1월 켄 톰슨이 C 코드를 만들어내는 컴파일러를 만들기 시작했고, 2008년 중반 풀타임 프로젝트로 승격되어 본격적인 개발에 들어갑니다.

2008년 5월 이안 테일러가 Go 스펙의 초안을 이용해서 GCC 프론트 엔드를 만들기 시작했고, 2008년 말 러스 콕스가 참여하면서 프로토타입에서 실질적인 언어와 라이브러리들을 만들기 시작했습니다.

2009년 11월 10일에 리눅스와 Max OS X 플랫폼을 대상으로 공식 발표되면서 실체를 들어 낸 것이지요. 


구글 I/O 2011에서 소개 된 go 언어
올해 구글 I/O 2011 행사에서 Go언어와 소식 전했습니다. 위에서 잠시 설명한 구글 앱엔진에서 go 언어를 지원하겠다는 발표인데요. 이전까지는 사실 Go 언어에 대한 불확실성으로 (실제로 로드맵 발표나 언어와 관련한 정보가 많이 소개되지 않았었습니다.) 개발자들이 Go 언어를 채택하지 않았었습니다. 

구글 입장에서는 아직 부족하다 판단되는 언어를 개발자에게 소개 할 수는 없었을테고 말이죠. 그러다가 구글 앱 엔진에서 지원을 시작하면서 본격적으로 개발자들을 모아 Go 커뮤니티를 만들겠다는 의지를 이번 행사에서 밝힌 것입니다. 

어쩌면 밝혔다기 보다는 소개해서 Go 언어를 써보라는 것이죠. 불편한 것은 개선하면서 자바가 그랬듯 점차 커뮤니티를 확대해가겠다는 의지로 보는 것이 맞을지도 모르겠습니다. 

앱 엔진을 첫 검증 프로젝트로 택한것은 아마도 많은 개발자가 테스트겸해서 쉽게 접근할 수 잇는 앱엔진의 특성과 문제가 발생해도 쉽게 버그픽스 할 수 있는 장점 때문이 아닐까 생각됩니다. 

안드로이드나 크롬은 복잡하기도 하고 Go 의 현재 상태로는 해당 프로젝트에 탑제 시키기엔 아직 완성도나 신뢰성을 확보하지 못해서 앱 엔진 검수 절차를 거치려는 것이 아닐까 생각됩니다. 특히 모바일쪽에 적용하려면 Ti나 ARM 같은 저전력 마이크로 프로세스 지원이 필요한데 아직 이런 부분에 대한 지원을 완벽하게 해소하지 못한 것으로 알려져 있습니다. 

구글 I/O 2011 행사 이후 Go언어 관련 문서가 눈에 띄게 늘면서 잘 정리되고 있으며 개발자들의 참여 또한 가파른 상승세를 보이고 있고 Go언어를 이용한 프로젝트 등록건수도 급증하는 추세라고 소개 된 걸보면 충분히 가능성 있는 언어가 아닐까 생각됩니다. 


Go와의 연관성에 부담 느끼는 구글
공식적으로나 비공식 적으로나 Go는 구글의 언어가 맞습니다. 그들이 제안하고 시작했기 때문이고 그들의 돈이 들어가 개발한 언어이기 때문입니다. 하지만 그들은 이 Go를 자신들의 적자로 내세우지 않고 있습니다.

정보가 빈곤했던 것도 Go 개발 페이지 이외에 정보 노출이 적었고 구글 스스로도 Go의 연관성을 공식적으로 언급하지 않았기 때문입니다. 언론에서 간간히 흘러나온 정보가 구글과 Go의 관계를 알리는 정보가 되고 있는 상태입니다.

그렇다면 구글은 왜? Go를 멀리할까요? 그것은 Go를 구글의 언어로 만들기 보다는 오픈소스 프로젝트 형태로 공개해 자바 같은 만인의 언어로 만들고자하는 꿈이 있기 때문이지 않을까 생각됩니다. 자신들의 적자라는 것을 공식적으로 내세우면 오픈소스진영의 개발자들의 의심의 눈초리를 받을 수 있고, 개발 참여가 제한 적일 수 있습니다.

또, 안드로이드 처럼 구글이 프로젝트를 주도하는 비중이 올라가 여러 상황에서 부담을 초래 할 수 있기에 연합군 형태를 위해서 자신들은 해당 언어 개발에 도움을 주는 스폰서 역할에 머물고자 하는 의중이 곧곧에서 포착됩니다.


 

그렇다면 왜? 구글은 Go를 만들고 지원하는 것일까?
우선은 처음부터 만들려고 했던 것은 아닐것이라 생각합니다. 다만, 위에서 열거했던 인물들이 모여 infemo 분산처리 시스템 개발하다 만드어지게 됩니다.

분산처리 시스템을 개발하다 보니 여러 언어들을 복합적으로 사용해야 했는데 이런 문제들이 시스템 개선에 문제점으로 지적되어 이를 개선하기 위한 프로젝트의 보조 형태로 개발되다 2008년이 되서야 메인 프로젝트로 올라서게 됩니다. 

이 시기가 구글이 안드로이드로 시장에서 반응을 불러일으킨 시점으로 특허등에 대한 문제로 인해 대안이 필요했는데 그때 이 go 언어가 눈에 띄게되어 전폭적인 개발 지원을 시작했다는 이야기가 있습니다. 

또, 안드로이드를 떠나서라도 크롬 OS도 역시 이런 언어의 필요성이 제기 된 프로젝트중 하나입니다. 세간의 평가에 따르면 자바로 제작된 안드로이드형 어플들의 성능이 아이폰의 앱에 비해 떨어진단느 이야기가 많습니다. 

아마도 이런 부분을 해소하기 위함도 Go를 본격 지원하기 시작한 이유일 수도 있습니다. 자바 특허에 대한 부담과 내부적으로 제기 된 시스템 개발에 필요한 요구도 증가등이 Go를 적극 지원하게 된 것이 아닐까 생각됩니다. 

 
Go가 아니더라도 출현했을 새로운 프로그래밍 언어
꼭, Go언어가 아니더라도 아마 C언어를 대체하는 언어가 출현 할 것이란 이야기가 많습니다. 물론 기존에 각광 받은 파이썬등이 그 대안자 역할을 할 수 도 있고요. 

특히 40년 넘게 IT 업계에서 MS 파워를 등에 업고 세계를 지배해온 C언어의 경우 시대적 도전에 직면해 있습니다. 개발되던 당시와 현재의 요구 사항과 내용이 많이 달라지기도 했고 활용 폭도 넓어져 대안 언어가 아니더라도 업그레이드가 필요한 시점이었습니다. 

MS의 경우는 MFC로 대변되는 .net 내지는 C# 플랫폼 종속을 불러왔고 자신들의 틀안에만 가두려는 정책을 취하는데 현재는 이런 틀의 확장이 더뎌졌음은 물론 MS의 종속과 영향력이 약화되면서 새로운 발전 토대가 필요한 상황에 직면하게 됩니다. 

특히 많은 개발자들이 요구하는 개발 환경의 개선에 다음과 같은 요구사항이 필요하게 되는데, 개발속도/모듈화를 위한 의존성/동적타입 언어의 속성/가비지 콜렉션/병렬처리가 그것입니다. 


Go 언어의 특징
개발에 있어서 모듈화를 쉽게 하기 위해서는 의존성(dependency)과 컴파일 속도가 중요한데 파일 수가 500개 이상인 규모의 C/C++언어로 개발하는 프로젝트의 경우 빌드 시키는데 어머어마한 시간이 들어간다고 합니다.

이는 C언어는 굳이 필요하지 않은 파일에 접근해서 불필요한 엑세스를 발생시켜 컴파일 시간이 증가한다는 것입니다.

좀더 쉽게 설명을하면 A/B/C 파일이 각각 있을 경우 C언어의 경우 A가 의존성이 있는 B를 찾고 B는 다시 의존성이 있는 C를 찾으며 전체적으론 속도나 성능을 저하시키는 요인이 됩니다. 그런데 Go의 경우는 직접적으로 필요한 B파일만 찾아서 불필요한 의존성 문제를 탈피할 수 있는 것이죠. 
 
- C언어     :  헤더 파일에서 필요한 처리 -> 9개 파일에서 360라인 엑세스
- C++         :  헤더 파일에서 필요한 처리 -> 131개 파일에서 25,326 라인 엑세스
- Object C :  헤더 파일에서 필요한 처리 -> 689개 파일에서 124,730라인 엑세스

위와 같은 차리르 만들어 낸다고 하네요. 암튼 제가 개발자가 아니라 더 디테일하게 설명하기 어려운데 위에서 지적한 각종 문제에 더불어 파이선과 자바스크립트 같은 동적 언어는 정적 언어처럼 사전에 검증이 어려운데 Go는 동적요소를 가지고 있으면서도 정적 요소를 내제하고 있어서 이런 검증과정에도 유의미한 결과를 보여준다고 합니다. 

또, C언어의 경우 포인터와 메모리 할당 문제로제기되는 가비지 콜렉션에 대한 부담이 발생해 동시성에 담보되는 개발에 약점을 보이고 자바는 이를 VM(가상머신)으로 해결하고 있는데 반해 Go 언어는 빌드 된 결과 파일 자체에서 이를 지원하게해 해결하고 있습니다. 

그리고 멀티코어 지원에도 강점을 가지고 있다고 합니다. 이런 장점을 종합해 보면 C, 파이썬, 자바의 장점만 모두 흡수한 궁극의 프로그래밍 언어가 되는 것이죠 ㅡㅡ;; 


결론, Go 언어 10년뒤엔 최고의 언어가 되지 않을까?
Go언어는 C 언어 계열입니다. 개발 특성도 C 형식을 취합니다. 물론 사용되는 문법이나 함수와 변수 처리등에 대해서는 새롭게 공부해야 하지만 기본적으로 개념적 특성은 C언어에 기반을 두고 있다고 합니다. 

또, 일부 문법은 파스칼을 이용했고 동시성 확보를 위해서 newsqueak에서도 기술을 많이 채용해 왔다고하네요. 이런 개념적 설계는 롭파이크의 연구 결과도 한몫했는데 전반적인 이런 기술들의 특성이 실제 안정성과 신뢰성을 확보하고 대중에 의해 입증되기 시작한다면 어쩌면 생각보다 빠른 시간안에 세상을 지배하는 언어가 될지도 모르겠습니다. 

또, 확장성도 유연해 시스템은 물론 웹등 다양한 환경을 지원하는 형태로 업그레이드 될 것이기에 앞으로 본격적으로 Go 개발자들이 나타나는 시기엔 어떤 결과물로 세상을 놀라게 할지 궁금해집니다. 10년뒤 최고의 언어와 현재 자바 커뮤니티 같은 규모의 Go 커뮤니티를 상상하며 이번 글을 맞칩니다. 

또, 해당 글은 Micro software란 잡지의 Go 프로그래밍 언어에서 많이 발췌해서 작성된 언어입니다. 참고해 주시기 바라며 아래 URL을 찾아 들어가면 관련해서 더 정확한 내용을 확인 할 수 있습니다. 

http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=38206
 
<표 1> C/C++ 컴파일 시 의존성 테스트
 
대표적인 동적언어로는 파이썬과 자바스크립트를 꼽을 수 있다.    
 
동적언어의 속성은 개발코드가 간결해지고 개발자의 귀찮은 코딩작업을 최소화시켜 개발자에게 재미를 주는 요소이기도 하다. 하지만 동적언어는 정적언어처럼 에러 발생을 사전에 검증하는 처리가 부족해서 실제로 해당 코드가 실행될 때 에러에 직면하게 된다는 문제가 있다. 따라서 안전성이 보장되지 않는다는 단점을 갖고 있다. 실제로 Go는 정적타입언어(statically typed language)이지만 동적타입언어(daynamically typed language) 속성을 지원하도록 설계됐다. 컴파일 시점에 컴파일러에 의해 지원되는 것이 특징이다. 따라서 정적언어 타입의 특징인 안전성을 가지면서 동시에 동적언어가 주는 코딩의 재미를 함께 취할 수 있다.
 
C 개발자를 가장 골치 아프게 하는 것들에는 포인터와 메모리 할당 및 해제가 있다. 포인터에 관한 문제점의 싹을 제거하기 위해 포인터는 제공하되 포인터 연산은 제공하지 않는다. 메모리 할당 및 해제에 대해 가비지 콜렉션(Garbage Collection)을 제공하는 경우 메모리 해제에 대해 개발자가 신경쓰지 않아도 된다. 특히 동시성(Concurrency) 관련 개발을 할 때 메모리 할당과 해제는 개발을 어렵게 하는 요소다. 동시성을 언어 차원에서 제대로 지원하기 위해서는 가비지 컬렉션이 반드시 필요하며 Go언어는 가비지 콜렉션을 완벽하게 지원한다. 물론 자바도 지원하는 기능이다. 하지만 자바의 경우 VM(Virtual Machine)에서 제공하는 것과 달리 Go언어에서는 빌드돼 나온 결과 파일에서 이를 지원한다는 것이 차이점이다.
 
최근 안드로이드 기기의 트렌드 중에 하나는 듀얼코어다. 물론 앞으로 두 개 이상의 코어를 갖는 기기가 기본 스펙으로 자리 잡을 것으로 예상된다. C/C++은 멀티코어를 고려해서 설계된 개발언어가 아니다. 당연히 40년 전에 존재하지도 않는 멀티코어를 미리 고려해서 언어를 설계할 수는 없었다. 그러므로 C/C++로 병렬처리가 가능한 프로그램을 작성하는 데는 많은 노력이 든다. 멀티코어 환경에서 개발할 경우 단순히 하드웨어의 병렬처리뿐만 아니라 소프트웨어 레벨에서 동시성도 함께 고려해야 한다. Go언어는 설계 단계에서 멀티코어를 지원하는 개념을 도입했다. 멀티코어 환경에서 안전하고 쉽게 개발할 수 있는 방법을 제공한다.


단계인 Google Go 프로그램 개발 언어는 그의 독특한 특성으로 나온지 4달도 안되는 사이 많은 개발자들의 시선을 끌었다. 다른 개발언어 들과 비교 할때 Google Go 는 많은 진보를 가졌다고 개발자들은 느끼고 있다. 
일부 개발자들은 이미 작은 프로그램을 GO 언어로 개발하고 있다. 그들은 Google Go 개발팀의 빠르고 한결같이 연관성을 유지하는데에 대해 칭찬을 마다하지 않고 있다. Go언어를 완성 하기까지는  많은 작업이 남아 있어 Go언어로 관건적 어플레케이션을 개발하기에는 아직 이르다. Go언어는 어플레케이션의 성능을 낮추지 않는 동시에 코드의 복잡성을 낮추는데 목표를 두고있다. Go는 Python과 같은 동적언어, C++ 와 같은 컴파일언어의 특성을 종합 하였다.  소프트 개발 메니저 Roger Voss 는 Go언어로 메일리스트서비스 응용프로그램을 써냈다. 그는 개발하는동안 아무런 문제에도 봉착하지 않았다고 표현하였다. Go는 퇴직 프로그래머 John Gordon의 시선을 끌어 Go에 관한 도움말 사이트를 건립하였다. John Gordon는 Go의 보다 쉬운 Multi Thread, Multi Processer 프로그래밍 생각이 다른 프로그램 개발언어들의 앞을 달리수 있게 하고 있다고 생각하고 있다.

이다. 다만 「속도」와 「경량」의 의미에는 약간 특수한 의미가 담겨져 있다.
Go의 「속도」란 컴파일 속도라고 하는 의미가 강하다. 또 Go의 「경량」이란 병렬처리에 대응한 언어이면서도 언어 사양이 가볍다는 의미가 있다.
컴파일이 빠르고 병렬처리의 기술이 용이하고 언어 사양이 경량이라고 하는 Go의 표어에 끌린 사람은 많을 것이다. 그리고 무엇보다 세계 최대 규모의 Web 서비스를 제공하고 있는 구글이 자사의 시스템 기반으로 가까운 레이어를 기술하기 위한 새로운 언어로서 Go를 세상에 내보냈다고 하는 점으로부터 Go는 수많은 프로그래머의 주목을 끌고 있다.
하지만 실제로 Go를 시험해 본 사람들에게서는 당황스러움의 소리도 나오고 있다. 영향을 받았다고 여겨지고 있는 C/C++은 물론 PHP나 Python이나 Ruby 등 기존의 메이저 언어와 적지 않은 차이가 있다.
예를 들면 Go의 변수 선언은 아래의 몇 개의 방법으로 구현한다.
 
 
 
댓글