"Objective-C는 C ++보다 엄격하게 C의 상위 집합입니다"는 정확히 무엇을 의미합니까?


87

내가 읽은 내용 : Objective-C가 Apple 커뮤니티 외부에서 그다지 인기가없는 이유는 무엇입니까?

Objective-C는 C의 상위 집합 (사실 C ++보다 훨씬 엄격함)이므로 이전 버전과의 호환성 문제가 발생하지 않습니다. C에서 할 수있는 모든 것은 Objective-C에서 할 수 있습니다.

수퍼 세트가되는 것은 임신과 같은 바이너리입니다. Obj-C는 C의 상위 집합이며 C ++는 그렇지 않습니다.

수퍼 세트 란 무엇을 의미합니까? Objective-C는 어떤 방식으로 C와 더 가깝거나 / 뒤로 호환됩니까? Objective-C는 어떤 방식으로 C ++보다 C 철학을 더 가깝게 따르나요?

Objective-C 컴파일러 (100 % 호환성)에 의해 수정없이 C 프로그램을 컴파일 할 수 있습니까?

이것은 어느 것이 더 나은지에 대한 전쟁보다 프로그래밍 언어 디자인과 호환성에 대한 질문입니다.

답변:


134

간단한 다이어그램을 준비했습니다. 그다지 예쁘지는 않지만 요점을 이해하기를 바랍니다.

  • 빨간색 : C, C ++ 및 Objective-C에서 유효한 모든 프로그램 집합 (상대적으로 작음)
  • 녹색 : C 및 Objective-C에서는 유효하지만 C ++에서는 유효하지 않은 모든 프로그램 집합 (더 작음)
  • 회색 : Objective C 및 C ++에서는 유효하지만 C에서는 유효하지 않은 모든 프로그램 집합 (내가 아는 한 비어 있음)
  • 파란색 : Objective C에서만 유효한 모든 프로그램 집합 (상대적으로 큼)
  • 노란색 : C ++에서만 유효한 모든 프로그램 집합 (최대)

유효한 C 프로그램 세트 (빨간색 및 녹색)는 유효한 Objective C 프로그램 세트 (파란색)의 엄격한 하위 집합입니다.

여기에 이미지 설명 입력


14
객관적인 C ++는 어떻습니까?
user1115057


19
여기에서 노란색이 파란색보다 "더 크다"고 주장하는 기준은 무엇입니까? 직감은 두 세트 모두 셀 수없이 무한 할 것이라고 말해줍니다.
WIM

4
@wim : 그리고 둘 다 R ^ 2의 셀 수없는 부분 집합으로 표현됩니다.) 이것은 크기가 같음에도 불구하고 Q 내부에서 N을 볼 수있는 것과 동일한 트릭입니다 (그리고 N은 Q의 엄격한 부분 집합 임).
Maciej Piechotka 2013 년

3
나는 그것에 대해 좀 더 생각하고 있었고 ObjC ++ 세트가 실제로이 모든 것을 둘러싼 것은 아니라는 것을 깨달았습니다. C ++의 상위 집합이지만 ObjC의 엄격한 상위 집합은 아닙니다. 합법적 인 C이지만 불법적 인 C ++ (녹색 영역) 인 동일한 프로그램은 불법적 인 ObjC ++입니다.
Rob Napier

62
  1. 수퍼 세트 란 무엇을 의미합니까?

    엄격한 수퍼 세트를 의미합니다. 유효한 C 프로그램은 Objective-C 컴파일러로 컴파일됩니다. 일부 유효한 C 프로그램은 C ++ 컴파일러로 컴파일되지 않습니다.

  2. Objective-C는 어떤 방식으로 C와 더 가깝거나 / 뒤로 호환됩니까?

    다음은 간단한 예입니다.

    int *foo = malloc(12);
    

    C 및 Objective-C에서 컴파일되지만 C ++에서는 컴파일되지 않습니다. 물론 다른 예도 있습니다.

  3. Objective-C는 어떤면에서 C ++보다 C 철학을 더 가깝게 따르나요?

    모두-Objective-C는 C의 엄격한 상위 집합입니다.

  4. Objective-C 컴파일러 (100 % 호환성)에 의해 수정없이 C 프로그램을 컴파일 할 수 있습니까?

    예.


