Backend/GoLang

Google Go 언어에 대해 알아보자! ( GoLang )

Juwon2106 2022. 1. 28. 19:07
728x90

Go

이번 포스트에서는 Google에서 발표한 프로그래밍 언어 GO에 대해 알아보겠습니다.

 

먼저 Go의 탄생입니다.

 

2009년 11월 Google에서 처음 발표하여, 2012년 3월에 정식으로 발표된 프로그래밍 언어입니다.

 

Go는 세명의 개발자가 디자인한 프로그래밍 언어입니다.

 

Robert Griesemer

로버트 그리스머( Robert Griesemer )

 

 

 

Kenneth Lane Thompson

케네스 레인 톰프슨( Kenneth Lane Thompson ) - Go, 정규표현식, UTF-8 인코딩 등

 

 

Rob Pike

롭 파이크( Rob Pike )

 

 

 

     이후에 두 명의 개발자가 보강되었습니다.

 

이안 테일러( Ian Taylor )

 

러스 콕스( Russ Cox )

 

 

 

이름이 Go인 프로그래밍 언어인 만큼, 검색에 불편한 경우가 많아 보통 Golang으로 검색하거나 발음합니다.

 

2009년, 2012년에 이어 2015년에 1.5 버전 Go에서 드디어 Go의 컴파일러( Compiler )가 Go로 작성되었습니다.

(이전 까지는 C언어로 구현 )

 

본인의 언어로 구현된 컴파일러가 생겼다는 것은 개발 속도에 상당한 가속이 붙었다는 뜻입니다.

 

2017년 에서는 1.8 버전의 Go가 업데이트되었습니다.

 

1.8 버전에서는 MIPS 명령어 지원, 컴파일러 프런트엔드 추가, 가비지 컬렉션 개선, Cgo의 오버헤드 개선 등의 변경점이 있습니다.

 

다음으로는 Go 언어의 장점을 알아보겠습니다.

 

Go의 특징

 

컴파일 언어이지만 인터프리터 언어처럼 쓸 수 있을 정도로 컴파일 속도가 매우 빠릅니다.

( 언어의 문법 구조 개선을 통한 컴파일러가 소스 코드를 해석하는 pass 수를 줄였습니다. ) 

 

접근성이 용이하고 간결한 코드이면서 컴파일 언어답게 높은 퍼포먼스를 가진 언어입니다.

 

자료형 체계에 있어 정적 타입( Static type ) 검사가 이루어집니다.

 

간결한 코드를 사용하면서도 풍부한 라이브러리 덕분에 다양한 기능을 쉽게 구현할 수 있습니다.

 

Go 언어는 GoRoutine( 고 루틴 )이라는 비동기 메커니즘을 제공합니다.

 

GoRoutine???

 

*Erlang에서 영향받은 메커니즘으로 GoRoutine은 병렬로 동작하며 메시지 채널을 통해 값을 주고받습니다.

 

GoRoutine을 사용하면 이벤트 처리, 병렬 프로그래밍 등이 간단해지는 이점이 있습니다.

 

하지만 병렬화된 GoRoutine 동기화 문제는 개발자가 다루어야 하며 동기화를 무시할 경우 프로그램이 비정상 종료될 수 있습니다.

( 부모 Routine이 자식 Routine보다 먼저 끝나면 자식 Routine은 OS에 의해 메모리에서 강제로 사출 됩니다. )

 

동기화 방법은 기존 Multi-Thread 응용프로그램에 비해 간단합니다.

 

단순하게 GoRoutine으로부터 반환 값을 받는 코드를 Main Thread에 추가하면 됩니다.

 

GoRoutine은 Multi-Thread의 메커니즘을 갖지만 자체적인 Scheduler에 의해 관리되는 가벼운 Thread이며 

 

OS에서 관리하는 Thread보다 더 가벼운 특징이 있습니다.

 

따라서 GoRoutine은 CPU 코어의 수와 무관하며 엄청나게 많은 GoRoutine을 작성해도 문제가 생기지 않습니다.

 

Go는 Binary Compiler입니다 그렇기에 서로 다른 플랫폼을 타깃으로 배포하는 경우 환경변수를 해당 플랫폼에

맞게 설정한 후에 컴파일해서 여러 개의 배포판을 만들어야 합니다.

 

Erlang : 함수형 병행성 프로그래밍 언어, VS Code에서 Erlang 플러그인을 사용할 수 있다.

 

Go의 Keyword( 명령어 )

Go는 단순함과 실용성을 지향하는 언어입니다. 명령어 혹은 Keyword가 25개 밖에 되지 않는 간결한 언어입니다.

break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var

 

Go 언어의 목적

Go는 정적 타입 컴파일 언어의 효율성과 동적 언어처럼 쉬운 개발을 하는 것을 목표로 만들어졌습니다.

또 다른 목적으로

  • 안정성 : 타입 안전성과 메모리 안전성
  • 병행성과 통신을 위한 훌륭한 지원
  • 효과적인 가비지 컬렉션
  • 빠른 컴파일

을 추구합니다.

 

Language Tool

Go는 수많은 언어 배포판들과 동일한 종류의 Debug, Test, Code 검사 도구들을 포함하고 있습니다.

 

  • go build : 소스 파일 자체의 정보만을 사용하여 Go의 바이너리를 빌드합니다. 별도의 makefile은 없습니다.
  • go test : 유닛 테스트 및 마이크로 벤치마크
  • go fmt : 코드 서식 지정
  • go get : 원격 패키지의 검색 및 설치
  • go vet : 코드 내의 잠재적인 오류를 찾아내는 정적 분석기
  • go run : 코드를 빌드하고 실행하는 바로 가기
  • godoc : 문서를 표시. HTTP를 통해 문서 확인
  • gorename : 변수, 함수 등을 형 안전(type-safe) 방식으로 이름을 변경
  • go generate : 코드 생성기를 호출하는 표준 방식

 

Go 예제

package main

import "fmt"

func main(){
	fmt.PrintLn("Hello world!")
}

 

Wsl 1 버전 ( Go 설치법과 환경변수 설정은 다른 포스트에서 설명하겠습니다! )

 

Hello Go World!

 

이번 포스팅으로 Go의 역사와 Golang이 추구하는 목표 그리고 특징을 알아보았습니다.

 

728x90