본문으로 이동

Go (프로그래밍 언어): 두 판 사이의 차이

위키백과, 우리 모두의 백과사전.
내용 삭제됨 내용 추가됨
편집 요약 없음
편집 요약 없음
25번째 줄: 25번째 줄:


{{목차숨김|3}}
{{목차숨김|3}}

== 역사 ==
2009년 11월에 Go가 발표되었다. 구글의 생산 시스템 중 일부 및 기타 기업들에 사용되고 있다.
<ref name="faq">
{{뉴스 인용
|url=http://golang.org/doc/faq#Is_Google_using_go_internally
|title=Go FAQ: Is Google using Go internally?
|accessdate=2013-03-09}}</ref>

2개의 주요 구현체가 존재한다:

* 구글의 Go [[컴파일러]] "gc"는 [[오픈 소스 소프트웨어]]로 개발되어 있으며 [[리눅스]], [[OS X]], [[마이크로소프트 윈도우|윈도우]], 다양한 [[BSD]] 및 [[유닉스 버전]]을 대상으로 하며, 게다가 2015년 이후로 [[스마트폰]]을 포함한 모바일 기기도 지원한다.<ref>{{웹 인용 |title=Google’s In-House Programming Language Now Runs on Phones |website=[[wired.com]] |date=19 August 2015 |url=https://www.wired.com/2015/08/googles-house-programming-language-now-runs-phones/}}</ref>
* 두 번째 컴파일러 gccgo는 [[GNU 컴파일러 모음|GCC]] 프론트엔드이다.<ref>{{웹 인용 |url=http://golang.org/doc/go_faq.html#Implementation |title=FAQ: Implementation |date=16 January 2010 |work=golang.org |accessdate=2010-01-18}}</ref><ref>{{웹 인용 |url=https://gcc.gnu.org/install/configure.html |title=Installing GCC: Configuration |accessdate=2011-12-03 |quote=Ada, Go and Objective-C++ are not default languages}}</ref>

gc 툴체인은 버전 1.5 이후로 [[셀프 호스팅]]되고 있다.<ref>{{웹 인용 |title=Go 1.5 Release Notes |url=https://golang.org/doc/go1.5#implementation |accessdate=28 January 2016 |quote=The compiler and runtime are now implemented in Go and assembler, without C.}}</ref>

Go는 다른 언어의 긍정적인 특징들을 유지하면서 공통이 되는 문제들을 해결할 새로운 프로그래밍 언어를 설계하기 위해 구글의 엔지니어 Robert Griesemer, [[Rob Pike]], [[켄 톰프슨]]에 의해 실험적으로 시작되었다. 이 새로운 언어는 다음의 기능을 포함할 작정이었다:<ref>{{웹 인용 |url=http://www.stanford.edu/class/ee380/Abstracts/100428.html |title=Another Go at Language Design |last=Pike |first=Rob |date=28 April 2010 |work=Stanford EE Computer Systems Colloquium |publisher=[[Stanford University]]}} [https://www.youtube.com/watch?v=7VcArS4Wpqk Video available].</ref>

* 정적 타이핑 및 대형 시스템으로의 스케일 가능할 것 (마치 [[자바 (프로그래밍 언어)|자바]]와 [[C++]]처럼)
* 너무 많은 필수적인 키워드와 반복 없이도 [[프로그래밍 생산성|생산적]]이고 가독성이 좋을 것<ref>{{웹 인용
|url=https://golang.org/doc/faq#different_syntax
|title=Frequently Asked Questions (FAQ) - The Go Programming Language
|work=golang.org
|accessdate=2016-02-26
}}</ref> ([[동적 언어]]와 같이 가벼움)
* [[통합 개발 환경]]이 필요하지 않지만 지원도 가능할 것
* 네트워킹 및 다중 처리를 지원할 것

나중의 인터뷰에서, 언어 설계자 3명 모두 자신들이 C++의 복잡성을 싫어하며 이로 인해 새로운 언어를 설계하는 계기가 되었다고 언급하였다.<ref>{{웹 인용 |url=http://www.drdobbs.com/open-source/interview-with-ken-thompson/229502480 |title=Dr. Dobb's: Interview with Ken Thompson |author=Andrew Binstock |date=18 May 2011 |accessdate=2014-02-07}}</ref><ref>{{웹 인용 |url=http://commandcenter.blogspot.mx/2012/06/less-is-exponentially-more.html |title=Less is exponentially more |year=2012 |last=Pike |first=Rob}}</ref><ref>{{웹 인용 |url=https://sourcegraph.com/blog/live/gophercon2015/123645585015 |title=The Evolution of Go |year=2015 |author=Robert Griesemer}}</ref>

Go 1.0은 2012년 3월에 출시되었다.<ref>{{웹 인용|url=https://golang.org/doc/devel/release.html|title=Release History}}</ref>


== 목적 ==
== 목적 ==

2017년 7월 10일 (월) 14:41 판

Go
패러다임컴파일 언어, 병행 프로그래밍, 명령형 언어, 구조적 언어
설계자로버트 그리즈머
롭 파이크
켄 톰슨
개발자구글
발표일2009년 11월
최근 버전1.8
자료형 체계strong, static typing
운영 체제리눅스, OS X, FreeBSD, MS 윈도, 플랜 9
라이선스BSD 라이선스
웹사이트http://golang.org
주요 구현체
gc (8g, 6g, 5g), gccgo
영향을 받은 언어
C, Limbo, Modula, Newsqueak, Oberon, 파스칼

Go는 구글이 개발한 프로그래밍 언어이다. 가비지 컬렉션 기능이 있고, 병행성(concurrent)을 잘 지원하는 컴파일 언어다.

Go의 초기 디자인은 2007년 9월 21일에 로버트 그리즈머, 롭 파이크, 켄 톰슨인페르노 분산 운영체제와 관련된 작업을 하다가 시작되었다. 화이트 보드에 새로운 언어에 대한 스케치를 하면서 초기 20% 파트타임 프로젝트로 시작하였다가 2008년 1월 켄 톰슨이 C 코드를 만들어내는 컴파일러를 만들기 시작했고, 2008년 중반 풀타임 프로젝트로 승격되었다. 2008년 5월 이안 테일러가 Go 스펙의 초안을 이용해서 GCC 프론트엔드를 만들기 시작했고, 2008년 말 러스 콕스가 참여하면서 프로토타입에서 실질적인 언어와 라이브러리들을 만들기 시작했다. 2009년 11월 10일에 리눅스Mac OS X 플랫폼을 대상으로 공식 발표되었다. Go가 처음 런칭되었을 때는 실무적인 소프트웨어를 만들기에는 준비가 좀 덜 된 상태였지만, 2010년 5월 롭 파이크는 구글에서 실제로 사용되고 있는 부분이 있다고 공개적으로 알리게 되었다.

역사

2009년 11월에 Go가 발표되었다. 구글의 생산 시스템 중 일부 및 기타 기업들에 사용되고 있다. [1]

2개의 주요 구현체가 존재한다:

gc 툴체인은 버전 1.5 이후로 셀프 호스팅되고 있다.[5]

Go는 다른 언어의 긍정적인 특징들을 유지하면서 공통이 되는 문제들을 해결할 새로운 프로그래밍 언어를 설계하기 위해 구글의 엔지니어 Robert Griesemer, Rob Pike, 켄 톰프슨에 의해 실험적으로 시작되었다. 이 새로운 언어는 다음의 기능을 포함할 작정이었다:[6]

  • 정적 타이핑 및 대형 시스템으로의 스케일 가능할 것 (마치 자바C++처럼)
  • 너무 많은 필수적인 키워드와 반복 없이도 생산적이고 가독성이 좋을 것[7] (동적 언어와 같이 가벼움)
  • 통합 개발 환경이 필요하지 않지만 지원도 가능할 것
  • 네트워킹 및 다중 처리를 지원할 것

나중의 인터뷰에서, 언어 설계자 3명 모두 자신들이 C++의 복잡성을 싫어하며 이로 인해 새로운 언어를 설계하는 계기가 되었다고 언급하였다.[8][9][10]

Go 1.0은 2012년 3월에 출시되었다.[11]

목적

Go는 정적 타입 컴파일 언어의 효율성과 동적 언어처럼 쉬운 프로그래밍을 할 수 있도록 하는 것을 목표로 한다. 또다른 목적은:

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

설명

Go의 문법은 대체로 C와 비슷하다: 코드 블록들은 중괄호로 둘러싸고 for, switch, if를 포함한 일반적인 제어구조를 가지고 있다. C와 다르게, 한 라인 끝의 세미콜론은 필수가 아닌 옵션이다. 변수 선언은 다르게 작성되고 대개 옵션이다. 형변환은 명시적으로 해야 한다. 병행성 프로그래밍을 다루기 위해 goselect 키워드가 사용된다. 새로운 타입은 map, 유니코드 문자열, 배열 slice, 그리고 내부 쓰레드 통신을 위한 channel이 있다.

Go는 그리 좋지 않은 하드웨어에서도 빠르게 컴파일될 수 있도록 디자인되었다. Go는 가비지 컬렉션이 되는 언어이다. 병행성(concurrency)와 관련된 Go의 구조적인 규칙들(channel과 선택적인 channel input들)은 Tony Hoare의 CSP로부터 가져온 것이다.

C++이나 Java에 있는 기능들 중 타입 상속, 제너릭, assertions, 메서드 오버로딩, 포인터 연산은 Go에서 포함하고 있지 않다. Go를 만들고 있는 개발자들은, 제너릭 등은 급하진 않지만 어느 시점에는 기능이 들어갈 거라고 한다.

병행성

Go를 이용해 프로그램들이 서로 소통하면서 상태를 공유하는 동시성(concurrency) 프로그램을 쉽게 만들 수 있다. [12][13][14] 동시성이란 멀티쓰레딩, 병렬 컴퓨팅 뿐 아니라, 비동기성 입출력 또한 포함한다. 예를 들어, 이벤트 기반 서버와 같이, 데이터베이스나 네트워크 작업과 같이 시간이 많이 걸리는 연산을 하는 동안 프로그램이 다른 일을 하는 것을 말한다. [15]

예제

아래는 Go로 만든 Hello, World 프로그램이다.

package main
 
import "fmt"
 
func main() {
        fmt.Println("Hello, World")
}

Go는 for loop과 같은 경우 각 항목을 구분하는 용도로 세미콜론(;)을 사용하고 그 외에는 대부분 자동으로 세미콜론이 컴파일 시 들어가게 된다. 중요한 것은 if와 같은 경우 if가 있는 그 라인에 중괄호({)가 반드시 같이 들어가야 한다는 것이다.

각주

  1. “Go FAQ: Is Google using Go internally?”. 2013년 3월 9일에 확인함. 
  2. “Google’s In-House Programming Language Now Runs on Phones”. 《wired.com》. 2015년 8월 19일. 
  3. “FAQ: Implementation”. 《golang.org》. 2010년 1월 16일. 2010년 1월 18일에 확인함. 
  4. “Installing GCC: Configuration”. 2011년 12월 3일에 확인함. Ada, Go and Objective-C++ are not default languages 
  5. “Go 1.5 Release Notes”. 2016년 1월 28일에 확인함. The compiler and runtime are now implemented in Go and assembler, without C. 
  6. Pike, Rob (2010년 4월 28일). “Another Go at Language Design”. 《Stanford EE Computer Systems Colloquium》. Stanford University.  Video available.
  7. “Frequently Asked Questions (FAQ) - The Go Programming Language”. 《golang.org》. 2016년 2월 26일에 확인함. 
  8. Andrew Binstock (2011년 5월 18일). “Dr. Dobb's: Interview with Ken Thompson”. 2014년 2월 7일에 확인함. 
  9. Pike, Rob (2012). “Less is exponentially more”. 
  10. Robert Griesemer (2015). “The Evolution of Go”. 
  11. “Release History”. 
  12. Share by communicating - Effective Go
  13. Andrew Gerrand, Share memory by communicating
  14. Andrew Gerrand, Codewalk: Share memory by communicating
  15. Rob Pike의 Concurrency is not Parallelism 참고.

바깥 고리