“Objective-C, C ++ 'dan daha katı bir şekilde C'nin bir üst kümesidir” tam olarak ne anlama geliyor?


87

Orada okuduklarıma göre: Objective-C neden Apple topluluğu dışında pek popüler değil?

Objective-C, C'nin bir üst kümesidir (aslında C ++ 'dan çok daha katıdır), bu nedenle geriye dönük uyumluluk sorunu ortaya çıkmaz. C'de yapabileceğiniz her şeyi Objective-C'de yapabilirsiniz.

Süper set olmak, hamile olmak gibi ikilidir. Obj-C, C'nin bir üst kümesidir ve C ++ değildir.

Süper set ile ne demek istiyorlar? Amaç-C, C'ye ne şekilde daha yakın // geriye dönük uyumlu olabilir? Object-C, C felsefesini C ++ 'dan daha yakından takip eder?

Herhangi bir C programı, bir Object-C derleyicisi tarafından değiştirilmeden derlenebilir mi (% 100 uyumluluk)?

Bu, hangisinin daha iyi olduğu savaşlarından çok programlama dili tasarımı ve uyumluluğu ile ilgili bir sorudur.

Yanıtlar:


134

Basit bir şema hazırladım; çok hoş değil, ama umarım noktayı aşar:

  • Kırmızı: C, C ++ ve Objective-C'de (nispeten küçük) geçerli tüm programlar kümesi
  • Yeşil: C ve Objective-C'de geçerli, ancak C ++ 'da geçersiz (daha da küçük) tüm programlar kümesi
  • Gri: Objective C ve C ++ 'da geçerli, ancak C'de geçersiz olan tüm programlar kümesi (bildiğim kadarıyla boş)
  • Mavi: yalnızca Hedef C'de geçerli olan tüm programlar kümesi (nispeten büyük)
  • Sarı: yalnızca C ++ 'da (en büyük) geçerli tüm programlar kümesi

Geçerli C programları seti (kırmızı ve yeşil), geçerli Hedef C programları setinin (mavi) katı bir alt kümesidir.

görüntü açıklamasını buraya girin


14
Peki ya nesnel c ++?
user1115057


19
Burada hangi ölçüye göre sarının maviden "daha büyük" olduğunu iddia ediyorsunuz? Sezgi bana her iki kümenin de sayılabilecek şekilde sonsuz olacağını söylüyor.
2013

4
@wim: Ve her ikisi de R ^ 2'nin sayılamayan alt kümeleri olarak temsil edilir;) Bu, aynı boyutta olmalarına rağmen (ve N, Q'nun katı alt kümesi olmasına rağmen) Q içinde N'yi göreceğinizle aynı numaradır.
Maciej Piechotka

3
Biraz daha düşünüyordum ve ObjC ++ kümesinin aslında tüm bunları çevrelemeyeceğini fark ettim. C ++ 'ın bir üst kümesidir, ancak ObjC'nin katı bir üst kümesi değildir. Yasal C olan ancak yasadışı C ++ (yeşil alan) olan aynı programlar yasa dışı ObjC ++ 'dır.
Rob Napier

62
  1. Süper set ile ne demek istiyorlar?

    Katı süperset anlamına gelir. Herhangi bir geçerli C programı, bir Objective-C derleyicisi ile derlenecektir. Bazı geçerli C programları bir C ++ derleyicisiyle derlenmeyecektir.

  2. Amaç-C, C'ye ne şekilde daha yakın // geriye dönük uyumlu olabilir?

    İşte basit bir örnek:

    int *foo = malloc(12);
    

    C ve Objective-C'de derler, ancak C ++ 'da değil. Elbette başka örnekler de var.

  3. Object-C, C felsefesini C ++ 'dan daha yakından takip eder?

    All - Objective-C, C'nin katı bir üst kümesidir.

  4. Herhangi bir C programı, bir Object-C derleyicisi tarafından değiştirilmeden derlenebilir mi (% 100 uyumluluk)?

    Evet.


2
Evet bu iyi olabilir. Muhtemelen GUI için Objective-C'ye ihtiyacınız yok, eğer kullanmak için düşük seviyeli çalışma zamanı işlevlerini anlamaya istekliyseniz.
Carl Norum

