Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

원문 : Will Go replace C in the next two decades ?

Go는 C언어를 대체 할 수 있을까 ?

그렇지 않다. 애초에 Go는 C/C++를 대체하기 위한 목적으로 디자인하지 않았다. Go는 구글의 네트워킹 인프라스트럭처를 유지하던 C++ 의 엄청난 복잡성과 긴 컴파일 시간을 해결하기 위한 C++의 대체폼으로 설계됐다.

여기에서 중요한 점은 프로그래머들은 구글러이며, 연구자들이 아니란 것이다. 그들은 일반적으로 매우 젊고, 이제 막 학교를 졸업했으며, 아마도 Java 나 C/C++, Python들을 배웠을 것이다. 그들은 훌륭한 언어를 이해할 능력은 없지만 좋은 소프트웨어를 개발하기 위해서 "언어를 사용"하고 싶어한다. 따라서 우리가 제공하는 언어는 이해하기 쉽고 채택하기 쉬워야 한다. - Rob Pike

Go는 C++의 대항마로 설계된 적이 없다. C/C++이 진정한 시스템 프로그래밍 언어라면, Go는 응용 프로그래밍 언어에 가깝다고 할 수 있다. 이들은 상호교환 할 수 없다.

Go는 정적 언어가 가지는 성능과 안정성과 동적언어가 가지는 편리함과 재미를 결합하려는 시도다. - Rob Pike

C/C++은 Go로 할 수 있는 모든 것을 할 수 있다. 반면 Go는 C/C++에서 허용하는 많은 것들을 허용하지 않고 있는데, 이는 언어의 복잡성을 크게 줄이는 역할을 한다.

Go는 기본적으로 서버 소프트웨어를 위해서 디자인 됐으며 본질적으로 동시성, 비동기 그리고 멀티스레드를 지향하고 있다. 이것은 함수형 프로그래밍이나 멀티스레딩과 같은 혁명적인 것은 아니지만 고루틴(goroutines)와 채널 덕분에 비동기 멀티스레드 코드를 보다 쉽게 개발 할 수 있게 도와준다.

우리는 멀티 코어 프로그래밍 문제를 해결했다고 생각하지 않는다. 다만 특정 종류의 문제들을 좀 더 쉽게 풀 수 있도록 멀티 코어 아키텍처를 이용 할 수있는 환경을 구축했다고 생각한다. - Rob Pike

Go는 개발자의 생산성을 높이기 위해서 디자인됐다.

생산성은 엔지니어링 관리 규칙에서 가장 중요한 요소이다. 반면 엔지니어에게는 즐거움이 가장 중요한 요소다. 하나는 다른 하나에서 유래한다. - Rob Pike

  • 사람의 두뇌에 쉽다. = 실리콘 하드웨어에는 덜 효율적이다.
  • 더 빠른 컴파일 = 더 낮은 수준의 컴파일 타임 최적화
  • 새로운 언어 = 레거시가 적지만 생태계가 작다.

메모리 관리

GC를 실행하는 언어는 C/C++을 대체할 수 없다.
  • Go : GC를 가지고 있다. 이는 코드 작성, 가독성, 유지관리성을 쉽게하지만 효율성을 떨어트린다. Go는 GC를 적용하고 수동으로 하는 메모리 관리가 불가능하다. 대신 개발 생태계를 일관되게 유지 할 수 있다.
  • C : 수동으로 해야 한다. 개발자는 모든 메모리 조각을 수동으로 할당하고 해제해야 한다. 그렇지 않으면 소프트웨어와 메모리가 끝장 날 수 있다.
  • C++ : RAII(Resource Acquisition Is Initialization)과 수동. RAII를 이용하면 코드를 간략하고 쉽게 유지 할 수 있지만 여전히 모든 종류의 C 스타일의 메모리 관리와 속임수를 허용한다.

런타임

런타임은 소프트웨어를 쉽게 만들 수 있게 도와준다. 하지만 비용이 들어간다.
  • Go : Go 컴파일러는 GC, 스케쥴러, 리플렉션(reflection), 모니터링, 측정인터페이스등을 포함하는 런타임을 생성한다.
  • C/C++ : 없다.

전반적인 복잡도

