Java neden C ++ gibi diğer dillerden daha taşınabilir olarak kabul edilir?


16

Java geliştiricileri için "her platform için belirli bir JRE yazmak" ile C ++ olanlar için "her platform için bir C ++ derleyicisi yazmak" arasında ne fark vardır?

Yanıtlar:


33

Java her yerde çalıştırıldığında derlenir. C ++ bir kez her yerde derleme yazmaktır.


3
Açıkçası GUI geliştirme konusunda çok fazla deneyiminiz olmadı. (Qt bekleniyor ...)

27
C ++ "bir kez herhangi bir yerde derlemek" olduğunu iddia eden herkes bir C ++ programı
taşımak zorunda kalmamıştı

7
BlueRaja'ya katılıyorum. Bir C ++ programını taşımak, derleyiciyi taşımaktan çok daha fazlası anlamına gelir. C ++, int dosyasının boyutu veya bir dosya sisteminin uygulanması gibi şeylerin bu kadar büyük bir fark yaratabileceği kritik ortamlarda en yaygın şekilde bulunur. Taşıma sadece yeniden derleme anlamına gelmez.
rahmu

8
@ Pubby8 hayır, taşınabilirlik sorunları da endianness (ki siz Java'da da muzdarip olabilirsiniz), hizalama ve temel türlerin boyutu gibi varsayımlar gibi taşınabilir olmayan varsayımlar yapan oldukça standart koddan gelir .
R. Martinho Fernandes

5
Bir kez yazın, her yerde hata ayıklayın.
bhagyas

25

"her platform için belirli bir JRE yazmak" her zaman yaptığınız bir şey değildir. JRE'yi yeni bir platforma taşımak, yalnızca bir kez yapmanız gereken bir şeydir. Bu görev genellikle programın ve / veya platformun ana yöneticisi / geliştiricileri tarafından yapılır. JRE'nin kim ve nasıl taşınacağına karar verirken birçok faktör devreye girebilir. Diğer şeylerin yanı sıra, altında yayınlandığı lisansa bağlıdır (Java'nın Açık Kaynak olduğunu duyuyorum, bu yüzden herkes bunu yapabilir). Komik bir fıkra olan Steve Jobs , yaklaşık bir yıl önce Mac'te Java'nın taşınmasına dikkat etmemek konusunda büyük bir anlaşma yaptı .

Mesele, JRE'yi nasıl veya kimin portladığını değil, bir kez taşındıktan sonra, her Java uygulamasının artık teorik olarak yeni makinede kolayca çalışması gerektiğidir. Bu anlamda JRE, makineyi tamamen gizleyerek kolay taşıma imkanı sağlayan bir soyutlama katmanı oluşturur.

Ancak, gerçeklik her zaman böyle değildir. Taşınabilirliği "efsane" olarak adlandırmayacağım, ama o kadar da mükemmel değil. Örneğin, Java JNIyerel çağrıların gönderilmesine izin veren, JRE'yi atlayan ve böylece Java hayranlarının "Her yerde çalıştırıldığında bir kez yaz" dediği mükemmel taşınabilirliği önleyen bir pakete sahiptir .

Yorumlarda belirtildiği gibi, C ++ 'ın taşınabilirliğe yaklaşımı farklıdır. Bir yandan, bu derlenmiş bir dildir ve bu ikili dosyalar neredeyse her zaman platforma özgüdür. Yani c ++ yürütülebilir dosyaları asla taşınabilir olmayacaktır (Java'nın aksine). Öte yandan, derleyiciyi taşımak bazen yeterli olabilir. Topluluk, derleyiciyi ve dilin bazı temel kütüphanelerini taşıyarak, kaynak kodların (ikili değil) taşınabilir olabileceğini buldu.

Bununla birlikte, C ++ derleyiciler, çekirdekler, gerçek zamanlı sistemler, gömülü sistemler gibi kritik sistemlerde yaygın olarak kullanılmaktadır ... C ++ 'ın taşınabilirlik hakkında göz ardı edilemeyecek bir "düşük seviye" yönü vardır.


4
Taşınabilirlik bir efsane değildir. Mükemmel taşınabilirlik.
Malcolm

"Java, her uygulamanın" makineye özgü "olduğu ve kodu değiştirmeden taşınamayacağı C ++ 'dan çok farklı olduğu yerdir." Bu doğru değil, bağımlılıklara bağlı. Standart kitaplığı ve kitaplıkları yalnızca hedeflerinize taşınabilir kaynaklarla kullanıyorsanız, bir kez kodlar ve her hedefi derlersiniz. C ++ 'da kodu değiştirmeden taşınabilecek bir şeyi kodlarsanız, değiştirmeniz gereken tek şey derleme komut dosyalarıdır. Bu her durumda bile doğru değil.
Klaim

Unutmayalım ki C ++ hem yüksek seviye hem de düşük seviye dil olarak kullanılabilir. 32bit int'in 64 bit int'ten çok farklı olduğu programlarda bir çok C ++ kodu kullanılır. Yüksek seviye elbette her zaman taşınabilir olacaktır. Ama bu bir C ++ genellemesinden uzak
rahmu

Söylediklerimi yanlış anlayabileceğinizi düşünüyorum: düşük seviyeli şeylerle uğraşmadan int veya herhangi bir standart tip ile doğru C ++ yazabilirsiniz. Sadece yükseltme kitaplıklarına bir göz atın, çoğu sadece yüksek seviye kodudur ve bu bir çok C ++ açık kaynak projesi için geçerlidir. Düşük seviyeye "gidebilirsiniz" ve bunu yaparsanız platforma özel API kullanmanız gerekene kadar herhangi bir koddan da kaçınabilirsiniz. Ancak gerekmiyorsa, her yerde çalışan C ++ yazabilirsiniz. Platforma bağımlılıktan kaçınılabilir ve genellikle kütüphane kodundadır.
Klaim

Sadece açık olduğumdan emin olmak için: Tüm C ++ kodunun taşınabilir olduğunu söylemiyorum, olduğu gibi ifadenizin yanlış olduğunu söylüyorum. "Java, C ++ 'dan çok farklı olduğu, her uygulamanın" makineye özgü "olduğu ve kodu değiştirmeden veya kod gerçekten taşınabilir ve derleme yapılamadığında taşınamayacağı bir şeyle düzeltmek isteyebilirsiniz. komut dosyaları en az bir derleme olmadan yeni hedefi yönetir. "
Klaim

14

Sadece dil değil, kütüphaneler.

Hem Java hem de C ++ platformlar arası kütüphaneler sağlar. Java daha zengin bir set sağlar.


2
Java varsayılan olarak daha zengin bir set sağlar. Aynı kütüphaneler C ++ için bulunabilirler, sadece standart kütüphanelerin bir parçası değildirler ve sadece hangilerini kullanacaklarına karar vermelisiniz (özellikle yüklü değilse önemsiz değildir).
Martin York

Java'nın standart kitaplıklarını C ++ için kitaplık evreniyle karşılaştırmak gerçekten geçerli bir karşılaştırma değildir. İster her birinin standart kitaplıklarını, ister her birinin kitaplık evrenini karşılaştırıyor olun, Java daha zengin bir set sağlar.
Andy Thomas

3
Kesinlikle buna katılmıyorum. Java kitaplığındaki her şey kullanılabilir, bazı kitaplıklarda C ++ tarafından kullanılabilir. Java'nın hepsini tek bir yerde bulundurması hoşuma gidiyor ama daha zengin olduğunu söylemek doğru değil. Belki de aradığınız sıfat `` daha entegre ''
Martin York

1
+1 tekrar yükselir. Kütüphanelerin taşınabilirlik açısından en büyük faktör olduğunu düşünüyorum. C / C ++ ile çalışıyorsanız ve saf hesaplama dışında herhangi bir şey yapıyorsanız, Windows ve Unix arasında kökten farklı ve Unix'in farklı lezzetleri arasında oldukça farklı kütüphaneler (özellikle sistem kütüphanesinin parçaları) olacaktır. Bu, taşımayı zorlaştırır. Java'nın temelde bu sorunu yoktur.
Tom Anderson

1
@Andy Thomas-Cramer: Hiçbir şeyi karşılaştırmıyorum (öyle görünüyorsun). İfadenizin yanlış olduğunu söylüyorum. Java'nın sahip olduğu avantajlardan biri (ve hepimiz bunun için seviyoruz), tüm standart kütüphaneler tek bir yerde. Daha zengin olduklarını söylemek doğru değildir.
Martin York

7

Fark, Java'nın herhangi bir platformda yeniden derleme yapmadan çalışmasıdır . Her platform için bir C ++ derleyicisine sahip olmak hiç de aynı değildir.


6

"Fark ..." ile başlayan tüm cevaplar veya çok benzer bir şey temelde yanlıştır (özür dilerim, ama hayat böyle). İkisi arasında gerçekten iki ayrı fark var.

Birincisi (çok fazla bahsedildi) derlenmiş bir Java programının Java'nın herhangi bir uygun uygulamasında çalışabileceği (veya en azından olması) gerektiğinden, derlendikten sonra bile, bir Java programını yeniden derlemeden bir platformdan diğerine taşıyabilirsiniz. . C ++ (en azından normalde) her hedef platform için yeniden derleme gerektirir.

Diğeri ise Java'nın (en azından doğru yazılmış tüm Java'ların taşınabilir olmasını sağlamasıdır). En azından teoride, taşınabilir olmayan herhangi bir kod yazamamanız gerekir.