3
Çoğunlukla felsefi.
Carl Norum

2
+1 Harika açıklama. "C felsefesi" sorununun biraz belirsiz olduğunu söyleyebilirim, ancak çoğu gözlemci muhtemelen C'nin "hedefleri" ile ObjC'nin "hedefleri" nin farklı olduğu konusunda hemfikir olacaktır. C'nin amacı donanıma çok yakın olmakla birlikte kullanışlı taşınabilirlik soyutlamaları sağlamaktır; ObjC'nin hedefi ise C'ye SmallTalk yaklaşımı getirmektir. Kakao son yıllarda ObjC'nin ayrılmaz bir parçası haline geldiğinden, bu farklılık daha da güçlüdür. Bir C-dizisi ve bir NSArray "felsefesi" (tasarım yaklaşımı) kesinlikle çok farklıdır.
Rob Napier

2
Bu tamamen programa bağlıdır. Muhtemelen bir Objective-C programında çok fazla C tarzı şey yapmazsınız. O halde neden Objective-C'yi kullanasınız?
Carl Norum

1
@ user1115057: Olayların nasıl değerlendirileceği konusunda çok fazla endişelenmemelisiniz. C olarak derleyen (veya en azından benzeyen) C ++ kodu yazarken iki sorun vardır. Birincisi, C ++ 'nın hiçbir avantajını elde etmiyorsunuz, ama bu sizin aramanız. Önemli olan, aslında C olmayan bozuk bir C diyalektinde yazmanızdır. Bunun yerine C kodunuzu bir C derleyicisiyle derlemeniz ve C ++ kodunuzla ilişkilendirmeniz gerekir. Bu sonuncu endişe C derler ki Objective-C alt grubunda beri, Objective-C ile geçerli değildir olduğunu C
Steve Jessop

31

C ++ 'ın yazarları dilden geçerken, C ++, hem gerçek hem de algılanan tasarım eksikliklerini düzelten "daha iyi bir C" olarak tasarlandı. Bu tasarım kararının sonucu, Xgeçerli bir C programı olmanın X, C ++ derleyicisi tarafından işlendiğinde çalışmayı bırakın, derlemeyi garanti etmediğidir . Değişiklikler, dize değişmezleri (oldular const char*), voidişaretçilerin atanması, enums ve integral türleri arasındaki dönüşümler , bileşik atama operatörlerinin anlambilimleri gibi temel yapılara dokundu. vb. .

Dahası, C99 bir kez ortaya çıktığında, onu güncellenmiş C standardına dahil eden özellikler güncellenmiş C ++ standardının dışında bırakıldı. Yine, çok önemli dil özellikleri dışarıda bırakıldı - en önemlisi, belirlenmiş başlatıcılar ve değişken boyutlu diziler.

Buna karşılık, Objective C, tüm geçerli C programlarının bir Objective C derleyicisi ile derlenmesini gerektiren, C'nin bir üst kümesi olarak konumlandırılmıştır.


4
Bu soruyu yanıtladım çünkü "süper set" ne olduğunu biliyorum, ancak Objective-C hakkında hiçbir şey bilmiyorum. Başka bir SO sorusunda, geçerli C kodu parçacığının int nil = 0; nil++;Objective-C olarak derlenmediğini iddia ettim . Buradaki sorun nedir, Objective-C'nin bir kez dahil edildiğinde kodunuzu tam olarak C başlıklarının yapabildiği gibi kırabilecek başlıkları kullanıma sunduğu açık olan şey mi? Ve bu nedenle, bu pasajın yazarı bunları eklememeliydi.
Steve Jessop

2
"nil" aslında bir anahtar kelimeden çok # tanımlıdır. Objc / objc.h dahil olduğu için sorunlar görüyorsunuz. Bu, YES adında bir değişken yapmaya çalıştığınızda göreceğiniz sorunlara benzer. (Xcode, bunları gerçekten anahtar kelimelermiş gibi vurgular çünkü bu şekilde düşünmek çok daha kolaydır; ancak basit C kodu olarak uygulanmışlardır.)
Rob Napier

