Що саме означає "Objective-C - надмножина C більш суворо, ніж C ++"?


87

З того, що я там читав: Чому Objective-C не дуже популярний поза спільнотою Apple?

Objective-C - це надмножина C (насправді набагато суворіша, ніж C ++), тому проблема зворотної сумісності не виникає. Все, що ви можете зробити в C, ви можете зробити в Objective-C.

Бути надмножиною - це бінарне, як вагітність. Obj-C - надмножина C, а C ++ - ні.

Що вони означають під надмножиною? Яким чином object-C буде більш близьким // назад сумісним із C? Яким чином object-C слідує філософії C ближче, ніж C ++?

Чи може будь-яка програма C компілюватися без змін компілятором object-C (100% сумісність)?

Це більше питання про дизайн та сумісність мови програмування, ніж про війни, яка з них краща.

Відповіді:


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;) Це той самий фокус, як ви побачите N всередині Q, незважаючи на те, що вони однакового розміру (і N є суворим підмножиною Q).
Maciej Piechotka

3
Я ще над цим думав і зрозумів, що набір ObjC ++ насправді не оточуватиме всього цього. Це надмножина C ++, але не сувора набір ObjC. Ті самі програми, які є законними C, але незаконні C ++ (зелена зона) є незаконними ObjC ++.
Роб Нейпір

62
  1. Що вони означають під надмножиною?

    Вони означають суворий надмір. Будь-яка діюча програма на С компілюється за допомогою компілятора Objective-C. Деякі діючі програми C не компілюються за допомогою компілятора C ++.

  2. Яким чином object-C буде більш близьким // назад сумісним із C?

    Ось простий приклад:

    int *foo = malloc(12);
    

    Компілюється на C та Objective-C, але не на C ++. Звичайно, є й інші приклади.

  3. Яким чином object-C слідує філософії C ближче, ніж C ++?

    Все - Objective-C - це сувора надмножина C.

  4. Чи може будь-яка програма C компілюватися без змін компілятором object-C (100% сумісність)?

    Так.


2
Так, це було б добре. Можливо, вам не потрібен Objective-C для графічного інтерфейсу, якщо ви готові з'ясувати функції низького рівня для використання.
Carl Norum

3
Переважно філософські.
Carl Norum

2
+1 Чудове пояснення. Я вважаю, що питання про "філософію С" є трохи розпливчастим, але більшість спостерігачів, мабуть, погодиться, що "цілі" С та "цілі" ObjC дійсно відрізняються. Намір C - бути наближеним до апаратного забезпечення, забезпечуючи при цьому деякі корисні абстракції щодо перенесення, тоді як мета ObjC - застосувати підхід SmallTalk до C. Оскільки какао стало невід’ємною частиною ObjC за останні роки, ця розбіжність ще сильніша. "Філософія" (дизайнерський підхід) C-масиву та NSArray, безумовно, сильно відрізняється.
Роб Нейпір,

2
Це повністю залежить від програми. Напевно, ви не зробите занадто багато речей у стилі С в програмі Objective-C. Чому б ви тоді використовували Objective-C?
Carl Norum

1
@ user1115057: не слід занадто турбуватися про те, як все розглядається. Існує дві проблеми з написанням коду на C ++, який компілюється як (або, принаймні, схожий на C.). Одна з них полягає в тому, що ви не отримуєте жодних переваг C ++, але це ваш дзвінок. Важливим є те, що ви пишете на порушеному діалекті мови C, який насправді не є C. Натомість вам слід скомпілювати свій код C за допомогою компілятора C і зв’язати його з вашим кодом C ++. Це останнє занепокоєння не стосується Objective-C, оскільки підмножиною Objective-C, що компілюється як C, є C.
Steve Jessop

31

З самого початку C ++ був розроблений як "кращий C", виправляючи недоліки дизайну, як реальні, так і сприйняті, оскільки автори C ++ пройшли мову. Результатом цього дизайнерського рішення стало те, Xщо діюча програма C не гарантувала Xкомпіляції, не кажучи вже про запуск, під час обробки компілятором C ++. Зміни торкнулися таких базових конструкцій, як рядкові літерали (вони стали const char*), присвоєння voidпокажчиків, перетворення між enums та інтегральними типами, семантику складених операторів присвоєння тощо.

