Bazı fonksiyonel diller neden yazılım işlem belleğine ihtiyaç duyar?


24

İşlevsel diller, tanımı gereği, durum değişkenlerini korumamalıdır. Öyleyse neden Haskell, Clojure ve diğerleri yazılım işlemsel bellek (STM) uygulamaları sağlıyor? İki yaklaşım arasında bir çatışma var mı?


Ben sadece epeyce açıklayan bu ilginç makaleyi bağlamak istiyorum .
Şahin

1
Açık olmak gerekirse, tüm işlevsel diller durumu korur, ancak saflık bir değişkenin değerinin ayarlandıktan sonra değişmeyeceğini belirtir.
Robert Harvey,

Yanıtlar:


13

Değişken durumu koruyan işlevsel bir dilde yanlış bir şey yoktur. Haskell gibi "saf" işlevsel dillerin bile, gerçek dünyayla etkileşime girebilmek için durumunu sürdürmesi gerekir. Clojure gibi "Impure" işlevsel diller, mutasyon durumu içerebilen yan etkilere izin verir.

Asıl nokta, işlevsel dillerin gerçekten ihtiyacınız olmadıkça değişebilir durumu engellemektir . Genel stil, saf fonksiyonlar ve değişmez veriler kullanarak programlamak ve kodunuzun onu gerektiren belirli bölümlerinde yalnızca "saf" değişken durumla etkileşime girmektir. Bu şekilde, kod tabanınızın geri kalanını "saf" tutabilirsiniz.

STM'nin işlevsel dillerde daha yaygın olmasının birkaç nedeni olduğunu düşünüyorum:

  • Araştırma : STM sıcak bir araştırma konusudur ve programlama dili araştırmacıları sıklıkla işlevsel dillerle çalışmayı tercih eder (kendi başlarına bir araştırma konusu, artı program davranışı hakkında "kanıtlar" oluşturmak daha kolaydır)
  • Kilit oluşturma : STM, eşzamanlılığa kilit temelli yaklaşımlara bir alternatif olarak görülebilir; bu, farklı bileşenleri bir araya getirerek karmaşık sistemlere ölçeklenirken sorun yaşamaya başlar. Bu tartışmalı STM'nin ana "pragmatik" nedenidir.
  • STM değişmezliğe iyi uyuyor : Eğer büyük değişmez bir yapınız varsa, değişmez kaldığından emin olmak istersiniz, böylece başka bir dişlinin gelip bir alt elemanı mutasyona uğramasını istemezsiniz. Aynı şekilde, söz konusu veri yapısının değişmezliğini garanti edebiliyorsanız, STM sisteminizde güvenilir bir "değer" olduğunu güvenilir bir şekilde değerlendirebilirsiniz.

Şahsen Clojure'in değişkenliğe izin verme yaklaşımını beğeniyorum, ancak yalnızca STM işlemlerine katılabilecek katı biçimde denetlenmiş "yönetilen referanslar" bağlamında. Dilde her şey "tamamen işlevsel" dir.

  ;; define two accounts as managed references
  (def account-a (ref 100))
  (def account-b (ref 100))

  ;; define a transactional "transfer" function
  (defn transfer [ref-1 ref-2 amount]
    (dosync
      (if (>= @ref-1 amount)
        (do 
          (alter ref-1 - amount)
          (alter ref-2 + amount))
        (throw (Error. "Insufficient balance!")))))

  ;; make a stranfer
  (transfer account-a account-b 75)

  ;; inspect the accounts
  @account-a
  => 25

  @account-b
  => 175

Yukarıdaki kodun tamamen işlemsel ve atomik olduğuna dikkat edin - başka bir işlemdeki iki dengeyi okuyan harici bir gözlemci her zaman tutarlı bir atom durumu görecektir, yani iki bakiye her zaman 200'e kadar toplanacaktır. Kilit tabanlı eşzamanlılık ile bu şaşırtıcı bir şekilde zor bir sorundur Çok sayıda işlem varlığına sahip büyük bir karmaşık sistemde çözmek için.

Bazı ekstra aydınlanma için, Rich Hickey, bu videoda Clojure'un STM'sini açıklamak için mükemmel bir iş çıkardı.


3

İşlevsel diller, tanımı gereği, durum değişkenlerini korumamalıdır

Tanımın yanlış. Devleti koruyamayan dil kullanılamaz.

İşlevsel ve zorunlu diller arasındaki fark, birinin diğeri olması diğeri değildir. Devleti korudukları bir şekilde.

Zorunlu diller programın her yerine yayılmış durumda.

İşlevsel diller, durumu tür imzalarıyla izole eder ve sürdürür. Ve bu, STM gibi gelişmiş devlet yönetimi mekanizmaları sağlamalarının nedenidir.


2

Bazen bir program değişken durum gerektirir (örneğin, bir web uygulaması için veritabanı içeriği) ve işlevsel programlamanın avantajlarını kaybetmeden kullanabilmek harika olurdu . İşlevsel olmayan dillerde, değişken durum her şeye nüfuz eder. Bir çeşit özel API ile açık hale getirirseniz , o zaman her şey tamamen işlevsel kalırken onu tanımlanabilir küçük bir bölgeyle sınırlayabilirsiniz. FP'nin faydaları arasında kolay hata ayıklama, tekrarlanabilir birim testi, ağrısız eşzamanlılık ve çok çekirdekli / GPU dostu olması sayılabilir.


Muhtemelen değişebilir devlet demek istiyorsun . Tüm programlar işlevsel, hatta programları korur.
Robert Harvey

Haklısın. Açıkçası, bunu kaçırmak için işlevsel programlama yapmak için yeterli zaman harcamam.
Will Ware,
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.