it-swarm.dev

Neden bir programlama dilinden diğerine otomatik çevirmenler yok?

Çoğu programlama dili Turing tamamlandı, yani bir dilde çözülebilen herhangi bir görev başka bir dilde, hatta Turing makinesinde çözülebilir. Öyleyse neden programları herhangi bir dilden başka bir dile çevirebilen otomatik çevirmenler yok? İki dil için birkaç deneme gördüm, ancak her zaman yalnızca bir dilin sınırlı bir alt kümesinde çalışırlar ve gerçek projeleri dönüştürmek için neredeyse hiç kullanılamazlar.

En azından teoride, tüm diller arasında% 100 doğru çevirmen yazmak mümkün müdür? Uygulamadaki zorluklar nelerdir? Çalışan mevcut çevirmenler var mı?

37
serg

En büyük sorun, program kodunun gerçek çevirisi değil, platform API'sının taşınmasıdır.

PHP to Java çevirmen.) PHP ikilisinin bir kısmını gömmeden bunu yapmanın tek mümkün yolu PHP'nin tüm modüllerini ve API'lerini Java'da yeniden uygular.Bu, 10.000'den fazla fonksiyonun uygulanmasını içerir .. Sözdizimini gerçekte tercüme etme işinin pasta gibi kolay olması ve tüm bu çalışmalardan sonra bile Java kodunda, Java platformunda çalıştırılan, ancak PHP gibi içeride yapılandırılmış) bir tür canavarlığa sahip olacaksınız.

Bu nedenle akla gelen bu tür araçların hepsi, daha sonra korumak için değil, kodu dağıtmak için çevirmeyle ilgilidir. Google'ın GWT'si "derliyor" Java JavaScript'e. Facebook'un hiphop'u PHP C'yi derliyor.

32
Joeri Sebrechts

Ara bir biçiminiz varsa, X Dilindeki bir programı bu biçime ve ayrıca 'dan Dil Y'ye. Bu dönüşümleri ilgilendiğiniz tüm diller için uygulayın ve işiniz bitti mi?

Biliyor musun? Böyle bir format zaten var: Montaj. Derleyici zaten "Dil X to Assembly" dönüşümünü yapar ve "Assembly to Language Y" dönüşümüne ayırır.

Şimdi, Meclis ters dönüşümü yapmak için büyük bir dil değil, ama MSIL aslında o kadar da kötü değil. İndir Reflector ve bir .NET Meclisini farklı dillerde bir araya getirmenin seçeneklerinin olduğunu göreceksiniz (ve eklentiler daha da fazlasını sağlar). Bu nedenle, C # 'da bir program almak, bir DLL (yani MSIL)) derlemek, sonra VB, C++/CLI, F # ve bir bütün olarak sökmek için reflektör kullanmak oldukça mümkündür Tabii ki, diğer tüm dönüştürme çalışmaları da .. Bir F # dosyası alın, bir DLL'ye derleyin, C # 'a dönüştürmek için Reflektör kullanın.

