Yorumlanmış ve derlenmiş kod arasındaki fark, Raphael'in yorumunda vurgulandığı gibi, muhtemelen bir kurgudur :
the claim seems to be trivially wrong without further assumptions: if there is
an interpreter, I can always bundle interpreter and code in one executable ...
Gerçek şu ki, kod her zaman, yazılım, donanım veya her ikisinin bir kombinasyonu olarak yorumlanır ve derleme işlemi, hangisinin olacağını söyleyemez.
Derleme olarak algıladığınız şey, bir dil (kaynak için) başka bir T diline (hedef için) çeviri işlemidir . Ve, S tercümanı genellikle T tercümanından farklıdır .STST
Derlenmiş programı bir sentaks formu çevrilir başka sözdizimsel formuna P T , öyle ki dil amaçlanan semantik verilen S ve T , U S ve P , T bir kaç şey kadar, aynı hesaplama davranışı olduğunu sen genellikle karmaşıklık veya basit verimlilik (zaman, alan, yüzey, enerji tüketimi) gibi optimize etmek için değişmeye çalışıyorlar. Kesin tanımlamalar gerektireceği için fonksiyonel denklikten bahsetmemeye çalışıyorum.PSPTSTPSPT
Bazı derleyiciler aslında yürütmeyi "iyileştirmek" için değil, yalnızca kodun boyutunu azaltmak için kullanılmıştır. Platon sisteminde kullanılan dil için durum buydu (derleme olarak adlandırmasalar bile).
Derleme işleminden sonra tercümanına artık ihtiyaç duymuyorsanız, kodunuzun tamamen derlenmiş olduğunu düşünebilirsiniz . En azından, teorik sorudan ziyade bir mühendislik olarak sorunuzu okuyabilmemin tek yolu budur (teorik olarak tercümanı her zaman yeniden kurabilirim).S
Problem yaratabilecek bir şey, afaik, meta-daireselliktir . Bu, bir programın sözdizimsel yapıları kendi kaynak dili manipüle edeceği ve daha sonra orijinal programın bir parçası olmuş gibi algılanan bir program parçası yaratacağı zamandır. Eğer dil keyfi programı parçalarını üretebilir yana S anlamsız sözdizimsel parçaları manipüle keyfi hesaplama sonucunda, sana (bakış bir mühendislik açısından) neredeyse imkansız hale getirebilir dil haline programı derlemek tahmin ediyorum T , böylece şimdi T'nin fragmanlarını oluşturur . Bu nedenle için yorumlayıcı S ihtiyaç duyulabilir veya en az derleyici olacak S içinSSTTSSS ' de üretilen parçalarınanında derlenmesiiçin T (ayrıcabu belgeye bakın).TS
Ancak bunun nasıl doğru bir şekilde formüle edilebileceğinden emin değilim (ve şu anda bunun için zamanım yok). Ve imkansız , resmileşmemiş bir mesele için büyük bir kelimedir.
Diğer açıklamalar
36 saat sonra eklendi. Bu çok uzun devam filmi atlamak isteyebilirsiniz.
Bu soruya yapılan birçok yorum, sorunun iki görüşünü gösterir: onu anlamsız gören teorik bir bakış açısı ve ne yazık ki kolay kolay şekillendirilemeyen bir mühendislik görüşü.
Yorumlama ve derlemeye bakmanın birçok yolu var ve birkaç tane çizmeye çalışacağım. Yönetebildiğim kadar gayrı resmi olmaya çalışacağım
Mezar taşı diyagramı
İlk formalizasyonlardan biri (1960'ların başından 1990'ların sonlarına kadar) T veya
Tombstone diyagramlarıdır . Bu şemalar, beste edilebilir grafiksel unsurlarda, tercüman veya derleyicinin uygulama dili, yorumlanan veya derlenen kaynak dil ve derleyiciler için hedef dil olarak sunulmuştur. Daha ayrıntılı sürümler özellik ekleyebilir. Bu grafiksel gösterimler aksiyomlar, çıkarım kuralları olarak görülebilir, mekanik olarak üretim sürecini aksiyomlardan, Curry la Curry-Howard'dan geldiğinin bir kanıtı olarak mekanik olarak elde etmek için kullanılabilir.
Kısmi değerlendirme
Bir başka ilginç görüş kısmi değerlendirme paradigmasıdır. Bazı girdi verileri verilen yanıtları hesaplayan bir tür işlev uygulaması olarak programları basit bir şekilde görüyorum. Sonra bir tercüman
dil için S bir program almak bir programdır p S
yazılmış S ve veri d o programın, ve semantik göre sonuca hesaplar S . Kısmi değerlendirme iki bağımsız değişken bir programı uzmanlaşmış bir tekniktir bir 1 ve bir 2 , tek argüman, demek bir 1benSSpSSdSbir1bir2bir1, bilinen. Nihai olarak ikinci argümanı aldığınızda daha hızlı bir değerlendirme yapmaktır . Eğer özellikle yararlıdır bir 2 daha sık değişen bir 1 kısmi değerlendirme maliyeti olarak bir 1 , sadece tüm hesaplamaları itfa edilebilir bir 2 değişiyor.bir2bir2bir1bir1bir2
Bu, algoritma tasarımında sık sık görülen bir durumdur (genellikle SE-CS'deki ilk yorumun konusu), verilerin daha statik bir kısmı önceden işlendiğinde, ön işleme maliyetinin tüm uygulamalarda itfa edilebildiği durumlarda algoritmasının, giriş verilerinin daha değişken bölümleriyle birlikte.
Bu aynı zamanda tercümanların durumudur, çünkü ilk argüman yürütülecek programdır ve genellikle farklı verilerle birçok kez çalıştırılır (veya alt bölümleri farklı verilerle birçok kez çalıştırılır). Bu nedenle, belirli bir programın daha hızlı değerlendirilmesi için, bu program üzerinde kısmen argüman olarak değerlendirilerek bir tercümanın uzmanlaşması doğal bir fikir haline geldi. Bu, programı derlemenin bir yolu olarak görülebilir ve bir tercümanın ilk (program) argümanında kısmi olarak değerlendirilmesiyle derlenmesi üzerine önemli araştırmalar yapılmıştır.
Smn teoremi
Kısmi değerlendirme yaklaşımının güzel yanı, özellikle Kleene'in Smn teoreminde teorik olarak (teorik bir yalancı olabilir) köklerini
çekmesidir . Burada, teorisyenleri rahatsız etmeyeceğini umarak sezgisel bir sunum yapmaya çalışıyorum.
Bir Gödel numaralandırma Verilen özyinelemeli fonksiyonlar görüntüleyebilir cp o Gödel sayısı göz önüne alındığında, böylece donanım olarak p
(okuma nesne kodu bir programı) φ p tarafından tanımlanan işlevi olan p donanımınız üzerinde nesne koduyla bilgisayarlı (yani ).φφpφpp
En basit şekliyle, teorem wikipedia'da şöyle ifade edilir (gösterimdeki küçük bir değişikliğe kadar):
Bir Gödel numaralandırması alındığında yinelemeli fonksiyonları, ilkel özyinelemeli işlevi yoktur σ aşağıdaki özellikleri olan iki bağımsız değişken: Her Gödel'in numarası için q kısmi hesaplanabilir fonksiyonu f iki bağımsız olan, ifadeler φ σ ( q , x ) ( y ) ve f ( x , y ) , x ve y sayılarının aynı doğal kombinasyonları için tanımlanmıştır ve değerleri, bu tür bir kombinasyon için eşittir. Başka bir deyişle, aşağıdaki fonksiyonların genişletilebilir eşitliği her şey için geçerlidir.φσqfφσ( q, x )( y)f( x , y)xy :
xφσ( q, x )≃ A, Y. φq( x , y) .
Şimdi, alma tercüman olarak I S , x bir program kaynağı kodu olarak p S ve Y veri olarak d , bu program için, yazabiliriz:
qbenSxpSydφσ( BenS, pS)≃ A, D.φbenS( pS, d) .
tercüman yürütülmesi olarak görülebilir Ben S
dil ile yazılmış programları yorumlamak için hazır bir kara kutu olarak, yani donanım üzerinde S .φbenSbenSS
Fonksiyon tercüman uzmanlaşmış bir fonksiyonu olarak görülebilir I S programı için P , S , kısmi değerlendirmede olduğu gibi,. Böylece Gödel'in numarası σ ( I S , p S ) görülebilir programı derlenmiş versiyonu nesne kodu vardır s S .σbenSPSσ( BenS, pS)pS
Yani fonksiyonu argüman olarak bir program kaynak kodunu almak bir fonksiyonu olarak görülebilir q S
dili ile yazılmış S , ve bu program için nesne kodu sürümünü döndürür. Yani C S genellikle denen şeydir bir derleyici.CS= λ qS. σ( ( BenS, qS)qSSCS
Bazı sonuçlar
Ancak dediğim gibi: "teori bir yalancı olabilir" veya aslında biri gibi görünüyor. Sorun, fonksiyonundan hiçbir şey bilmememizdir . Aslında bu tür birçok fonksiyon var ve benim tahminim teorem kanıtının, Raphael'in önerdiği çözümden ziyade, bir mühendislik bakış açısından daha iyi olmayabilecek çok basit bir tanım kullanabileceğidir: kaynak kodu q S tercüman ile ben S . Bu her zaman yapılabilir, şöyle diyebiliriz: derleme her zaman mümkündür.σqSbenS
Bir derleyicinin ne olduğuna dair daha kısıtlayıcı bir fikir oluşturmak, daha ince bir teorik yaklaşım gerektirecektir. Bu yönde ne yapılmış olabileceğini bilmiyorum. Kısmi değerlendirmede yapılan çok gerçek iş, mühendislik açısından daha gerçekçidir. Ve elbette, Curry-Howard izomorfizmine dayanarak, tip teorisi bağlamında geliştirilen programların kendi özelliklerinin kanıtından çıkarılması da dahil olmak üzere, derleyiciler yazmak için başka teknikler de var (ancak uzmanlık alanımın dışına çıkıyorum). .
Buradaki amacım Raphael'in sözlerinin "çılgın" olmadığını, her şeyin açık olmadığını ve hatta basit olmadığını hatırlatmaktı. Bir şeyin imkansız olduğunu söylemek, sadece nasıl ve neden imkansız olduğuna dair kesin bir anlayışa sahip olması durumunda, kesin tanımlar ve bir kanıt gerektiren güçlü bir ifadedir . Ancak böyle bir kanıtı ifade etmek için uygun bir formalizasyon oluşturmak oldukça zor olabilir.
Bu, belirli bir özellik uyuşmasa bile, mühendisler tarafından anlaşılan anlamda, Gilles'un cevabında da belirtildiği gibi, böyle bir özelliği kullanmayan programların bölümlerine standart derleme teknikleri her zaman uygulanabilir.
Gilles'un anahtarını takip etmek için, dile bağlı olarak, derleme zamanında bazı şeylerin yapılabileceği, diğerlerinin çalışma zamanında yapılması gerektiği, bu nedenle de özel kod gerektiren bir derleme kavramının gerçekte olduğunu görebilirsiniz. yanlış tanımlanmış ve muhtemelen herhangi bir tatmin edici şekilde tanımlanamaz. Derleme, bazı algoritmalarda statik veri ön işleme ile karşılaştırdığımda, kısmi değerlendirme bölümünde göstermeye çalıştığım gibi, sadece bir optimizasyon işlemidir .
Karmaşık bir optimizasyon işlemi olarak, derleme kavramı aslında bir sürekliliğe aittir. Dilin veya programın özelliğine bağlı olarak, bazı bilgiler statik olarak bulunabilir ve daha iyi bir optimizasyona izin verebilir. Diğer şeylerin çalışma süresine ertelenmesi gerekir. İşler gerçekten kötüye gittiğinde, her şey çalışma zamanında en azından programın bazı kısımları için yapılmak zorundadır ve kaynak kodunu tercümanla birlikte paketlemek için yapabileceğiniz tek şey budur. Dolayısıyla bu donatma, bu derleme sürekliliğinin sadece en düşük noktasıdır. Derleyicilerle ilgili araştırmaların çoğu, dinamik olarak yapılması gerekenleri statik olarak yapmanın yollarını bulmakla ilgilidir. Derleme zamanı çöp toplama iyi bir örnek görünüyor.
Derleme işleminin makine kodu üretmesi gerektiğini söylemenin yardımı olmadığını unutmayın. Bu tam olarak yorumlayıcının makine kodu olduğu için paketlemenin yapabileceği şeydir (şey, çapraz derlemeyle biraz daha karmaşık hale gelebilir).