Більше того, як тільки з'явився C99, функції, що увійшли в оновлений стандарт C, були вилучені із оновленого стандарту C ++. Знову ж таки, дуже важливі мовні особливості були опущені - перш за все, призначені ініціалізатори та масиви змінного розміру.

На відміну від цього, Objective C позиціонується як надмножина C, вимагаючи, щоб усі діючі програми C були компілюються з компілятором Objective C.


4
Я відповів на це запитання, бо знаю, що таке "надмножина", але про Objective-C я нічого не знаю. Я бачив твердження в іншому запитанні SO, що дійсний фрагмент коду C int nil = 0; nil++;не компілюється як Objective-C. У чому проблема, чи очевидна річ, що Objective-C робить доступними заголовки, які після включення можуть зламати ваш код точно так, як можуть заголовки C? І отже, автор цього фрагмента не повинен був їх включати.
Steve Jessop

2
"nil" насправді є #define, а не ключовим словом. Ви бачите проблеми, оскільки включено objc / objc.h. Це схоже на проблеми, які ви побачите, якби спробували зробити змінну під назвою YES. (Xcode виділяє їх так, ніби це справді ключові слова, тому що набагато легше думати про це таким чином; але вони реалізовані як простий код C.)
Роб Нейпір,

4
ДО ВСЬОГО, варто трохи розібратися з objc.ha, якщо вас цікавить, як живе ObjC на вершині C. Речі, які, на вашу думку, були б ключовими словами (id, BOOL, Class, nil тощо) - це просто прості типи, структури , та визначає. Ви навіть можете реалізувати передавання повідомлень вручну в чистому C. Ніколи, ніколи цього не роби. : D Але ти можеш. github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c
Роб Нейпір

2
@DanNeely: Роб Нейпір сказав "ніколи, ніколи цього не роби" як коментар до пов'язаного файлу. Зв'язаний файл не є середовищем виконання Objective-C, це лише швидкий хак, який показує, як насправді працює обмін повідомленнями.
Дітріх Епп

1
Зв’язаний файл не демонструє, наскільки складним є передавання повідомлень ObjC. Це демонструє, що час виконання доступний від C, і що ви можете в принципі перетворити код ObjC в чистий C. АЛЕ ... це приблизно так само повільно, наскільки ви могли б його створити. Він покладався на моє знання типу повернення методів (а для деяких типів повернення мені, мабуть, потрібно було б знати тип процесора), і я ретельно вибирав методи, які не беруть жодних параметрів. Повне рішення має безліч тонких хитрощів (деталі повинні бути в асемблері, оскільки вони обманюють рамки стека). Ви ніколи не повинні намагатися його відбудувати.
Роб Нейпір,

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. Завдання C може легко відстежувати такі події, як C99 та C11.

З іншого боку, C ++ - це не просто розширення до C; це інша мова, яка змінює значення деяких синтаксисів C. C ++ та C підтримуються окремо, і тому їх взаємозв'язок змінюється з часом. Наприклад, C придбав нові функції, які повністю відсутні в C ++, і цілком ймовірно, що вони не перейдуть на C ++, такі як масиви змінної довжини C99. C ++ не може легко підібрати нові функції C.

Якщо ви пишете портативну програму на С, вона одночасно повинна бути програмою на Objective C. Але знадобиться додатковий догляд, щоб це була також програма на C ++ із таким самим значенням. (Ця практика не є нечуваною, і діалект, який вона вимагає, неофіційно відомий як "Clean C").

Тривіальний приклад програми C , яка розривається , коли розглядається як C ++ будь-яка програма , яка C використовує ++ ключове слово C в якості ідентифікатора, такі як classабо virtual. Завдання C не містить жодних зарезервованих ключових слів. У ньому є нові ключові слова, які вводиться @символом, наприклад @interface.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.