Derleyiciler geliştirme dışında mı kullanılıyor?


14

Anladığım kadarıyla, derleyiciler kodlarını yürütülebilir (makine kodu) dosyalara derleyen geliştiriciler içindir. Derleyiciler bir istemcinin makinesine veya son kullanıcı sistemine uzanmaz.

Bunun yerine, geliştiriciler kodlarını makine koduna dönüştürmek için derleyiciyi kullanırlar, bu da daha sonra uygulama olarak kullanılmak üzere diğer makinelere aktarılır.

Derleyicilerin bu işlemin dışında bir işlevi var mı? Varsa, ne zaman kullanılırlar?


21
Evet, derleyiciler kodu derler.
Tom Squires

@Tom: Bir yerde C-derleyicilerinin oyun konsolları da dahil olmak üzere çeşitli makinelere yüklendiğini okudum. Bu, C dilinde kod yazdığımız anlamına mı geliyor, o zaman bu cihazlara gönderiliyor, derleyici tarafından derleniyor ve ardından tercüman tarafından yürütülüyor mu?
Pankaj Upadhyay

3
@Pankaj Upadhyay: Bu kod olması mümkün olabilir bir makineye gönderilen ve daha sonra bir iç işlem tarafından derlenen olsun. Cihazın kullanıcısının bunu görmesi veya bilmesi hiç olası değildir. Kod parçalarının belirli donanımlar için derlenmesi ve çalışma zamanında donanımı test eden çözümlerin çok yavaş olması, kodun dağıtılması ve kurulum sırasında derlenmesine neden olması durumunda yapılabilir. Belki ...
SinirliWithFormsDesigner

3
@Pankaj Hiçbir oyun konsolu derleyici ile gönderilmez, ancak bazıları üzerine yüklenebilir. Sony, örneğin PS2'ye yüklenebilecek bir Linux ve GCC sürümü sağladı. Diğer insanlar, diğer işletim sistemlerini ve yazılımları konsollara alma yollarını kırdı / hackledi.
IronMensan

4
@Stargazer: Şunu mu demek istediniz: "Hayır, derleyiciler kaynak dilden hedef dile çevirir"? Virgülün atlanması, cümlenizi amaçladığınız anlamın tersi kılar.
Daniel Pryden

Yanıtlar:


19

Evet ve hayır. Evet, klasik senaryo, kaynak koddan makine kodu oluşturmak için bir derleyici kullanan bir geliştiricidir ve makine kodu daha sonra kullanıcılara dağıtılır.

Orada olan bu olsa birkaç istisna. İlk olarak, birçok açık kaynak projesi öncelikle (veya sadece) kaynak kodu biçiminde dağıtılır ve son kullanıcının bunları makeve ardından gibi birkaç komut yazarak bunları yüklemesini bekler.make intall. Bu, derleyiciyi, bağlayıcıyı, vb., Söz konusu kullanıcıların bilgisayarının kaynak kodundan makine kodunu üretmelerini sağlar. Bununla birlikte, bu durumlarda, inşaat ve kurulum süreci (en azından amaçlanan), kullanıcının daha önce hiç kaynak kodu içermeyen bir paket kurmamış olmasının ötesinde, nadiren bunun hakkında çok fazla bilgiye ihtiyaç duyduğu noktaya kadar otomatikleştirilir. , paket yöneticileri genellikle bazı "geliştirme" paketlerini gerçekten önem verdikleri uygulamayı yüklemek için bir önkoşul olarak listeler (bazıları bunu hala son kullanıcılara düşmanca görür).

Başka bir istisna (gördüğüm, ancak gördüğüm diğer cevaplarda çok iyi açıklanmayan) tam zamanında (JIT) derleyiciler. JIT derleyicilerinin birkaç açık örneği Microsoft Ortak Dil Çalışma Zamanı (CLR) ve Java Sanal Makinesi'dir (JVM). Bu durumlarda, normalde kaynak kodunu makine koduna çevirmekle ilgili iki tamamen ayrı derleyici vardır. Biri geliştirici tarafından kullanılır. Ancak, doğrudan makine kodu üretmek yerine, makineden bağımsız bir bayt kodu üretir. CLR / JVM daha sonra bu bayt kodlarını hedef bilgisayar için makine koduna dönüştüren birinciden tamamen ayrı olan ikinci bir derleyici içerir .

İkinci derleyicinin kesinlikle gerekli olmadığını da eklemeliyim. JVM'nin ilk sürümleri (bir örnek için) bayt kodlarını derlemek yerine yorumladı. Bu genellikle oldukça ciddi bir performans cezası taşır, bu nedenle üretim amaçlı amaçlanan en makul JVM'ler arasında bir JIT derleyicisi bulunur.


