Apa sebenarnya arti "Objective-C adalah superset dari C lebih ketat daripada C ++"?

87

Dari apa yang saya baca di sana: Mengapa Objective-C tidak terlalu populer di luar komunitas Apple?

Objective-C adalah superset dari C (sebenarnya jauh lebih ketat daripada C ++) sehingga masalah kompatibilitas ke belakang tidak muncul. Apa pun yang dapat Anda lakukan di C dapat Anda lakukan di Objective-C.

Menjadi superset adalah biner, seperti hamil. Obj-C adalah superset dari C, dan C ++ bukan.

Apa yang mereka maksud dengan superset? Dalam hal apa tujuan-C akan lebih dekat // kompatibel dengan C? Dalam hal apa tujuan-C mengikuti filosofi C lebih dekat daripada C ++?

Dapatkah program C dikompilasi tanpa modifikasi oleh kompiler C objektif (kompatibilitas 100%)?

Ini lebih merupakan pertanyaan tentang desain dan kompatibilitas bahasa pemrograman daripada perang tentang mana yang lebih baik.

pengguna1115057
sumber

Jawaban:

134

Saya menyiapkan diagram sederhana; ini tidak terlalu bagus, tapi mudah-mudahan mendapatkan intinya:

  • Merah: himpunan semua program yang valid di C, C ++, dan Objective-C (relatif kecil)
  • Hijau: himpunan semua program valid di C dan Objective-C, tetapi tidak valid di C ++ (bahkan lebih kecil)
  • Abu-abu: himpunan semua program valid di Objective C dan C ++, tetapi tidak valid di C (kosong, sejauh yang saya tahu)
  • Biru: himpunan semua program hanya valid di Objective C (relatif besar)
  • Kuning: himpunan semua program hanya valid di C ++ (terbesar)

Himpunan program C yang valid (merah dan hijau) adalah himpunan bagian yang ketat dari himpunan program Objective C yang valid (biru)

masukkan deskripsi gambar di sini

Escualo
sumber
14
Bagaimana dengan objektif c ++?
pengguna1115057
14
Kemiripan yang aneh ...: justindomke.files.wordpress.com/2008/11/scalaimage11.png
pengguna1115057
19
Dengan ukuran apa Anda menyatakan kuning "lebih besar" dari biru di sini? Intuisi memberi tahu saya bahwa kedua set akan menjadi tak terhingga.
wim
4
@wim: Dan keduanya direpresentasikan sebagai subset yang tak terhitung dari R ^ 2;) Ini adalah trik yang sama karena Anda akan melihat N di dalam Q meskipun ukurannya sama (dan N menjadi subset yang ketat dari Q).
Maciej Piechotka
3
Saya memikirkannya lagi, dan menyadari bahwa set ObjC ++ tidak akan benar-benar mengelilingi semua ini. Ini adalah superset dari C ++, tetapi bukan superset ketat dari ObjC. Program yang sama yang legal C, tetapi C ++ ilegal (area hijau) adalah ObjC ++ ilegal.
Rob Napier
62
  1. Apa yang mereka maksud dengan superset?

    Yang mereka maksud adalah superset ketat. Semua program C yang valid akan dikompilasi dengan kompiler Objective-C. Beberapa program C yang valid tidak dapat dikompilasi dengan kompiler C ++.

  2. Dalam hal apa tujuan-C akan lebih dekat // kompatibel dengan C?

    Berikut contoh sederhananya:

    int *foo = malloc(12);
    

    Mengompilasi dalam C dan Objective-C, tetapi tidak dalam C ++. Tentu saja ada contoh lain juga.

  3. Dalam hal apa tujuan-C mengikuti filosofi C lebih dekat daripada C ++?

    Semua - Objective-C adalah superset ketat dari C.

  4. Dapatkah program C dikompilasi tanpa modifikasi oleh kompiler C objektif (kompatibilitas 100%)?

    Iya.

