Что Вы не можете сделать в C, который можно сделать в Objective C?

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

5
задан 5 revs, 4 users 67% 15 June 2012 в 02:12
поделиться

4 ответа

Я буду немного самонадеян и не согласен со всеми остальными. Хотя технически верно, что все возможное на одном языке возможно на другом (где «возможный» означает «вычислимый»), они различаются тем, что вы можете выразить естественным образом и легко . Компьютер может делать то же самое в ответ на код, который вы пишете на 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;
}
9
ответ дан 18 December 2019 в 07:28
поделиться

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

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

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

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

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

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

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

3
ответ дан 18 December 2019 в 07:28
поделиться

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

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

8
ответ дан 18 December 2019 в 07:28
поделиться

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

1
ответ дан 18 December 2019 в 07:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: