Go 언어의 장점은 무엇입니까?

9 년이 넘는 기간 동안 Google의 Go 언어 인 Golang (2019 년 9 월 현재 버전 1.13 포함)은 알파 괴짜에 대한 호기심에서 세계에서 가장 중요한 일부의 배후에서 전투 테스트를 거친 프로그래밍 언어로 진화했습니다. 클라우드 중심 프로젝트. 

Docker 및 Kubernetes와 같은 프로젝트의 개발자가 Go를 선택한 이유는 무엇입니까? Go의 정의 특성은 무엇이며 다른 프로그래밍 언어와 어떻게 다른가요? 그리고 어떤 종류의 프로젝트가 빌드에 가장 적합합니까? 이 기사에서는 Go의 기능 세트, 최적의 사용 사례, 언어의 누락 및 제한 사항, 그리고 Go가 여기서 어디로 갈 수 있는지 살펴볼 것입니다.

Go 언어는 작고 간단합니다.

Go 또는 Golang은 Google 직원 (주로 오랜 유닉스 전문가이자 Google의 저명한 엔지니어 인 Rob Pike)에 의해 개발되었지만 엄격하게 "Google 프로젝트"라고 말하는 것은 아닙니다. 오히려 Go는 커뮤니티 주도의 오픈 소스 프로젝트로 개발되었으며 Go의 사용 방법과 언어의 방향에 대한 강한 의견을 가진 리더십이 주도합니다.

Go는 배우기 쉽고 함께 작업하기 쉽고 다른 개발자가 쉽게 읽을 수 있도록 설계되었습니다. Go에는 특히 C ++와 같은 언어와 비교할 때 큰 기능 세트가 없습니다. Go는 구문에서 C를 연상 시키므로 오랜 C 개발자가 비교적 쉽게 배울 수 있습니다. 즉, Go의 많은 기능, 특히 동시성 및 기능적 프로그래밍 기능은 Erlang과 같은 언어로 되돌아갑니다.

모든 종류의 크로스 플랫폼 엔터프라이즈 애플리케이션을 구축하고 유지하기위한 C와 유사한 언어 인 Go는 Java와 많은 공통점이 있습니다. 그리고 어디에서나 실행될 수있는 코드의 신속한 개발을 가능하게하는 수단으로 Go와 Python간에 유사점보다 차이가 훨씬 큽니다.

Go 언어는 모두를위한 무언가를 가지고 있습니다

Go 문서에서는 Go를 "동적으로 입력되고 해석되는 언어처럼 느껴지는 빠르고 정적으로 입력 된 컴파일 된 언어"라고 설명합니다. 큰 Go 프로그램도 몇 초 만에 컴파일됩니다. 또한 Go는 파일 및 라이브러리를 포함하는 C 스타일의 오버 헤드를 많이 방지합니다.

Go는 여러 가지 방법으로 개발자의 삶을 편하게 만듭니다.

  • 편의.  Go는 많은 일반적인 프로그래밍 요구를 충족시키는 능력에서 Python과 같은 스크립팅 언어와 비교되었습니다. 이 기능 중 일부는 동시성 및 스레드와 유사한 동작을위한 "고 루틴"과 같은 언어 자체에 내장되어 있으며 추가 기능은 Go의 http 패키지와 같은 Go 표준 라이브러리 패키지에서 사용할 수 있습니다. Python과 마찬가지로 Go는 가비지 수집을 포함한 자동 메모리 관리 기능을 제공합니다.

    Python과 같은 스크립팅 언어와 달리 Go 코드는 빠르게 실행되는 네이티브 바이너리로 컴파일됩니다. 그리고 C 또는 C ++와 달리 Go는 컴파일 속도가 매우 빠르기 때문에 Go 작업이 컴파일 된 언어보다 스크립팅 언어로 작업하는 것처럼 느껴질만큼 빠릅니다. 또한 Go 빌드 시스템은 다른 컴파일 된 언어보다 덜 복잡합니다. Go 프로젝트를 빌드하고 실행하는 데 몇 단계와 약간의 부기가 필요합니다.

  • 속도.  Go 바이너리는 C 바이너리보다 느리게 실행되지만 대부분의 애플리케이션에서 속도 차이는 무시할 수 있습니다. Go 성능은 대부분의 작업에서 C만큼 우수하며 일반적으로 개발 속도로 알려진 다른 언어 (예 : JavaScript, Python 및 Ruby)보다 훨씬 빠릅니다.
  • 휴대 성.  Go 도구 모음으로 생성 된 실행 파일은 기본 외부 종속성없이 단독으로 사용할 수 있습니다. Go 도구 모음은 다양한 운영 체제 및 하드웨어 플랫폼에서 사용할 수 있으며 여러 플랫폼에서 바이너리를 컴파일하는 데 사용할 수 있습니다.
  • 상호 운용성.  Go는 기본 시스템에 대한 액세스를 희생하지 않고 위의 모든 것을 제공합니다. Go 프로그램은 외부 C 라이브러리와 통신하거나 기본 시스템 호출을 수행 할 수 있습니다. 예를 들어 Docker에서 Go는 저수준 Linux 함수, cgroup 및 네임 스페이스와 인터페이스하여 컨테이너 마법을 작동합니다.
  • 지원하다.  Go 도구 체인은 Linux, MacOS 또는 Windows 바이너리 또는 Docker 컨테이너로 무료로 사용할 수 있습니다. Go는 Red Hat Enterprise Linux 및 Fedora와 같이 널리 사용되는 많은 Linux 배포판에 기본적으로 포함되어있어 Go 소스를 해당 플랫폼에 배포하는 것이 다소 쉽습니다. Go에 대한 지원은 Microsoft Visual Studio Code에서 ActiveState의 Komodo IDE에 이르기까지 많은 타사 개발 환경에서도 강력합니다.

