2010-04-18 7 views
15

정적 유형 언어와 동적 유형 언어는 원칙적으로 반대 개념으로 보입니다. 그러나 Objective-C와 같은 언어는 어떻게하면 한 번에 이러한 두 가지 일 수 있습니까? Objective-C는 동적 인 것보다 정적 인 것처럼 보입니다. 누군가 이것이 이것이 어떻게 가능한지 설명 할 수 있습니까?프로그래밍 언어를 정적으로 입력하고 동적으로 입력 할 수있는 방법은 무엇입니까?

+6

어떻게? 두 가지 패러다임을 희생해서. –

답변

9

Objective-C는 실제로 개념적으로 C 언어 자체의 계층이며 정적 및 동적 유형을 모두 가질 수 있습니다. Objective-C 확장을 사용하는 경우 동적 인 기본 -C 파일을 사용하는 경우 정적입니다.

그러나 C는 sort-of도이 기능을 제공합니다. C의 void * 타입에 대해서 생각해 보면, 어떤 타입을 가리킬 수 있다는 것을 알 수 있습니다. 따라서 동적 인 타입의 언어를 제공합니다. 예를 들어

:

int i; 
float f; 
double d; 
void *p = &i; 
p = &f; 
p = &d; 

p에 모든 과제에서, 다른 종류를 가리 키도록 만들어졌다. 당신이 영리 충분히 코드를 할 경우, 당신은 심지어 내가 언어 을 고려할 것 C.

에서 RTTI와 다형성을 에뮬레이션 할 수 있습니다 주로은 정적 또는 동적으로 사용 가장 무엇을 기반으로 입력했습니다.

1

두 관용구를 모두 지원할 수있는 기술 능력에 대해 질문하는 경우 특히 흥미로운 질문이 아닙니다. 대부분의 현대 언어를보고 어떻게하는지보십시오. 대개의 경우 catch-all 동적 유형 (VB에서는 Object, C에서는 dynamic, C에서는 void* 등)을 사용합니다. 형이상학/론적 수준에서

,이 질문은 훨씬 더 재미있다 ...

직관을 무시하는 행동을 제안 할 수있는 물리학 이론, 부탁 하나를 선도하는 "이 될 수 있는가?" 예를 들어, 파동 - 입자 이중성은 현실이 어떠해야하는지에 대한 상식적 인 개념을 뛰어 넘을 것이며, 그래서 그것은 우리로 하여금 상상할 수없는 것을 숙고하게 만듭니다.

그러나 프로그래밍 언어는 현실의 모델이 아닙니다. 그것들은 우리의 목적에 부합하도록 고안된 마음의 발명품입니다. 따라서 프로그래밍 언어가 어떻게 그렇게 될 수 있는지 상상하는 것은 의미가 없습니다. 우리가 그렇게하기를 원했기 때문에 그 길입니다. 그것은 우리의 목적에 부합하기 때문입니다. 다른 이유가 필요하지 않거나 보증되지 않습니다.

언어가 동적 일 수도 있고 정적 일 수도 있다는 이유 때문에 유용하지 않기 때문에 나는 경박하거나 분개하지 않습니다. 더 이상 조사 할 필요가 없다.

+7

이것은 내가 지금까지 보아온 가장 불쾌하고 비협조적 인 대답 중 하나입니다. – jpswain

+1

@ orange80 : 천만에. –

+0

내가이 모든 것으로부터 이해 한 것은 그것이 사람들이 그렇게 만든 것입니다. 아마도 너무 많은 단어로 말입니다. – madhukar93

0

C는 정적 형식의 언어이지만 형식을 다른 형식으로 다시 변환하고 일반 포인터 (void * 형식)를 사용할 수 있습니다. void * 유형은 "지정되지 않은 데이터 유형에 대한 포인터"를 의미합니다. 보통이, 정의, 형식 정의의 여러 수준으로 떨어져 추상화되어 있지만 오브젝티브 C는, 이러한 무효 * 유형의 사용을 통해 동적 유형을 구현하는 등

21

난 당신이 정적 및 동적 방법 해상도를 입력 혼동 생각. 목표 -C는 확실히 강력하고 정적으로 입력됩니다. C와 마찬가지로 모든 변수는 선언되고 유형화되어야합니다 (다른 현대의 정적 유형 언어와 마찬가지로 유형 유추도 없습니다). 컴파일러는 변수 유형을 기반으로 코드를 생성하며 런타임에이 유형을 변경할 수 없습니다.

그러나 Objective-C 메서드 호출은 메시지 전달 패러다임을 사용합니다. 여기서 메시지 이름과 대상은 컴파일시 인코딩되지만 Objective-C 런타임 라이브러리는 런타임시 실행할 코드의 주소를 런타임에 조회합니다.

+0

Apple Objective-C 문서에서 동적 메서드 확인 때문에 Objective-C가 동적으로 형식화되어 있기 때문에 실제로이 동일한 질문에 대해 궁금합니다. 문서가이 기능을 기반으로 동적으로 입력되었다고 말하는 것을 혼동해서는 안된다는 데 동의합니다. – Oscar

+1

원한다면 모든 Obj-C 객체 유형을 _id_로 만들고 C 기본 형식을 제외하고는 _int_와 같은 유형을 완전히 무시할 수 있다는 점을 감안할 때 "선택적으로 형식이 지정되어 있지 않습니까?" – jpswain

+0

@ orange80,'id' *는 유형입니다. 사실, Objective-C의 모든 객체 인스턴스는 컴파일러 유형'id' ('struct objc_object *')에 있습니다. 정적 유형 지정은 C 나 Objective-C에서 선택 사항이 아닙니다. –

0

Objective-C에는 정적 및 동적 입력이 혼합되어 있습니다. 일반 C 객체는 정적으로 입력되지만 Objective-C 객체는 동적으로 입력됩니다. Objective-C 런타임은 객체에 보내는 메시지가 객체에 의해 인식되는 한 객체의 유형을 신경 쓰지 않습니다.

-1

정적 형식의 언어와 동적 형식의 언어는 실제로는 반대입니다. 적어도 이러한 용어가 일반적으로 사용되는 방식은 다릅니다.

정적 유형 언어는 컴파일 중 (또는 적어도 코드 실행 전에) 형식 검사 (보고) 단계를 포함하는 언어입니다. 목표 C는 확실히 이것을 가지고 있으므로 정적으로 타입이 지정됩니다.

동적 유형 언어는 이러한 유형 검사 단계가없는 언어입니다. 따라서 Objective C는이 정의에 의해 동적으로 타입이 지정되지 않습니다. 이것이 가장 표준적인 정의라고 생각합니다.

그러나 Objective C는 프로그래머가 코드의 일부, 특히 특수 정적 유형 id을 통해 객체에 대해 감소 된 정적 유형 검사를 지정할 수 있기 때문에 동적 유형 지정 (정적 유형 이외에)이라고도합니다. 개인적으로 나는 그것이 동적으로 타입이 지정된 객체를 잘 지원하는 정적으로 타입이 지정된 언어라고 말하는 것이 덜 혼란 스럽다고 생각한다.

거의 모든 정적 유형 언어에는 동적 유형 지정에 대한 일부 지원이 포함되어 있습니다. 예를 들어, 런타임 검사를 사용하여 제로 오류, 배열 경계 오류, 다운 캐스트 오류 등으로 나누기를 포착하기 때문입니다. 동적으로 타이핑 된 언어를 호출합니다. 그렇지 않으면 거의 모든 언어를 동적으로 타입 지정해야합니다.

관련 문제