C ++, taşınabilir olmayan birkaç şey yapmanıza izin verir. C ++ standardı, taşınabilir olmayan bir çok şey hakkında "uyarılar" içerir (örn., Uygulama tanımlı davranış veya tanımsız davranış alacağınızı söyler), ancak mutlaka bunları yapmanıza engel olmayacaktır. . Örneğin, bir PCI veri yolu kullanan donanım için bir işletim sistemi yazmak istiyorsanız, muhtemelen PCI yapılandırma belleğini okumanız / yazmanız gerekecektir. Bu, bir PCI veri yolu olmayan sistemlere taşınabilir olmayacaktır, ancak bir PCI veri yolu olan donanım için bir işletim sistemi yazıyorsanız, hemen hemen gereklidir. Açıkça taşınabilir olmayacak olsa da C ++ buna izin verir.


C ++, PCI veri yolu veya donanım hakkında hiçbir şey bilmiyor.
Nikko

Tabii ki öyle değil, bunlar platforma özel kütüphanelere dahil edilmesi gereken platforma özgü şeyler. Tıpkı Java'nın gerekirse platforma özel kütüphanelere sahip olması gibi.
jwenting

1
@Nikko: Bunun hakkında hiçbir şey bir şey bilen, ama ne kullanmanıza olanak verir sen bundan haberdar.
Jerry Coffin