4
BTW, ObjC'nin C'nin üzerinde nasıl yaşadığıyla ilgileniyorsanız objc.ha'nın etrafını biraz karıştırmaya değer. ve tanımlar. Saf-C'de elle mesaj geçişini bile uygulayabilirsiniz. Asla, asla bunu yapma. : D Ama yapabilirsin. github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c
Rob Napier

2
@DanNeely: Rob Napier, bağlantılı dosya hakkında bir yorum olarak "asla, asla bunu yapma" dedi. Bağlantılı dosyasıdır değil o gösterileri nasıl mesajlaşma bazıları gerçekten işe yaradığını sadece hızlı kesmek, Objective-C çalışma zamanı.
Dietrich Epp

1
Bağlantılı dosya ObjC mesaj geçişinin ne kadar karmaşık olduğunu göstermiyordu. Çalışma zamanının C'den temin edilebildiğini ve prensipte ObjC kodunu saf C'ye dönüştürebileceğinizi gösterir. AMA… bu, inşa edebileceğiniz kadar yavaştır. Yöntemlerin dönüş türünü bilmeme dayanıyordu (ve bazı dönüş türleri için muhtemelen işlemci türünü bilmem gerekiyordu) ve hiçbir parametre almayan yöntemleri dikkatlice seçtim. Tam çözümün pek çok ince hilesi vardır (parçaların montajcıda olması gerekir çünkü yığın çerçeveleriyle hile yaparlar). Onu asla yeniden inşa etmeye çalışmamalısın.
Rob Napier

12

"Objective-C, C'nin bir üst kümesidir", her geçerli C programının geçerli bir Objective-C programı olduğu anlamına gelir (aynı anlama gelir).

O edilir bazen değil C ++ C This bir üst olduğunu C ++ uzmanları tarafından sizin tırnak ikisini karşılaştırarak büyük bir anlaşma yapıyor neden olan, doğru olmasa da, söyledi.


9

Amaç C, C'ye geriye dönük uyumlu bir uzantılar kümesidir. Bu mümkündür çünkü Amaç C özellikleri iki çok basit şekilde sınırlandırılmıştır:

  • karakterin kullanımı @ . Bu karakter şu anda C dilinde kullanılmamaktadır.
  • yöntemleri çağırmak için basit bir sözdizimsel uzantı [obj method:argument],. C'de köşeli parantezler dizi abonelikleri için çok özel bir şekilde kullanılır ve bu nedenle bu geçersiz C sözdizimidir. Geçersiz sözdizimi üzerine inşa edilen uzantılar, ana bilgisayar dilinde geçerli olan hiçbir şeyin anlamını değiştirmez.

Görmek o kadar kolay ki, Objective C uzantılarını kullanan hiçbir program, ne kadar basit olursa olsun, kesinlikle uyumlu bir ISO C programı olamaz. Ayrıca, her ISO C programı tanım gereği geçerli bir Hedef C programı olarak ilan edilebilir. Objective C, C99 ve C11 gibi gelişmeleri kolaylıkla takip edebilir.

Öte yandan, C ++ yalnızca C'nin uzantıları değildir; C'nin bazı sözdizimlerinin anlamını değiştiren farklı bir dildir. C ++ ve C ayrı ayrı korunur ve bu nedenle ilişkileri zamanla değişir. Örneğin, C, C ++ 'da tamamen bulunmayan ve C99 değişken uzunluklu diziler gibi büyük olasılıkla C ++' ya girmeyecek yeni özellikler edinmiştir. C ++, yeni C özelliklerini kolayca alamaz.

Taşınabilir bir C programı yazarsanız, aynı zamanda bir Objective C programı da olmalıdır. Ancak, aynı anlama gelen bir C ++ programı olması için daha fazla özen gösterilmesi gerekecektir. (Bu uygulama duyulmamış bir şey değildir ve gerektirdiği lehçe gayri resmi olarak "Temiz C" olarak bilinir).

C ++ olarak değerlendirildiğinde bozulan bir C programının önemsiz bir örneği, classveya gibi bir tanımlayıcı olarak bir C ++ anahtar sözcüğü kullanan herhangi bir C programıdır virtual. Amaç C, herhangi bir ayrılmış anahtar sözcük getirmez. @Gibi karakter tarafından tanıtılan yeni anahtar kelimelere sahiptir @interface.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.