24

Evet, derleyiciler esas olarak geliştiriciler tarafından birkaç istisna dışında kullanılmaktadır. Son kullanıcılar bazen kodda herhangi bir değişiklik yapmasalar bile en son açık kaynaklı yazılımı derlemek ve yüklemek için derleyicileri kullanırlar. Ayrıca, bazı programlama dillerinde derleyici yoktur. Anında "derlemek" yerine tercümanlar kullanırlar. Bu durumda, son kullanıcıların tercümanın makinelerinde kurulu olması gerekir.


4
"Derleyiciler" tanımını yürütülebilir dosyalar üreten programlarla sınırlayacak olsaydık, bu iyi bir yanıt olurdu. Ancak, bu sadece "derleyici" gerçek tanımının bir alt kümesidir
riwalk

16
@Jan Soltis: Kabul etmiyorum. Linux çekirdeğini kaynaktan derledim: bu benim bir Linux çekirdeği geliştiricisi olduğum anlamına mı geliyor? Linux çekirdek kodunu hiç değiştirmedim veya bir yama göndermedim - bunun çekirdek geliştirici olmadığımı söyleyebilirim . Ayrıca, birincil işletim sistemim olarak Gentoo'yu kullandığım birkaç yıl boyunca , makinedeki her bir yazılım parçasını derledim . Bununla birlikte, bunların büyük çoğunluğu Portage paket yönetim sistemi tarafından otomatik olarak derlenmiştir. Bu durumda son kullanıcı olarak hareket ettiğimi ancak geliştirici olarak hareket etmediğimi iddia ediyorum .
Daniel Pryden

8
@Jan Soltis: Bunun senin fikrin olduğunu biliyorum. Saygılarımla katılmıyorum. Siz desteklenmeyen iddialarda bulunmaya devam ederken pozisyonumu desteklemek için kontrgajlar sağladım. Görünüşe göre "geliştirici" ve "son kullanıcı" arasında var olduğuna inanmadığım keskin bir çizgi var.
Daniel Pryden

6
Kaynakları indirip "make install" komutunu çalıştırmak bir geliştirici değildir. Kesinlikle bir son kullanıcı operasyonudur.
Kristopher Johnson

3
@Jan: Paketleri derleyen Gentoo gibi bir dağıtım kullanmanın sizi en azından güçlü bir kullanıcı haline getirdiğini kabul edebilirim , ancak bu hala açıkça bir tür kullanıcı. Başkalarının kodunu değiştirmeden, derlemeden, hatta okurken derlemek sizi geliştirici yapmaz.
Carson63000

10

Evet

Derleyici, kodu bir dilden diğerine çeviren bir program olarak tanımlanır (bkz. Wikipedia ). Derleyicilerin en yaygın kullanımı kaynak dili makine koduna çevirmektir, ancak bu "derleyici" kelimesini tanımlar.

