Fonksiyonel programlama dillerinin derleme zamanı optimizasyonu için daha fazla fırsatı var mı?


10

"Gerçek Dünya için Fonksiyonel Programlama" kitabını okuyordum. Zorunlu ve fonksiyonel programlama dilleri arasındaki karşılaştırma ile başladı. Ve fonksiyonel programlamadaki 'değerler' ve 'ifadelerin' zorunlu programlamanın 'değişkenler' ve 'işlevler' den ne kadar farklı olduğunu belirtti. Tartışmadan bir çeşit fikir geliştirdim -

İşlevsel programlama dilleri, derleme zamanı optimizasyonunu zorunlu olan meslektaşlarına göre daha fazla fırsata sahiptir.

Bu doğru mu?

Yanıtlar:


16

Fonksiyonel programlama dilleri çok daha fazla zaman optimizasyonu yapar. Sebeplerden biri saflıktır - eşzamanlılık önemsizdir çünkü devlet yoktur. Böylece derleyici iki dal alabilir ve programın davranışını değiştirmeden kolayca birleştirebilir.

Aynı zamanda, durum olmadan hesaplanabilen herhangi bir şey (yani haskell'de monadik olmayan herhangi bir şey) derleyici tarafından önceden hesaplanabilir, ancak bu tür hesaplamalar pahalı olabilir ve bu nedenle muhtemelen sadece kısmen yapılabilir.

Ayrıca, hesaplama gerektirmeyen her şey programdan tamamen optimize edilebilir.


1
+1: Yan etki ücretsiz programlama optimize etmek çok ama çok kolaydır.
S.Lott

@mathepic: aslında paralelleştirme (Haskell'de) hem derleme zamanında hem de çalışma zamanında gerçekleşir. Derleme zamanı karar olsun veya olmasın 's değerinde bir yaratma kırığı , (diş tohumu) ve çalışma zamanı süreçleri kırıkları olabildiğince belirttiğiniz parçacığı sayısına bağlı. Yalnızca tek bir iş parçacığı belirtirseniz, kırıklar oluşturulur, ancak birbiri ardına işlenir.
Matthieu M.Nis

2
@mathepic: saflığın başka bir kullanımı -> tembellik ve hesaplama olmaması. Değerin gerekli olmadığını kanıtlayabilirseniz, hesaplamayı tamamen çıkarın. Gerekirse, tembel bir thunk kullanın. İhtiyacınız olacağını biliyorsanız, doğrudan ileriye doğru hesaplayın (tembel ek yükü önlemek için). Saflık (sadece) şaşırtıcı :)
Matthieu M.Nis

@Matthieu iyi nokta
alternatif

1
@ Masse IO monad bile saf. Bu sadece IO monadını "çalıştırmanın" sonucu değildir.
alternatif

7

Prensipte, fonksiyonel diller için zorunlu meslektaşlarına göre daha derleme zamanı optimizasyon olasılıklarının olması muhtemelen doğrudur.

Daha ilginç olan şu ki, eğer mevcut derleyicilere gerçekten uygulanmışlarsa ve bu optimizasyonların pratikte ne kadar alakalı olduğu (yani, önceden tahmin edilebilir bir derleyici ayarlarıyla, bir üretim ortamında deyimsel 'gerçek hayat (TM)' kodunun nihai performansı).

Örneğin, meşhur Bilgisayar Dili Deneyleri Oyunu için Haskell gönderimleri (olması gerektiği kadar kötü - ama şu anda - orada önemli ölçüde daha iyi bir şey olduğu gibi değil) önemli miktarda zaman harcadığı izlenimi veriyor. "olası derleyici optimizasyonları" iddiasıyla karşılaşan manuel optimizasyonlar, insert some property about FP languages hereoptimizasyonların (şu anda en azından) ilgili bir gerçeklikten daha teorik bir olasılık gibi görünmesini sağlar.

Bu noktada yanlış kanıtlanmış olmaktan memnuniyet duyarım.


1
Haskell'deki manuel optimizasyonların nedeni, Haskell'deki bazı "doğrudan" işlemlerin biraz zaman alıcı (karmaşıklık perspektifinden) olmasıyla ilgilidir. Örneğin, bir listenin son öğesini almak istediğinizi varsayalım. Java'da bu oldukça basit bir işlemdir; Haskell'de naif yaklaşım, sonuna kadar (listelerin tembel doğası nedeniyle) tüm listeyi yürüterek bir O (n) operasyonu yapmanızı gerektirir. Manuel optimizasyonların devreye girdiği yer (kısmen).
mipadi

2
Haskell'in elle yuvarlanan optimizasyonlarının geçerli nedenleri olduğundan eminim, ancak "basit" işlemler için gerekli olmaları, kodu optimize etmek için daha büyük fırsatların (şu anda) sadece teoride alakalı olduğu izlenimlerini veriyor.
Alexander Battisti

6
Daha çok algoritmaları optimize etmek ve üretilen kodu optimize etmek arasındaki fark. Bir C örneği alın: Bir arama algoritması yazıyorsam, sadece bir liste boyunca yürüyen saf bir algoritma yazabilirim veya ikili aramayı kullanabilirim. Her iki durumda da, derleyici kodumu optimize eder, ancak saf bir arama algoritmasını ikili aramaya dönüştürmez. Haskell kodundaki birçok manuel optimizasyonun, üretilen kodu optimize etmek yerine algoritmaları kendileri optimize etmekle ilgisi vardır.
mipadi

2
ancak Haskell algoritmasının basit versiyonunun diğer dillerin algoritmalarının basit versiyonu kadar iyi olmadığı anlaşılıyor. (Fonksiyonel model ve bilgisayar mimarisi arasındaki uyumsuzluktan şüpheleniyorum) Kod üretme konusunda iyi olsa bile, bu sorunun üstesinden gelmek için yeterli değil.
Winston Ewert

>> olabildiğince kötü << - Kötü olup olmadığını biliyor musunuz? Bunun "kötü" olduğunu söyleyerek ne demek istiyorsun? Lütfen açık ol.
igouy

2

Fonksiyonel tarzda, değerlerin bir programdan akışı çok, çok görünür (hem derleyici hem de programcı için). Bu, derleyiciye değerleri nerede saklayacağına, ne kadar süre saklayacağına vb. Karar vermek için çok fazla boşluk sağlar.

Zorunlu bir dilde, derleyici programcıya çoğu değişkenin bellekteki belirli bir yaşam süresi boyunca kalan gerçek konumlara karşılık geldiği bir model vaat eder. Potansiyel olarak, herhangi bir ifade bu konumların herhangi birinden okuyabilir (veya bunlara yazabilir!), Bu nedenle derleyici bellek konumlarını yalnızca kayıt tahsisi ile değiştirebilir, iki değişkeni tek bir depolama konumuna birleştirebilir veya nerede özenli bir analiz yaptıktan sonra benzer optimizasyonlar gerçekleştirebilir başka programda bu değişkene başvurulabilir.

Şimdi iki uyarı var:

  • Programlama dili topluluğu, son elli yıl boyunca bu analizi yapmak için akıllı yollar geliştirmek için çok çaba harcadı (boşa harcadı?) . Kayıt renklendirme gibi bilinen hileler vardır ve çoğu zaman daha kolay vakalardan bazılarını elde etmek için; ancak bu, büyük, yavaş derleyiciler ve sonuçta ortaya çıkan kodun kalitesi için sürekli bir derleme karmaşıklığı dengesi sağlar
  • Aynı zamanda, çoğu işlevsel programlama dili de tamamen işlevsel değildir; G / Ç'ye yanıt vermek gibi programların gerçekten yapması gereken pek çok şey doğal olarak işlevsel değildir, bu nedenle hiçbir derleyici bu hilelerden tamamen özgür olamaz ve hiçbir dil onlardan tamamen kaçınmaz - hatta biraz da Haskell bile benim zevkime göre saf (Kilometre Değişebilir) kodunuzun yalnızca işlevsel olmayan kısımlarını kontrol edebilir ve duvardan çıkarabilir, onlardan tamamen kaçınamazsınız.

Ancak genel soruyu cevaplamak için, evet, fonksiyonel bir paradigma derleyiciye zorunlu bir ortamda olmadığını optimize etmek için çok fazla özgürlük verir.


Haskell'deki her şey işlevseldir, sadece sizin maindevletin kendisini kullanan bir şeyden ziyade bir devlet dönüştürücü işlevidir.
alternatif

Evet ve hayır - kavramsal olarak, bir Haskell programının kullanıcının bu programla etkileşimleri (ve sistemin rasgele sayı üretecinin durumu ve günümüzde ağın gecikmesi ve doğal olarak) üzerinde saf bir işlev olduğunu söylemek oldukça doğrudur. programın yanıt verdiği işlevsel olmayan girdiler), ancak pratikte bu fark olmadan bir ayrımdır.
jimwise

@jimwise Referans şeffaflığı çok büyük bir farktır.
alternatif

En azından burada tartışılan amaç için gerçekten sahip değilseniz. IO veya rasgele sayı üretimi gibi işlemlerin noktası , aynı girdilerle her çağrıldıklarında farklı bir değer döndürmeleri gerektiğidir ve bu, programcı veya derleyici için işlevsel olarak bunlarla ilgili akıl yürütmeyi sınırlar .
jimwise

1
@mathepic Evet, elbette rastgele veya kullanıcı girişini (veya ağ gecikmesini veya sistem yükünü) sonsuz bir akış veya eyaletten eyalete bir işlev olarak kavramsal olarak görüntüleyebilirsiniz, ancak bu, program davranışı hakkında yararlı mantığa katkıda bulunan bir görünüm değildir. siz veya derleyiciniz - Bob Harper, CMU'nun yeni fonksiyonel-programlama-ilk CS müfredatı hakkındaki blogunda son zamanlarda yayınlanan bir yazıda bu zemini iyi kaplıyor .
jimwise
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.