E D R , A S I H C RSS

Objective-C (rev. 1.1)

Objective-C

Objective-C

오브젝티브 씨라고 읽으면 된다. 애칭은 옵씨. 브래드 콕스(Brad Cox)와 톰 러브(Tom Love)가 만든, 20세기의 걸작 언어 Jr.라고 생각하면 당신은 멋쟁이.

안시(ANSI) C에 객체지향 층을 얹어 만들었다. 따라서 실행 시 반드시 런타임(libobjc.dylib 또는 objc.dll)의 도움을 받아야 작동 가능하다. 물론 런타임은 애플 오픈 소스 사이트에 공개돼있으므로 능력이 있다면 얼마든지 정적 라이브러리로 만들어 붙여버려도 된다.

역사

초창기(넥스트가 먹기 전?) 옵씨는 C에서 객체 지향을 지원하도록 문법을 확장한, 일종의 신택틱 슈거(syntactic sugar)로 구현됐다. 옵씨 컴파일러는 옵씨 코드를 읽어 C 코드를 뱉었고, C 컴파일러가 그걸 바이너리로 어셈블했다. 넥스트(NeXT Inc.)가 옵씨를 집어삼킨 이후부터는 옵씨 코드에서 바로 바이너리로 직행하는 컴파일러가 지원된다. 예전에는 GCC를 이용했지만, 요즘은 애플 주도의 LLVM/Clang을 이용해 컴파일한다. 물론 오픈 소스 LLVM/Clang 3와 Apple LLVM/Clang 4 모두 옵씨 코드를 컴파일할 수 있지만, 클로즈드 브랜치인 Apple LLVM/Clang 4가 훨씬 월등한 어셈블 능력을 보여준다는 게 참.......

여담으로 FreeBSD 재단에서 오픈 소스 LLVM/Clang 3를 다루던 사람이 말하길, 참고삼아 GCC 4.2의 옵씨 담당 부분 소스 코드를 봤다가 기절할 뻔했다고. 무려 일만 줄이 넘어가는 단일 C 파일 하나로 옵씨의 모든 걸 처리했단다.

구조

C 소스 코드는 곧 옵씨 소스 코드이다. 앞서 말했듯, 옵씨는 C에 확장을 얇게 바른 언어에 가깝다. 하지만 그렇다고 옵씨 소스 코드가 곧 C 소스 코드인 건 아니다.

옵씨의 모든 클래스, 인스턴스, 셀렉터는 C의 struct로 만들어진 것과 같다. 즉, 내가 클래스 하나를 소스 코드로 선언했다면 그건 C의 struct로 묶인 것처럼 바이너리 상에 들어간다는 소리. 실제로, 옵씨로만 작성된 Foundation 프레임워크와 C로만 작성된 CoreFoundation 프레임워크의 구성 클래스 및 원시 클래스(struct로 만들어진 것)는 서로 실행 시간에 캐스팅하여 사용이 가능하다. 물론 규칙에 맞도록 struct를 짰을 경우에 한해서.

임의의 클래스(AFArdieFoxTestClass)의 인스턴스(theFox)는 대충 이렇게 보면 된다:
struct _AFArdieFoxTestClass {
        Class *isa; // 클래스 객체 AFArdieFoxTestClass를 가리킨다
        // 기타 잡다한 인스턴스 변수들
} *theFox;

잠깐, 지금 클래스 객체라고 했나? 오케이 정확히 들었다. 옵씨는 흔히들 생각하는 것처럼 설계도인 클래스와 제품인 객체(인스턴스)로 이뤄진 관계가 아니다. 옵씨에는 적어도 세 종류의 객체 있다: 객체, 클래스 객체, 메타 객체.
어떤 클래스의 인스턴스를 만들었다면 그건 그냥 객체다. 그런데, 클래스 그 자체도 객체이다! 이 클래스 객체가 무슨 메서드를 들고 있을까? 바로 클래스 메서드이다. 자바로 치면 static 메서드라고 할 수 있겠다.


작성 중



언어의 종류
머신 친화적C가족
MachineLangaugeAssemblyCC++Objective-CObjective-C++씨앗
체지향함수형 언어
SmallTalkJAVAC#LispHaskellScala
스크립트언어
JavaScriptCoffeeScriptPerlLuaPHPPythonPyPyRubyShellScriptMATLAB
미분류
ErlangGoJOCamlScalaRCSSMLAdaProlog
ScratchRustless
[http]프로그래밍 언어 목록


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:53
Processing time 0.0304 sec