“A dili B dilinde yazılmış” anlamına gelir?


31

Sık sık dil A Örneğin dil B'de yazılır o terimi duymak, PHP yazılmıştır C , C # ile yazılmış C ++ .

Birisi lütfen bunun ne anlama geldiğini ve doğru olup olmadığını açıklayabilir mi? Bunun dilin kullandığı tercüman derleyicisiyle ilgisi var mı?

Ayrıca, uygulayıcı dil seçiminin dayandığı faktörler nelerdir?


19
Kesinlikle, "PHP C ile yazılmıştır" yanlıştır. Dil kendi başına resmi bir tanımdır, bu nedenle başka bir programcı dilde yazılmaz (ancak İngilizce); sadece derleyici, tercüman ve / veya kütüphane C, C ++ ya da her neyse yazılabilir. Uygulamada, birçok dil için bir baskın derleyici ya da tercüman vardır ve dil tanımı ile uygulama arasındaki ayrım yapılmamıştır.
user281377

İlginçtir ki, BCPL çoğunlukla
BCPL'de

7
PHP "per se", resmi bir tanım değildir. Bu bir C programıdır.
Kaz

8
s/written/implemented/ve çok daha net.
TMN

2
@ugoren Montajda yazılı birçok C derleyicisi vardı. Yine de bu yüzyıl değil.
Ross Patterson

Yanıtlar:


30

Çoğu programlama dili iki kategoriye ayrılır: yorumlanmış ve derlenmiş diller.

Derlenmiş dili tarafından çevrilmiştir derleyici içine makine kodu , dil işlemci ile doğrudan adım adım çalıştırır. Tercüme edilmiş bir dil ise, dil kodunu çalıştırmak için bir aracı, tercüman kullanır . Tercümanın kendisi genellikle makine koduna göre derlenmiş başka bir programdır.

PHP, tercüme edilmiş bir dildir. PHP kodunu çalıştırmak için ayrı bir programa ihtiyacınız var , bilgisayar programı doğrudan çalıştırmıyor. Bu ayrı program, PHP tercümanı, C dilinde yazılmıştır.

C # derlenmiş bir dildir, ancak makine koduna göre derlenmemiştir. Bunun yerine, sanal bir makinede çalıştırılmak üzere uzman bir dile, bayt koduna göre derlenir. Java böyle bir kurulumun başka bir örneğidir. Sanal makinenin tercüman olduğu derleme ve yorumlama arasında bir melez olarak görebilirsiniz. C # (CLI veya Ortak Dil Altyapısı ) için sanal makine , C ++ dilinde yazılmıştır.

Diğer örnekler:

  • Python: Python yorumlayıcısı Python kodunu Python bayt koduna derler, ardından bayt kodunu yorumlar. Tercümanın kendisi C ile yazılmıştır. IronPython adlı C # için kullanılan aynı CLI üzerinde çalışmak için pitonu ve IronPython olarak adlandırılan aynı CLI üzerinde çalışan ve Java sanal makinesi olan Jython da dahil olmak üzere yeni uygulamalar eklenmiştir . Daireyi tamamlamak için, Python, PyPy (bir altkümesi) içinde yazılmış bir Python sürümü vardır .
  • Ruby: Ruby salt bir yorumlanmış dil olarak başladı, ancak en yeni sürüm bytecode kullanmaya başladı. Ruby için de IronRuby adında CLI'ye ve Java VM için JRuby adında bir proje var .

Üzgünüm, sanal bir makinenin tercümandan ne kadar farklı olduğu? Birini kullanarak nasıl derleme için bir yarı nokta olduğunu anlamıyorum. Bayt kodunun yarısının derlendiğini mi söylüyorsunuz?
Philip

1
@Philip: Bayt kodu makine kodu değil; bu nedenle CPU'ya doğrudan talimatlar vermek yerine, bayt kodunu almak ve yorumlamak için yine de makine talimatlarına çevirmek için bir tercümana ihtiyacınız var. Bunun avantajı, sanal makinenin diğer mimarilere bağlantı yapmaktan daha kolay olması ve JIT derlemesi gibi püf noktaları kullanabilmenizdir .
Martijn Pieters