@jwenting: Tek fark platforma özgü kütüphaneleri C ++ ' da yazabilmenizdir , ancak genellikle bunları Java'da yazamazsınız.
Jerry Coffin

6

Tesisleri yanlış anladınız. Java programları çok taşınabilirdir, çünkü JVM aynı olması garanti edilen standart bir davranış sağlar. C ++ programları, gerçek donanıma daha az standartlaştırılmış bir ortama sahiptir, bu nedenle programın, bir int boyutu, kelime hizalama vb. Gibi çeşitli platforma özgü ayrıntıları işleyebilmesi gerekir.

JVM'nin kendisi çok taşınabilir değil. Yüksek performanslı bir JVM'yi başka bir platforma veya CPU mimarisine taşımak çok büyük bir görevdir.


Bu son cümle için +1!
rahmu

2

Fark, Java (bir kısaltma değildir) programlarının JVM yüklü herhangi bir bilgisayarda çalıştırılabilecek bir biçimde dağıtılabilmesidir, ancak C ++ normalde çok kullanıcı dostu olmayan bir kaynak kodu veya bir grup olarak dağıtılır. platformlar için farklı ikili dosya kümesi.


Ha? JVM'yi hedefleyen C ++ derleyicileri ve yerel kodu hedefleyen Java derleyicileri vardır. C ++ dil belirtiminin C ++ programlarının kaynak kodu veya platforma özgü ikili dosyalar olarak dağıtılması gerektiğini belirten belirli bir bölümünü belirtebilir misiniz?
Jörg W Mittag