2
네, 괜찮습니다. 사용할 저수준 런타임 함수를 기꺼이 알아 내려면 GUI에 Objective-C가 필요하지 않습니다.
Carl Norum

3
대부분 철학적입니다.
Carl Norum

2
+1 좋은 설명. 나는 "C 철학"에 대한 질문이 약간 모호하다고 생각하지만 대부분의 관찰자들은 아마도 C의 "목표"와 ObjC의 "목표"가 다르다는 데 동의 할 것입니다. C의 의도는 하드웨어에 매우 가깝고 유용한 이식성 추상화를 제공하는 반면, ObjC의 목표는 SmallTalk 접근 방식을 C에 제공하는 것입니다. Cocoa가 최근 몇 년 동안 ObjC에 통합됨에 따라 이러한 차이는 더욱 강력 해졌습니다. C-array와 NSArray의 "철학"(설계 접근 방식)은 확실히 매우 다릅니다.
Rob Napier

2
그것은 전적으로 프로그램에 달려 있습니다. 아마도 Objective-C 프로그램에서 C 스타일의 작업을 너무 많이하지 않을 것입니다. 그렇다면 왜 Objective-C를 사용합니까?
Carl Norum

1
@ user1115057 : 사물이 어떻게 고려되는지에 대해 너무 많이 걱정해서는 안됩니다. C로 컴파일되는 (또는 적어도 비슷하게 보이는) C ++ 코드를 작성하는 데는 두 가지 문제가 있습니다. 하나는 C ++의 이점을 전혀 얻지 못하고 있다는 것입니다. 중요한 것은 실제 C가 아닌 C 언어의 깨진 방언으로 작성하고 있다는 것입니다. 대신 C 코드를 C 컴파일러로 컴파일하고 C ++ 코드에 연결해야합니다. 즉, 후자의 관심은 C로 컴파일는 것을 목표 - C의 부분 집합 이후, 오브젝티브 C로 적용되지 않습니다 이다 C.
스티브 Jessop

31

처음부터 C ++는 "더 나은 C"로 설계되어 C ++의 작성자가 언어를 사용함에 따라 실제 및인지 된 디자인 누락을 수정했습니다. 이 디자인 결정의 결과는 X유효한 C 프로그램이 XC ++ 컴파일러에 의해 처리 될 때 실행되는 것은 말할 것도없이 컴파일 된다는 것을 보장하지 않는다는 것입니다. 변경 사항은 문자열 리터럴 ( const char*), void포인터 할당 , enums와 정수 유형 간의 변환 , 복합 할당 연산자의 의미 등과 같은 기본 구성에 영향을 미쳤 습니다.

게다가 C99가 나오자 업데이트 된 C 표준에 포함 된 기능은 업데이트 된 C ++ 표준에서 제외되었습니다. 다시 말하지만, 매우 중요한 언어 기능, 특히 지정된 이니셜 라이저 및 가변 크기 배열은 생략되었습니다.

대조적으로, Objective C는 C의 상위 집합으로 위치하여 모든 유효한 C 프로그램을 Objective C 컴파일러로 컴파일 할 수 있어야합니다.


4
나는 "superset"이 무엇인지 알고 있기 때문에이 질문에 대답했지만 Objective-C에 대해서는 아무것도 모릅니다. 유효한 C 코드 조각 int nil = 0; nil++;이 Objective-C로 컴파일되지 않는다는 또 다른 SO 질문에서 주장을 보았습니다 . 거기에 문제는 무엇입니까? Objective-C가 일단 포함되면 C 헤더가 할 수있는 것처럼 코드를 깰 수있는 사용 가능한 헤더를 만드는 것이 분명합니까? 따라서 해당 스 니펫의 작성자는이를 포함하지 않아야합니다.
Steve Jessop

2
"nil"은 실제로 키워드가 아니라 #define입니다. objc / objc.h가 포함되어 있기 때문에 문제가 발생합니다. 이것은 YES라는 변수를 만들려고하면 볼 수있는 문제와 유사합니다. (Xcode는 이런 식으로 생각하는 것이 훨씬 쉽기 때문에 실제로 키워드 인 것처럼 강조하지만 단순한 C 코드로 구현되었습니다.)
Rob Napier

