Search

'go언어'에 해당되는 글 1건

  1. 2014.11.04 Go언어 소개

Go언어 소개

프로그래밍 2014. 11. 4. 20:55 Posted by UnHa Kim

Go언어는 효율성을 추구하는 실용적인 프로그래밍 언어이다.

 

1. 개발 효율성 (혹은 생산성)

2. 실행 효율성 (멀티코어 CPU 활용)

 

이렇게 2가지의 효율성을 추구하는 대신 기능성은 포기했다.

 

go언어 창시자는 C++언어가 너무 복잡해서 go언어를 만들었기에

미니멀리즘의 극한을 추구하는 것으로 유명하다.

(어쩔 때는 그게 좀 과한 듯 하다.

 키워드 숫자를 줄이려고 interface가 가변형 자료형을 겸하는 것은 혼동을 유발하고,

 에러 처리를 if문으로 처리하니 상당히 불편하다.) 

 

개발자 생산성 향상을 위해서는 다음 특징을 가진다.

1. 빠른 컴파일.

2. 단순하지만 필수기능은 다 갖춘 문법.

3. 자동 메모리 관리

4. 유니코드 지원

5. 풍부한 표준 라이브러리 및 수많은 제3자 공개 라이브러리.

6 테스트, 테스트 커버리지, 동시 사용 데이터 충돌(레이스) 감지등 풍부 개발 도구 기본 내장

 

마지막으로...

7. 소스코드 자동 정리 (써보면 입이 떡 벌어진다. 소스 코드 들여쓰기로 분쟁이 생길 소지를 원천 봉쇄.)

 

 

하드웨어의 효율적 사용을 위해서 다음 특징을 가진다.

1. AOT 컴파일. (C, C++의 컴파일 개념. Java나 C#이 사용하는 JIT컴파일의 반대 개념.)

2. C보다 2배 정도 느리고, Java와는 비슷한 상당히 우수한 단일 스레드 실행 속도.

3. 멀티코어 CPU를 안전하고 효율적으로 사용하기 위한 독특한 기능 (goroutine, channel)

 

Go언어에서는 포기한 기능들은 다음과 같다.

1. 상속은 지원하지 않음. 대신 mixin을 지원.

2. 제너릭은 지원하지 않음. 대신, interface{}가 가변형 변수 역할을 함.

(제너릭 기능은 Go언어 창시자들이 미니멀리즘에 기반하여 의도적으로 배제한 것이 아니라,

 Go언어 창시자들이 기술적인 문제를 해결하지 못해서 아직 추가되지 못한 경우임.)

3. 에러 처리 구문이 취약함. 대신, defer문, recover()함수를 사용해서 panic상황에 대처 .

 

이러한 장단점이 혼합된 Go언어를 실제로 사용해 본 느낌과,

1. 기능성이 약간 부족하지만 오히려 간결해서 좋은 면도 있다.

   기능이 풍부하지 않지만 꼭 있어야 하는 기능들은 거의 다 있으며,

   반대로, 쓸데없는 기능이 없기 때문에 남이 개발한 소스 코드를 읽을 때도

   처음보는 기능을 접하는 경우는 거의 없다.

   그래서, 불러다 쓰는 제 3자 라이브러리가 의심스러우면 

    (저작권 문제가 없는 한도 내에서) 거리낌없이 소스 코드를 들여다보고 만지작 거리게 된다.

2. 개발 생산성이 확연하게 높아진다.

3. 실행속도 문제로 걱정할 일이 없다.

 

트위터가 서비스 초기에 루비(Ruby)언어를 사용했으나, 성능 상의 문제로 인해서 서비스 불안정의 어려움을 겪었고, 결국은 상당 부분을 Java와 Scala언어로 다시 개발해야 했다.

드롭박스도 서비스 초기에 파이썬(Python)언어를 사용했으나, 성능 상의 문제로 인해서 백엔드 상당 부분을 Go언어로 대체하였다.

 

트위터와 드롭박스의 공통점은 높은 개발 생산성을 얻기 위해서

루비(Ruby), 파이썬(Python)등 동적언어를 사용하였으나,

성능상의 문제로 인해서 동일한 기능을 실행 성능이 높은 정적 언어로 다시 작성했다는 것이다.

 

Go언어는 개발 생산성도 높고, 실행 성능도 상당히 높은 편이므로,

이러한 고민을 동시에 해결할 수 있으며,

무한 경쟁 시대에 비용 효율성 면에서 강점을 가진다.

(거대 S/W 기업이 된 구글이 자체적인 비용 절감 차원에서 만든 것 같다.)

 

그 대신에 포기해야 하는 것이 기능성인데, 

막상 써보면 기능이 심하게 부족하다고 느껴지지는 않는다.

 

물론, C++, Java, C#등을 사용하던 사람은

1. 변수 선언 순서가 반대임.

2. 에러 처리 구문이 없고 if문으로 처리함.

3. 제너릭이 없음

등의 장애물에 좌절하곤 하지만 

실제로 사용해보면 의외로 그럭저럭 쓸만 하다.

(Java도 1.4까지 Generic이 없었지만 다들 잘 썼다.)

 

Go언어를 가장 잘 설명하는 문구는  '모든 면에서 80%'이다.

파이썬(혹은 루비) 개발 효율성의 80%,

C++ 실행 효율성의 80% (사실은 50%이지만, 동적 언어보다 수백배 빠르므로 체감상 80%)

 

모든 면에서 약간씩 부족하고 아쉽지만,

비용절감의 면에서는 타의 추종을 불허하고,

여러모로 공동작업이 편하다.

'프로그래밍' 카테고리의 다른 글

WebAssembly는 이식성 높은 바이트코드였구나.  (0) 2022.06.11
Rust 언어의 match문  (0) 2022.05.28
Go언어 안정성 문제.  (0) 2022.05.27
Go언어 에러처리  (0) 2016.11.02
Go언어 소개  (0) 2014.11.04
TAG

댓글을 달아 주세요