Aşamalı fonksiyonlar nelerdir (kavramsal olarak)?


24

Yakın tarihli bir CACM makalesinde [1], yazarlar aşamalı işlevler için bir uygulama sunmuştur . Terimi iyi bilinen bir terim olarak kullanıyorlar ve referansların hiçbiri açık bir giriş gibi görünmüyor.

Kısa bir açıklama yaparlar (vurgunun madeni ve referans numarası değiştirildi; aslında 22 oldu)

Program oluşturma bağlamında, Taha ve Sheard [2] tarafından oluşturulan çok aşamalı programlama (MSP, kısa süreli evreleme) [2] , programcıların bir program ifadesinin değerlendirmesini daha sonraki bir aşamaya açıkça geciktirmelerine izin verir (bu nedenle bir ifadeyi düzenler). Mevcut aşama, bir sonraki aşamadaki programı oluşturan (ve muhtemelen yürüten) bir kod üreticisi olarak etkilidir.

Ancak, Taha ve Sheard şöyle yazıyor:

Çok aşamalı bir program, hepsi aynı süreç içinde kodun oluşturulmasını, derlenmesini ve yürütülmesini içeren programdır. Çok aşamalı diller, çok aşamalı programları ifade eder. Aşama ve dolayısıyla çok aşamalı programlama, çalışma zamanı tercüman genel giderler ödemeyen genel amaçlı çözümlere duyulan ihtiyacı giderir.

Evrelemenin etkili olduğunu gösteren iddia edilen eski eserlere birkaç atıfta bulunduklarından, bu kavramın daha da eski olduğunu gösteriyor. Terimin kendisine referans vermezler.

Bu ifadeler çelişkili değilse, ortogonal görünüyor; belki Rompf ve Odersky'nin yazdığı şey Taha ve Sheard'ın önerdiklerinin bir uygulamasıdır, ama belki de aynı şeye başka bir bakış açısı olabilir. Önemli bir noktaya göre programların çalışma zamanında kendi parçalarını yazdıkları (ancak) bunun gerekli ve / veya yeterli bir yetenek olup olmadığını bilmiyorum.

Peki, ne olduğunu evreleme bu bağlamda evreleme yorumların sırasıyla var? Terim nereden geliyor?


  1. Hafif Modüler Evreleme: T. Rompf ve M. Odersky'nin (2012) Çalışma Zamanı Kodları Oluşturma ve Derlenmiş DSL'lere Pragmatik Bir Yaklaşım
  2. W. Taha ve T. Sheard (2000) tarafından açık ek açıklamalar ile MetaML ve çoklu programlama;

İki ifade arasında ne çelişki görüyorsunuz? Bana göre, aynı konu hakkında konuşuyorlar, farklı vurgu yapıyorlar gibi görünüyorlar.
Gilles 'SO- kötülük yapmayı bırak'

@Gilles Bir şeyin değerlendirmesini geciktirmek için çalışma zamanı kod oluşturma / derleme işlemine ihtiyacım yok (bkz. Devam edilebilir). Çok iyi olabilir, sadece bir başka vurgu (sorudaki bu seçeneği itiraf ediyorum) olabilir, ama gerçekten söyleyemem.
Raphael

Julia programlama dili uygulamasını ve metaprogramlama belgelerini @generated functions: julia.readthedocs.org/en/latest/manual/metaprogramming/…
SalchiPapa

Yanıtlar:


21

Bildiğim kadarıyla, aşamalı hesaplama terimi ilk olarak Bill Scherlis tarafından bu yazıda kullanılmıştır . Bundan önce, “ kısmi değerlendirme ” terimi aynı kavram için kullanıldı, ancak aşamalı hesaplama fikri oldukça farklıydı. Her iki fikir de Kleene Smn teoremi ile ilgilidir .

Eğer iki argümandan fonksiyonuna sahipseniz, ancak bir argüman biliyorsanız, m diyelim , o zaman fonksiyonun bir kısmını ilk argüman bilgisini kullanarak yapabilirsiniz. O zaman geride bıraktığınız şey , hesaplamaları yalnızca ikinci, bilinmeyen argümana bağlı olan ϕ m ( n ) işlevidir .φ(m,n)mφm(n)

Kısmi değerlendirme fikri, uzmanlık işlevini otomatik olarak hesaplamaktır . Orijinal işlev kodunu verilen cp , kısmi değerlendirme kod parçaları bağlıdır belirlemek için statik analiz yapar m olan ve bit bağlıdır n bir işlev için, ve dönüşümler de cp ' , verilen m , yapılar φ m . İkinci bağımsız n, daha sonra bu özel işlev için beslenebilir.φm(n) φmnφ'mφmn

Aşamalı hesaplama fikri, ilk önce işlevini düşünmektir . Çok aşamalı olarak çalıştığı için “kademeli” bir fonksiyon denir. Bunu ilk argüman vermek kez m , bu özel işlevin kodunu oluşturur φ m . Bu "ilk aşama". İkinci aşamada, ikinci argüman verilir φ m işin gerisini.φ'mφmφm

