Portabilitas bahasa C

10

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)?

KawaiKx
sumber

Jawaban:

26

apakah hanya kode sumber yang ditulis dalam C yang portabel dan tidak dapat dieksekusi?

Benar. Beberapa orang menyebutnya menulis sekali, kompilasi di mana-mana.

http://en.wikipedia.org/wiki/Write_once,_compile_anywhere .

Alternatif lain adalah menulis sekali, jalankan di mana-mana. Java adalah contoh yang bagus untuk ini.

http://en.wikipedia.org/wiki/Write_once,_run_anywhere

Dan meskipun Anda dapat mencapai portabilitas lintas platform parsial, Anda tidak boleh mengharapkan kode Anda berjalan di mana-mana tanpa modifikasi.

adolfojp
sumber
Kode sumber C tidak portabel untuk kompiler yang berbeda atau ISA atau OS tanpa sedikit shennanigans ekstra-bahasa. Hal-hal sederhana seperti ukuran dan penyelarasan tipe standar tidak standar dalam C, sehingga perangkat lunak porting yang akan bertukar data dengan instance lain dari itu sendiri bisa sangat menantang. Rujuk ke GNU Autoconf / Automake untuk contoh (mungkin dikaburkan) dari simpai C yang akan dilompati programmer untuk mendapatkan portabilitas.
Tim Williscroft
3
@TimWilliscroft: Masalah portabilitas biasanya disebabkan oleh pustaka yang tidak standar dan praktik pemrograman yang buruk; dan tidak disebabkan oleh C atau perpustakaan standarnya. Contoh sederhana akan menggunakan ekstensi GCC non-standar atau gagal untuk data serial / de-serialise dengan benar untuk IO.
Brendan
6

Ini bukan hanya khusus ISA. Misalnya Anda bertanya:

aplikasi untuk x86 terpisah dari aplikasi untuk apel?

Ya, benar, meskipun Apple menggunakan perangkat keras x86. Biner C adalah arsitektur dan sistem operasi khusus.

vartec
sumber
1
@ Steven314: Komentar Anda bersinggungan. Ini tidak ada hubungannya dengan apakah perangkat keras adalah standar atau tidak, dan semuanya berkaitan dengan fakta bahwa OS X memiliki format biner yang berbeda (Mach-O) dibandingkan dengan, katakanlah, Linux (biasanya ELF).
mipadi
@Steve: EFI vs BIOS hanya penting untuk boot dan OS internal; arsitektur perangkat keras, yang merupakan set instruksi CPU sama, karena itu CPU yang sama.
vartec
Komentar dihapus, terutama karena saya seharusnya tidak memasukkan hal mac di tempat pertama. Penyebutan ABI (Application Binary Interface) dan konvensi panggilan saya mungkin masih relevan (item ketiga untuk ditambahkan ke "arsitektur dan sistem operasi"). Mereka tidak relevan dengan perangkat keras, kecuali ABI cenderung dirancang untuk arsitektur tertentu (misalnya register yang tersedia), tetapi mereka relevan dengan portabilitas biner. Ini bukan masalah format file - ELF digunakan pada Windows dan Linux (oleh gcc), tetapi Anda mungkin tidak dapat mengambil file objek dari satu ke yang lain.
Steve314
@artec Anda mengatakan binari C adalah sistem operasi yang spesifik juga, apakah itu karena O / S itu sendiri adalah ISA khusus, sehingga biner C menjadi O / S spesifik secara tidak langsung?
KawaiKx
@Saurabh - semua executable asli khusus untuk OS, karena OS menentukan format file. Juga, pustaka standar C harus mengimplementasikan banyak fungsi dengan memanggil sistem operasi, jadi meskipun format file standar, kode itu sendiri tidak dapat berjalan pada OS lain. Ini adalah standar untuk bahasa yang mengkompilasi ke kode asli, yang bertentangan dengan beberapa kode mesin virtual seperti JVM (Java Virtual Machine). Dimungkinkan untuk mengkompilasi C untuk mesin virtual, tetapi tidak pernah melakukan yang saya tahu. LLVM datang paling dekat, tetapi dimaksudkan sebagai ujung belakang kompiler - bukan lingkungan kompilasi yang pernah dijalankan di mana saja.
Steve314
5

apakah hanya kode sumber yang ditulis dalam C yang portabel dan tidak dapat dieksekusi?

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 :-).

Péter Török
sumber
3

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.

tiktak
sumber
3

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:

  1. Tingkat standardisasi.
  2. Ketersediaan kompiler untuk berbagai platform / arsitektur.
  3. Kedalaman dan luasnya perpustakaan portabel.

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.

Guy Sirton
sumber
3

"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.

John Bode
sumber
0

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.

Steve314
sumber
4
ISA = arsitektur kumpulan instruksi alias arsitektur perangkat keras
vartec