Computing

[Go] ChatGPT로 알아보는 Go 개념과 장점(Go Programming Language, Golang) 본문

Programming/Go

[Go] ChatGPT로 알아보는 Go 개념과 장점(Go Programming Language, Golang)

jhson989 2023. 3. 15. 21:58

어쩌다보니 Go programming language(Go, Golang)[1]를 사용할 일이 생겨 공부를 시작하게 되었다. 새로운 프로그래밍 언어를 배움에 있어, 그 언어가 왜 만들어졌고(필요성), 어떤 장점이 있고, 어디 분야에서 자주 쓰이는 지 아는 것이 매우 중요하다고 생각한다. 특히 Go는 특정 기업(Google)에서 비교적 최근에 만들어졌기에 개발하는 데에 분명 이유가 있을 것이다. 따라서 오늘은 Go를 처음 배우는 입장으로서 왜 Go를 사용해야 하는 지, 그 장점에 대해서 ChatGPT를 통해 배워보고자 한다. 처음 공부하며 정리해나가는 글이기에 틀린 내용도 있을 것이다.

 

최근 프로그램을 개발하는 과정에서 ChatGPT[2]를 사용하는 경우가 종종 있다. 다행히도 아직까지는 잘못된 답변을 생성하기도 하여 개발 자체를 맡길 수준은 아니다. (아직까지는 개발자라는 직업을 대체할 수 없을 것 같아 다행이다.) 다만 프로그래밍 지식 측면에서는 Stackoverflow 검색 전 종종 ChatGPT에 질문을 던져 보기도 한다. 답변에 대한 진실 여부 검수는 여전히 필요하지만, ChatGPT가 어느정도 질문에 대한 정제된 답변을 제시해주기에 관련 개념을 빠르게 습득하는데에 도움이 되는 것 같다.

 

 

 

Go Programming Language (Go, Golang)

시작하기 앞서 Go가 무엇인지 질문해 보았다.

 