Yani, kısmi değerlendirmenin işi sıradan bir fonksiyon kodunu dönüştürmektir bir işlev sahnelenen için cp ' . Scherlis, bu dönüşümün önceki kısmi değerlendirme yöntemlerinden daha genel mekanizmalar tarafından yapılabileceğini öngörüyordu. "Kademeli hesaplama" konusu şimdi aşağıdaki konularla ilgileniyor:φφ'

  • Aşamalı fonksiyonlar nasıl tanımlanır?
  • Aşamalı işlevleri tanımlamak için hangi programlama dilleri ve tip sistemleri kullanılmalıdır?
  • Bu dillerin anlambilimi nedir?
  • Aşamalı işlevlerin tutarlılığını ve doğruluğunu nasıl sağlıyoruz?
  • Aşamalı işlevleri otomatik veya yarı otomatik olarak oluşturmak için hangi teknikler faydalıdır?
  • Bu tür tekniklerin doğruluğunu nasıl kanıtlarız?

Aşamalı hesaplama pratikte çok önemli olabilir. Aslında, her derleyici aslında aşamalı bir hesaplamadır. Bir kaynak programı göz önüne alındığında, daha sonra gerçek girdiyi alabilen ve sonucu hesaplayabilen, çevrilmiş ve optimize edilmiş bir hedef program oluşturur. Aşamalı hesaplama programlarını pratikte yazmak zordur, çünkü çoklu aşamaları dengelemek ve doğru şeylerin doğru zamanda yapıldığından emin olmak zorundayız. Derleyici yazan herkes bu konularla mücadele etti. Makine programları (derleyiciler), SQL sorguları (veritabanı manipülasyonları) veya HTML / Sunucu Sayfaları / Javascript kodu (web uygulamaları) ve diğer uygulamaların sayısızları olabilir.


φ'φ'

Yani kısmi değerlendirme, çok aşamalı programlamaya göre bir soyutlamadır, yani kısmi değerlendirme çok aşamalı programlama anlamına gelmez, ancak çok aşamalı programlama kısmi değerlendirmeyi ifade eder. Kısmi değerlendirme bir veya birden fazla aşamada yapılabildiği için, fonksiyonel dillerde körelme işlemi birden fazla aşamada yapılmasını ve çalışma zamanında kod oluşturmayı gerektirmez, değil mi?
denis631

1
Tam olarak değil. Kısmi bir değerlendirici, sıradan bir programı 2 aşamalı bir programa derler ve sonra ilk aşamasını çalıştırır. Aşamalı programlamada, çok aşamalı programı kendiniz yazarsınız.
Uday Reddy

9

Her ne kadar diğer cevaplar teknik olarak doğru olsa da, bilgisayar bilimcilerinin neden sahnelemeli işlevlerle ilgilendiklerini doğru bildiklerini sanmıyorum.

Aşamalı işlevler oluşturarak, programlar üreten programları tanımlarsınız. Modern pratik dil teorisinin en büyük amaçlarından biri potansiyel yeniden kullanımı en üst düzeye çıkarmaktır. Yalnızca kullanışlı işlevler ve nesneler değil aynı zamanda yüksek dereceli mimari yapılar sağlayarak programcılara yardımcı olan kütüphaneler yazmayı mümkün kılmak istiyoruz.

Tüm kazan kodundan kurtulabilseydik harika olurdu. Şartname dilini en aza indirebilmeliyiz. Örneğin olay yönlendirmeli bir gönderici istiyorsak, örneğin belirli bir iş parçacığı tasarımına sahip diğer göndericilerle iletişim kurarsak, bunu kompakt bir şekilde belirtebilmeliyiz ve tüm IO dinleyicileri ve sıra nesnesi ve iş parçacığı bağlantıları bu belirtimden oluşturulabilir.

Etki alanı dilleri, aradığımız kompakt temsiller olma eğilimindedir. İnsanlar bir alanda bir süre çalıştıklarında, kullandıkları dil çoğu bilginin çoğaltılmasını engelleme ve zayıf bir özellik haline gelme eğilimindedir. Dolayısıyla bu evreleme teorisi, etki alanı dillerinden yürütme diline çeviri sistemi olma eğilimindedir.

Derleyiciler teknik olarak elverişlidir ancak hedefi kaçırır. Modern evrelemenin amacı, yeniden kullanımı en üst düzeye çıkarmak ve mümkün olan yerlerde program yapımını otomatikleştirmek için programlar oluşturan programlar oluşturmaktır. Bir programın bir günlük işlevsel gereksinimlerinin program olması harika olurdu.

Czarnecki ve Eisenecker tarafından "Üretken Programlama" bölümüne bakın (ISBN-13: 978-0201309775).