Go 언어가 가장 잘 작동하는 곳

모든 직업에 적합한 언어는 없지만 일부 언어는 다른 직업보다 더 많은 직업에 적합합니다.

Go는 다음과 같은 애플리케이션 유형을 개발하는 데 가장 빛을 발합니다.

  • 분산 네트워크 서비스. 네트워크 애플리케이션은 동시성에 의해 살고 죽으며 Go의 기본 동시성 기능 (주로 고 루틴 및 채널)은 이러한 작업에 적합합니다. 결과적으로 많은 Go 프로젝트는 네트워킹, 분산 기능 및 클라우드 서비스 (API, 웹 서버, 웹 애플리케이션 용 최소 프레임 워크 등)를위한 것입니다.
  • 클라우드 네이티브 개발. Go의 동시성 및 네트워킹 기능과 높은 수준의 이식성으로 인해 클라우드 네이티브 앱을 구축하는 데 적합합니다. 실제로 Go는 Docker, Kubernetes, Istio를 포함한 클라우드 네이티브 컴퓨팅의 여러 초석을 구축하는 데 사용되었습니다.
  • 기존 인프라를 대체합니다. 인터넷 인프라를 위해 우리가 의존하는 많은 소프트웨어가 노후화되어 악용에 시달리고 있습니다. Go에서 이러한 내용을 다시 작성하면 메모리 안전성이 향상되고 플랫폼 간 배포가 쉬워지며 향후 유지 관리를 촉진하는 깨끗한 코드 기반 등 많은 이점이 있습니다. Teleport라는 새로운 SSH 서버와 새로운 버전의 Network Time Protocol이 Go로 작성되고 있으며 기존의 서버를 대신하여 제공됩니다.
  • 유틸리티 및 독립형 도구. Go 프로그램은 최소한의 외부 종속성으로 바이너리로 컴파일됩니다. 따라서 빠르게 실행되고 재배포를 위해 쉽게 패키지화 될 수 있기 때문에 유틸리티 및 기타 도구를 만드는 데 이상적으로 적합합니다.

Go 언어 제한

Go의 독단적 인 기능 세트는 칭찬과 비판을 모두 불러 일으켰습니다. Go는 일부 기능을 의도적으로 생략 한 상태에서 작고 이해하기 쉽게 설계되었습니다. 그 결과 다른 언어에서 흔히 볼 수있는 일부 기능은 고의로 Go에서 사용할 수 없습니다.

이러한 기능 중 하나는 함수가 다양한 유형의 변수를 허용하는 제네릭입니다. Go에는 제네릭이 포함되어 있지 않으며, 언어 관리자는 제네릭이 언어의 단순성을 훼손 할 수 있다는 근거로 제네릭을 추가하는 것에 반대합니다. 이 제한을 해결하는 것은 가능하지만 많은 개발자는 여전히 Go에 제네릭이 추가되는 것을보고 싶어합니다. Go에서 제네릭을 구현하기위한 하나 이상의 제안이 제기되었지만 아직 확정 된 것은 없습니다.

Go의 또 다른 단점은 생성 된 바이너리의 크기입니다. Go 바이너리는 기본적으로 정적으로 컴파일됩니다. 즉, 런타임에 필요한 모든 것이 바이너리 이미지에 포함됩니다. 이 접근 방식은 빌드 및 배포 프로세스를 단순화하지만 "Hello, world!"라는 간단한 비용이 발생합니다. 64 비트 Windows에서 무게는 약 1.5MB입니다. Go 팀은 각 후속 릴리스에서 해당 바이너리의 크기를 줄이기 위해 노력해 왔습니다. 압축을 사용하거나 Go의 디버그 정보를 제거하여 Go 바이너리를 축소 할 수도 있습니다. 이 마지막 옵션은 클라우드 또는 네트워크 서비스보다 독립 실행 형 분산 앱에서 더 잘 작동 할 수 있으며, 서비스가 제대로 작동하지 않는 경우 디버그 정보가 있으면 유용합니다.

