Google의 Go는 안전한 유형의 언어입니까?


14

이 페이지 http://golang.org/doc/go_faq.html 다음과 같이 씁니다.

Go에는 정적 유형이 있지만 언어는 일반적인 OO 언어보다 유형이 가벼워 지도록 시도합니다.

그래서 제 질문은 정확하게 제네릭 (C #과 같은)으로 입력하거나 느슨하게 입력 (자바 스크립트와 같이) 또는 옵션 (Vb.Net의 옵션 엄격한과 같이)입니다.


@JamesMcNellis는 타입이 실패 할 경우에만 타입 캐스트를 수행하기 때문에 발생할 수 있습니다 (다른 액션은 타입 예외를 발생
시키지 않아야 함

1
@ davidk01 Java는 (1 + "boo") 컴파일되며 Java의 안전한 유형입니다. 이 표현은 언어에 의해 String 객체에 +가 오버로드되기 때문에 명확한 정적 의미를 가지며 모든 기본 리터럴은 랩핑 된 객체로 타입 해제되어 문자열로 바뀔 수 있습니다.
Trixie Wolf

답변:


26

타입 안전은 흑백 타입 안전이 아닙니다. 그것은 더 많은 스펙트럼이며 일부 언어는 다른 언어 보다 유형 이 안전 할 수 있습니다 (그 반대도 가능). 그러나 C #과 Javascript에 대해 생각하는 것은 정적 입력 (유형 검사가 컴파일 타임에 발생하는 경우) 대 동적 입력 (유형 검사가 런타임에 발생하는 경우) 일 것입니다. Go FAQ의 내용

Google Go는 정적으로 유형이 정해졌지만 여러 가지 기능으로 인해 (적어도 다소) 동적으로 유형이 "표시"됩니다. 예를 들어 클래스를 인터페이스 구현으로 명시 적으로 표시 할 필요는 없습니다. 클래스의 메소드 시그니처가 인터페이스의 메소드 시그니처와 일치하면 클래스는 해당 인터페이스 (오리 종 입력)를 자동으로 구현합니다. 이는 타사 라이브러리의 내장 클래스 및 클래스를 확장하는 데 유용합니다. 타사 클래스의 메소드와 일치하도록 인터페이스를 구성하면 자동으로 구현되기 때문입니다.

타입 안전은 실제로 타입 시스템의 다른 "축"입니다. 예를 들어, C는 형식이 안전하지 않은 정적으로 유형이 지정된 언어입니다. 포인터를 사용하면 프로그램을 중단시킬 수있는 것까지 원하는대로 수행 할 수 있습니다. Javascript는 동적으로 입력되지만 형식이 안전합니다. 프로그램을 중단시키는 작업을 수행 할 수 없습니다. C #은 대부분 형식이 안전하지만 unsafe더 이상 형식이 안전하지 않은 코드 영역을 명시 적으로 표시 할 수 있습니다.

Google Go는 형식에 문제가 없으며 프로그램에 충돌을 일으킬 수 없다는 점에서 형식에 안전합니다 (포인터에 직접 액세스하지 않음).


"안전하지 않은"패키지를 사용하지 않으면, 원하는 방식으로 프로그램을 중단시킬 수 있습니다 :)
Eloff

당신은 할 수있는 유형의 주위에 혼란을 포인터에 액세스 할 수 없습니다. 그리고 네, 그렇게함으로써 쉽게 프로그램을 중단시킬 수 있습니다.
eithed

4

형식은 잘못 해석되지 않으므로 안전하게 입력되지만 형식이 잘못되면 프로그램이 패닉 상태가 될 수 있습니다.


나는 그것을 얻지 못한다. 비 유형 안전 코드가 실제로 컴파일 될 수 있음을 의미합니까? (동적 기능을 사용하지 않으면 C #에서는 불가능합니다)
Pacerier

타입 어설 션을 타입별로하는 것은 기본적으로 동적 타입에서 메소드를 호출하는 것과 같습니다
dan_waterworth

즉, 간단히 말해서 유형 안전 c #에서 허용하는 종류가 없습니까?
Pacerier

타입 어설 션을하지 않으면 그렇습니다.
dan_waterworth

5
@Pacerier : 역학없이 C #에서 잘못 입력 된 표현식을 완벽하게 실행할 수 있습니다 : 어디서나 캐스트를 삽입하십시오 (기본적으로 유형 주장이 무엇인지).
sepp2k

-1

Go의지도 유형은 스레드로부터 안전 하지 않으며 정적으로 유형이 지정됩니다. 형식 상속, 일반 프로그래밍, 어설 션, 메서드 오버로드 또는 포인터 산술 이 없으며 적절한 이유가 없습니다.

유형 안전 및 메모리 안전은 장기적인 목표이며 여기서 문제가 있습니다.

형식 안전은 허용 가능한 킬로바이트 및 메가 바이트 단위의 오버 헤드를 나타냅니다. Go는 MapReduce 및 "빅 데이터"로 설계되었으며, 페타 바이트 단위의 데이터를 엑소 바이트로 표시합니다.이 형식은 유형 안전성과 성능 문제를 나타내며, 유형 검사 (복싱 / 언 박싱)로 인해 오버 헤드가 발생하고 처리에서주기가 걸립니다.

유형 안전은 하위 입력 및 다형성 및 오리 입력 (객체에 캐스트)에서 제한적일 수 있으며, 이로 인해 위험과 Go와 같은 언어가 큰 이점을 제공하는 공간이 생성됩니다. C ++ 및 Java는 Go로 대체되지 않으며 분산 프로그래밍 및 대규모 병렬 시스템을 지원하는 새로운 언어입니다.

브루스 에켈 (Bruce Eckel)은 "C ++이 원래 해결하려고했던 문제의 종류에 대해 훨씬 더 의미가있다"고 큰 진술을 논할 수있다. C ++은 매우 효율적인 언어이며 MapReduce의 Boost 구현은 매우 효율적입니다.

동시성 프리미티브는 미래입니다. 타입 안전성은 항상 매우 논쟁적인 주제였으며 Go는 아마도 20 년 또는 Algol 이후이 문제를 해결 한 최초의 언어 일 것입니다.


3
슬프게도이 답변을 -1로 높이려면 더 많은 평판이 필요합니다. 유형 안전은 오버 헤드가 아니며 런타임 오버 헤드는 바이트 단위로 측정되지 않으며 Java 의미에서 boxing / unboxing이 있습니다. 정적 타입은 컴파일러가 동적 타입 언어보다 더 많은 최적화를 할 수있게합니다. 스레드 감소와 함께 맵 리 듀스는 여기 저기도 아닙니다.
Eloff

언어 기능으로 제네릭의 구현을 피하기 위해 빈 인터페이스를 공통 패턴으로 사용하여 유형을 주장하는 Golang의 관용구는 확실히 "유형 안전"으로 간주되는 것이 아니며 문제가 발생할 때 언어 사양을 단순하게 유지할 수 있습니다. 덕트 탭 롤의 문제를 해결하기 위해 떠난 사람의 판에 복잡성이 남습니다. 형식 안전을 훨씬 더 잘 다루는 언어가 있기 때문에 확실히 지난 20 년 동안 설계된 언어처럼 보이지 않습니다.
tsturzl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.