Kısa cevap: şüphede haklısın, her zaman X'te yazılmış başka bir tercümana ya da Y'den bir tercümana sahip olduğun başka bir dile derleyiciye ihtiyacın var. Tercümanlar derleyiciler sadece bir dilden diğerine tercüme de, yürütme bazı sisteminizde noktası, orada gerekir hatta sadece işlemci bulunuyor ... tercüman olmak.
Y dilinde ne kadar yeni tercüman yazdığınız önemli değildir , sonraki tercümanları yorumlamak için her zaman X ile yazılmış ilk tercümanı kullanmak zorunda kalacaksınız . Bu sadece tercümanların doğası gereği bir sorun gibi görünüyor.
Doğru. Ne yapabilirsiniz yapmak bir derleyici yazmak olduğunu Y'ye için X (veya tercüman olan başka bir dil), ve hatta o yapabilirsiniz Y . Sonra da çalıştırabilirsiniz Y yazılmış derleyici Y üzerinde Y yazılmış tercüman X (veya Y ile yazılmış tercüman Y üzerinde çalışan Y yazılmış tercüman X veya üzerinde Y yazılmış tercüman Y üzerinde çalışan Y yazılmış tercüman Y üzerinde çalışan YX ile yazılmış tercüman , ya da… ad infinitum) , Y ile X arasında yazılmış Y tercümanınızı derleyin , böylece daha sonra bir X tercüman üzerinde çalıştırabilirsiniz . Bu yolla, X dilinde yazılmış Y tercümanınızdan kurtuldunuz , ancak şimdi X tercümanına ihtiyacınız var (zaten bir taneye sahip olduğumuzu biliyoruz, çünkü aksi halde Y ile yazılmış X tercümanını koyamadık ) ve siz önce bir Y- to- X- derleyici yazmak zorunda kaldım .
Ancak , çevirme tarafında, tercümanlar hakkındaki Wikipedia makalesi aslında kendini barındıran tercümanlar hakkında konuşuyor. İşte alakalı olan küçük bir alıntı:
Bir kendi kendine tercüman, kendi kendini yorumlayabilen bir programlama dilinde yazılmış bir programlama dili tercümanıdır; bir örnek, BASIC dilinde yazılmış bir BASIC yorumlayıcısıdır. Kendi kendine tercümanlar, kendini barındıran derleyicilerle ilgilidir.
Yorumlanacak dil için bir derleyici mevcut değilse, bir kendini tercüman oluşturmak, dilin bir ana dilde (başka bir programlama dili veya montajcısı olabilir) uygulanmasını gerektirir. Bunun gibi bir ilk tercümana sahip olmakla birlikte, sistem önyüklenir ve tercümanın yeni sürümleri dilin kendisinde geliştirilebilir
Yine de, bana bunun tam olarak nasıl yapılacağı belli değil. Görünüşe göre, ne olursa olsun, tercümanınızın ilk sürümünü ana bilgisayar dilinde yazılmış olarak kullanmak zorunda kalacaksınız.
Doğru. Wikipedia makalesinin açıkça , dilinizin ikinci bir uygulamasına ihtiyacınız olduğunu söylediğini ve ilkinden kurtulabileceğinizi söylemediğini unutmayın.
Şimdi yukarıda belirtilen makale, Vikipedi'nin sözde kendini barındıran tercümanlardan bazı örnekler verdiği başka bir makaleye bağlantı vermektedir. Daha yakından bakıldığında, bu kendi kendini barındıran tercümanların çoğunun (özellikle PyPy veya Rubinius gibi daha yaygın olanlardan bazıları) ana "tercümanlık" bölümünün aslında C ++ veya C gibi diğer dillerde yazılmış olduğu görülmektedir.
Yine doğru. Bunlar gerçekten kötü örneklerdir. Mesela Rubinius'u ele alalım. Evet, Rubinius’un Ruby kısmının kendi kendini barındırdığı doğrudur, ancak bir derleyicidir, tercüman değildir: Ruby kaynak kodunu Rubinius bytecode’a derler. Tercüman bölümü OTOH kendine ait değildir: Rubinius bytecode'unu yorumlar, fakat C ++ ile yazılmıştır. Bu nedenle, Rubinius'u "kendi kendine barındırılan bir tercüman" olarak adlandırmak yanlıştır: Kendi kendine barındırılan bölüm bir tercüman değildir ve söz konusu tercüman bölüm kendi kendine barındırılamaz .
PyPy benzer, ancak daha da yanlış: ilk etapta Python'da bile yazılmıyor, farklı bir dil olan RPython'da yazıyor. Anlamsal olarak "genişletilmiş bir alt küme" olan Python'a sözdizimsel olarak benzer, ancak aslında Java ile aynı soyutlama düzeyinde kabaca statik olarak yazılmış bir dildir ve uygulaması, RPython'u C kaynak koduna (ECMAScript) derleyen çoklu arka uçlara sahip bir derleyicidir kaynak kodu, CIL bayt kodu, JVM bayt kodu veya Python kaynak kodu.
Peki yukarıda tarif ettiğim şey mümkün mü? Kendi kendini barındıran bir tercüman asıl sunucusundan bağımsız olabilir mi? Eğer öyleyse, bu tam olarak nasıl yapılır?
Hayır, kendi başına değil. Orijinal tercümanı tutmanız veya bir derleyici yazmanız ve kendi tercümanınızı derlemeniz gerekir.
Orada olan bazı meta-dairesel gibi VM'lerin, Klein (yazılı Öz ) ve Maxine (Java ile yazılmış). Bununla birlikte, burada "meta-dairesel" tanımının farklı olduğunu unutmayın: bu VM'ler yürüttükleri dilde yazılmaz : Klein, Self bytecode'u çalıştırır ancak Self'de yazılır, Maxine JVM bytecode'u çalıştırır ancak Java'da yazılmıştır. Ancak, VM Öz / Java kaynak kodu aslında Öz / JVM bayt kodu derlenmiş ve daha sonra VM tarafından yürütülen, böylece zaman VM işletilirse alır, bu ise o yürütür dilinde. Uf.
Bunun SqueakVM ve Jikes RVM gibi VM'lerden farklı olduğunu da unutmayın . Jikes, Java ile yazılmıştır ve SqueakVM, Slang'da (kabaca üst seviye bir montajcı ile aynı soyutlama düzeyinde statik olarak yazılmış bir sözdizimsel ve anlamsal bir Smalltalk alt kümesi) yazılmıştır ve her ikisi de çalıştırılmadan önce yerel koda statik olarak derlenir. Kendi içlerinde koşmazlar. Sen olabilir , ancak, onları çalıştırmak on-top kendilerini (veya başka bir Smalltalk VM / JVM üstünde). Ancak bu anlamda “meta-dairesel” değildir.
Maxine ve Klein, OTOH yapmakkendi içlerinde koşmak; kendi uygulamalarını kullanarak kendi bayt kodlarını uygularlar. Bu gerçekten akıl almaz! Bazı serin optimizasyon fırsatlarına izin verir, örneğin VM, kullanıcı programı ile birlikte kendisini yürüttüğü için, kullanıcı programından VM'ye yapılan çağrıları sıraya koyabilir ve tam tersi, örneğin çöp toplayıcısına yapılan çağrı veya bellek ayırıcı kullanıcının içine girebilir kodu ve kullanıcı kodundaki yansıtıcı geri aramalar, Sanal Makineye dahil edilebilir. Ayrıca, modern VM'lerin yürüttüğü akıllı optimizasyon püf noktalarının tümü, yürütme programını izleyen ve gerçek iş yüküne ve verilere göre optimize ettikleri yerde, VM, kullanıcı programı yürütürken kullanıcı programını yürütürken aynı püf noktalarını kendine uygulayabilir belirli iş yükünü yürütüyor. Başka bir deyişle, VM bunun için kendini uzmanlaştıçalışan belli bir program olduğunu belli iş yükü.
Ancak, yukarıda "tercüman" kelimesini kullandığımı fark ettim ve her zaman "execute" kullandım? Eh, bu VM'ler tercümanların etrafında kurulmazlar, bunlar (JIT) derleyicileri etrafında kurulur. Daha sonra Maxine'ye eklenmiş bir tercüman vardı, ancak her zaman derleyiciye ihtiyacınız var: VM'yi bir kez daha başka bir VM'nin üzerinde çalıştırmanız gerekir (örneğin, Maxine durumunda Oracle HotSpot), böylece VM (JIT) kendisini derleyebilir. Maxine söz konusu olduğunda, JIT kendi önyükleme aşamasını derleyecek, daha sonra yerel kodu bir önyükleme VM görüntüsüne derleyecektir ve çok basit bir önyükleyiciyi ön tarafa yerleştirecektir (sadece C için yazılmış VM'nin tek bileşeni) , ayrıca Java da olabilir). Artık Maxine'i çalıştırmak için kullanabilirsiniz.