Orada, daha az kesin bir dil kullanmak için cevabımı düzenledim
Colin

2

Java'nın taşınabilir olarak kabul edilmesinin nedenlerinden biri, aritmetik ifadelerin nasıl değerlenmesi gerektiğine ilişkin belirli kurallara sahip olması ve zorunlu olarak değerlendirildiğinde bile uygulamaların bunları daha doğru bir şekilde değerlendirmekten daha yavaş bir kod gerektireceği için uygulamaların başka bir şekilde değerlendirilmesini yasaklamasıdır. moda.

Örneğin,

long thing1(int x) {
  return (x+1)-1L;
}
double thing2(int x, float y) {
  return x/y;
}

Değerleri thing1(2147483647) ve thing2(1123456700,11234567.0f)-2147483649L ve 99,9999923706054688, olunmalıdır sırasıyla aritmetik olarak doğru değerler 2147483647L ve 100.0 ve sağlamasına rağmen hatta bazı platformlar kodu da sayısal olarak-yanlış sonuçlar yavaş kodunu doğru oluşturmak için daha olacaktır üretmek için sonuçlar (bazı 64 bit platformlarda, (x + 1) sonrasında sarma davranışını zorlamak fazladan bir talimat gerektirir ve 8x87 platformunda 1123456700 değerini bir yuvarlamaya zorlamak, floatsadece yüklemeye kıyasla ekstra bir talimat gerektirir. doğrudan genişletilmiş hassasiyetli bir kayıt defterine).


1
Bir zamanlar, aslında değerli bir şey ekleyen eski bir soru üzerine yeni bir cevap: Java'nın çok kesin aritmetik gereksinimleri vardır ve elbette ilkel veri türleri C ++ ile karşılaştırıldığında belirli boyutlara ve anlambilime sahiptir. Bu tarihten itibaren başka bir cevaptan söz edilmiyor.

@Snowman: Seçilen belirli örnekleri nasıl buldunuz? Şahsen bir dil tasarlamasaydım (int), ilk örnekteki ilk örneğin (x+1)alt ifadesi için float, ikinci örneğin xparametresine daraltma dökümleri kullanmadan, her iki örneğin de Java'nın değerini döndürmezdim , ama açıkçası dili tasarlamıyordum .
supercat

Bence mantıklı. Herhangi bir dil için önemli olan iyi tanımlanmış semantiğe sahip olmaktır. Kişinin belirli bir dil tasarımı kararını kabul edip etmediğine bakılmaksızın, önemli olan koda bakıp nasıl çalıştığını bilmek . Java genellikle bunu yapar, tanımlanmamış davranışlar azdır.

1

Destek araçları için iş miktarı gerçekten benzerdir, fark başka yerlerde yatmaktadır. Bir C ++ programı bir platform için derlendikten sonra, farklı bir platformda kullanmak istiyorsanız yeniden derlemeniz gerekir. Ancak, bir java programı derlendiğinde, yeniden derlemek zorunda kalmadan çalışma zamanı ortamına sahip başka bir platforma taşıyabilirsiniz.


1

"Taşınabilirlik bir efsane mi?" Başlığını cevaplamak yerine, "Taşınabilirlik, Java veya C ++ 'da daha iyidir" yerine kısmi taşınabilirliğin mümkün olduğunu söyleyebilirim, ancak tam taşınabilirlik bir efsanedir.

