Golang

Golang 입문기 - 0

kahnco 2023. 10. 20. 03:35

계기

 한참 회사에서 풀스택 잡부로 일하면서 다양한 프레임워크, 프로그래밍 언어를 접할 기회가 있었다 (Java, Javascript, Typescript, Dart, Python, Kotlin 등등). 그 정도에 차이가 있을 뿐이지 전부 정적 타입 검사를 지원하는 아~주 고급 언어들이다. 이러한 언어들로 프로그래밍을 진행하다보니 문득, 이렇게 고급스럽게 만들어진 언어들에만 익숙해져 있어서 프로그래밍 언어 그 자체의 최적화라던가, 가비지 컬렉션, 박싱/언박싱 등등 프로그래밍 언어의 내면에 대해서 얕은 지식만 가지고 있는 채로 지나가고 있다라는 생각이 들었다.

 

 또한, 매번 규모가 작은 스타트업에서 근무하면서 프로젝트의 아키텍처, 개발론 (TDD, DDD, BDD 등등)과 같은 이론적이고 설계적인 부분에 대해서만 고민을 하고, 코드를 최적화해서 어떻게 하면 더 빠르고 안정적인 코드를 짤 수 있을가에 대한 고민은 최소한으로 한 것 같다. 아키텍처 상의 레이어, 도메인을 지정하면서 의존성 관계를 최소한으로 하는 방법으로 빌드 용량, 속도 등을 최적화하는 것만 신경을 썼지 프로그래밍 언어 그 자체의 속성을 제대로 이해하고 언어를 깊게 파고들어서 최적화하는 부분은 신경을 덜 썼다는 것이다.

 

 그래서 저급 언어 중에서 하나를 골라 공부해보면서 언어 측면에서의 최적화를 같이 배워보자는 취지로 고랭을 선택하게 되었다. 사실 러스트와 고랭 중에서 엄청 고민했지만 러스트는 임베디드 코딩과 같이 매우 로우한 레벨의 프로그래밍에서 잘 활용되고, 살짝 매니악한 느낌이 들어서 (물론 매우 매력적인 프로그래밍 언어임에는 틀림없다) 약간의 거부감이 들었다. 또한, 향후 진로 방향으로 잡은 DevOps 쪽에서 고랭이 활용되는 케이스가 많아서 고랭으로 선택하게 되었다.


개요

 고랭 (Go 혹은 Golang)은 2009년 11월에 구글에서 처음 발표된 후 2012년 3월에 정식 발표된 프로그래밍 언어이다. 본래 이름은 Go 이지만, 구글에 Go로 검색하면 온갖 이상한 검색 결과가 동반되기 때문에 Golang으로 검색하거나 부르는 사람이 많다고 한다. 

 

 고랭의 창시자는 로버트 그리스머(Robert Griesemer), 켄 톰슨(Ken Thompson), 롭 파이크(Rob Pike) 세 명이며, 개발 중간에 이안 테일러(Ian Taylor)가 GCC 컴파일러에 고랭을 적용하는 작업을 위해 투입되었고 러스 콕스(Russ Cox) 또한 고랭의 완성도를 높이는 작업을 위해 투입되었다고 한다.

 위 사람들은 고랭을 만들 때에 다음과 같은 컨셉을 가지고 만들었다고 한다.

  • 정적 타이핑 및 대형 시스템으로의 스케일링이 가능할 것
  • 너무 많은 필수적인 키워드와 반복 없이도 생산적이고 가독성이 좋을 것
  • 통합 개발 환경이 필요하진 않지만 지원도 가능할 것
  • 네트워킹 및 다중 처리를 지원할 것

