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?
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:
Java her yerde çalıştırıldığında derlenir. C ++ bir kez her yerde derleme yazmaktır.
"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 JNI
yerel ç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.
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.
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.
"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.
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.
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.
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, float
sadece yüklemeye kıyasla ekstra bir talimat gerektirir. doğrudan genişletilmiş hassasiyetli bir kayıt defterine).
(int)
, ilk örnekteki ilk örneğin (x+1)
alt ifadesi için float
, ikinci örneğin x
parametresine 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 .
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.
"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.
Ş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.
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.