Tabii ki, bulacağınız iki büyük sorun:

  1. Kod temelde okunamıyor. MSIL (hata ayıklama bilgileriyle bile) orijinal kaynaktan çok fazla bilgi kaldırır, bu nedenle çevrilen sürüm% 100 uygunluğa sahip değildir (teorik olarak bir C # -> MSIL-> C # dönüşümü size orijinal kodu geri vermelidir, ancak alışkanlık).
  2. Birçok .NET dilinin kendi özel kitaplıkları vardır (örneğin, VB çalışma zamanı kitaplığı, F # kitaplığı ve benzeri).

# 2 civarında gerçekten hiçbir şey yok, ancak muhtemelen MSIL'de bazı ek açıklamalarla # 1 civarında olabilir (özniteliklerle, belki de). Tabii ki bu ek bir çalışma olurdu.

20
Dean Harding

En azından teoride, tüm diller arasında% 100 doğru çevirmen yazmak mümkün müdür? Uygulamadaki zorluklar nelerdir?

  • Daha yapılandırılmış bir dilden, hala Turing-complete olan daha az yapılandırılmış bir dile çevirmek her zaman mümkündür.
    • Bu iddia kesinlikle teknik anlamda incelenmelidir: Bu, çevrilen program yürütüldüğünde tam olarak aynı sonucu üreteceği anlamına gelir.
    • Çevrilmiş kodun okunabilirliği veya orijinal program yapılarının korunması hakkında hiçbir şey ima edilmemektedir.
  • Daha az yapılandırılmış bir dilden daha yapılandırılmış bir dile çeviri yapmak mümkündür, ancak çevrilen kod daha az yapılandırılmış biçiminde kalacaktır.
20
rwong

Neden bir programı dönüştürmek istersiniz?

Her iki dil, kaynak ve hedef dil (sanal) makine kodunda zaten derlenmiştir *, bu nedenle teknik nedenlerden dolayı başka bir üst düzey dilde derleyiciye gerek yoktur.

Diller insanlar içindir. Yani, sorunuzun üstü kapalı şartı: 'neden okunabilir okunabilir kodu üreten bir çevirmen yok' ve cevap (imho) olurdu: çünkü yeterince farklı iki dil varsa, 'okunabilir kodun' yazılma yöntemleri sadece algoritmaları çevirmekle kalmayıp aynı zamanda farklı algoritmalar almayı gerektirecek şekilde farklıdır.

Örneğin, tipik bir C ve LISP yinelemelerini karşılaştırın. Ya da deyimsel Ruby ile pitonlar 'en iyi yol'.

Burada, aynı diller gerçek dilde göründüğünüz gibi görünmeye başlıyor, tıpkı ingilizceden almancaya çeviri yaparken 'Kedileri ve köpekleri yağmur yağıyor' anlamında bir şeye çeviriyormuşsunuz gibi, İngilizce'den Almanca'ya çeviri yaparken, Artık Word'ü Word'e çevirin, ancak anlamını aramalısınız.

Ve 'anlam' üzerinde çalışmak kolay bir kavram değildir.

*) iyi, kahve var ...

10
keppla

Teorik olarak mümkün ama çoğunlukla işe yaramaz. Kaynak ve hedef dillerin hemen hemen her türlü kombinasyonu mümkündür, ancak çoğu durumda hiç kimse sonuca bakmak veya kullanmak istemez.

C derleyicileri var olan hemen hemen her platform için mevcut olduğundan (ve bir işlemciyi tasarlamanıza ve yeni işlemcinizi hedefleyen bir C derleyicisini otomatik olarak oluşturmanıza izin veren otomatik derleyici jeneratörleri vardır), çünkü adil sayıda derleyici C'yi hedefler. Elbette, .NET, JVM, C-- ve LLVM gibi çeşitli sanal makineler tarafından kullanılan dilleri hedefleyen çok sayıda uygulama da vardır.

Bununla birlikte, kilit nokta, sadece hedefe davranmanızın temel olarak derleme sürecinde bir adım olarak kullanılan bir Montaj dili olması durumunda gerçekten yararlı olmasıdır. Özellikle, genellikle normal bir programcının bu sonucu okumasını veya üzerinde çalışmasını istemezsiniz; genellikle çok okunaklı olmaz.

6
Jerry Coffin

FWIW, Java ila D arasında bir çevirmen var. Buna TioPort denir ve SWT'yi D'ye taşımak için oldukça ciddi bir girişimde kullanıldı. Java standart kitaplığın büyük bölümlerini taşımak gerekliydi).

5
dsimcha

Kendi başına kod çevirisi olmasa da, dil çalışma tezgahları kavramı, tüm diller arasında% 100 doğru çevirmene benzer bir şeyin nasıl uygulanabileceğini gösterir.

Mevcut yaklaşımımızda, kaynak kodu metin biçiminde saklanmaktadır. Derleme sırasında, bu okunabilir metin dosyaları soyut bir sözdizimi ağacı temsiline ayrıştırılır ve bu da bayt kodu veya makine kodu oluşturmak için kullanılır. Ancak bu soyut temsil geçici ve derleyici içindedir.

Dil tezgahı yaklaşımında, benzer bir soyut sözdizimi ağacı temsili kalıcı, depolanmış eserdir. Hem makine kodu hem de metinsel 'kaynak' kodu bu soyut temsile dayanarak oluşturulur. Böyle bir yöntemin sonuçlarından biri, programın soyut sunumunun aslında dile agnostik olması ve uygulanan herhangi bir dilde metin kodu oluşturmak için kullanılabilmesidir. Yani, bir kişi en uygun gördüğü dili kullanarak sistemin farklı yönleri üzerinde özgürce çalışabilir ya da ekibin her üyesi, en aşina oldukları dilde paylaşılan proje üzerinde çalışabilir.

Bildiğim kadarıyla, teknoloji hala genel gelişimde kullanılabilir olmaktan çok uzak, ancak bağımsız olarak üzerinde çalışan birkaç grup var. Herhangi birinin vaatlerini yerine getirip getirmeyeceğini söylemek zor, ama bunun olduğunu görmek ilginç olurdu.

4
scrwtp

bazı otomatik çevirmenler vardır. Amacınız okunabilir kod yerine derlenebilir kod üretmekse, çok sık değil, oldukça olası ve bazen yararlıdır. Ünlü olarak, ilk C++ derleyicisi aslında bir derleyici değildi, ancak C++ 'ı daha sonra C derleyicisi tarafından derlenen (gerçekten karmaşık) C kaynağına çevirdi. Birçok derleyici istek üzerine Montaj kodu oluşturabilir - ancak Montaj metnini tükürmek ve sonra makine koduna çevirmek yerine, normalde doğrudan makine kodu oluşturabilirler.