간단한(덜 복잡한)언어는 일반적으로 유연성이 떨어지므로 간단한 언어가 복잡한 다른 언어를 대체할 수는 없다.
  • Go : mild. Go는 C/C++에서 허용하는 대부분의 속임수를 허용하지 않는다. 따라서 쓰고 읽는게 훨씬 쉬워진다. 제너릭도 없고, 레거시도 없으며, 전처리기도 없다. 반면 Javascript나 Python만큼 쉽지는 않다. Go에서 시작하는 C/C++에서 시작하는 것에 비하여 매우 쉽다.
  • C: 높음 - 매우 높음. C는 전처리기, 레거시, 오버로딩, 메모리관리, 포인터, 복잡한 툴체인을 가지고 있다. C는 기본적으로 휴대용 어셈블러라 할 수 있다. 거의 모든 것을 할 수 있는 베어메탈이다.
  • C++: 매우 높음. C++은 C만큼 복잡할 뿐만 아니라 거기에서 멈추지 않는다. 메타프로그래밍, 지나치게 유연한 OOP 모델, 예외, 극도로 많은 오래된 기능과 새로운 기능을 가지고 있다.

성능과 메모리

좋은 C 코드는 어셈블러와 수작업으로 CPU 명령을 건드리지 않고도 개발자가 원하는 만큼의 속도를 보장한다. Go와 같은 언어로는 이러한 성능을 달성 할 수 없다.
  • Go : 높음. Javascript, Python, PHP, Ruby 및 이와 유사한 동적 언어와 비교할 때 매우 빠르지만 C/C++과 경쟁할 수는 없다. 인간이 쉽게 사용 할 수 있는 언어는 궁긍적으로 성능이 떨어진다.
  • C/C++ : 매우 높음. 다만 개발자 기술에 따라서 달라질 수 있다. 좋지 않은 C/C++ 코드는 평범한 Go 코드보다 나빠질 수 있다. 하지만 좋은 C/C++ 코드는 좋은 Go 코드보다 더 빠르다.

생태계

진지한 언어가 되기 위해서는 좋은 생태계가 필요하다. 수백개의 (다른 언어에는 이미 존재하는) 바퀴를 새로 만들기 위해서 삶을 소비하고 싶지는 않을 것이다.

  • Go : 크다. Go는 인상적인 생태계를 구축했지만 여전히 라이브러리가 부족 할수 있다. Go의 생태계는 네트워킹과 CLI 소프트웨어에 중점을 둔다. 예를들어 GUI의 경우 제대로 준비된 것이 없다.
  • C : 어디에나 있다. 이 글을 읽고 있는 당신이 C로 작성된 소프트웨어를 사용하고 있을 확률은 99.99%다.
  • C++ : 어디에나 있다. 이 글을 읽고 있는 당신이 C++로 작성된 소프트웨어를 사용하고 있을 확률은 99.8%다.

개발 툴

좋은 툴은 생산성을 극도로 향상시킨다. Go는 품질에서, C/C++은 수량에서 장점을 가지고 있다.
  • Go : 좋음 & 통합. Go는 data race detector, 테스팅, 벤치마킹, pprof, tracer, linters, 정적 코드 분석도구, gofmt, godoc 등 필요한 모든 것을 즉시 사용 할 수 있다. 그리고 잘 통합돼 있기 때문에, 어떤 것을 사용해야 할지 고민할 필요가 없다.
  • C/C++ : 크다 하지만 흩어져 있다. 아주 유용한 C/C++ 툴은 엄청나게 많지만 엄청나게 흩어져 있다. 개발자는 지루하고 어렵게 수동으로 작업흐름을 설계하고 여기에 맞는 툴들을 찾아서 통합해야 한다. 경험이 없다면 프로젝트를 설정하는 데 며칠이 걸릴 수도 있다.

상호 운용성

Go는 일반적으로 사용하는 상용 하드웨어 전용으로 설계됐다.
  • Go : ARM/x86/RISC-V CPU. Go는 상용 하드웨어에서만 실행되도록 설계됐다. 하드웨어 가속(GPGPU, 고도로 전문화된 아키텍처)를 활용 할 방법이 없다. Cgo를 이용할 수 있기는 하지만 Cgo는 Go가 아니다.
  • C/C++ : 거의 모든 곳에서 실행된다. 심지어는 운영체제를 실행하지 않는 초소형 하드웨어에도 사용 할 수 있다.