Referans şeffaflığı nedir?


285

Referans şeffaflığı terimi ne anlama geliyor? "Eşittir eşittir değiştirebilirsiniz" olarak tarif duydum ama bu yetersiz bir açıklama gibi görünüyor.


1
vay i merak ediyorum neden bu sorunun popülaritesinde ani yükseliş ...
Claudiu

1
@claudia: Kesin olarak söyleyemem, ama r / haskell rüzgar aldı ve birçoğu Uday'ın oldukça doğru olsa da, toplulukta bir miktar jibe aldığını hissetti.
efrey

6
@ efrey Bir jibe, belki de öyleydi. Ancak, işlevsel programcılar zorunlu programlama dillerini ve yan etkili fonksiyonel dilleri (Lisp ve ML gibi) referans olarak şeffaf olmadıklarını iddia ettiklerinde vururlar mı? Bunu yapmadan önce en azından gerçeklerini anlamamalılar mı?
Uday Reddy

2
@Claudiu Haskell Reddit'e gönderiyorum ve Conal tweet atıyor. Tartışmayı ilginç buldum ve daha geniş tartışmalar gerektirdiğini düşündüm. Bir tartışmayı teşvik etmek için Uday'ın hareketine dikkat çektim. Bize FPers bazen şikayet alabilir ve iyi bir eşyaya ihtiyacımız olduğunu kabul ediyorum - bunu sağlamak için Uday'a aferin!
chrisdornan

7
@efrey. Gerçekten de bu yüzden ikinci yazımda Bird ve Wadler'dan (anlambilimciler?) Alıntı yapmayı seçtim. Bilgili insanlar, popüler referans şeffaflığı kavramının belirsiz ve muhtemelen tutarsız olduğunu bilirler. Ancak programlama topluluğuna asla düzgün bir şekilde açıklanmadı. Umarım buradaki yazım bir fark yaratır.
Uday Reddy

Yanıtlar:


362

"Referans şeffaflık" terimi, analitik felsefeden , mantık ve matematik yöntemlerine dayanan doğal dil yapılarını, ifadeleri ve argümanları analiz eden felsefenin dalıdır. Başka bir deyişle, programlama dili anlambilimi dediğimiz şeye bilgisayar bilimi dışındaki en yakın konudur . Filozof Willard Quine , referans şeffaflığı kavramını başlatmaktan sorumluydu, ancak Bertrand Russell ve Alfred Whitehead'in yaklaşımlarında da ima edildi.

Özünde "referans şeffaflığı" çok basit ve açık bir fikirdir. "Referans" terimi, analitik felsefede bir ifadenin ifade ettiği şey hakkında konuşmak için kullanılır . Programlama dili semantiğinde "anlam" veya "anlamlandırma" ile kastettiğimizle kabaca aynıdır. Andrew Birkett örneğini ( blog yazısı ) kullanarak, "İskoçya'nın başkenti" terimi Edinburgh şehrini ifade eder. Bu bir "yönlendirmeye" açık bir örnektir.

Bir cümledeki bağlam, o bağlamdaki bir terimin aynı varlığa atıfta bulunan başka bir terimle değiştirilmesi anlamını değiştirmezse "referans olarak şeffaftır" . Örneğin

İskoç Parlamentosu İskoçya'nın başkentinde toplanır.

ile aynı anlama gelir

İskoç Parlamentosu Edinburgh'ta toplanır.

Dolayısıyla "İskoç Parlamentosu ... 'da toplanıyor" bağlamı, referans olarak şeffaf bir bağlamdır. Anlamını değiştirmeden "İskoçya'nın başkentini" "Edinburgh" ile değiştirebiliriz. Başka bir deyişle, bağlam sadece terimin neyi ifade ettiğini ve başka hiçbir şeyi umursamaz. Bağlamın “referans olarak şeffaf” olduğu duygusu budur.

Öte yandan, cümle içinde,

Edinburgh 1999'dan beri İskoçya'nın başkentidir.

böyle bir yedek yapamayız. Eğer yapsaydık, "1999'dan beri Edinburgh Edinburgh olmuştur" diyebiliriz, ki bu söylenmesi gereken çirkin bir şeydir ve orijinal cümle ile aynı anlamı taşımaz. Yani, "Edinburgh olmuştur ... 1999'dan beri" bağlamı referans olarak opak (referans olarak saydam olanın tersi) gibi görünmektedir. Görünüşe göre terimin ifade ettiği şeyden daha fazla bir şeye önem veriyor. Bu ne?

"İskoçya'nın başkenti" gibi şeylere kesin terimler denir ve uzun süre mantıkçılara ve filozoflara zayıf bir baş ağrısı vermezler. Russell ve Quine onları aslında "referans" olmadıklarını söyleyerek çözdüler, yani yukarıdaki örneklerin varlıklara atıfta bulunmak için kullanıldığını düşünmek bir hatadır. "Edinburgh 1999'dan beri İskoçya'nın başkenti olmuştur" doğru yolu söylemek

İskoçya'nın 1999'dan beri bir sermayesi var ve bu sermaye Edinburgh.

Bu cümle ceviz cevizine dönüştürülemez. Sorun çözüldü! Quine'nin amacı doğal dilin dağınık veya en azından karmaşık olduğunu söylemekti, çünkü pratik kullanım için uygun hale getirildi, ancak filozoflar ve mantıkçılar doğru şekilde anlayarak netlik getirmelidir. Referans şeffaflığı, bu tür bir anlam netliği getirmek için kullanılacak bir araçtır .

