Bagaimana portabilitas bahasa seperti C ditentukan? Saya telah belajar bahwa kompiler khusus untuk ISA. Jika ini benar, bagaimana C portabel? Atau apakah hanya kode sumber yang ditulis dalam C yang portable tetapi tidak dapat dieksekusi? Bukankah executable ISA khusus untuk contoh aplikasi untuk x86 terpisah dari aplikasi untuk Apple (anggap Apple menggunakan mikroprosesor Motorola / PowerPC)?
10
Ini bukan hanya khusus ISA. Misalnya Anda bertanya:
Ya, benar, meskipun Apple menggunakan perangkat keras x86. Biner C adalah arsitektur dan sistem operasi khusus.
sumber
Persis. Anda perlu mengkompilasi ulang program C Anda di setiap platform. Kompiler C menghasilkan kode mesin yang portabel hanya pada tingkat yang sangat terbatas, antara mesin dengan arsitektur prosesor / memori yang sama dan OS. Itulah sebabnya Anda melihat distribusi biner yang berbeda dari aplikasi multi platform (mis. Browser), seperti "Linux 64-bit Intel" atau "Mac OS X 32-bit PowerPC" (OK, yang terakhir hanya ilustrasi, saya tahu Apple beralih) ke Intel beberapa tahun yang lalu :-).
sumber
Sebagian besar pertanyaan telah dijawab tetapi saya ingin menambahkan selain daya tahan adalah hal lain yang mungkin harus Anda perhitungkan.
Sebagai contoh, JAVA dapat ditulis satu kali dan dijalankan pada platform mana pun di mana VM (saat ini, disebut "Runtime Environment"). Tetapi keuntungan lain adalah bahwa Anda dapat menjalankan kode Java 1.1 dari 1995 di mesin 2011 Anda. Yang tidak mungkin jika kode Anda dikompilasi pada i386 dan Anda mencoba menjalankannya pada arsitektur AMD64 Anda.
Anda mendapatkan peningkatan dari mesin virtual itu sendiri juga.
Lalu, saya akan mengatakan bahwa secara umum, beralih dari yang paling portabel ke bahasa yang lebih portabel yang Anda miliki: Assembler, bahasa yang dikompilasi tingkat rendah seperti C, lalu C ++, kemudian menafsirkan bahasa atau yang berjalan dalam mesin virtual.
Saya bukan benar-benar pembela Java, setidaknya bukan untuk bahasa atau komunitas misalnya, tapi itu cara untuk pergi jika Anda mencari portabilitas dan kehilangan kinerja paling sedikit dibandingkan dengan C.
sumber
Jawaban yang bagus tentang menulis sekali dikompilasi di mana saja.
Orang-orang suka berpikir tentang C sebagai bahasa portabel karena popularitasnya dan probabilitas tinggi kompiler C tersedia untuk platform target masa depan. Faktor lain adalah pustaka standar yang membantu tugas-tugas pemrograman umum dalam platform yang independen.
Jadi saya akan mengatakan portabilitas suatu bahasa ditentukan oleh:
Secara realistis meskipun hampir semua aplikasi C kompleks akan memerlukan beberapa pekerjaan untuk pindah ke platform baru karena perangkat keras atau ketergantungan sistem operasi. Proses itu dikenal sebagai porting.
sumber
"Portabilitas" memiliki banyak arti. Sehubungan dengan C, itu berarti yang berikut:
Compiler telah diimplementasikan untuk C untuk berbagai macam perangkat keras dan platform sistem operasi, yang merupakan masalah besar di awal 70-an;
Ada standar yang disepakati secara universal untuk bahasa itu sendiri, sebagai lawan dari setiap implementasi kompiler yang mengenali varian bahasa yang sedikit berbeda (sekali lagi, Masalah Besar ketika C pertama kali dirancang, karena ada beberapa varian bahasa seperti Pascal dan BASIC yang tidak diakui secara universal);
Karena standar ini, kode yang sesuai akan menghasilkan perilaku yang sama ketika dikompilasi pada platform yang berbeda.
The kode sumber portabel, tetapi biner baru harus dihasilkan untuk setiap target.
Perhatikan, bagaimanapun, bahwa sumber C jarang "portabel" portabel; sebagian besar aplikasi mengharuskan Anda melampaui apa yang didefinisikan oleh standar bahasa, menggunakan ekstensi yang unik untuk platform tertentu, sehingga dalam praktiknya kode sumber tidak 100% portabel.
Perhatikan, bagaimanapun, bahwa C tidak cukup banyak untuk implementasi. Ukuran yang tepat dari berbagai tipe data, perilaku overflow, dll., Semuanya terserah implementasi; standar tersebut memberikan persyaratan minimum yang harus dipenuhi oleh suatu implementasi, tetapi penerapannya bebas untuk melampaui batas-batas tersebut.
sumber
Apa pun ISA, C tidak spesifik untuk ISA. Saya berasumsi Anda tidak mengacu pada slot yang sekarang usang untuk kartu ekstensi PC.
Ada kompiler C yang memenuhi standar untuk sangat banyak platform, dan selama Anda menggunakan fitur bahasa yang didefinisikan sepenuhnya standar dalam kode sumber Anda, Anda harus dapat mengompilasinya pada kompiler C apa pun untuk platform apa pun.
Namun, satu hal yang perlu diperhatikan adalah bahwa standar C meninggalkan banyak perilaku fitur sebagai implementasi yang didefinisikan atau sebagai perilaku yang tidak terdefinisi. Hal ini dilakukan untuk membuat bahasa C lebih bermanfaat secara umum untuk pemrograman tingkat rendah, menghindari kasus-kasus di mana beberapa perilaku yang didefinisikan secara tepat tidak sesuai untuk apa yang didukung perangkat keras pada beberapa platform. Namun, itu membuat sedikit lebih sulit untuk menulis program portabel.
Juga, tidak seperti beberapa bahasa, C tidak dilengkapi dengan perpustakaan besar seperti yang disediakan Java atau C #. Anda bisa mendapatkan perpustakaan yang sangat portabel untuk melakukan apa saja, tetapi Anda harus melakukan beberapa pekerjaan untuk membangunnya dan membuatnya bekerja bersama.
C memang memiliki perpustakaan standar, tentu saja, tetapi cakupannya relatif terbatas dibandingkan dengan Java, C #, Python, dll.
sumber