C dili taşınabilirliği


10

C gibi bir dilin taşınabilirliği tam olarak nasıl belirlenir? Derleyicilerin ISA'ya özgü olduğunu öğrendim. Bu doğruysa, C taşınabilirliği nasıl? Yoksa sadece C ile yazılmış kaynak kodları taşınabilir değil çalıştırılabilir dosyalar değil mi? Örnekler için çalıştırılabilir ISA'ya özel x86 uygulamaları Apple uygulamalarından ayrı değil mi (Apple'ın Motorola / PowerPC mikroişlemci kullandığı varsayılarak)?

Yanıtlar:


27

sadece C ile yazılmış kaynak kodu çalıştırılabilir değil taşınabilir mi?

Doğru. Bazı insanlar buna bir kez yazma derler, her yerde derlerler.

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

Diğer alternatif bir kez yazmak, her yerde koşmak. Java buna iyi bir örnektir.

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

Kısmi platformlar arası taşınabilirlik elde edebilmenize rağmen, kodunuzun hiçbir yerde değişiklik yapmadan çalışmasını beklememelisiniz.


C kaynak kodu, biraz fazladan dilli shennanigans olmadan farklı derleyiciler, ISA'lar veya OS'ler için taşınabilir değildir. Standart tiplerin boyutu ve hizalanması gibi basit şeyler C'de standart değildir, bu nedenle diğer örneklerle veri alışverişinde bulunacak taşıma yazılımı oldukça zor olabilir. Taşınabilirlik elde etmek için C programcılarının atlayacağı çemberlerin (muhtemelen gizlenmiş) bir örneği için GNU Autoconf / Automake'ye başvurun.
Tim Williscroft

3
@TimWilliscroft: Taşınabilirlik sorunlarına genellikle standart olmayan kitaplıklar ve kötü programlama uygulamaları neden olur; ve C veya standart kütüphanelerinden kaynaklanmaz. Basit bir örnek, standart olmayan bir GCC uzantısı kullanmak veya G / Ç için verileri doğru şekilde serileştirmemek / serileştirmemek olabilir.
Brendan

6

Sadece ISA'ya özgü değil. Örneğin:

x86 için olan uygulamalar apple için olan uygulamalardan ayrı mıdır?

Evet, Apple x86 donanımı kullanıyor olsalar da öyleler. C ikili dosyaları mimariye ve işletim sistemine özeldir.


1
@ Steven314: Yorumunuz bir teğet. Donanımın standart olup olmadığı ile ilgisi yoktur ve OS X'in Linux (tipik olarak ELF) biçiminden farklı bir ikili biçime (Mach-O) sahip olmasıyla ilgili her şey.
mipadi

@Steve: EFI ve BIOS yalnızca önyükleme ve işletim sistemi iç öğeleri için önemlidir; CPU komut kümesi olan donanım mimarisi aynıdır, çünkü aynı CPU'dur.
vartec

Yorumlar silindi, çünkü esas olarak mac şeyi asla dahil etmemeliydim. ABI (Uygulama İkili Arabirimi) ve çağrı kurallarından bahsetmem yine de alakalı olabilir ("mimari ve işletim sistemi" ne eklemek için üçüncü bir öğe). ABI'lerin belirli mimariler (örneğin, kullanılabilir kayıtlar) için tasarlanma eğilimi dışında, ancak ikili taşınabilirlik ile ilgili olmaları dışında, donanımla ilgili değildirler. Bu bir dosya biçimi sorunu değildir - ELF, Windows ve Linux'ta (gcc tarafından) kullanılır, ancak bir nesne dosyasını birinden diğerine alamazsınız.
Steve314

@vartec, C ikili dosyalarının da işletim sistemine özgü olduğunu söylediniz, bunun nedeni O / S'nin kendisinin ISA'ya özgü olması, dolayısıyla C ikili dosyalarının dolaylı olarak O / S'ye özgü olması mı?
KawaiKx

@Saurabh - tüm yerel yürütülebilir dosyalar işletim sistemine özgüdür, çünkü işletim sistemi dosya biçimini belirtir. Ayrıca, bir C standart kitaplığı işletim sistemini çağırarak birçok işlevi uygulamalıdır, bu nedenle dosya biçimi standartlaştırılmış olsa bile, kodun kendisi başka bir işletim sisteminde çalışamaz. Bu, JVM (Java Sanal Makinesi) gibi bazı sanal makine kodlarının aksine, yerel kodla derlenen diller için standarttır. Sanal makine için C derlemek mümkündür, ama asla bilemediğim gibi. LLVM en yakın şekilde gelir, ancak derleyici arka ucu olarak tasarlanmıştır - bir kez çalıştırıldığında her yerde derleme ortamı değil.
Steve314

5

sadece C ile yazılmış kaynak kodu çalıştırılabilir değil taşınabilir mi?

Kesinlikle. C programınızı her platformda yeniden derlemeniz gerekir. C derleyicileri, aynı işlemci / bellek mimarisine ve işletim sistemine sahip makineler arasında yalnızca sınırlı ölçüde taşınabilir olan makine kodu üretir. Bu nedenle, "Linux 64-bit Intel" veya "Mac OS X 32-bit PowerPC" gibi çoklu platform uygulamalarının (örn. Tarayıcılar) farklı ikili dağılımlarını görüyorsunuz (Tamam, sonuncusu sadece bir örnek, Apple'ın değiştiğini biliyorum birkaç yıl önce Intel'e :-).


3

Sorunun çoğu cevaplandı ama eklemek istiyorum dayanıklılık dikkate almak gerekebilir başka bir şeydir.

Örneğin, JAVA bir kez yazılabilir ve VM'nin (bugün "Çalışma Zamanı Ortamı" olarak adlandırılır) herhangi bir platformda çalıştırılabilir. Ancak bir diğer avantajı da, 1995'teki Java 1.1 kodunu 2011 makinenizde çalıştırabilmenizdir. Kodunuz i386'da derlenmişse ve AMD64 mimarinizde çalıştırmayı denerseniz bu mümkün değildir.

Sanal makinenin kendisinde de iyileştirmeler elde edersiniz.

Daha sonra, genel olarak, en az taşınabilir olandan daha taşınabilir dillere gideceğinizi söyleyebilirim: Assembler, C gibi düşük seviyeli derlenmiş dil, sonra C ++, daha sonra dilleri veya sanal bir makinede çalışan dilleri yorumladı.

Gerçekten bir Java savunucusu değilim, en azından dil veya topluluk için değil, ancak C ile karşılaştırıldığında taşınabilirlik ve en az performans kaybı arıyorsanız gitmenin yolu.


3

Bir kez yazma hakkında iyi cevaplar her yerde derler.

İnsanlar, popülerliği ve gelecekteki hedef platformlar için mevcut bir C derleyicisinin yüksek olasılığı nedeniyle C'yi taşınabilir bir dil olarak düşünmeyi sever. Diğer bir faktör, ortak programlama görevlerine platformdan bağımsız bir şekilde yardımcı olan standart kütüphanedir.

Yani bir dilin taşınabilirliğinin şu şekilde belirlendiğini söyleyebilirim:

  1. Standardizasyon seviyesi.
  2. Farklı platformlar / mimariler için derleyicilerin kullanılabilirliği.
  3. Taşınabilir kütüphanelerin derinliği ve genişliği.

Gerçekçi olarak, neredeyse her karmaşık C uygulaması, donanım veya işletim sistemi bağımlılıkları nedeniyle yeni bir platforma geçmek için biraz çalışma gerektirecektir. Bu işleme taşıma adı verilir.


3

"Taşınabilirlik" in birden çok anlamı vardır. C ile ilgili olarak, aşağıdakiler anlamına gelir:

  • C derleyicileri, 70'lerin başında büyük bir anlaşma olan çok çeşitli donanım ve işletim sistemi platformları için C için uygulandı;

  • Dilin biraz farklı bir varyantını tanıyan her derleyici uygulamasının aksine, dilin kendisi için evrensel olarak kabul edilmiş bir standart vardır (yine, C, ilk tasarlandığında bir Büyük Fırsat, çünkü Pascal ve BASIC gibi birçok dil varyantı olduğu için) evrensel olarak tanınmadı);

  • Bu standart nedeniyle, uygun kod farklı platformlarda derlendiğinde aynı davranışı üretecektir.