Go의 또 다른 선전 기능인 자동 메모리 관리는 가비지 컬렉션에 일정량의 처리 오버 헤드가 필요하기 때문에 단점으로 볼 수 있습니다. 설계 상 Go는 수동 메모리 관리를 제공하지 않으며 Go의 가비지 수집은 엔터프라이즈 애플리케이션에 나타나는 종류의 메모리로드를 잘 처리하지 못한다는 비판을 받았습니다. 플러스 측면에서 Go 1.8은 관련된 지연 시간을 줄이는 메모리 관리 및 가비지 수집에 많은 개선 사항을 제공합니다. 물론 Go 개발자는 C 확장 또는 타사 수동 메모리 관리 라이브러리를 통해 수동 메모리 할당을 사용할 수 있습니다.

데스크톱 애플리케이션과 같은 Go 애플리케이션을위한 풍부한 GUI 구축과 관련된 소프트웨어 문화는 여전히 흩어져 있습니다.

대부분의 Go 애플리케이션은 명령 줄 도구 또는 네트워크 서비스입니다. 즉, 다양한 프로젝트에서 Go 애플리케이션을위한 풍부한 GUI를 제공하기 위해 노력하고 있습니다. GTK 및 GTK3 프레임 워크에 대한 바인딩이 있습니다. 또 다른 프로젝트는 플랫폼 네이티브 UI를 제공하기위한 것이지만 이러한 UI는 C 바인딩에 의존하고 순수 Go로 작성되지 않았습니다. 그리고 Windows 사용자는 걷기를 시도 할 수 있습니다. 그러나이 분야에서는 확실한 승자 나 안전한 장기적 내기가 나오지 않았고, 크로스 플랫폼 GUI 라이브러리를 구축하려는 Google의 시도와 같은 일부 프로젝트는 길을 잃었습니다. 또한 Go는 설계 상 플랫폼 독립적이기 때문에 이들 중 어느 것도 표준 패키지 세트의 일부가 될 가능성이 낮습니다.

Go는 기본 시스템 기능과 통신 할 수 있지만 커널이나 장치 드라이버 또는 임베디드 시스템과 같은 저수준 시스템 구성 요소를 만들기 위해 설계되지 않았습니다. 결국 Go 런타임과 Go 애플리케이션의 가비지 수집기는 기본 OS에 의존합니다. (이러한 종류의 작업을위한 최첨단 언어에 관심이있는 개발자는 Rust 언어를 살펴볼 수 있습니다.)

Go 언어 미래

Go 개발의 다음 단계는 개발자 기반의 요구와 요구에 따라 더 많이 추진 될 수 있으며, Go의 마인더는 고집스러운 예를 따르는 것이 아니라이 청중을 더 잘 수용하기 위해 언어를 변경합니다. 즉, Go는 제네릭과 같이 원래 의도하지 않았던 기능을 얻을 수 있습니다.

Golang 개발자가 이러한 것들을 원한다는 것은 분명합니다. 2018 년 Go 사용자 설문 조사에서는 더 나은 종속성 및 패키지 관리와 함께 광범위한 Go 채택 방식에서 제네릭을 3 가지 주요 과제 중 하나로 선정했습니다. 제네릭에 대한 GitHub의 기존 제안은 Go 2.x에 대한 제안으로 활성 상태로 유지됩니다. 이와 같은 변경 사항은 Go가 현재 Java, JavaScript 및 Python이 우위를 점하고있는 엔터프라이즈 개발의 중심 위치를 차지하는 데 도움이 될 수 있습니다.

큰 변화가 없더라도 위에서 설명한 SSH 및 NTP의 대체에 따라 그리고 다국어 프로젝트의 일부로 인프라 재 구축 프로젝트에 Go 사용이 증가 할 것으로 예상 할 수 있습니다. 

Go 도구 체인의 타사 구현도 확산되었습니다. ActiveState의 ActiveGo는 상업적으로 지원되는 Go 언어 버전을 제공하며 LLVM 및 gccgo 프로젝트는 대체 도구 모음을 통해 Go의 자유 라이선스 오픈 소스 구현을 제공합니다.

마지막으로 Go는 완전히 새로운 언어를 개발하기위한 기반 역할을했지만 두 가지 사례가 활발한 개발을 중단했습니다. 한 가지 예는 Go 구문을 간소화하고 동일한 개념 중 일부를 자체 방식으로 구현하고 쉽게 실행하기 위해 Go로 변환 한 Have 언어입니다. 사라진 또 다른 프로젝트 인 Oden은 Go의 어셈블러와 툴체인을 사용하여 Lisp 및 Haskell과 같은 언어에서 추가 영감을 얻은 새로 설계된 언어를 컴파일했습니다.

이 마지막 프로젝트 세트는 모든 IT 혁신이 진정으로 혁명적으로 변모하는 방법 중 하나를 보여줍니다. 사람들이 그것을 분해하고 용도를 ​​변경하면 디자이너가 의도하지 않은 용도를 찾는 것입니다. 해킹 가능한 프로젝트로서의 Go 언어의 미래는 이제 막 시작되었습니다. 그러나 Go의 속도와 단순성이 장기적으로 유지 될 수있는 확장 가능한 인프라의 개발을 용이하게하는 클라우드에서는 주요 프로그래밍 언어로서의 미래가 이미 보장됩니다.