[Question]
Can you explain what Go programming language is briefly?
[ChatGPT's Answer]
Sure, here's a brief explanation of the Go programming language:

Go, also known as Golang, is an open-source programming language developed by Google. It was created to address the need for a language that was easy to learn and use, but also fast, efficient, and suitable for large-scale systems.

Go is a statically-typed language with a simple and concise syntax that is easy to read and write. It has built-in support for concurrency, which allows multiple tasks to be executed simultaneously, and also includes features such as garbage collection to automatically free up memory.

Go is commonly used for building web servers, network tools, system utilities, and other types of software applications. It has a growing community of developers and a rich ecosystem of libraries and tools to support its development.

 

ChatGPT에 따르면 Go programming language(Go, Golang)은 구글에 의해 개발된 open-source 프로그래밍 언어라고 한다. 개발자가 배우고 사용하기 쉬우면서도 동시에 빠르고 효율적인 대규모 시스템 개발에 사용할 수 있는 언어를 목표로 개발되었다고 한다.

 

대규모 시스템 개발 자체는 매우 어려운 분야이다. 대규모 시스템은 많은 요청을 빠르게 처리하기 위해 동시성(Concurrent) 혹은 병렬(Parallel) 프로그래밍 기법을 이용해 개발되는데, 이러한 대규모 시스템은 설계&개발도 어렵지만 디버깅, 최적화도 어렵다. Go 언어는 이러한 대규모 시스템 개발 자체를 쉽게 개발 및 최적화 할 수 있도록 목표한다고 한다. 구체적으로 자체 내장 기능으로 동시성 프로그래밍 기능(goroutine)도 지원한다고 한다.

 

다음으로 ChatGPT의 답변은 Go 언어가 읽고 쓰기 쉽다고 강조한다. Go는 쉬운 syntax를 가지며 statically-typed language(정적 타입 언어)로 변수 선언 시 타입 명시가 필요한 언어이다. 정적 타입 언어의 반대 개념인 동적 타입 언어로는 Python, JavaScript 등이 있다. 개인적인 의견으로 동적 타입 언어는 변수 선언 시 타입 지정이 필요하지 않아 사용하기는 쉽지만 읽고 디버깅 하기에는 어렵다고 생각한다. 그에 비해 Go는 정적 타입 언어기에 읽고 디버깅하기 쉽지 않을까 생각한다. 

 

 

 

Go의 장점

좀 더 구체적으로 Go가 왜 효율적(efficient)인 지 질문해 보았다.

 

[Question]
Can you let me know specifically what features make Go efficient?
[ChatGPT's Answer]
Certainly! Go has several features that make it an efficient programming language:

Concurrency: Go has built-in support for concurrency, which makes it easy to write programs that can handle multiple tasks simultaneously. This allows programs to utilize resources more efficiently and run faster.

Garbage Collection: Go has an efficient garbage collector that automatically frees up memory that is no longer in use. This helps to avoid memory leaks and ensures that programs run smoothly.

Compilation: Go compiles to machine code, which makes it faster than interpreted languages like Python or JavaScript

Static Typing: Go is a statically-typed language, which means that variables must be defined with a specific data type at compile-time. This helps to catch errors early and improve program efficiency.

Simple Syntax: Go has a simple and concise syntax that is easy to read and write, making it easier to write efficient code.

Overall, these features of Go contribute to its efficiency and make it a popular choice for building high-performance software applications.

 

ChatGPT가 똑똑하게 5가지 특성으로 정리해 주었다. 동시성(Concurrency), Garbage collection, Compilation, Static Typing, Simple Syntax 특성에서 Go의 강점이 있다고 한다. 

 

Go는 자체적으로 Concurrency를 지원한다고 한다. Concurrency 지원은 쉽게 생각해서 언어 자체가 multi-threading을 지원한다는 것인데, 찾아보니 goroutine 이라는 가벼운 thread를 이용할 수 있다고 한다. 이 goroutine은 OS가 아닌 Go runtime이 관리하는데 덕분에 가볍게(thread 하나가 더 적은 메모리 사용, thread간 context switching 시 더 적은 시간 소요) 구현되어 효율적인 multi-threading을 지원할 수 있다고 한다. (구체적으로 공부한 것은 아니라 추측만 하자면 하나의 OS thread가 다수의 goroutine들을 multiplexing하도록 runtime이 구현된게 아닌가 싶다) goroutine 관련 내용은 따로 다른 포스트로 정리할 예정이다.

 

Go는 Garbage Collection(GC)을 지원한다. GC란 더 이상 쓰지 않는 동적 할당된 메모리를 자동 회수하는 기능인데, 프로그래밍 개발 시 memory leak과 같은 메모리 관련 오류를 자동으로 방지해준다. C/C++에서는 GC를 지원해주지 않고(최신 C++은 shared_ptr이라는 대체제가 있긴 하다) 프로그래머가 직접 동적 할당된 메모리를 할당 해제해줘야 한다. 할당 해제해주지 않으면 메모리를 계속 차지하고 있게 되고 그것들이 쌓이면 결국 메모리가 부족하게 되어 프로그램이 종료된다. 할당 해제만 잘해주면 되지 않나 생각할 수 있다. 하지만 exception 발생 등 모든 경우의 수를 고려해야 하기에 할당 해제를 잘 하는 것도 매우 복잡한 일이다. 따라서 GC 기능 지원은 매우 유용한 기능이라고 생각한다.

 

Go는 컴파일(Compiled) 언어라고 한다. 반대 개념은 인터프리터(Interpreter) 언어가 있다. 컴파일 언어는 해당 언어로 작성한 코드 전체가 컴파일러를 통해 컴퓨터에서 실행가능한 프로그램 하나로 빌드되는 경우를 말한다. 반대로 인터프리터 언어는 해당 언어로 작성한 코드 한줄 한줄을 인터프리터가 해석해서 실시간으로 실행하는 프로그램을 말한다. (깊게 들어가면 사실 좀 더 복잡하게 나뉘긴 한다.) 컴파일 언어는 일반적으로 인터프리터 언어보다 매우 빠른데, 컴파일과정에서 프로그램 최적화가 진행되는 등 여러 요인이 있다. 다만 인터프리터 방식에 비해 컴파일이라는 단계가 추가되기에 디버깅에 더 많은 시간과 노력이 필요하다. (디버깅할때마다 컴파일을 해줘야 함). 결국 컴파일 언어기에 속도가 빠르다고 결론 내리면 될 것 같다.

 

Go는 정적 타입 언어(Static typing)이다. 앞서 말했듯 정적 타입 언어는 코드 개발과정에서 변수마다 타입을 지정해줘야 하기에 개발자 입장에서는 번거롭지만은 개발과정에서 오류를 잡거나 읽기 쉽다. (사실 이건 개인이 어떻게 느끼는 지에 따라 달라지는 문제인 것 같다.)

 

Go는 쉬운 syntax를 가진다고 한다. 쉽다는 것은 개인적인 느낌이니까 정량화하여 비교할 수 없지만은 다른 언어에 비해 쉬운 문법을 가진다 정도로 생각하면 되지 않을까 싶다. 구체적으로 C/C++에 비해서 keyword 수도 적고, exception 핸들링 방식도 쉽다고 한다. (여전히 개인이 어떻게 느끼는 지에 따라 달라지는 문제인 것 같다. CISC vs. RISC 문제와 비슷하게..)

 

 

 

Go 사용처

마지막으로 Go를 어떤 분야에서 많이 사용하는 지 질문해 보았다.

 

[Question]
What kinds of programs do programmers use Go for?
[ChatGPT's Answer]
Programmers use Go for a wide range of programs and applications, including:

Web Development: Go is a popular choice for building web servers and web applications. It has a built-in HTTP server package and is compatible with many web frameworks, making it easy to build high-performance web applications.

System Programming: Go's efficient memory management and low-level control make it well-suited for system programming tasks like network programming, file I/O, and operating system-level tasks.

DevOps: Go is widely used for building command-line tools and scripts used in DevOps, automation, and system administration. This is because Go produces statically linked binaries that can be run on any machine without needing a runtime environment.

Cloud Computing: Go is popular for building cloud-native applications and microservices, due to its concurrency features and efficient memory management.

Data Science: Go has several libraries and packages for data processing and analysis, making it a viable option for building data science applications.

Overall, Go's versatility and efficiency make it a popular choice for a wide range of programming tasks and applications.

 

Web Development, System programming, DevOps, Cloud Computing, Data Science 등 상당히 메이저한 분야에서 많이 사용되고 있는 것 같다. 위의 예시의 대부분이 성능이 중요한 대규모 분산 시스템이기에 Go를 사용할 여지가 있는 것 같다. (전해 듣기로는 구글 내부에서 구글 관련 제품에서도 많이 쓰인다고 들었는데 구체적인 예시는 확인해 보아야 겠다. 구글에서 자기들이 직접 어떤 의도를 가지고 만들었으니 당연하게 아닌가 싶기도 하다.)

 

 

 

마지막 인사

고마운 ChatGPT에게 마지막 인사를 하고 블로그 글을 마치도록 하자.

 

[Question]
Thank you so much, my best AI friend! Have a nice day.
[ChatGPT's Answer]
You're welcome! Don't hesitate to ask if you have any more questions or if you need any help in the future. It was great chatting with you!

 

 

 

Reference

[1] https://go.dev/

[2] https://openai.com/blog/chatgpt