4
BTW, ObjC가 C 위에 어떻게 사는지에 관심이 있다면 objc.ha를 조금 둘러 볼 가치가 있습니다. 키워드 (id, BOOL, Class, nil 등)가 될 것이라고 생각하는 것은 단순한 유형, 구조체입니다. , 정의합니다. pure-C에서 직접 메시지 전달을 구현할 수도 있습니다. 절대로하지 마십시오. : D하지만 할 수 있습니다. github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c
Rob Napier

2
@DanNeely : Rob Napier는 링크 된 파일에 대한 논평으로 "절대, 절대 그렇게하지 마십시오"라고 말했습니다. 링크 된 파일은 Objective-C 런타임 이 아니며 메시징이 실제로 작동하는 방식을 보여주는 간단한 해킹 일뿐입니다.
Dietrich Epp

1
연결된 파일은 ObjC 메시지 전달이 얼마나 복잡한 지 보여주지 않았습니다. C에서 런타임을 사용할 수 있으며 원칙적으로 ObjC 코드를 순수 C로 변환 할 수 있음을 보여줍니다. 그러나 이것은 빌드 할 수있는 것만 큼 느립니다. 메서드의 반환 유형을 아는 데 의존했으며 (일부 반환 유형의 경우 프로세서 유형을 알아야 할 것입니다) 매개 변수를 사용하지 않는 메서드를 신중하게 선택했습니다. 전체 솔루션에는 많은 미묘한 트릭이 있습니다 (부품은 스택 프레임을 속이기 때문에 어셈블러에 있어야 함). 재 구축을 시도해서는 안됩니다.
Rob Napier

12

"Objective-C는 C의 상위 집합입니다."는 모든 유효한 C 프로그램이 유효한 Objective-C 프로그램 (동일한 의미)임을 의미합니다.

C ++ 전문가는 아니지만 C ++가 C의 상위 집합이라고하는 경우종종 있습니다 . 이것은 정확하지 않습니다. 그렇기 때문에 인용문이 둘을 비교하는 데 큰 비중을 차지합니다.


9

Objective C는 C에 대한 이전 버전과 호환되는 확장 집합입니다. Objective C 기능이 두 가지 매우 간단한 방법으로 구분되기 때문에 가능합니다.

  • 캐릭터의 사용 @. 이 문자는 현재 C 언어에서 사용되지 않습니다.
  • 메서드 호출을위한 간단한 구문 확장, [obj method:argument]. C에서 대괄호는 배열 첨자에 매우 특정한 방식으로 사용되므로 잘못된 C 구문입니다. 유효하지 않은 구문을 기반으로하는 확장은 호스트 언어에서 유효한 것의 의미를 변경하지 않습니다.

Objective C 확장을 사용하는 프로그램은 아무리 간단하더라도 ISO C 프로그램을 엄격하게 준수 할 수 없다는 것을 쉽게 알 수 있습니다. 또한 모든 ISO C 프로그램은 정의에 따라 유효한 Objective C 프로그램으로 선언 될 수 있습니다. Objective C는 C99 및 C11과 같은 개발을 쉽게 따를 수 있습니다.

반면에 C ++는 단순히 C에 대한 확장이 아닙니다. C의 일부 구문의 의미를 변경하는 다른 언어입니다. C ++와 C는 별도로 유지되므로 시간이 지남에 따라 관계가 변경됩니다. 예를 들어, C는 C ++에 전혀없는 새로운 기능을 획득했으며 C99 가변 길이 배열과 같이 C ++에 포함되지 않을 가능성이 높습니다. C ++는 새로운 C 기능을 쉽게 선택할 수 없습니다.

이식 가능한 C 프로그램을 작성하는 경우 동시에 Objective C 프로그램이어야합니다. 그러나 동일한 의미를 가진 C ++ 프로그램이되도록 추가주의가 필요합니다. (이 관행은 들어 본 적이 없으며 필요한 방언은 비공식적으로 "Clean C"로 알려져 있습니다.)

나누기 ++ C로 처리하는 C 프로그램의 단순 예는 다음과 같은 식별자, C ++과 같은 키워드를 사용하는 C 프로그램 class또는 virtual. Objective C는 예약 된 키워드를 도입하지 않습니다. @와 같이 캐릭터 가 도입 한 새로운 키워드가 있습니다 @interface.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.