A dilinin tam bir belirtimi göz önüne alındığında, prensipte bazı dillerde B direktiflerini ifade eden bir program yazmak o kadar da zor değildir. Ancak genellikle sorun yaşayan herkes "B dili" için gerçekten düşük bir şey seçecektir: Makine kodu veya bu gün bayt kodu: Jython, python VM tarafından yorumlanan Java bayt kodunu oluşturan Java uygulamasının bir uygulamasıdır. Java sınıfı hiyerarşilerini yazmak ve derlemek zahmetine gerek yok!

4
alexis

Bu her zaman yapılır.

Her derleyici , yorumlanan diller durumunda C++ gibi "birincil dili" makinenin yerel Meclis diline veya mimariden bağımsız bayt koduna çevirir .

Yine de bahsettiğin şey bu değil. Muhtemelen C++ 'ı Java veya Python gibi bir şeye dönüştüren bir çevirmen istersiniz. Bunun anlamı nedir?) En iyi durumda, sonuç orijinal kaynakla aynı verimliliğe sahip olacaktır. Pratik olarak, çok daha kötü olacak.)

Eğer kodun sadece anladığınız bir dil olarak okuyabilmeniz için çevrilmesini istiyorsanız, böyle bir çevirmen istenen etkinin tam tersine sahip olacaktır. Bir yığın şifreli, sezgisel ve okunamayan kodla bırakılacaksınız.

Bunun nedeni sadece en önemsiz şeylerin doğrudan bir dilden diğerine dönüşmesidir. Çoğu zaman, bir dilde basit olan bir başkası için büyük kütüphaneler gerektirir - veya tamamen imkansız olabilir. Bu nedenle:

  1. Program önemsiz ise, iyi bir sonuç alabilirsiniz. Ama sonra, bu kadar basitse, bir çevirmenden geçmenin anlamı nedir?
  2. Program önemsizse, kod düşük kalitede olacaktır.

Sonunda, iyi kod yazmanın tek yolu aslında yazmaktır. Bilgisayarlar - en azından henüz - okunabilirlik, en iyi uygulamalar ve zarif çözümler konularında insanları eşleştiremezler.

Kısacası, buna değmez.

3
Maxpm

Programlama dilleri için herhangi bir dil çevirmeni yoktur çünkü programlama dilleri inanılmaz derecede karmaşıktır. Varsayımsal olarak mümkün olsa da, birçok zorluk var.

İlk zorluk sadece dilin kabul edilebilir uygulamalarındadır. Java ve C++ gibi iki nesne yönelimli dil arasında dönüştürme yapmak inanılmaz derecede karmaşıktır ve her ikisi de C tabanlıdır. Tercüman programı, her iki dil için standart kütüphaneler hakkında mükemmel bilgiye sahip olmalı ve Muazzam bir sözlük oluşturmanız gerekir ve o zaman bile, programcıdan programcıya olan programlama stillerindeki farklılıklar, bazı değişikliklerin nasıl yapılacağını tahmin etmesi gerektiği anlamına gelir.

Sözdizimi çevirisini indirdikten sonra, ilk dilde bir yapının ikinci dilde bir yapıya nasıl dönüştürüleceğini anlamanız gerekir. C++ 'da bir nesneyi Java (nispeten kolay)) bir nesneye gidiyorsanız iyi olur, ancak C++ yapılarınızla ne yaparsınız? Veya C++ sınıflarının dışındaki işlevler - Bunun nasıl ele alınacağına karar vermek, başka bir soruna, yani bir blob nesnesinin yaratılmasına neden olabileceğinden zor olabilir.Top, yeterince yaygın bir antipatterndir.

Bu sorunların tam bir listesi değil, ama bunlar sadece iki ve büyük olanlar. Profesörlerimden biri, birisinin işverenini 80'lerde makine kodundan C'ye bir tane yapabileceklerine ikna ettiğini söyledi, ancak o zaman işe yaramadı. Tam olarak çalışan bir tane olacağından şüpheliyim.

1
indyK1ng

Derlemenin amacı bilgisayar için yararlı bir şey elde etmektir. yani çalışabilecek bir şey. Neden yazdığınızdan daha yüksek bir şey bile derleyesiniz ki?

.NET stratejisini daha çok seviyorum. Her şeyi ortak bir dile derleyin. Bu, (N ^ 2) -N çapraz dil derleyicileri oluşturmaya gerek kalmadan, iletişim kurabilen dillerin faydasını sağlar.

Örneğin, 10 programlama diliniz varsa, .NET modeli altında yalnızca 10 derleyici yazmanız gerekir ve hepsi birbirleriyle iletişim kurabilir. Mümkün olan tüm çapraz dil derleyicilerini yaptıysanız, 90 derleyici yazmanız gerekir. Bu, az fayda için çok fazladan iş.

1
mike30