C'nin derlenmesini / yorumlanmasını / JIT'lenmesini engelleyen nedir?


9

Java genellikle JVM'den kaynaklandığını düşündüğüm inanılmaz taşınabilirliği nedeniyle övülür. Benim sorum, C'nin derlenmesini / yorumlanmasını / JIT'lenmesini engelleyen şeydir, eğer öyleyse, C bir kez yazılabilir ve sahip olduğunuz cihaz üzerinde çalışmasını sağlayabilir. ancak bu bir C programının işlenmesi için popüler bir mekanizma değildir.

C'yi bu şekilde işlemenin dezavantajları nelerdir, ayrıca Java'nın bu şekilde işlenmesinin ve elbette taşınabilirliği dışında makine koduna derlenmemenin avantajları nelerdir?


Sorunuzun burada zaten çok iyi cevapları var: stackoverflow.com/questions/3925947/…
Doc Brown

2
@delnan, "C'nin derlenmesini / yorumlanmasını / JIT'ed edilmesini engelleyen şey", dilin JIT olan bir sanal makineyi veya vm'nin donanımdaki eksik özellikleri tanımlayacağı ve yeniden derleyeceği durumları gerçekten anlamını yitirdiği mevcut donanıma uygun kod (farklı grafik kartları için OSX'te OpenGL (C ile yazılmış) gibi). Hayır, bir makinede llvm'yi hedeflemek için derlenmiş bir şeyi alıp başka bir işlemcide çalıştıramazsınız. Ancak derlenen / yorumlanan / JIT çizgisi oldukça bulanık olabilir.

1
Java, inanılmaz taşınabilirliği nedeniyle sık sık hiperlenir . JVM'nin derlendiği sistemlere, yani JVM'nin (C ile yazılmış) derlendiği sistemlere taşınabilir. C kodunun aynı şekilde kullanılmasını engelleyen hiçbir şey yoktur, ancak hiç kimse çabayı haklı çıkarmak için bunu yapmaktan yeterince fayda görmez.
Pete Becker

2
Bu bit hakkında şaşkınım: "C'nin derlenmesini engelleyen / [...]". Hiçbir şey?
Andres F.

1
C derleyicileri bugünlerde oldukça hızlıdır, bu nedenle "myprog.c; myprog" yazarı muhtemelen çoğu tercümandan daha hızlı çalışacaktır.
James Anderson

Yanıtlar:


18

C orta seviye dil diyeceğim. Amacı "çok yüksek seviyeli bir montajcı" olarak hizmet etmektir, bu yüzden bir derleyici hedefi kadar iyi çalışır ve taşınabilirliği neden bu kadar iyi kucaklar.

Tarihsel olarak, tercümanlar genellikle yöntem çağrıları bağlamında üst düzey dillerle kullanılmıştır . En basit haliyle, bir yorumlayıcı ilişkili anahtarlarla birlikte yalnızca kaynak dildeki her bir anahtar sözcüğü ayrıştırır ve bunu yöntem çağrılarına ve parametrelerine dönüştürür. Uygulamada, çoğu tercümanın yaptığı, kaynak dili bazı ara temsillere dönüştürmektir ve yorumlanan temsildir.

C'nin yorumlanmasını veya yayınlanmasını engelleyen nedir? Hiçbir şey değil. Ama bu C'nin varoluş nedeni değil.


6

Her şeyden önce, Sun'ın JVM'sinin C dilinde yazıldığını belirtmek gerekir. C, taşınabilirlik gerektiğinde çok popüler bir dildir.

Birçok C programı olmasa da C dili taşınabilir . Bunun nedeni, C'nin programcıya çok fazla kısıtlama getirmemesi veya fazla varsayım yapmamasıdır. Bir C programcısı programlarının taşınabilir olmasını isterse, bu kısıtlamaları kendi üzerine koymalıdır.

Uygulamada, bu Java'nın size getirdiği kısıtlamalarla yaşamaktan çok daha zor değil. Bu çoğunlukla endianlığınıza ve ilkel boyutlarınıza dikkat etme ve platforma özgü kütüphaneler yerine GTK + gibi taşınabilir kütüphaneleri kullanma meselesidir .