Carl Norum
sumber
2
Ya, itu akan baik-baik saja. Bisa dibilang Anda juga tidak memerlukan Objective-C untuk GUI, jika Anda ingin mengetahui fungsi runtime tingkat rendah yang akan digunakan.
Carl Norum
3
Kebanyakan filosofis.
Carl Norum
2
+1 Penjelasan yang bagus. Saya akan menyarankan bahwa pertanyaan tentang "filosofi C" agak kabur, tetapi sebagian besar pengamat mungkin akan setuju bahwa "tujuan" C dan "tujuan" ObjC memang berbeda. Maksud C adalah menjadi sangat dekat dengan perangkat keras, sambil memberikan beberapa abstraksi portabilitas yang berguna, sementara tujuan ObjC adalah membawa pendekatan SmallTalk ke C. Karena Cocoa telah menjadi bagian integral ObjC dalam beberapa tahun terakhir, perbedaan ini bahkan lebih kuat. "Filosofi" (pendekatan desain) dari C-array dan NSArray tentunya sangat berbeda.
Rob Napier
2
Itu sepenuhnya tergantung pada programnya. Mungkin Anda tidak akan melakukan terlalu banyak gaya C dalam program Objective-C. Lalu mengapa Anda menggunakan Objective-C?
Carl Norum
1
@ user1115057: Anda tidak perlu terlalu khawatir tentang bagaimana hal-hal dipertimbangkan. Ada dua masalah dengan penulisan kode C ++ yang dikompilasi sebagai (atau setidaknya terlihat seperti) C. Salah satunya adalah Anda tidak mendapatkan keuntungan apa pun dari C ++, tetapi itulah panggilan Anda. Yang penting adalah bahwa Anda menulis dalam dialek C rusak yang sebenarnya bukan C. Anda harus mengkompilasi kode C Anda dengan kompiler C dan menautkannya dengan kode C ++ Anda. Perhatian terakhir itu tidak berlaku dengan Objective-C, karena bagian dari Objective-C yang dikompilasi sebagai C, adalah C.
Steve Jessop
31

Dari bawah ke atas, C ++ telah dirancang sebagai "C yang lebih baik", memperbaiki kelalaian desain, baik yang nyata maupun yang dipersepsikan, saat penulis C ++ mempelajari bahasanya. Hasil dari keputusan desain ini adalah bahwa Xmenjadi program C yang valid tidak menjamin Xakan dapat dikompilasi, apalagi dijalankan, ketika diproses oleh compiler C ++. Perubahan tersebut menyentuh konstruksi dasar seperti literal string (menjadi const char*), penugasan voidpointer, konversi antara enums dan tipe integral, semantik operator penugasan gabungan , dan sebagainya.

Selain itu, begitu C99 hadir, fitur yang membuatnya menjadi standar C yang diperbarui ditinggalkan dari standar C ++ yang diperbarui. Sekali lagi, fitur bahasa yang sangat penting ditinggalkan - terutama, penginisialisasi yang ditunjuk dan array ukuran variabel.

Sebaliknya, Objective C telah diposisikan sebagai superset dari C, yang mengharuskan semua program C yang valid dapat dikompilasi dengan compiler Objective C.