"Derlenmiş" terimi pazarlama amacıyla inceltilmiş gibi hissediyorum?
Philip

2
Oha! Onu geri alırım. Bir süredir yanlış yoldan aşağı iniyordum. "Derlenmiş" işlemin, makine koduna ve sadece makine koduna dönüşmesi anlamına geldiğini varsaydım. Bu sadece kodu diğer koda çevirmek için kullanılan bir terimdir. Bu makine kodu, bayt kodu veya istediğiniz dili seçin. Ayrıca, orada PHP derleyicileri olduğu ortaya çıktı, bu yüzden sadece "genellikle" yorumlandığını söyleyebilirsin.
Philip

Ayrıca iyi bir kaynak: youtube.com/watch?v=e4ax90XmUBc
Adam

34

Temel olarak haklısın. Ruby'nin C dilinde yazılmış olduğu söylenirse, dil yorumlayıcısı ve çekirdek kütüphanesinin bazı kısımları C dilinde yazılmıştır.

Bu yüzden Ruby tercümanı bir metin dosyasını girdi olarak alan, onu işleyen ve daha sonra başka bir metin dosyasındaki (Ruby'de yazılmışsa) ya da C kodunu derleyen, gereken temel fonksiyonelliğin fonksiyonlarını çağıran bir C programıdır. Bellek, dosya sistemi ve daha fazlası gibi sistem kaynaklarına doğrudan erişmek için. Ve çok yüksek performans gerektiren bazı fonksiyonlar.

Yani bir dilin başka dillerde yazılmış veya yazılması gereken farklı bölümleri var. Hiçbir şey, C'yi tercümanı, C ++ 'da ise kütüphaneleri yazmaktan alıkoyamaz. Birden fazla adıma bile sahip olabilir ve daha sonra bazı C kodlarıyla işlenen bazı ara verileri üretmek için metin işlemede çok iyi bir dil kullanabilirsiniz.

Karar faktörleri, diğer karmaşık uygulamalardakilerle aynı olabilir. Performans birdir. Doğrudan sistem kaynaklarına doğrudan erişebilen bir kod yazabilme. Bu yüzden çoğu durumda derlenmiş bir dil olmalıdır (teoride Python'da bir Ruby tercüman yazabilseniz de). Dilinizin Linux, Win, OS X ve diğerleri üzerinde çalışmasını istiyorsanız, farklı sistemlerde kullanılabilirlik önemlidir.


Gönderdiğim andaki cevabım için neden üç tane artı puan gördüğümü bilen var mı?
thorsten müller

1
Şimdi dördünü görüyorum ama ne sorduğundan emin değilim. Olumsuzlar çok mu hızlı görünüyordu? Eğer öyleyse, iyi, soru üzerine çok fazla göz (üç neredeyse eşzamanlı cevap) ve cevabınız iyi.
yannis

Hmm .. Evet. Belki de onu kurtardım ve kurdum, tekrar kaydettim ve ilk kaydı unuttum (yaşlanıyorum). Benim için gönderdiğim an ilk üç oyu almış gibiydim.
thorsten müller

@ thorstenmüller +1 "Hiçbir şey sizi tercümanı C ve C ++ kütüphanelerinde yazmaktan alıkoyamaz" diye sormak üzereydim. Çekirdek kütüphaneleri başka bir dilde iken tercümanın / derleyicinin bir dilde olduğu herhangi bir ünlü uygulama var mı?
Songo

@ thorstenmüller Birkaç kez bunun vesilesiyle oldum. Birkaç kişi sorduğunuzu yayınladığınız soruyu görüyorsa, gönderdiğiniz an veya iki saniye içinde "yeni bir cevap gönderildi" diyen küçük bir mesaj gönderilir, böylece tüm yanıtı gözden kaçırmış ve 10 saniye içinde reddetmiş olabilirler. gönderdiğinizden. Ek olarak, yanıtı gönderdikten sonraki 5 dakika içinde yapılan düzenlemeler düzenleme geçmişinde görünmez ve bu da sizin tarafınızdan küçük karışıklığa neden olabilir.
Izkata

10

Bu sadece, A dilinin çoğunun , B dilinde yazılmış olduğu anlamına gelir . Bu, "A dilinin özü" nün dilden dilden farklı olabileceği anlamına gelir, ancak genel olarak doğru tahmin edersiniz, bunun derleyici veya tercüman olduğu anlamına gelir. Başka bir dilde bir dil seçmek için karar vermede belirleyici faktör, hemen hemen her projede olduğu gibi, geliştiricilerin daha fazla hangi dilde aşina olduklarıdır.

Bununla birlikte, "A dili B dilinde yazılmıştır" ifadesi çoğu modern dil için bir basitleştirmedir. Python'u bir örnek olarak alırsak, referans uygulaması CPython gerçekten C dilinde yazılmış olsa da, Jython (Java ile yazılmış), IronPython (C # ile yazılmış), PyPy (Python ile yazılmış ) gibi başka dillerde yazılmış uygulamalar vardır. CLPython (Common Lisp ile yazılmış), Stackless Python (C ve Python ile yazılmış) ve Unladen Swallow (C ++ ile yazılmış).

Bir programlama dili bir tanımdır ve Python örneğinin gösterdiği gibi, derleyicisinin, tercümanının ve kütüphanelerinin hangi dillerde yazılabileceği konusunda herhangi bir kısıtlama yoktur. Ve elbette bir dilin kendi içinde de yazılması mümkündür. bootstrapping adı verilen bir işlemle .


2
CPsyton'un bir uzantısı olarak çalıştığı için Psyco'ya başka bir uygulama demezdim.
Martijn Pieters

@MartijnPieters Siteye göre de ölü bir proje. Kaldırıldı.
yannis

@YannisRizos Unladen Swallow da ölmedi mi?
Andres F.

1
@Songo: Bunun dışında onu string.lower(s)temsil return s.lower()eden, doğru olan bir python işlevidir . CPython 3.3 dize kasa işlemleri C. uygulanmaktadır
Martijn Pieters


3

Bir programlama dili kullanma perspektifinden bakıldığında, bir programlama dili sadece bir programdır. Bir derleyici olabilir veya bir tercüman olabilir veya bir tür sanal makine olabilir. Bunların hepsi sadece bilgisayar programları ve bu nedenle herhangi bir dilde yazılabilir.

Bu nedenle, eğer kendi PHP versiyonunuzu oluşturmak istiyorsanız, en akıcı hangi dilde olursanız oradan başlayabilirsiniz. Daha sonra PHP formatındaki kodu okuyabilen ve PHP spesifikasyonunun programınızın yapması gerekeni yaptığını söyleyebilecek bir program yazabilirsiniz. . Böylece X dilinde X dili yaratıyorsunuz.


İlginç nokta. Yani temelde PHP'yi explodea Stringalıp geri döndüren yerleşik bir işleve sahipsem Array, uygulamasını (yani diziyi üretmek için dizede çalışacak kod) kodunu C yazıyor , değil mi?
Songo

@Songo: doğru. Yine, PHP sadece bir programdır, Word veya Apache veya Notepad veya vi veya emacs'den farklı değildir. Verileri okur ve bir dil belirtimine göre ayrıştırır, sonra dil belirtiminin yapması gerekeni yapar.
Bryan Oakley

Bu cevap, dili uygulama ile fena şekilde birleştirir.
Russell Borogove

Bunun en basit ve en doğrudan cevap olduğunu düşünüyorum ve bir şeyi nasıl birleştirdiğini anlamıyorum. Hatta birden fazla PHP uygulaması olabileceğini de öne sürüyor. Aslında, bazıları, orijinal PHP ve Facebook olayı var ve diğerleri de olabilir.
Warren P

@RussellBorogove: "Bir programlama dili kullanma açısından" cevabının netleştirilmesine yardımcı olduğunu düşünmüyor musunuz? Unutmayın, bu soru ile mutlak bir başlangıç ​​yapıyoruz, bu yüzden amacın adil olduğunu göstermek için küçük bir hassasiyetten fedakarlık ediyoruz, IMO.
Bryan Oakley

3

Tamamen farklı anlamlara sahip benzer ifadeler "B dilinde A dili yazmak", örneğin "C dilinde Java yazmak" dır.

Bu, bir dilde sözdizimsel olarak doğru olan, ancak başka bir dilden yapıları, deyimleri ve kuralları kullanan kodu açıklar. "Java'da C yazma" örneğinde, bunun işaretleri, tüm yerel değişkenleri enums yerine tamsayı sabitleri kullanarak, tanımlayıcıları_with_underscores, vb.

Genelde bu, birisinin uzun süre bir dilde çalıştığı (özellikle de yalnızca o dilde çalıştığı zaman ) ve geçerli dilin (veya temiz kod yazmakla ilgilenmediği) çok yeni olduğu durumlarda olur.


"CPython C dilinde yazılmıştır" kesinlikle "bu kullanıcının Python'da C yazdığı gibi yazdığı" anlamına gelmez. Bu, CPython (Windows'ta Python.exe, Unix'te / usr / bin / python) anlamına gelir. C
Warren P

@Warren P: elbette, fakat ifadeler birbirine çok benziyor, bu yüzden her ikisine de aşina olmayan insanlar kolayca bir açıklama bulabilirler.
Michael Borgwardt

3

Teknoloji doğal olarak yinelemeli bir süreçtir. Basit araçlar ile başlıyoruz ve daha sonra bu araçları daha iyi araçlar yapmak için kullanıyoruz. İlk montaj dilleri, çip için standart hale getirilmiş komut bayt kodlarının 1: 1 çevirileridir; 8086 mimarisi ve bir araya getiricisi Z80, RISC, vb. gibi diğer mimarilerde baskın hale geldi ve böylece FORTRAN, COBOL, Pascal ve C gibi 8086 meclisine sindirilebilecek diller geliştirmeye başladık. bu dillerin daha ilkel bir şeyle yazılması gerekir, aksi takdirde bir tavuk-yumurta argümanına kapılırsınız; ilk C derleyicisinin kaynak kodu C'ye yazılmışsa, o zaman bu C kaynak kodunu ne derledi ve tanım olarak ilk C derleyicisi olmaz mı?

Temel olarak, "C #, C ++ dilinde yazılmıştır", C # dilinin (Microsoft .NET Framework olanları ve komut satırı derleyicisinin belirtimine uyan ilk ve / veya en popüler derleyici ve çalışma zamanı / çekirdek kitaplıklarının olduğu anlamına gelmelidir) program CSC.exe) C ++ ile yazılmıştır.


0

"Dil A, B dilinde yazılmıştır", A dilinin (veya yaygın olarak kullanılan tek dil) tek uygulamasının aslında B dilinde geliştirilen bir proje ve tek, eksiksiz olan proje olduğu anlamına gelir. A'nın özelliği, dokümantasyon ve B programı uygun değilse, B programının genellikle doğru görüleceği şekilde uygulayan B kaynak kodudur.


C ++ 'ın yetkili bir uygulaması yoktur. C ++ durumunda, özellik doğrudur ve özellikteki tanımsız davranışlar uygulamanızda herhangi bir şey yapabilir. Yani hayır, bu doğru değil.
Warren P,

Önceki yorumun cevabımla ne ilgisi olduğunu anlamıyorum. Tüm diller hakkında evrensel olarak ölçülmüş bir ifade vermedim ve bu nedenle C ++ karşı örnek uygulanamaz. B'nin "İngilizce" olduğu durumlar haricinde, "A ++ C" olduğu "A B dilinde yazılır" ifadesinin bir anlamı yoktur.
Kaz
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.