Muhtemelen JVM olsa bile sanal bir makineyi destekleyen bir GTK + hedefi ve C derleyicisi yapabilir ve mevcut kodun çok az değişiklikle çalışmasını sağlayabilirsiniz. Aslında, çöp toplama olmadan, bir C sanal makinesi muhtemelen çok daha basit olurdu. Peki neden istiyorsun?

Java'yı yerel koda derleyen tersi de aynı şekilde yapılabilir. Temel olarak JIT bunu yapar. Peki neden istiyorsun? Eminim bunu yapmak için evcil hayvan projeleri vardır, çünkü bunlar ciddi kullanımda değildir.


5

Dedin:

Java genellikle JVM'den kaynaklandığını düşündüğüm inanılmaz taşınabilirliği nedeniyle övülür.

Ve orada, ilk cümle içinde yanılıyorsunuz. JVM nedeniyle Java taşınabilir değil. Java taşınabilirdir, çünkü Java dili, bir programın davranış biçiminde uygulayıcıyı herhangi bir boşluk bırakmayacak şekilde tanımlanmıştır.

Örnek olarak, Java iki tür "int" (işaretli 32 bit tam sayı) ve "uzun" (işaretli 64 bit tam sayı) içerir. C ve C ++ 'da "int" (en az 16 bit imzalı), "uzun" (en az 32 bit imzalı) ve "uzun uzun" (en az 64 bit imzalı) bulunur. Çünkü C'nin birçok farklı işlemcide çalışması gerekiyor ve farklı davranmalarına izin veriyor.

C, bu tipler için sabit boyutlar tanımlamış olabilir. Olsaydı, 36 bit işlemci C dilini uygulayamazdı. Ve gerçekten Java'yı uygulayamazlar! Böylece C, dilin çeşitli farklı bilgisayarlarla çalışmasına izin verdi. Bunun taşınabilir olmayan bir kod oluşturulmasına izin vermesi kaçınılmazdır. Bu bir dil meselesi.


36 bitlik bir makinede 32 bit aritmetiği taklit etmek ve 0xFFFFFFFF ile her işlemin sonucunu 32 bit olarak kısaltmak mümkündür. Yani, bu makineler olabilir Java uygulaması, sadece Java nonet tabanlı tiplerini izin eğer daha yavaş olacaktır.
dan04

4

Java özellikle taşınabilirdir, çünkü dil, adından da anlaşılacağı gibi gerçek bir makine olmayan Java Sanal Makinesi'ni hedefler . Sanal Makineyi birçok farklı gerçek makinenin mimarisine uygulayabildiğiniz için, JVM tabanlı bir program oldukça taşınabilirdir.

Öte yandan, C, tam donanıma ihtiyaç duyan bir işletim sisteminin uygulanması için özel olarak yaratıldığından, gerçek donanıma karşı çalışmak üzere özel olarak tasarlanmıştır. Bu, C kodunun tasarım gereği özellikle taşınabilir olmadığı ve bir C programını bir platformdan diğerine taşırken, hedef mimariye özgü çeşitli parçaların bir dereceye kadar yeniden yazılması gerekecektir.


7
C son derece portatiftir. Hedef platformda yeniden derlemeniz ve özellikle ve kasıtlı olarak taşınabilir olmayan birkaç bitten kaçınmanız gerekir.
Robert Harvey

5
@RobertHarvey: ... çeşitli ilkellerin büyüklüğü kadar temel şeyler gibi mi? ;)
Mason Wheeler

2
Evet, bu şeyler. Sorunun mevcut olması talihsiz bir durumdur, ancak dil diğer her şekilde tamamen taşınabilirdir ve ilkel boyutların tüm platformlarda çalıştığından emin olmanın yolları vardır.
Robert Harvey

3
@RobertHarvey: C'nin taşınabilir programlar yazmayı mümkün kıldığını söyleyebilirim, ancak bunu doğal olarak kolaylaştırmaz.
Doc Brown

2
@RobertHarvey: Dini bir savaş başlatmak istiyor musunuz? ;-) En sevdiğim taşınabilir dil Python.
Doc Brown

3

Aslında C'nin yorumlanmış versiyonları vardır , ancak çoğunlukla üretim sisteminden ziyade hızlı deney için kullanılması amaçlanmıştır.

