한편 기존 언어에 비해 강화되고 있는 것이 병렬처리 대응이다.

Go에서는 「go」라고 하는 명령을 적는 것만으로 처리를 병렬화할 수 있게 되어 있다. Go 프로그래머 자신이 병렬 디스트리뷰티드 프로세싱에 있어서의 메모리 메니지먼트라고 하는 곤란한 코딩을 실시하지 않아도 끝나도록 가베지 컬렉션이 채용되고 있다.

심플한 언어 기능과 함께 Go의 실행 속도는 충분히 빠르다고 여겨진다(C 10 ~ 20% 정도 느린 것을 목표로 하고 있다고 한다).


이러한 점에 대해서 아래와 같이 이해해 두면 좋은 것이 아닐까 필자는 생각한다.

우선 Go는 현재에 이르기까지 C가 이용되고 있는 분야에서 C에 대신해서 이용되는 포텐셜을 가지고 있다(향후의 멀티 코어 CPU 시대에 있어서는 Go로 기술하는 것에 의한 약간의 오버헤드는 용이하게 병렬처리를 기술할 수 있는 등의 이점이 보충하고 남음 것이다).


보다 고도의 언어 기능을 가진 C++과 역할 분담을 실시하는 관계에 있다고 생각할 수 있다(숙련 한 프로그래머를 확보할 수 있는 프로젝트에 대해 C++이 채용되어 고속 컴파일이 의미를 가지는 프로젝트에서는 Go가 채용되는 등).


더하여 향후 Go의 실행 속도가 구글의 공약 대로 C에 가까운 것이 되는 한편 언어의 동작도 충분히 안정되어 온 후에는 현재 JavaC#으로 기술되고 있는 애플리케이션에 대해서도 Go로 기술되는 것이 일어날 것이다.


물론 등장한지 얼마 안된 언어인 Go가 한꺼번에 C/C++, Java/C# 이라고 하는 주요 언어와 대등한 존재가 될 것은 없을 것이다. 하지만 이들 기존 언어의 유저도 각각의 언어가 각각의 경위(시대적인 제약)로부터 안고 있는 복잡함이나 오버헤드와 Go가 인연을 잘랐던 것에 대하서는 흥미를 가지고 있을지도 모른다.