Örneğin, bir modülü içe aktarırken Python bayt kodu üretir ve böylece bir derleyici tanımına uyar (çünkü kaynak dil olan Python'dan hedef dile, Python bayt koduna dönüştüğü için).

Başka bir örnek V8 JavaScript motorudur. Bu x86 makine koduna JavaScript dönüştürür ve böylece bir derleyici tanımına uyar de. V8 sadece bir derleyici tanımına uymakla kalmaz, aynı zamanda Chrome'da bulunur ve istemci makinelerde çok yaygın olarak kullanılır.


4

Bir örnek, çalışma zamanında dinamik olarak kod oluşturan ve daha sonra oluşturulan kodu çalıştıran bir uygulama için olabilir. Bu kodun çalışma zamanında derlenmesi gerekir.

Düzenleme: Diğer istisnalar vardır, ancak diğer cevaplarda zaten belirtilmişti.


+1 sadece JIT
gnat

1
Chrome'daki V8 motoru tuhaf bir istisna değildir.
riwalk

Açıklığa kavuşturmak için güncellendi. Başka istisnalar da olduğunun farkındayım.
Morgan Herlocker

3

derleyiciler yalnızca programlama dili kodlarını yürütülebilir (machin-code) dosyalarına derlemek için geliştiriciler içindir

"Derleyiciler geliştiriciler için birincil anlamındadır ..." diyebilirim. Ancak, programların anında yeni programlama dili kodu oluşturduğu ve bu nedenle son kullanıcıların makinesine yüklenmesi için bir derleyiciye ihtiyaç duyduğu örnekleri gördüm. Bu, son kullanıcının derleyici ile tek başına çalışması gerektiği anlamına gelmez.

Bu program tasarımının olası nedenleri:

  • performans: kuralların bir tür son kullanıcı veri deposunda saklandığı ve bu kurallar tarafından işlenecek bazı toplu verileriniz olan kural odaklı bir uygulamayı düşünün. Bir kural, kuralları tekrar tekrar yorumlamak yerine, önce işlem kodunu oluşturur, derler ve işlenecek verilere karşı çalıştırır

  • son kullanıcının bir tür matematik formülü ekleyebileceği ve programın geliştiricisinin bunun için kendi ayrıştırıcısını / yorumlayıcısını uygulamak istemediği bir program düşünün. Bunun yerine, program bu formülü alır, geçerli bir program koduna dönüştürmek için bazı eklemeler yapar, derleyicinin derlemesine izin verir ve daha sonra çalıştırır.


hmm .... Bu, son kullanıcının derleyici ile tek başına çalışması gerektiği anlamına gelmez . Bu hemen hemen açıklar ve açıklar.
Pankaj Upadhyay

2

Bu doğru - derleyiciler kaynak kodunu yürütülebilir forma derler, bu da daha sonra bir linker tarafından yürütülebilir bir ikili dosyaya bağlanır. Kaynak kodu ayrıca birçok komut satırı kabuğundan biri (C-kabuk, bash, zsh, vb.), Awk, sed vb. Gibi bir yorumlayıcı tarafından doğrudan yürütülebilir.

Tartışmanızı belirli bir ürünle sınırlamadığınız sürece "geliştirici" ve "son kullanıcı" arasında net bir çizgi çizmek zor olabilir. Geliştiricilerin tümü kullandıkları araçların "son kullanıcıları" dır ve "son kullanıcılar", makinelerinde yüklü derleyiciler ve tercümanlar gibi geliştirme araçlarına sahip olabilir.


2
Tamam, bunu -1'e çevireceğim, çünkü burada derleyiciler hakkında çok fazla yanlış anlama var. Derleyiciler kodu kaynak dilden hedef dile çevirir. Makine kodu ürettiklerini söylemek, araçların 4 tekerleği olduğunu söylemeye benzer (evet, çoğu aracın 4 tekerleği vardır, ancak bir motosiklet de bir araçtır. Aynı şekilde, çoğu derleyici makine kodu üretir, ancak bir C # -> VB dönüştürücü bir derleyici de)
riwalk

1
@ Stargazer712, yanlış anlaşılma olmadığını temin ederim - derleyicilerin ne yaptığını çok iyi biliyorum, teşekkürler. Ama bilmeyen biri bana bir arabanın ne olduğunu sorarsa, muhtemelen arabanın bazılarının olmamasına rağmen dört tekerleği olduğunu söyleyebilirim . Bilgiçlik tasavvurlu bir tanım, bir kavramla uğraşmaya çalışan bir kişiye açıkladığından daha fazla kafa karıştırır. "Derleyici" bir iş tanımı da olabilir, ancak burada yardımcı olmayacağını belirtmek.
Caleb

1

Yöneticiler ayrıca çeşitli otomatik görevleri gerçekleştirmek için programlama dillerini yazma komutlarında kullanmaya ihtiyaç duyabilirler. Örneğin, bazı disk alanını boşaltmak için 90 gün sonra sunucudan eski günlük dosyalarını silen bir komut dosyasına sahip olmak. Komut dosyasını yazmak için kullanılan dil, sistemde çalıştırılabilmesi için yorumlanmalı veya derlenmelidir.


1

Bazı programlar meta-programlardır : çalışırken başka bir program (veya bazı kaynak kodu) oluşturabilir ve derleyebilir ve bir şekilde çalıştırabilir. Çok aşamalı programlama hakkında da okuyun .

Dolayısıyla, bu tür programları kullanmak için, kullanıcı kendini nasıl programlayacağını bilmese bile bir derleyici gerekecektir (çünkü bilgisayar derlenmesi gereken bir kod üretecektir).

Bir örnek için, MELT ( GCC'yi genişletmek için C ++ kodu üreten ) veya J.Pitrat'ın CAIA yapay zeka sistemine (kombine edici sorunları çözmek için C kodu -özellikle kendi kodu üreten-) bakın.

Ayrıca, bazı diller ve bazı uygulamalar neredeyse her yerde bir derleyicinin bulunmasını gerektirir (o dilde ve uygulamada kodlanmış her programda). İlk olarak, bazı web tarayıcıları bir Javascript JIT motoru içerir ( V8 gibi ). Ayrıca, çoğu Common Lisp uygulaması -eg SBCL - bir derleyici içerir ( ifadeleri oluşturabilen ve değerlendirebilen uygulamaları çalıştırmak için bile yararlıdır ). Homikonik diller ve Qine programları hakkında da okuyun .

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.