Kaynak kodu taşınabilir, ancak yeni bir ikili her hedef için oluşturduğu gerekmektedir.

Bununla birlikte, C kaynağının nadiren “önemsiz” taşınabilir olduğuna dikkat edin; çoğu uygulama, belirli bir platforma özgü uzantıları kullanarak dil standardı tarafından tanımlananların ötesine geçmenizi gerektirir, bu nedenle uygulamada kaynak kodu% 100 taşınabilir değildir.

Bununla birlikte, C'nin uygulamaya çok fazla şey bıraktığını unutmayın. Çeşitli veri türlerinin tam boyutları, taşma davranışı, vb. Hepsi uygulamaya bağlıdır; standart, bir uygulamanın uyması gereken minimum gereksinimleri sağlar , ancak uygulama bu sınırların ötesine geçmekte serbesttir.


0

ISA ne olursa olsun, C ISA'ya özgü değildir. PC uzatma kartları için artık kullanılmayan yuvadan bahsetmediğinizi düşünüyorum.

Çok sayıda platform için standartlarla uyumlu C derleyicileri vardır ve kaynak kodunuzda tam olarak standart tanımlı dil özelliklerini kullandığınız sürece, herhangi bir platform için herhangi bir C derleyicisinde derleyebilmeniz gerekir.

Bununla birlikte, bir sorun, C standardının, uygulama olarak tanımlanmış veya tanımlanmamış davranış olarak birçok özellik davranışı bırakmasıdır. Bu, C dilini düşük seviyeli programlama için daha kullanışlı hale getirmek için yapılır, bu da kesin olarak tanımlanmış bazı davranışların bazı platformlarda donanımın desteklediği şeyle zayıf bir eşleşme olduğu durumlardan kaçınır. Ancak, taşınabilir programlar yazmayı biraz zorlaştırır.

Ayrıca, bazı dillerden farklı olarak, C, Java veya C # tarafından sağlanan büyük bir kütüphane ile birlikte gelmez. Hemen hemen her şeyi yapmak için çok taşınabilir kütüphaneler alabilirsiniz, ancak bunları oluşturmak ve birlikte çalışmalarını sağlamak için biraz çalışma yapmanız gerekir.

C'nin elbette standart bir kütüphanesi var, ancak kapsamı Java, C #, Python vb.'ye kıyasla nispeten sınırlı.


4
ISA = Komut Seti Mimarisi aka Donanım Mimarisi
VARTEC
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.