C의 포인터 연산 기능을 계승하고 다중 상속과 템플릿을 채용했던 C++은 복잡함과 컴파일 속도가 약점이 되고 있다. CPU에 의존하지 않는 중간 언어 방식을 채용했던 Java에서는 최적화가 진행되고 있다고는 해도 실행 속도면에 약간의 약점이 남아 있다(이 점은 Java의 대항마로서 등장했던 C# 마찬가지이다)(*3).


필자는 Go의 매력은 기존의 언어 기능을 무비판적으로 받아 들이지 않았다고 하는 것에서 나타나고 있는 것은 아닐까라고 생각하고 있다.

 

*3
가베지 컬렉션과 필요 최소한의 언어 기능을 가지는 병렬처리 대응 언어인 GoJava VM이나 .NET의 중간 언어(Java바이트 코드/MSIL)에 비할 수도 있을지도 모른다. 이러한 중간 언어에 비교하면 아득하게 고급 언어인 Go는 병렬처리를 기술하는 기반 언어로서 이용되면서 보다 고급 언어의 호스트 언어가 될 가능성이 있다(Ruby이나Python이라고 하는 스크립트 언어를 Java VM이나 .NET에 이식하는 시도에는 벌써 수년의 실적이 있다. 이러한 이식 노하우는 Go 위에서도 발휘되는 것은 아닐까).

 

 

Go()를 배우자

장래적인 것은 접어두고 심플한 언어 사양인 것은 일단 그 약속을 받아 들여 버리면 학습이 용이한 것을 의미한다(필자는 Pascal을 사용 했기 때문에일지도 모르지만 Go류의 코딩 방법을 그다지 위화감 없게 받아 들여지고 있다).

향후의 프로그래밍에 대하여 병렬처리는 중요한 과제로 되어 있다. Go는 병렬처리를 용이하게 기술하는 방법을 배우기 위한 언어라고 해도 가치가 있다고 생각한다.

 

 

출처  : http://www.atmarkit.co.jp/fcoding/articles/go/01/go01a.html

저작자 표시
신고
by 흥배 2009.12.10 08:30

요즈음 프로그램 언어에서는 프로그래머의 부담을 줄이기 위해 처리계에 있어서 이름은 생략 해도 괜찮은 추론 기능을 가지는 것이 많아지고 있다.

Go에서는 이러한 추론 기능은 충실하고 있지 않고 오히려 프로그래머에게 구문 요소를 「명시하는 것(explicit)」을 요구한다. 물론 Go는 등장한지 얼마 안된 언어이며 Google자신도 「실험적(experimental)」이라고 자리 매김을 하고 있는 언어이다. 그 때문에 장래적으로는 언어 기능이 충실 함과 동시에 보다 익숙한 기술 법을 기대할 수 있다.


그러나 요즈음 프로그램 언어의 트랜드로부터 조금 빗나간 것처럼 생각되는 언어를 Google이 이 타이밍에 릴리스 한 것의 의문은 남는다.

프로그램 언어를 열심히 뒤쫓고 있는 블로거나 Go의 메일링 리스트 참가자의 사이에서는 C의 후계를 문자 대로 목표로 하고 있는 컴파일 언어 D, Google App Engine에서 이용되고 있는 스크립트 언어인 Python 등에 더 가까운 문법을 가지는 프로그램 언어가 등장해 주었으면 했다고 한 소리도 나오고 있다. 

 

 


Go의 실행계로부터 보여 오는 매력

Go의 이러한 독자성은 그 실행계까지 생각하여 맞추면 의미가 보여 온다.

Go의 주요한 특징인 지극히 고속 컴파일은 최근의 언어로는 스토어 철학자라고 생각되는 문법을 채용하는 것에 의해서 실현되고 있다. 이 점으로 Go는 철저하게 모던한 언어라면 필수의 요소라고 생각되는 기능이 싹둑 잘라 없어지고 있다.


GoC의 포인터 연산 기능을 제외한 것(*2)은 위화감 없이 받아 들여지는 사람이라도 JavaC++ 등의 객체 지향 언어에 빠뜨릴 수 없는 요소라고 생각되고 있는 「클래스의 계승」이 언어 기능으로부터 떼어졌던 것에는 놀랄 것이다(그 밖에도 Go에서는 예외 처리 기능이나 형태를 실행 시에 인수로 하는 제네릭 등이 지원 되어 있지 않다).

 

*2
테스트 시에 발견 되기 어려운 버그의 온상이 되고 있는 포인터 연산은 JavaC# 등에서도 언어 기능으로서 제공되어 있지 않다. 현재에도 포인터 연산에 관한 프로그램의 실수가 OSWeb브라우저의 보안 구멍을 낳아 버리는 일이 있다. 이러한 실수는 대기업 소프트웨어 기업의 엄격한 테스트 체제에서도 발견할 수 없는 것이 있다.

【참고 기사】
IE」에 대한 최신 공격의 원인, 단 하나의 타입 실수—MS가 인정한다
http://japan.cnet.com/news/sec/story/0,2000056024,20397505,00.htm



출처  : http://www.atmarkit.co.jp/fcoding/articles/go/01/go01a.html


저작자 표시
신고
by 흥배 2009.12.09 08:30

200910월말에 구글이 발표한 새로운 프로그램 언어 Go(또는golang)는 빠른 경량 언어이다. 다만 「속도」와 「경량」의 의미에는 약간 특수한 의미가 담겨져 있다.

Go의 「속도」란 컴파일 속도라고 하는 의미가 강하다. Go의 「경량」이란 병렬처리에 대응한 언어이면서도 언어 사양이 가볍다는 의미가 있다.

컴파일이 빠르고 병렬처리의 기술이 용이하고 언어 사양이 경량이라고 하는 Go의 표어에 끌린 사람은 많을 것이다. 그리고 무엇보다 세계 최대 규모의 Web 서비스를 제공하고 있는 구글이 자사의 시스템 기반으로 가까운 레이어를 기술하기 위한 새로운 언어로서 Go를 세상에 내보냈다고 하는 점으로부터 Go는 수많은 프로그래머의 주목을 끌고 있다.

하지만 실제로 Go를 시험해 본 사람들에게서는 당황스러움의 소리도 나오고 있다. 영향을 받았다고 여겨지고 있는 C/C++은 물론 PHPPython이나 Ruby 등 기존의 메이저 언어와 적지 않은 차이가 있다.

예를 들면 Go의 변수 선언은 아래의 몇 개의 방법으로 구현한다.

var a uint64 = 1; (1)

a := uint64(1);  (2)

(1) var는 변수 선언인 것을 명기하고 그 다음에 변수명 a와 그 형태 uint64가 기술되고 있다(GoC/C++와 같이 정적 형 언어이다). 그리고 이콜 뒤에 초기 값 1이 대입되고 있다.

(2) (1)의 표기의 약기법(문맥)이며 명칭a는 그 후의 := 라고 하는 선언에 의해서 형태 uint64와 초기 값 1로 연결해 붙일 수 있다.


Go에 주목하고 있는 사람에게 있어서 이러한 기법 자체를 이해하는 것은 어렵지 않을 것이다. 하지만 변수의 대입이라고 하는 극히 기본적인 것부터 새롭게  기억하지 않으면 안 되는 것이 생기고 있다.

게다가 Goiffor 등의 제어 구조, 함수의 기능을 보면 곤혹이 생길지도 모른다. Go의 제어 구조는 서로 경쟁하여 진화한 주요 언어에 비하면 오히려 후퇴하고 있는 것 같이 생각되는 점이 있다.


예를 들면 if에서 평가한 결과에 근거해 반환 값을 바꾸는 함수 정의(func Fx) 는 아래와 같이 쓰지 않으면 안 된다.

// 반환 값 ret(int형태)를 함수 선언 내에서 명기

    func Fx(i int) (ret int) {

        if i > 0 { ret = i*i } else { ret = 0 }

        return;

    }

// 입력 값 i가 양의 정수의 경우 i2승이, i0 이하의 정수인 경우 0이 반환된다.

 

현상의 Go에서는 함수 내에 복수의 return을 쓸 수 없다. 그 때문에 함수 선언 시에 미리 반환 값을 명시하는 등 기존의 언어보다 「스텝이 더 늘어난 감」이 있다(*1).


*1
Go
와 같이 병렬처리 지향의 신흥 컴파일 언어로서 주목을 끌고 있는 Scala(컴파일 언어 중에서는 가장 추론 기능이 충실한 언어의 하나이다)에서는 if가 값을 돌려주는 식이라고 되며 또 return을 생략 할 수 있는 규칙이 있어(마지막에 평가된 식이 함수의 반환 값이 된다) 같은 함수 정의(def Fx)는 아래와 같이 쓸 수 있다.

  def Fx(i:Int) = if (i > 0) i*i else 0

여기에서는 반환 값이 되는 i*i0 쌍방이 정수이기 때문에 함수 Fx의 반환 값은 자동적으로 Int형태이다고 추측된다




출처  : http://www.atmarkit.co.jp/fcoding/articles/go/01/go01a.html


저작자 표시
신고
by 흥배 2009.12.08 08:30
| 1 |