Yazmak için ısrar ettiğim ve bu soru için geçerli olan bir şey, geliştiricilerin artık sadece programlama dilleriyle değil, tam programlama çerçeveleriyle çalıştığıdır.

Ve bu çerçeveler arasında kütüphaneler, veritabanları, grafik arayüzler bulunur.

Hangi programlama dili veya hangi programlama çerçevesi daha taşınabilir?

Peki, uygulamanızın ne olduğuna bağlı. başarmaya çalışıyor.


1

Şey "sen" JRE yazmayın herhangi bir JRE üzerinde çalışan Java kodunu yazın . "Siz" C ++ kodu yazıyorsunuz olabilir değişiklikleri gerektiren size başka bir platformda derlemek önce.


0

Birçok kişi "% 100 taşınabilir" veya bunun gibi ifadeler söylediklerinde Java'nın gerçekliğini unutur veya dikkate almaz.

Hemen hemen tüm büyük Şirketler / Yazılım evi, yakın geçmişte ilişkili bir JRE ile en az 1 ev yapımı Java uygulamasına sahipti ve bazıları hala bunu sürdürüyor, Microsoft, IBM ve Apple'ın örneğin, hepsinin kendi Java'larını yansıtan kendi sürümleri vardı. endüstrinin ve bu dilin nereye gitmesi gerektiği konusunda kendi fikir ve düşünceleri.

"Portatif" için bu nasıl? Döndüğünüz her yerde bir JRE.

Ve bu Sun / Oracle'ın ne yaptığını düşünmeden.

Java kodunun taşınabilirlik açısından gerçekten C ve C ++ 'dan çok uzak olmadığına bir örnek GUI'ler ve grafik sunuculardır, Apple kendi JRE'si için GUI çerçevesinin standart olmayan bir uygulamasına sahipti, sonuç olarak çok sayıda Apple makineleri için Java kullanarak bir GUI oluşturmak / taşımak isteyen herkes için baş ağrısı ve çift çalışma ve temelde Quartz ile uğraşmak zorunda kaldılar (bu "kaldıraç" ve üst düzey diller açısından nasıl?).

Bazen en yaygın kullanılan kelimeler bile insanların genellikle onlara verdiği anlamı yansıtmaz, bana göre Java dünyasındaki "taşınabilirlik" genel anlamda "görünüm" gibidir; Ticari ve finansal açıdan, diğer dillerden (en azından Java'nın doğduğu zamanda) Java'yı benimserseniz sizin için daha iyi bir görünüm vardır, çünkü zaten bir tarafta çok fazla işiniz var (her şeyde bir JRE elde edersiniz) "bilgisayar" olarak kabul edilebilir) ve kod tabanınızın olduğu gibi taşınabilir olması muhtemeldir, programınızı taşımak için daha az kaynağa ihtiyacınız vardır, bu, söz konusu kaynak para, zaman veya insan gücü önemli değil, daha düşük eşiği diğer teknolojilere kıyasla ve Java'nın amacı budur, bu eşiği düşürmektedir.

Tabii ki, Java'nın tesislerini kabul ediyorsanız, çöp toplama özelliğine sahip bir sanal makine anlamına gelir, bu da yerel dillere kıyasla daha fazla kaynak tüketir, eğer gerçekten CPU veya sunucu çiftliğinizden maksimum maksimum sıkmak istiyorsanız bu doğrudur. kaynakları çok az olmadıkça veya şirketiniz gerçekten küçük olmadığı sürece Java'yı kullanabileceğinizi düşünmeyin.

Hala kod veya işlevsellik her satır için sadece 1 sürümü içeren herhangi bir önemsiz Java uygulaması bulmak zorunda (herhangi bir platforma özel şeyler olmadan aka aka) ve tüm büyük JRE'ler arasında% 100 taşınabilir.

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.