Tüm bunların programlama ile ne ilgisi var? Aslında pek değil. Söylediğimiz gibi, referans şeffaflığı dili anlamada, yani anlam atamada kullanılan bir araçtır . Dil semantiği programlama alanını kuran Christopher Strachey , bunu anlam çalışmalarında kullandı. " Programlama dillerinde temel kavramlar " adlı temel makalesini internette bulabilirsiniz. Çok güzel bir kağıt ve herkes okuyabilir ve anlayabilir. Lütfen bunu yap. Çok aydınlanacaksınız. Bu paragrafta "referans şeffaflığı" terimini tanıtmaktadır:

İfadelerin en kullanışlı özelliklerinden biri, Quine referans şeffaflığı tarafından çağrılan özelliklerdir. Özünde bu, bir alt ifade içeren bir ifadenin değerini bulmak istiyorsak, alt ifade hakkında bilmemiz gereken tek şeyin değeri olmasıdır. Alt ifadenin iç yapısı, bileşenlerinin sayısı ve doğası, değerlendirildikleri sıra veya yazıldıkları mürekkebin rengi gibi diğer tüm özellikleri, ana değerinle alakasızdır. ifadesi.

"Özünde" kullanımı Strachey'in basit terimlerle açıklamak için onu yeniden ifade ettiğini göstermektedir. İşlevsel programcılar bu paragrafı kendi yollarıyla anlıyor görünmektedir. Makalede başka 9 “referans şeffaflığı” vardır, ancak diğerlerinden rahatsız olmazlar. Aslında, Strachey'in tüm makalesi, zorunlu programlama dillerinin anlamını açıklamaya adanmıştır . Ancak, bugün, fonksiyonel programcılar zorunlu programlama dillerinin referans olarak şeffaf olmadığını iddia etmektedir . Strachey mezarında dönecekti.

Durumu kurtarabiliriz. Doğal dilin "dağınık veya en azından karmaşık" olduğunu söyledik çünkü pratik kullanım için uygun hale getirildi. Programlama dilleri de aynı şekilde. Pratik kullanım için uygun oldukları için “dağınık veya en azından karmaşıktır”. Bu bizi şaşırtmaları gerektiği anlamına gelmez. Anlam netliğine sahip olmamız için referans olarak şeffaf bir meta dili kullanarak sadece doğru şekilde anlaşılmalıdır. Alıntı yaptığım makalede Strachey tam olarak bunu yapıyor. Zorunlu programlama dillerinin anlamlarını temel kavramlara ayırarak, hiçbir yerde netlik kaybetmeden açıklar. Analizinin önemli bir parçası programlama dillerindeki ifadelerin iki çeşit "değer" olduğuna dikkat çekmek,r-değerleri . Strachey'in gazetesinden önce, bu anlaşılmadı ve karışıklık yüce hüküm sürdü. Bugün, C'nin tanımı rutin olarak bahseder ve her C programcısı ayrımı anlar. (Diğer dillerdeki programcıların eşit derecede iyi anlayıp anlamadıklarını söylemek zor.)

Hem Quine hem de Strachey, bir çeşit bağlam bağımlılığı içeren dil yapılarının anlamı ile ilgiliydi. Örneğin, "Edinburgh 1999'dan beri İskoçya'nın başkenti olmuştur" örneğimiz, "İskoçya'nın başkenti" nin dikkate alındığı zamana bağlı olduğunu gösterir. Bu bağlam-bağımlılık, hem doğal dillerde hem de programlama dillerinde bir gerçektir. Fonksiyonel programlamada bile, serbest ve bağlı değişkenler, içinde bulundukları bağlama göre yorumlanmalıdır. Herhangi bir türün bağlam bağımlılığı, bir şekilde ya da diğerinde referans şeffaflığını engeller. Eğer bağımlı oldukları bağlamlara bakmadan terimlerin anlamını anlamaya çalışırsanız, yine karışıklığa neden olursunuz. Quine, modal mantığın anlamı ile ilgiliydi. Bunu tuttumodsal mantık referans olarak opaktı ve referans olarak saydam bir çerçeveye dönüştürülerek temizlenmelidir (örneğin, zorunluluk güvenilirlik olarak dikkate alınarak). Bu tartışmayı büyük ölçüde kaybetti. Mantıkçılar ve filozoflar Kripke'nin olası dünya semantiğinin mükemmel derecede yeterli olduğunu gördüler. Benzer durum zorunlu programlama ile de hüküm sürmektedir. Strachey tarafından açıklanan devlet bağımlılığı ve Reynolds tarafından açıklanan mağaza bağımlılığı (Kripke'nin olası dünya semantiğine benzer bir şekilde) mükemmel bir şekilde yeterlidir. Fonksiyonel programcılar bu araştırmanın çoğunu bilmiyorlar. Referans şeffaflığı konusundaki fikirleri büyük bir tuz tanesi ile alınmalıdır.