Sergey Kalinichenko
sumber
4
Saya telah menjawab pertanyaan ini karena saya tahu apa itu "superset", tetapi saya tidak tahu apa-apa tentang Objective-C. Saya telah melihat klaim dalam pertanyaan SO lain, bahwa cuplikan kode C yang valid int nil = 0; nil++;tidak dapat dikompilasi sebagai Objective-C. Apa masalahnya di sana, apakah jelas bahwa Objective-C menyediakan tajuk yang, setelah disertakan, dapat merusak kode Anda persis seperti tajuk C? Dan karenanya penulis potongan itu seharusnya tidak memasukkannya.
Steve Jessop
2
"nil" sebenarnya adalah #define, bukan kata kunci. Anda melihat masalah karena objc / objc.h disertakan. Ini mirip dengan masalah yang Anda lihat jika Anda mencoba membuat variabel bernama YA. (Xcode menyoroti ini seolah-olah itu benar-benar kata kunci karena jauh lebih mudah untuk memikirkannya seperti itu; tetapi mereka diterapkan sebagai kode C sederhana.)
Rob Napier
4
BTW, ada baiknya mengotak-atik objc.ha sedikit jika Anda tertarik pada bagaimana ObjC hidup di atas C. Hal-hal yang menurut Anda akan menjadi kata kunci (id, BOOL, Class, nil, dll.) Hanyalah jenis sederhana, struct , dan mendefinisikan. Anda bahkan dapat mengimplementasikan message passing dengan hand dalam pure-C. Jangan pernah lakukan itu. : D Tapi Anda bisa. github.com/iosptl/ios6ptl/blob/master/ch28/Runtime/MyMsgSend.c
Rob Napier
2
@DanNeely: Rob Napier berkata "jangan pernah lakukan itu" sebagai komentar tentang file tertaut. File yang ditautkan bukanlah runtime Objective-C, ini hanya peretasan cepat yang menunjukkan beberapa cara kerja perpesanan yang sebenarnya.
Dietrich Epp
1
File yang ditautkan tidak menunjukkan betapa rumitnya pengiriman pesan ObjC. Ini menunjukkan bahwa runtime tersedia dari C dan pada prinsipnya Anda dapat mengubah kode ObjC menjadi C. TETAPI… ini sama lambatnya dengan saat Anda dapat membuatnya. Itu bergantung pada pengetahuan saya tentang jenis kembalian dari metode (dan untuk beberapa jenis pengembalian, saya mungkin perlu mengetahui jenis prosesor), dan saya dengan hati-hati memilih metode yang tidak mengambil parameter. Solusi lengkap memiliki banyak trik halus (bagian harus di assembler karena curang dengan frame stack). Anda tidak boleh mencoba membangunnya kembali.
Rob Napier
12

"Objective-C adalah superset dari C" berarti bahwa setiap program C yang valid adalah program Objective-C yang valid (dengan arti yang sama).

Kadang - kadang dikatakan, meskipun bukan oleh para ahli C ++, bahwa C ++ adalah superset dari C. Ini tidak akurat, itulah sebabnya kutipan Anda membuat perbandingan besar antara keduanya.

Steve Jessop
sumber
9

Objective C adalah sekumpulan ekstensi yang kompatibel dengan versi sebelumnya ke C. Hal ini dimungkinkan karena fitur Objective C dibatasi dalam dua cara yang sangat sederhana:

  • penggunaan karakter @. Karakter ini saat ini tidak digunakan dalam bahasa C.
  • ekstensi sintaksis sederhana untuk memanggil metode [obj method:argument],. Di C, tanda kurung siku digunakan dengan cara yang sangat spesifik untuk subskrip array, dan ini adalah sintaks C yang tidak valid. Ekstensi yang dibangun di atas sintaks yang tidak valid tidak mengubah arti dari apa pun yang valid dalam bahasa host.

Sangat mudah dilihat sehingga tidak ada program yang menggunakan ekstensi Objective C yang dapat menjadi program ISO C yang benar-benar sesuai, sesederhana apapun. Selain itu, setiap program ISO C dapat dideklarasikan, menurut definisi, sebagai program Objective C yang valid. Objective C dapat dengan mudah mengikuti perkembangan seperti C99 dan C11.

Di sisi lain, C ++ bukan hanya ekstensi ke C; Ini adalah bahasa berbeda yang mengubah arti dari beberapa sintaks C. C ++ dan C dipertahankan secara terpisah, sehingga hubungannya berubah seiring waktu. Misalnya, C telah memperoleh fitur baru yang sama sekali tidak ada di C ++, dan kemungkinan besar tidak akan masuk ke C ++, seperti array panjang variabel C99. C ++ tidak dapat dengan mudah mengambil fitur C baru.

Jika Anda menulis program C portabel, program tersebut harus sekaligus menjadi program Objective C. Tetapi perhatian tambahan akan diperlukan agar ini juga merupakan program C ++ dengan arti yang sama. (Praktik ini tidak pernah terdengar, dan dialek yang dibutuhkannya secara informal dikenal sebagai "C Bersih").

Contoh sepele dari program C yang rusak saat diperlakukan sebagai C ++ adalah program C apa pun yang menggunakan kata kunci C ++ sebagai pengenal, seperti classatau virtual. Tujuan C tidak memasukkan kata kunci yang dipesan. Ini memiliki kata kunci baru yang diperkenalkan oleh @karakter, seperti @interface.

Kaz
sumber