Что вы не можете сделать в C, что вы можете сделать в Objective-C? - PullRequest
5 голосов
/ 14 июня 2010

Что вы не можете сделать в C (стандарт C99), что вы можете сделать в Objective-C?(с примером кода, если хотите)

Ответы [ 4 ]

9 голосов
/ 14 июня 2010

Я собираюсь быть немного самонадеянным и не соглашаться со всеми остальными. Хотя технически верно, что все возможное на одном языке возможно на другом (где «возможно» означает «вычислимый»), они отличаются тем, что вы можете выразить естественно и легко . Компьютер может делать то же самое в ответ на код, который вы пишете на C, но вы пишете совершенно другой код, чтобы заставить его делать эти вещи.

Как уже говорили другие, Objective-C предоставляет полную библиотеку времени выполнения, написанную на C, которая позволит вам создавать структуры данных Objective-C и вызывать функции C, но код для этого будет очень многословным, довольно окольным и полностью императив. В Objective-C код является более декларативным, более кратким и гораздо более читабельным.

В общем, попытка написать вещи в Objective-C на C только сделает ваш код хуже, чем при идиоматическом использовании любого языка. Например, вот простая программа, написанная на Objective-C:

@interface NumberAdder : NSObject {
    int storedValue;
}

- (id)initWithStoredValue:(int)value;
- (int)resultOfAddingStoredValue:(int)numberToAdd;
@end

@implementation NumberAdder
- (int)resultOfAddingStoredValue:(int)numberToAdd {
    return numberToAdd + storedValue;
}

- (id)initWithStoredValue:(int)value {
    if (!(self = [super init])) return nil;
    storedValue = value;
    return self;
}
@end

int main() {
    id adder = [[NumberAdder alloc] initWithStoredValue:4];
    int result = [adder resultOfAddingStoredValue:3];
    printf("It is %d\n", result);
    return 0;
}

А вот то же самое, написанное на C со средой выполнения Objective-C (не проверено, но должно быть приблизительно правильно):

int returnPlusStoredValueImp(id self, SEL _cmd, int arg) {
    int *storedValue = nil;
    object_getInstanceVariable(self, "storedValue", &storedValue)
    return arg + *storedValue;
}

id numberAdderInit(id self, SEL _cmd, int valueToStore) {
    objc_super superInfo = {self, objc_lookupClass("NSObject")};
    self = objc_msgSendSuper(super_info, sel_getName("init"));
    if (!self) return nil;
    object_setInstanceVariable(self, "storedValue", &valueToStore);
    return self;
}

void createNumberAdderClass() __attribute(constructor)__ {
    Class NumberAdder = objc_allocateClassPair(objc_lookupClass("NSObject"), "NumberAdder", 0);
    if (!NumberAdder) return;
    class_addIvar(NumberAdder, "storedValue", sizeof(int), 4, "i"); // I'm actually not sure if the fourth argument is correct, so it's probably wrong, but just take that as a sign of how much this way of coding sucks
    objc_registerClassPair(NumberAdder);
    SEL nameOfPlusStoredValue = sel_registerName("resultOfAddingStoredValue:");
    SEL nameOfInit = sel_registerName("initWithStoredValue:");
    class_addMethod(NumberAdder, nameOfPlusStoredValue, returnPlusStoredValueImp, "i@:i");
    class_addMethod(NumberAdder, nameOfInit, numberAdderInit, "@@:i");
}

int main() {
    id adder = objc_msgSend(objc_lookupClass("NumberAdder"), sel_getName"alloc");
    adder = objc_msgSend(adder, sel_getName("initWithStoredValue:"), 4);
    int result = (int)objc_msgSend(adder, sel_getName("resultOfAddingStoredValue:"), 3);
    printf("It is %d\n", result);
    return 0;
}
8 голосов
/ 14 июня 2010

Абсолютно ничего. Возможности OO Objective-C реализованы в виде небольшой библиотеки времени выполнения, написанной на C.

Хотя некоторые комментаторы могут указывать, что в Objective-C есть блоки, а в C нет, на самом деле это расширение GCC / LLVM до C , которое использует Objective-C, но это не функция ObjC.

3 голосов
/ 14 июня 2010

Как сказал Грэм - в Objective-C абсолютно ничего нельзя сделать, чего нельзя сделать в C. Конечно, в C тоже нет ничего, что нельзясделано в сборке.Это всего лишь вопрос ввода.

(я надеялся, что упоминания о сборке будет достаточно, чтобы указать, что нет, я не хочу удаленно утверждать, что написание шаблонов OO в чистом C - это продуктивноделать ...)

Есть еще несколько интересных моментов:

  • Objective-C начинал как препроцессор, который превратил код Objective-C в код Cэто может быть скомпилировано стандартным компилятором Си.Таким образом, Objective-C изначально никогда не компилировался напрямую, но переводился в прямую C, а затем компилировался.

  • Объекты Objective-C можно рассматривать как структуры C, в которых первая запись вструктура - isa - всегда является указателем на метаданные - Class - который описывает структуру / экземпляр.

  • Блоки являются расширением C,сейчас предлагается в качестве дополнения к языку C в WG-14 (комитет по стандартам C).Блоки, реализованные Apple, абсолютно не требуют наличия исполняемого стека.Это было жесткое требование в их дизайне.

  • LLVM имеет переписывающее устройство, которое может фактически переписать Objective-C на C, и, по-видимому, использовалось для включения кодирования Objective-C в Xbox 360игры (см. http://permalink.gmane.org/gmane.comp.compilers.llvm.devel/31996).

1 голос
/ 14 июня 2010

Нет такой вещи.Как правило, вы можете программировать что угодно на любом языке программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...