[Ek not: Yukarıdaki örnekler, "İskoçya'nın başkenti" gibi basit bir ifadenin birden çok anlama sahip olduğunu göstermektedir. Bir düzeyde, şu anda sermaye hakkında konuşuyoruz olabilir. Başka bir düzeyde, İskoçya'nın zaman içinde sahip olabileceği tüm olası başkentlerden bahsedebiliriz. Belirli bir bağlamı "yakınlaştırabilir" ve normal uygulamada tüm bağlamları kolayca kapsayacak şekilde "uzaklaştırabiliriz". Doğal dilin etkinliği bunu yapma yeteneğimizi kullanır. Zorunlu programlama dilleri de aynı şekilde etkilidir. Belirli bir durumdaki değeri hakkında konuşmak için bir ödevin ( r-değeri ) sağ tarafında x değişkeni kullanabiliriz . Veya l değeri hakkında konuşabiliriztüm devletleri kapsar. İnsanlar nadiren böyle şeylerle karıştırılır. Bununla birlikte, dil yapılarına özgü anlam katmanlarını tam olarak açıklayabilir veya açıklayamayabilirler. Tüm bu anlam katmanları mutlaka 'açık' değildir ve bunları doğru bir şekilde incelemek bir bilim meselesidir. Bununla birlikte, sıradan insanların bu tür katmanlı anlamları açıklamak için eklemsizliği, onların kendileriyle karıştırıldıkları anlamına gelmez.]

Aşağıdaki ayrı bir "postscript", bu tartışmayı fonksiyonel ve zorunlu programlama ile ilgilidir .


10
Teşekkürler, ama 'açık' genişlemiş bir eşitlik kavramı olduğunu düşünmüyorum. "İskoçya'nın başkenti" nin Edinburgh şehrine atıfta bulunduğunu söylediğimde, bu konuda iki kere düşünmedin. Ama "1999'dan beri" hakkında konuşmaya başladığımda aniden zamanın geldiğinin farkına vardın. Dolayısıyla, genişlemiş eşitlik kavramı oldukça ince olabilir ve dil araştırmacıları tarafından resmileştirilir. Genişlemiş eşitliği tam olarak anlamak isteyen insanların bu araştırmanın meyvelerini öğrenmesi gerekir. Hiç de 'açık' olmayabilir.
Uday Reddy

5
Fantastik! RT ile ilgili popüler yanlış anlamalara hoş geldiniz, örneğin işlevlere bağlama . Ya da bir ifadeyi değeriyle (Wikipedia'da olduğu gibi) değiştirerek tanımlamak - garip bir şekilde, çünkü ifadeler ve değerler farklı şeylerdir. Belki de insanların zorunlu dillerin RT'sini göz önünde bulundurmada yanlış gittikleri bir yer, bu "değerlerin" bir mağazadaki işlevler gibi daha karmaşık şeyler yerine sayılar gibi basit şeyler olduğunu varsaymaktır.
Conal

13
@sclv Analitik felsefenin Bilgisayar Bilimi üzerindeki daha geniş etkisine gelince, Bilgisayar Bilimi'nin bildiğimiz gibi Godel, Church, Kleene ve Turing tarafından kurulduğunu söylemeliyim. Bu insanlar mantıklıydılar ve mantığın hem matematiksel hem de felsefi yönlerinde, özellikle de Peano, Frege, Russell, Whitehead, Carnap ve Quine geleneklerinde çok bilgililerdi. Modern Bilgisayar Biliminin ilk öncüleri bağlantıları biliyordu. Ancak Bilgisayar Bilimi'nin hızlı büyümesi onları kesmiştir. Onlara geri dönmeliyiz.
Uday Reddy

5
@sclv Mantık geleneksel olarak sonuç bilimi olarak yorumlanır . Ama bence daha geniş. Bilgi bilimidir . Quine, daha geniş görüşü ortaya çıkaran ilk kişi olarak görüyorum. "Kelime ve nesne" doğal dil ifadelerinin bilgi içeriğinin bir analizidir. Bununla birlikte, ne filozoflar ne de matematikçiler, eski hesaplamanın medeniyet ve bilim için çok eski zamanlardan beri nasıl olduğu göz önüne alındığında, oldukça şaşırtıcı olan hesaplamalara aktif bir ilgi duymamıştır. Onları ilgilendirmek için yollar bulmalıyız.
Uday Reddy

3
@Conal: Puanınızı yükselten yeni bir yanıt ekledim. Muhtemelen sayfanın altında olacaktır.
Uday Reddy

134

İşlevsel programlamada yaygın olarak kullanılan bir terim olan referans şeffaflığı, bir işlev ve giriş değeri verildiğinde, her zaman aynı çıktıyı alacağınız anlamına gelir. Yani işlevde kullanılan harici bir durum yoktur.

İşte referans şeffaf işlevine bir örnek:

int plusOne(int x)
{
  return x+1;
}

Bir giriş ve bir işlev verildiğinde, şeffaf bir saydam işlevle, işlevi çağırmak yerine bir değerle değiştirebilirsiniz. Bu nedenle, plusOne'u 5 parametresiyle çağırmak yerine, bunu 6 ile değiştirebiliriz.

Diğer iyi bir örnek ise genel olarak matematiktir. Bir fonksiyon ve bir giriş değeri verilen matematikte, her zaman aynı çıkış değerine eşlenir. f (x) = x + 1. Bu nedenle matematikteki fonksiyonlar referans olarak saydamdır.

Bu kavram araştırmacılar için önemlidir, çünkü referans olarak şeffaf bir işleve sahip olduğunuzda, kolay otomatik paralelleştirme ve önbelleğe almayı sağlar.

Referans şeffaflığı her zaman Haskell gibi işlevsel dillerde kullanılır.

-

Buna karşılık, referans opaklık kavramı vardır. Bu tam tersi demektir. İşlevin çağrılması her zaman aynı çıktıyı vermeyebilir.

//global G
int G = 10;

int plusG(int x)
{//G can be modified externally returning different values.
  return x + G;
}

Başka bir örnek, nesne yönelimli bir programlama dilinde üye işlevidir. Üye işlevleri genellikle üye değişkenleri üzerinde çalışır ve bu nedenle referans amaçlı opak olur. Üye işlevleri elbette referans olarak şeffaf olabilir.

Yine başka bir örnek, bir metin dosyasından okuyan ve çıktıyı yazdıran bir işlevdir. Bu harici metin dosyası herhangi bir zamanda değişebilir, böylece işlev referans olarak opak olur.


1
Sadece bir adım yukarı, referans olarak saydam üye fonksiyonları ile tamamen referans olarak saydam bir nesneye sahip olmak mümkündür. Bkz. Okmij.org/ftp/Scheme/oop-in-fp.txt
Jonathan Arkell

1
Ve işte bu makalede bahsi
Jonathan Arkell

Tamamen referans olarak saydam bir sınıf söz konusu olduğunda, muhtemelen tüm üye işlevlerinin statik olması gerekir.
Brian R. Bondy

13
Burada bahsettiğiniz şey, referans olarak şeffaflık değildir , ancak yaygın olarak adlandırılır. Uday'ın iki cevabını ve bunlara ilişkin yorumları görün. Özellikle, "çıktı" olarak adlandırdığınız şey ifadedir. "PlusG 3" ifadesini, aynı değere / ifadeye sahip başka bir ifadeyle değiştirdiyseniz, aslında aynı anlama sahip bir program alırsınız, böylece RT zorunlu dillerde tutulur. "3 + 10" veya "13" ifadesi , "plusG 3" ile aynı anlama sahip değildir , çünkü zorunlu dillerdeki anlam "mağaza" (durum) işlevidir.
Conal

1
Sadece yan etkiler ve devletin değişmesi hakkında bir makale okudum ve RT ile ilgili bir sezgisi var. Üzerine bir not ekleyebilir misiniz?
Gaurav

91

Referans olarak saydam bir işlev, yalnızca girdisine bağlı olan bir işlevdir.


4
Bu yüzden nesnelerin durumu olduğu için OO programlamasında zordur.
Kris

5
Öyleyse, işlevleri tanımlarken "referans olarak şeffaf" ifadesinin "deterministik" ile özdeş olduğunu söylemek doğru mudur? Değilse, iki terim arasındaki fark nedir?
mwolfe02

1
Bu aynı zamanda "saf" bir fonksiyonun tanımı gibi geliyor.
Evgeny A.

75

[Bu, tartışmayı işlevsel / zorunlu programlama kaygılarına daha da yakınlaştırmak amacıyla 25 Mart'tan itibaren cevabım için bir postscript.]

İşlevsel programcıların referans şeffaflığı fikri, standart kavramdan üç şekilde farklı görünmektedir:

  • Filozoflar / mantıkçılar "referans", "ifade", "designatum" ve " bedeutung " (Frege'nin Almanca terimi) gibi terimler kullanırken, işlevsel programcılar "değer" terimini kullanırlar. (Bu tamamen onların işi değil. Landin, Strachey ve onların soyundan gelenlerin de referans / açıklama hakkında konuşmak için "değer" terimini kullandıklarını fark ettim. saf bir şekilde kullanıldığında büyük fark.)

  • İşlevsel programcılar, bu "değerlerin" dışarıda değil, programlama dilinde var olduğuna inanmaktadır. Bunu yaparken hem filozoflardan hem de programlama dili anlambilimcilerinden farklıdırlar.

  • Bu "değerlerin" değerlendirme yoluyla elde edileceğine inanıyor gibi görünüyorlar.

Örneğin, referans şeffaflığı hakkındaki Wikipedia makalesi bu sabah şöyle diyor:

Bir ifadenin, bir programın davranışını değiştirmeden değeriyle değiştirilebiliyorsa referans olarak saydam olduğu söylenir (diğer bir deyişle, aynı girdide aynı efektlere ve çıktıya sahip bir program verir).

Bu, filozofların / mantıkçıların söyledikleriyle tamamen tutarsızdır. Bu bağlamdaki bir ifadenin yerine aynı şeye (temel bir ifade) atıfta bulunan başka bir ifade ile yer değiştirilebiliyorsa, bir bağlamın referans veya referans olarak şeffaf olduğunu söylerler . Bu filozoflar / mantıkçılar kimler? Bunlar Frege , Russell , Whitehead , Carnap , Quine , Kiliseve sayısız diğerleri. Her biri yükselen bir figür. Bu mantıkçıların birleşik entelektüel gücü en azından söylemek gerekirse dünyayı sarsıyor. Referansların / ifadelerin biçimsel dilin dışında var olduğu ve dil içindeki ifadelerin sadece onlar hakkında konuşabileceği durumda hepsi oybirliğindedir . Yani, kişinin dil içinde yapabileceği tek şey, bir ifadeyi aynı varlığı ifade eden başka bir ifadeyle değiştirmek. Referansların / ifadelerin kendileri dil içinde mevcut değildir . İşlevsel programcılar neden bu köklü gelenekten sapmaktadır?

Programlama dili anlambilimcilerinin onları yanlış yönlendirmiş olabileceği düşünülebilir. Ama etmediler.

Landin :

(a) her ifadenin bir iç içe yerleştirme alt ifade yapısı vardır, (b) her alt ifade bir şeyi (genellikle bir sayı, doğruluk değeri veya sayısal işlev) gösterir , (c) bir ifadenin ifade ettiği şey, yani "değeri" yalnızca alt ifadelerinin değerleri, diğer özelliklerinde değil. [Vurgu eklendi]

Stoy :

Bir ifade hakkında önemli olan tek şey onun değeridir ve herhangi bir alt ifade, değere eşit başka bir ifade ile değiştirilebilir [Ek vurgu]. Dahası, bir ifadenin değeri, belirli sınırlar içinde, meydana geldiğinde aynıdır ".

Kuş ve Kuşlardır :

bir ifadenin değeri yalnızca (varsa) kurucu ifadelerinin değerlerine bağlıdır ve bu alt ifadeler aynı değere sahip olan başkaları tarafından serbestçe değiştirilebilir [Ek vurgu].

Bu nedenle, geçmişe bakıldığında, Landin ve Strachey'in "referans" / "ifadeyi" "değer" ile değiştirerek terminolojiyi basitleştirme çabaları haksız olabilirdi. Kişi bir "değer" duyar duyar duymaz, buna yol açan bir değerlendirme sürecini düşünmenin cazibesi vardır. Değerlendirmenin ne ürettiğini "değer" olarak düşünmek eşit derecede caziptir, ancak bunun bir ifade olmadığı açıktır. Fonksiyonel programcıların gözünde "referans şeffaflık" kavramının başına gelmek için topladığım şey bu. Fakat ilk semanticists tarafından konuşulan ediliyordu "değer" dir değil bir değerlendirme veya bir fonksiyonun çıktısı ya da herhangi bir tür şeyin sonucudur. Terimin ifadesidir.

Bir ifadenin sözde "değerini" (klasik filozofların söyleminde "referans" veya "ifade") karmaşık bir matematiksel / kavramsal nesne olarak anladıktan sonra, her türlü olasılık açılır.

  • Strachey , 25 Mart cevabımda belirtildiği gibi, bir programlama dilinin sözdizimi içinde doğrudan bir temsili olmayan karmaşık bir kavramsal nesne olan zorunlu programlama dillerindeki değişkenleri L değerleri olarak yorumladı .
  • Ayrıca, sözdiziminde bir "değer" olmayan karmaşık bir matematiksel nesnenin başka bir örneği olan durumdan duruma işlevler gibi dillerde komutları yorumladı.
  • C'deki bir yan etki fonksiyon çağrısı bile durumları durum ve değer çiftleriyle (fonksiyonel programcıların terminolojisinde "monad" olarak adlandırılır) eşleyen bir durum transformatörü olarak iyi tanımlanmış bir "değere" sahiptir.

İşlevsel programcıların bu tür dilleri "referans olarak şeffaf" olarak adlandırmaya isteksizlikleri, yalnızca "değerler" gibi karmaşık matematiksel / kavramsal nesneleri kabul etmeye isteksiz oldukları anlamına gelir. Öte yandan, bir devlet transformatörüne kendi favori sözdizimine yerleştirildiğinde ve "monad" gibi bir vızıltı kelimesi giydirirken mükemmel bir şekilde istekli görünüyorlar. Şunu söylemeliyim ki, onlara "referans şeffaflığı" fikrinin bir miktar tutarlılığı olduğunu kabul etsek bile, tamamen tutarsızlar.

Biraz tarih bu karışıklıkların nasıl oluştuğuna ışık tutabilir. 1962-1967 arasındaki dönem Christopher Strachey için çok yoğun bir dönemdi. 1962-65 yılları arasında CPL olarak bilinen programlama dilini tasarlamak ve uygulamak için Maurice Wilkes ile araştırma görevlisi olarak yarı zamanlı bir görev aldı. Bu zorunlu bir programlama diliydi, ancak güçlü fonksiyonel programlama dili yeteneklerine de sahip olması gerekiyordu. Danışmanlık şirketinde Strachey çalışanı olan Landin, Strachey'in programlama dilleri görünümü üzerinde büyük bir etkiye sahipti. 1965 tarihli " Sonraki 700 programlama dili " makalesinde Landin, işlevsel programlama dillerini acımasızca destekliyor (onları dentatif olarak adlandırıyor)) ve zorunlu programlama dillerini "antitezi" olarak tanımlar. Sonraki tartışmada Strachey'nin Landin'in güçlü pozisyonu hakkında şüpheler doğurduğunu görüyoruz.

... DL'ler tüm dillerin bir alt kümesini oluşturur. Bunlar ilginç bir alt kümedir, ancak buna alışmadıkça kullanmak rahatsız edici bir alt kümedir. Onlara ihtiyacımız var çünkü şu anda zorunluluklar ve sıçramalar içeren dillerle nasıl kanıt yapılacağını bilmiyoruz. [Vurgu eklendi]

1965 yılında Strachey, Oxford'da bir Okuyucu pozisyonunu aldı ve esasen bir zorunluluklar ve atlama teorisi geliştirmek için tam zamanlı olarak çalışıyor gibi görünüyor. 1967'de Kopenhag yaz okulunda " Programlama dillerinde temel kavramlar " dersinde öğrettiği bir teoriye hazırdı . Ders notlarının yayınlanmış olması gerekiyordu, ancak "ne yazık ki, dilatory düzenleme nedeniyle, işlemler hiçbir zaman gerçekleşmedi; Strachey'in Oxford'daki çalışmaları gibi, gazetenin etkili bir özel dolaşımı vardı." ( Martin Campbell-Kelly )

Strachey'nin yazılarını elde etmenin zorluğu, insanların ikincil kaynaklara ve kulaktan dolmaya dayanan kafa karışıklıklarına yol açabilir. Ancak, " Temel kavramlar " artık web üzerinde mevcut olduğundan, işi tahmin etmek için başvurmaya gerek yoktur. Bunu okumalı ve Strachey'in ne anlama geldiğine dair kendi zihnimizi oluşturmalıyız. Özellikle:

  • Bölüm 3.2'de "R-değeri referans şeffaflığı" hakkında konuştuğu "ifadeler" ile ilgilenmektedir.
  • 3.3 bölümü, "L değeri referans şeffaflığı" hakkında konuştuğu "komutlar" ile ilgilidir.
  • Bölüm 3.4.5'te "işlevler ve rutinler" hakkında konuşuyor ve bir R-değeri bağlamında R-değeri referans şeffaflığının herhangi bir şekilde ayrılmasının ya ifadeyi çeşitli komutlara ve daha basit ifadelere ayırarak ortadan kaldırılması gerektiğini veya Bu bir yorum konusu olarak zor görünüyor. "

L-değerleri, R-değerleri ve zorunlu programcının kavramsal evrenini dolduran diğer karmaşık nesneler arasındaki ayrımı anlamadan "referans şeffaflığı" ile ilgili herhangi bir konuşma temelde yanlıştır.


10
Bence bu iki “değer” kavramını karıştırmanın (değerlendirmeler ve anlamlandırmalarla) karıştırılması, işlevsel programcıları, kavramlar arasındaki boşluğun büyük olduğu zorunlu dil eleştirilerinde yanlış yönlendirdiğini vurgulamakta fayda var .
Conal

8
yani değerlendirme nosyonu, zorunlu dillerin RT olmadığı sonucuna götürürken, nosyon nosyonu da değildir.
Conal

12
Bana öyle geliyor ki, bir dilin anlamsal anlambilimini gerçekten tamamen çektikten sonra, yardım edemez, ancak referans olarak şeffaf olabilir. Yani bu, terimin programlama dilleri için yararlı olmadığını söylemekle eşdeğerdir.
Tom Crockett

20
Öyleyse, millet geçmişte bu terimi kullandıklarında diğer insanların ne anlama geldiğinden maddi olarak farklı bir şey ifade etmek için bir terim kullanma alışkanlığına sahip gibi görünüyor. Dediğim gibi: İngilizce diline hoş geldiniz.
Daniel Pratt

17
@DanielPratt: Fonksiyonel programcıların ne demek istediği yan etki özgürlüğü ise, buna neden "referans şeffaflığı" diyorlar? Sadece "yan etki özgürlüğü" diyebilirler ki bu tamamen açık bir fikirdir. Kimse stackexchange'te "yan etki özgürlüğünün" ne anlama geldiğini sormak zorunda kalmayacak. Kimsenin anlamadığı görkemli klasik terimleri aşma ihtiyacı nerede?
Uday Reddy

23

Bir ifade, algoritma değiştirilmeden, aynı girdide aynı efektlere ve çıktıya sahip bir algoritma vererek değeriyle değiştirilebiliyorsa referans olarak saydamdır.


18

Referans olarak saydam bir fonksiyon, matematiksel bir fonksiyon gibi davranır; aynı girdiler verildiğinde her zaman aynı çıktıları üretecektir. Bu, iletilen durumun değiştirilmediğini ve işlevin kendi durumuna sahip olmadığını ima eder.


10

Kısa bir açıklamaya ihtiyaç duyanlar için bir tanesini tehlikeye atacağım (ancak aşağıdaki açıklamayı okuyun).

Bir programlama dilindeki referans şeffaflığı denklem muhakemesini teşvik eder - ne kadar çok referans şeffaflığı varsa, denklem muhakemesi yapmak o kadar kolay olur. Örneğin, bir (sözde) işlev tanımı ile,

fx = x + x,

bu indirgeme işlemini nerede yapabileceğiniz konusunda çok fazla kısıtlama olmaksızın bu tanımın kapsamındaki f (foo) yerine foo + foo (kolayca) koyma kolaylığı, programlama dilinizin ne kadar referans şeffaflığının olduğunun iyi bir göstergesidir. vardır.

Örneğin foo C programlama anlamında x ++ olsaydı, o zaman bu azaltmayı güvenli bir şekilde gerçekleştiremezdiniz (yani, bu azaltmayı yapacak olsaydınız, başlattığınız aynı programla sonuçlanamazsınız).

Pratik programlama dillerinde mükemmel referans şeffaflığı görmezsiniz, ancak fonksiyonel programcılar bunu çok daha fazla önemser (cf Haskell, burada temel bir hedeftir).

(Tam açıklama: Ben işlevsel bir programcıyım, bu yüzden en iyi cevaba göre bu açıklamayı bir tuz tanesi ile almalısınız.)


3
Denklem akıl yürütmeyi kolaylaştıran dillerle ilgili bir sorunum yok. Ama bunun klasik olarak tanımlandığı gibi "referans şeffaflığı" ile ilgisi olduğu konusunda itiraz ediyorum. İkincisi, pratik bir programcı olarak, denklemsel akıl yürütmenin abartıldığını düşünüyorum. Uygulamada önemli olan akıl yürütme, ön koşullar, son koşullar, değişmezler ve veri soyutlaması ile ilgilidir. Bu tür akıl yürütme tekniklerine dayanan insanlar için yan etkiler çok fazla önemli görünmemektedir. Dolayısıyla, ifadelerdeki yan etkilerin kötü bir fikir olduğunu kabul ederken, katil bir argümanı temsil etmiyorlar.
Uday Reddy

1
@UdayReddy İşlevsel programcılar, programlarındaki referans şeffaflığını çevirmek için belirli bir yöntem seçtikleri (yan etkileri ortadan kaldıran ve karmaşık ve güçlü bir program cebiri geliştirdikleri) veya muhtemelen referans şeffaflığı da anlamayan bazı uygulayıcılara sahip oldukları için Yaptıklarını düşünüyorlar, fonksiyonel programlama dillerinin referans şeffaflığı artırmadığı ya da fonksiyonel dil programcılarının ve derleyici yazarlarının resmi izlenebilirlikteki bu artışı pek çok iyi amaçtan yararlanmadıkları anlamına gelmez.
chrisdornan

2
Chris: Uday, Strachey'in programlama dili anlambilimindeki referans opaklık problemini, özellikle de zorunlu diller için ortadan kaldırdığına dikkat çekti . Dolayısıyla, işlevsel programcılar "programlarındaki referans şeffaflığını çeviremezler". Somut bir örnek olarak Haskell IO, RT'ye tam olarak yardımcı değildir, çünkü RT yardımına ihtiyaç yoktur.
Conal

2
@chrisdornan: Yukarıdaki ilk yorumum için üzgünüm. İlk iki cümleyle söylemeye çalıştığım şeyi yapmakta kendim güçlük çektim :-( Ama burada bir açıklama var: İki seviyeli veya çok seviyeli bir aşama analizi düşünün. Her aşama operatörü referans olarak opaktır. Bununla birlikte, her aşamada denklemsel akıl yürütmeyi mükemmel şekilde yapabilirsiniz.Bu nedenle, her bir opak opak operatör denklemsel akıl yürütme için sınırlar belirler, ancak yine de bu sınırlar içinde
denklemsel

1
@chrisdomain: Dahası, çok az insan bu tür evreleme operatörlerini yasaklamak için referans şeffaflığı-safları olmak isteyecektir. Bu operatörler son derece kullanışlıdır. Elle hazırlama ile onlarsız programlama yorucu, hataya açık ve çirkin olurdu. Ve el ile sahneleme yapmak, daha önce sahip olduğunuzdan daha eşit bir akıl yürütme satın almaz. Bu nedenle, eşitlikçi akıl yürütme arayışında iyi programlama cihazlarını yasaklamak, yüzünüze rağmen burnunuzu kesmek gibi bir şey olacaktır.
Uday Reddy

8

Etimoloji ile ilgileniyorsanız (yani, bu kavramın neden bu özel adı var), konuyla ilgili blog gönderime bir göz atın . Terminoloji filozof / mantıkçı Quine'den gelir.


4
  1. Anlamsal anlambilim, tanımlanabilir değerler oluşturan alan adları oluşturarak dilleri modellemeye dayanır .
  2. Fonksiyonel Programcılar , dil terimini yeniden yazma kurallarına dayanan bir hesaplamanın yakınsamasını tanımlamak için değer terimini kullanır . operasyonel semantiği.

1'de söz konusu iki dilin netliği vardır:

  • modellenen nesne nesnesi
  • modelleme dili, meta dil

2'de, nesnenin yakınlığı ve meta diller sayesinde karıştırılabilirler.

Bir dil uygulayıcısı olarak, bu ayrımı sürekli hatırlamam gerektiğini düşünüyorum.

Prof. Reddy, sizi bu şekilde tefekkür edebilirim :-)

İşlevsel programlama ve anlambilim bağlamında, Referans Şeffaflığı terimi referans olarak şeffaf değildir.


1
Ha ha. Açıklama için teşekkürler. Sorun aynı zamanda fonksiyonel programcıların, tüm programlama dilleri için geçerli olan genel bir "referans şeffaflığı" kavramına sahip gibi davranmalarıdır . Ancak bu onların diğer diller için anlamlı veya anlamlı olmayan “değer” kavramına bağlıdır. Genel bir "referans şeffaflık" teorisi talep etmek için, genel bir teori "değer" üretmeleri gerekir. Şimdiye kadar eksik.
Uday Reddy

4

Umarım aşağıdaki cevap tartışmalı 1. ve 3. cevapları ekler ve nitelendirir.

Bir ifadenin bazı referanslara işaret ettiğini veya bir referansa atıfta bulunduğunu söyleyelim. Bununla birlikte, bir soru bu referansların ifadelerin bir parçası olarak izomorfik olarak kodlanıp kodlanamayacağıdır ve bu ifadelere 'değerler' diyebilir. Örneğin, gerçek sayı değerleri aritmetik ifadeler kümesinin bir alt kümesidir, doğruluk değerleri boolean ifadeler kümesinin bir alt kümesidir, vb. Fikir bir ifadeyi değerine göre değerlendirmektir (eğer varsa). Dolayısıyla, 'değer' kelimesi bir ifadeye ya da ifade kümesinin ayırt edici bir elemanına işaret edebilir. Ancak, referans ve değer arasında bir izomorfizm (bir bijection) varsa, bunların aynı şey olduğunu söyleyebiliriz. (Bu, anlamsal semantik alanında kanıtlandığı gibi referansları ve izomorfizmi tanımlamaya dikkat edilmelidir. 3. cevaba verilen cevaplarla belirtilen bir örnek vermek için,data Nat = Zero | Suc Nat doğal sayılar kümesine beklendiği gibi karşılık gelmez.)

E[·]Bazı bölümlerde 'bağlam' olarak da bilinen delikli bir ifade yazalım . C benzeri ifadeler için iki bağlam örneği [·]+1ve şeklindedir [·]++.

[[·]]Bir ifade alan (deliksiz) ve anlam ifade eden evrende anlamını (referans, adlandırma vb.) Veren fonksiyon için yazalım . (Anlamsal anlambilim alanından notasyon ödünç alıyorum.)

Bize biraz resmen Quine tanımını adapte edelim aşağıdaki gibi: bir bağlam E[·] herhangi iki ifadeler verilen referentially şeffaf IFF olduğunu E1ve E2(hiçbir delik), öyle ki [[E1]] = [[E2]](ifadeleri belirtmek yani / referans bölümü aynı referantın) daha sonra bu durum [[E[E1]]] = [[E[E2]]](yani doldurma - delikte ya E1da E2aynı başvuruyu gösteren ifadelerle sonuçlanır).

Leibniz'in eşitleri eşit yerine koyma kuralı genellikle bir işlev olduğunu söyleyen 'eğer E1 = E2öyleyse E[E1] = E[E2]' olarak ifade edilir E[·]. Bir işlev (veya bu nedenle işlevi hesaplayan bir program), her kaynak öğesi için en fazla bir hedef öğe olacak şekilde bir kaynaktan bir hedefe eşlemedir. Deterministik olmayan fonksiyonlar yanlış isimlerdir, ya ilişkilerdir, fonksiyonlar küme teslim ederler, vb. Leibniz'in kuralında eşitlik =ifadeliyse, çift parantezler basitçe verilir ve kaldırılır. Dolayısıyla referans olarak saydam bir bağlam bir işlevdir. Ve Leibniz'in kuralı, denklemsel akıl yürütmenin ana bileşenidir, bu nedenle denklemsel akıl yürütme kesinlikle referans şeffaflığı ile ilgilidir.

[[·]]İfadelerden ifadelere kadar bir işlev olsa da, ifadelerden sınırlı bir ifade alt kümesi [[·]]olarak anlaşılan ve değerlendirme olarak anlaşılabilen 'değerlere' bir işlev olabilir.

Şimdi, eğer E1bir ifade ve E2bir değer ise, ifadeler, değerler ve değerlendirme anlamında referans şeffaflığı tanımlarken çoğu insanın kastettiğini düşünüyorum. Ancak bu sayfadaki 1. ve 3. cevaplarda gösterildiği gibi, bu yanlış bir tanımdır.

Gibi bağlamlarla ilgili sorun [·]++yan etki değildir, ama değeri C'de izomorfik olarak anlamıyla tanımlanmamıştır. Fonksiyonlar değer değildir (fonksiyonların işaretçileri), fonksiyonel programlama dillerinde ise. Landin, Strachey ve anlamsal anlambilimin öncüleri, anlam sağlamak için işlevsel dünyaları kullanmada oldukça zekiydi.

Zorunlu C benzeri diller için, (kabaca) işlevi kullanarak ifadelere anlambilim sağlayabiliriz [[·]] : Expression -> (State -> State x Value).

Valuebir alt kümesidir Expression. Stateçiftleri (tanımlayıcı, değer) içerir. Anlamsal işlev bir ifadeyi alır ve anlamı olarak mevcut durumdan güncellenmiş durum ve bir değere sahip bir çifti ifade eder. Örneğin [[x]], geçerli durumdan ilk bileşeni geçerli durum olan ve ikinci bileşeni x değeri olan çifttir. Buna karşılık, [[x++]]mevcut durumdan ilk bileşeni x'in değerinin artırıldığı bir durum olan ve ikinci bileşeni bu çok değer olan çifttir. Bu anlamda bağlam [·]++, yukarıda verilen tanımı karşıladığı takdirde referans olarak şeffaftır.

İşlevsel programcıların, [[·]]ifadelerden değerlere bir işlev olarak doğal olarak iyileşmeleri anlamında referans şeffaflığı kullanma hakkına sahip olduklarını düşünüyorum . İşlevler birinci sınıf değerlerdir ve durum ayrıca bir değer değil, bir değer olabilir. Devlet monad'ı (kısmen) devleti geçmek (veya diş çekmek) için temiz bir mekanizmadır.


Muhtemelen "1." ve "3." cevaplar sırasıyla UdayReddy'nin "25 Mart" ve "postscript" cevaplarıdır. Ordinaller, SO'daki cevaplara atıfta bulunmak için iyi bir yol değildir. Oylar ve kabuller zamanla değişmekle kalmaz, aynı zamanda birden fazla seçilebilir sipariş de vardır.
philipxy

2

Bu "anlam" kavramının gözlemcinin zihninde olan bir şey olduğunu unutmayın. Böylece, aynı "referans" farklı insanlar için farklı şeyler ifade edebilir. Örneğin, Wikipedia'da bir Edinburgh ayrıştırma sayfamız var.

Programlama bağlamında ortaya çıkabilecek ilgili bir konu polimorfizm olabilir.

Ve belki de, bizim amacımız için farklı polimorfik vakaların semantik olarak eşdeğer olduğu (sadece benzer olmanın aksine) özel polimorfizm (hatta belki de döküm) vakası için bir isme sahip olmalıyız. bir tamsayı tipi, ya da karmaşık bir tip ya da çeşitli başka tipler kullanılarak - polimorfik olarak muamele edilebilir).


0

" Bilgisayar Programlarının Yapısı ve Uygulanması " (Sihirbaz Kitabı) kitabındaki referans şeffaflığının tanımını yararlı buldum çünkü atama işleminin tanıtılmasıyla referans saydamlığının nasıl ihlal edildiğine dair bir açıklama ile tamamlanmaktadır . Konu hakkında yaptığım aşağıdaki slayt destesine göz atın: https://www.slideshare.net/pjschwarz/introducing-assignment-invalidates-the-substitution-model-of-evaluation-and-violates-referential-transparency-as- açıkladı-in-SiCp-sihirbaz kitapta


0

Referans şeffaflığı basitçe şu şekilde ifade edilebilir:

  • Herhangi bir bağlamda her zaman aynı sonucu değerlendiren bir ifade [1] ,
  • Bir fonksiyon, aynı parametrelerin iki kez verilmesi durumunda, aynı sonucu iki kez üretmelidir [2] .

Örneğin, Haskell programlama dili saf işlevsel bir dildir; yani referans olarak şeffaftır.

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.