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.
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.
Yanıtlar:
"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 .
İş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.
Referans olarak saydam bir işlev, yalnızca girdisine bağlı olan bir işlevdir.
[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 ".
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.
İş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:
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.
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.
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.)
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.
1'de söz konusu iki dilin netliği vardır:
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.
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 [·]+1
ve ş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 E1
ve 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 E1
da E2
aynı 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 E1
bir ifade ve E2
bir 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)
.
Value
bir 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.
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).
" 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
Referans şeffaflığı basitçe şu şekilde ifade edilebilir:
Örneğin, Haskell programlama dili saf işlevsel bir dildir; yani referans olarak şeffaftır.