제공 기능

 이 글을 작성하는 2023년 10월 기준으로 현재 가비지 컬랙션 기능이 있고, 병행성을 잘 지원하는 컴파일 언어이다. 문법이 C와 비슷하지만 메모리 보안, 구조 타이핑, CSP 스타일 병행성을 제공한다.

  • 가비지 컬랙션(Garbage Collection, GC): 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능이다.여기서 필요없게 된 영역이란, 어떤 변수도 포인팅하지 않게 된 영역을 의미한다. Java, C#, 그리고 일부 스크립트 언어들은 처음부터 GC 기법을 염두에 두고 설계되어 언어 정의에 GC가 포함되어 있다. C, C++ 등의 시스템 프로그래밍 언어들은 수동 메모리 관리를 가정하고 설계되었으나, GC를 지원하는 구현도 존재한다.
  • 병행성(Concurrency): 컴퓨터 과학에서 여러 계산을 동시에 수행하는 시스템의 특성으로, 잠재적으로는 서로 상호 작용이 가능하다.병행 시스템의 설계는 실행, 데이터 교환, 메모리 할당, 실행 스케줄링을 조화롭게 하여 응답 시간을 최소화하고 스로우풋을 최대화하는 미더운 기술들을 찾아내는 일을 동반한다.
  • 메모리 보안(Memory safety): 소프트웨어 개발에서 고려하는 것으로써 버퍼 오버플로와 허상 포인터 같은 (RAM 접근을 다루는) 보안 취약점을 유발시킬 수 있는 소프트웨어 버그들을 회피할 목적으로 이루어진다. 포인터 연산, 캐스팅 그리고 할당 해제를 지원하는 C, C++ 같은 언어들은 전형적으로 안전한 메모리를 갖지 않는다. 대부분의 고수준 프로그래밍 언어들은 포인터 연산과 캐스팅을 완전히 불허하고, 단일 메모리 관리 제도로써 GC를 강화함으로써 이 문제를 피한다. (ex. 버퍼 오버플로우, 허상 포인터, 중복 할당 해제, 유효하지 않은 할당 해제, 널 포인터 접근, 초기화되지 않은 변수, OOM)
  • 구조적 타이핑(Structural-Typing): 구조적 타입 시스템이라고도 불린다. 실제 구조와 정의에 의해 결정되는 타입 시스템의 한 종류이다. 명시적 선언이나 이름을 기반으로 하는 명목적 타입 시스템(Nominal Type System)인 Java, C# 과 다르고, 런타임에 타입을 체크하는 덕 타이핑(ex. Javascript)과 다르다. 구조적 타이핑은 명목적 타이핑처럼 명확한 상속 관계를 지향하기 보다 집합으로 포함한다는 개념을 지향한다. 일례로, 아래 예시 코드에서 같은 속성의 타입이 있는지를 체크하기 때문에 두 인터페이스는 호환된다. 그러므로 중복되는 범위가 있다면 재사용할 수 있고, 생산성 있는 코드를 쉽게 생산할 수 있다.
interface Vector2D {
  x: number
  y: number
}
interface NamedVector {
  name: string
  x: number
  y: number
}
function calculateLength(v: Vector2D) {
  return Math.sqrt(v.x * v.x + v.y * v.y)
}

const v: NamedVector = { x: 3, y: 4, name: 'mgh' }
calculateLength(v)
  • 커뮤니케이팅 시퀜셜 프로세스(Communicating Sequential Processesm, CSP): 동기 시스템의 상호 작용 패턴을 설명하기 위한 공식 언어이다. 이는 채널을 통한 메시지 전달을 기반으로 하는 프로세스 대수 또는 프로세스 계산을 알려진 동시성 수학적 이론 계열의 한 축이다.

구현체

 고랭은 2개의 주요 구현체를 가지고 있다. 

  • gc: 구글의 셀프 호스팅 컴파일러 툴체인으로써, 여러 종류의 OS와 웹어셈블리를 대상으로 한다.
  • gccgo: libgo 라이브러리와 GCC의 합동으로 사용되는 다른 컴파일러의 프론트엔드이다.

결론

 이렇게 언어의 디자인 계기와 컨셉을 이해하고 넘어가면 해당 언어로 프로그래밍할 때에 많은 도움이 되기 때문에 한번 살펴보았다. C++의 복잡성을 싫어한 개발자들이 모여서 디자인한 언어답게, 심플하면서도 높은 성능을 위해 설계한 것이 인상적인 언어인 것 같다. 다음 장부터는 Golang의 기본 문법에 대해서 공부해보고, 이를 활용해서 다양한 구현체(gc, gccgo, gin, fiber) 를 구현해볼 계획이다.

반응형

'Golang' 카테고리의 다른 글

Golang 입문기 - 문법 4  (2) 2024.02.11
Golang 입문기 - 문법 3  (2) 2023.11.20
Golang 입문기 - 문법 2  (2) 2023.10.27
Golang 입문기 - 문법 1  (2) 2023.10.24