@Raphael: İşte alan ve yeniden kullanım ile ilgili temel bilgileri içeren üçüncü bölüm . Bahsettiğiniz optimizasyona bile bakın. FFT daha hızlı çalışmasını sağlamak için evreleme yapılmadı. Programcının değer tablosunu her seferinde elle hesaplaması, programa kopyalaması ve büyük bir liste oluşturması gerekmez. Yapılan işi en aza indirgemek ve temel adımları tekrar kullanmaktır. Döngü açma ile aynı. El ile yapmak bilgileri tekrarlar ve tekrar kullanılamaz.
ex0du5

Bu DSL bakış açısı, kademelendirmeyi bir seviye ile sınırlıyor (programın içindeki bir DSL derleyicisi), değil mi?
Raphael

1
@ Raphael: Bu gerçekten senin bakış açına bağlı. Açıkçası, kavram sadece kaynak -> çalıştırılabilir çeviri olarak görüldüğünde hesaplama gücü katmaz. Sadece DS dili için bir derleyici hazırlayabiliriz ve yapılabilir. Gücünün geldiği yer yinelemede. Gelecekte projeler tarafından kullanılacak ve genişletilecek kütüphaneler kurarken, kütüphane sınırlarının içinde doğal aşamalar ortaya çıkmaktadır. Tam seri hale getirme için nesne özelliklerini kaynağa dönüştüren bir kitaplığa, ardından da bazı gönderme özelliklerine göre oluşturulan taşıma katmanını oluşturan başka bir kitaplığa sahip olabilirsiniz ...
ex0du5 20

1
@Raphael: Evreleme daha doğal olarak birden fazla aşamada yapılabilir. Bir kod parçasının gereksinimlerinin olması zaman zaman çok fazla değişiyorsa, diğerlerinin çok daha kararlı olduğu durumlarda, aşamayı “daha ​​dengeli arayüzlerle katmanlara ayırmak” için uygun olan “kesme katmanları” nedeniyle uygun olabilir. Daha sonra sistemdeki değişikliklerden daha azını etkileyebilir ve açık-kapalı prensibinin aşamalı halini onurlandırabilirsiniz. Bunlar matematiksel zorunluluğu olmayan pratik kaygılar, ancak hepsi pratikliğe dayanıyor. Tek bir derleyici dili istemiyoruz, evrime izin vermek istiyoruz.
ex0du5

5

Cevap, söz konusu makalenin teknik perspektifinde verilmiştir [1]. Söz konusu sorun genel ve özel kod arasındaki gerilim alanıdır:

Programlar genel amaçlı veya özel amaçlı olarak yazılabilir. Genel amaçlı kod, çeşitli durumlarda kullanılabilir olma avantajına sahipken, özel amaçlı kod, yürütme ortamının benzersiz özelliklerinden faydalanabilecek ve böylece yeniden kullanılabilirlik maliyetinde etkinlik sağlayacak şekilde yazılabilir.

Tabii ki bu gerginliği çözmek istiyoruz, bu genel bir kod ve özel bir uygulama elde etmektir :

Şu soruyu sorabiliriz: Genel amaçlı olması için kod yazmak mümkün mü, ancak daha sonra yürütme sırasında eldeki duruma otomatik olarak uzmanlaşıyor mu?

Bu, (genel) programların belirli bir duruma uyum sağlamak için çalışma zamanında kendilerini (yeniden) yazma fikrine yol açmıştır:

Sonuç olarak, önemli bir araştırma yönü, programcıların çalışma zamanında doğru ve verimli bir şekilde yüksek performanslı özel kod haline getirilmiş olan genel amaçlı kod yazmasına izin verebilecek dil ve derleyici teknolojisini aramayı içermiştir.

Sanırım Java'nın JIT'i buna iyi bir örnek. Belirli bir fikir, Lee'nin şöyle açıkladığı çok aşamalı programlamadır:

Bu araştırma hattında, temel fikirlerden biri evreleme kavramıdır. Her biri sonraki aşamalarda kullanılan değerleri hesaplayan bir dizi aşamada ilerleyen bir programın yürütülmesini hayal ediyoruz. Öyleyse aradığımız şey program kodunu yazmak, böylece bir şekilde bu aşamalar belirgin hale geliyor. Eğer bu başarılırsa, daha sonraki aşama kodlarının, önceki aşama hesaplamalarının sonuçlarına göre optimize eden kod üreteçlerine derlenmesini sağlayabiliriz.

Yani, "evreleme", hesaplama / yürütmedeki aşamaları tanımlayan, önceki aşamaların sonuçlarını bilmek kolaylaşabilen uygun fonksiyonlara / koda bakmanın bir yoludur. Sorudaki ilk alıntıda olduğu gibi "geciktirme" hesaplaması, aşamaları doğru bir şekilde ayırmak için gerekli bir yan etki olabilir, ancak konu bu değil.

Rompf ve Odersky öğretici olabilen hızlı fourier dönüşümünden bahseder .


  1. Tilki ve kirpi: Peter Lee tarafından teknik bakış açısı (2012)
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.