Bunlar sıradan değil, çünkü sonuçta, neden küçük, hızlı ve statik bir yürütülebilir dosya almıyorsan neden tüm C idiosyncrasies'e uğrarsınız?


3

Teorik olarak hem C hem de Java yerel koda derlenebilir, yorumlanabilir veya sanal bir makinede derlenebilir.

C'nin sanal bir makineye derlenmemesinin teknik nedeni, standart bir sanal C makinesinin bulunmamasıdır.

Ve hiç kimse sanal bir C makinesi tanımlamak, hatta Java sanal makinesini derlemek istemiyor gibi görünüyor (bu tamamen mümkündür). Muhtemelen C'yi kullanan hiç kimse rakipsiz hızını kaybetmek istemiyor. Muhtemelen aynı zamanda C, açık kaynak topluluğunda derleme yoluyla taşınabilirliği yapabilen (kaynağı dağıtma ve yeniden derleme ve yürütme) en güçlü olduğu için, kapalı olarak yürütme taşınabilirliğine (ikili dağıtma ve yürütme) ihtiyaç duymazlar. kaynak geliştirici.


1

Aslında bu yapılır. LLVM'ye derlemeyi destekleyen büyük derleyiciler var (clang'ın yaptığını biliyorum ve gcc'nin de yaptığını düşünüyorum). Bu LLVM, Java kodu JIT'd olan bayt koduna derlendiğinde JIT'd olabilir.

Ancak, Java'yı C ile karşılaştırıldığında "çapraz platform" yapan şey, Java'nın birçok platforma taşınan büyük bir çalışma zamanı kütüphanesine sahip olmasıdır. C bu paradigmayı açıkça takip etmiyor.


Dikkatli bir şekilde kod yazarsanız, POSIX'li C oldukça taşınabilir olabilir (herhangi bir POSIX sistemine).
Basile Starynkevitch

0

Java ve C arasında bazı büyük farklılıklar vardır. Java, java sanal makinesi (JVM) aracılığıyla işletim sisteminden yalıtılır. JVM, işletim sistemini programdan uzaklaştırır. Bir java uygulaması JVM'den bir bellek yığını isteyebilir ve JVM daha sonra işletim sisteminden o belleği ister. Farklı platformlar / işletim sistemleri için birçok JVM vardır. JVM, aynı java programının farklı platformlarda çalışmasına izin veren şeydir.

C ile işletim sistemi yalıtımı yoktur. C programları (genellikle) doğrudan işletim sisteminin üstünde çalışır ve doğrudan işletim sistemi çağrıları yapar. Bu, C programının belirli bir işletim sistemine / platforma bağlanmasını sağlar. Önemsiz herhangi bir program işletim sistemine çağrı yapacak. Ek olarak, C programları donanıma özgü makine kodunda derlenir. X86 için derlenmiş bir C programı doğrudan bir ARM işlemcide çalıştırılamaz.


1
Java , herhangi bir platformda herhangi bir JVM tarafından çalıştırılabilen (en azından teorik olarak) platform agnostik bayt koduna derlenir . C, hedeflediğiniz CPU için derleme diline derlenir (bu nedenle x86 mimarisini hedefliyorsanız, C derleyicisi x86 derleyicisi veya bu mimariyi veya ARM derleyicisini vb. Hedefliyorsanız amd64 derleyicisi oluşturur). Daha sonra montaj dili, yürütülebilir bir dosyaya (hedef makineye bağlı olarak birkaç farklı format) bağlanan nesne dosyalarına (ikili montajcı, gerçekten) dönüştürülür.
Craig

1
Java Dil Spesifikasyonu'nda JVM hakkında bir şey söyleyen hiçbir şey yoktur ve aslında JVM'siz Java uygulamaları vardır. Android'de, Java programları Dalvik VM'de (artık kullanılmıyor) veya Android Çalışma Zamanı'nda çalışır, CLI için Java uygulamaları, ECMAScript ile derlenen uygulamalar ve yerel kodla derlenen uygulamalar vardır. JVM'yi derleyen C derleyicileri vardır. ECMAScript'i derleyen C derleyicileri vardır. C tercüman var.
Jörg W Mittag
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.