Apa itu transparansi referensial?

285

Apa arti istilah transparansi referensial ? Saya pernah mendengarnya digambarkan sebagai "itu berarti Anda dapat mengganti sama dengan sama dengan" tetapi ini sepertinya penjelasan yang tidak memadai.

Claudiu
sumber
1
wow saya bertanya-tanya mengapa kenaikan mendadak dalam popularitas pertanyaan ini ...
Claudiu
1
@claudia: Saya tidak bisa mengatakan dengan pasti, tetapi r / haskell mendapat angin dan banyak yang merasa Uday, meskipun cukup akurat, mengambil sedikit jibe di komunitas.
efrey
6
@efrey Jibe, mungkin itu. Tetapi, ketika programmer fungsional menembak bahasa pemrograman imperatif dan bahasa fungsional efek samping (seperti Lisp dan ML) mengklaim bahwa mereka tidak transparan secara referensial, apakah mereka tidak mengambil jibe? Haruskah mereka setidaknya tidak mendapatkan fakta yang benar sebelum melakukannya?
Uday Reddy
2
@Claudiu Saya telah memposting di Haskell Reddit dan Conal telah mentweetnya. Saya menemukan diskusi yang menarik dan menurut saya pantas diskusi yang lebih luas. Saya menarik perhatian pada keceriaan Uday untuk merangsang diskusi. Saya setuju bahwa kami, FPers terkadang dapat berpuas diri dan membutuhkan bantuan yang baik - terlaksana dengan baik untuk Uday karena menyediakannya!
chrisdornan
7
@ Eva. Memang, itu sebabnya saya memilih untuk mengutip dari Bird dan Wadler (semanticists?) Di posting kedua saya. Orang-orang berpengetahuan tahu bahwa konsep populer tentang transparansi referensial tidak jelas dan mungkin tidak koheren. Tetapi tidak pernah dijelaskan kepada komunitas pemrograman dengan benar. Semoga tulisan saya di sini akan membuat perbedaan.
Uday Reddy

Jawaban:

362

Istilah "transparansi referensial" berasal dari filsafat analitis , cabang filsafat yang menganalisis konstruksi, pernyataan, dan argumen bahasa alami berdasarkan metode logika dan matematika. Dengan kata lain, itu adalah subjek terdekat di luar ilmu komputer dengan apa yang kita sebut semantik bahasa pemrograman . Filsuf Willard Quine bertanggung jawab untuk memprakarsai konsep transparansi referensial, tetapi juga tersirat dalam pendekatan Bertrand Russell dan Alfred Whitehead.

Pada intinya, "transparansi referensial" adalah ide yang sangat sederhana dan jelas. Istilah "rujukan" digunakan dalam filsafat analitik untuk membicarakan hal yang dirujuk oleh ungkapan . Ini kira-kira sama dengan apa yang kita maksud dengan "makna" atau "denotasi" dalam semantik bahasa pemrograman. Menggunakan contoh Andrew Birkett ( posting blog ), istilah "ibu kota Skotlandia" mengacu pada kota Edinburgh. Itu adalah contoh langsung dari "referensi".

Konteks dalam kalimat adalah "transparan referensial" jika mengganti istilah dalam konteks itu dengan istilah lain yang mengacu pada entitas yang sama tidak mengubah artinya. Sebagai contoh

Parlemen Skotlandia bertemu di ibukota Skotlandia.

artinya sama dengan

Parlemen Skotlandia bertemu di Edinburgh.

Jadi konteks "Parlemen Skotlandia bertemu di ..." adalah konteks referensial transparan. Kita dapat mengganti "ibu kota Skotlandia" dengan "Edinburgh" tanpa mengubah artinya. Dengan kata lain, konteksnya hanya peduli tentang apa yang merujuk istilah dan tidak ada yang lain. Itulah pengertian di mana konteksnya "transparan secara referensial".

Di sisi lain, dalam kalimat,

Edinburgh telah menjadi ibu kota Skotlandia sejak 1999.

kita tidak bisa melakukan penggantian seperti itu. Jika kita melakukannya, kita akan mendapatkan "Edinburgh telah menjadi Edinburgh sejak 1999", yang merupakan hal yang gila untuk dikatakan, dan tidak menyampaikan arti yang sama dengan kalimat aslinya. Jadi, akan tampak bahwa konteks "Edinburgh telah ... sejak 1999" bersifat rujukan (kebalikan dari rujukan transparan). Tampaknya peduli tentang sesuatu yang lebih dari apa yang merujuk pada istilah itu. Apa itu?

Hal-hal seperti "ibu kota Skotlandia" disebut istilah yang pasti dan mereka tidak memberikan sakit kepala yang parah kepada ahli logika dan filsuf untuk waktu yang lama. Russell dan Quine memilah-milah mereka mengatakan bahwa mereka sebenarnya tidak "referensial", yaitu, adalah kesalahan untuk berpikir bahwa contoh di atas digunakan untuk merujuk pada entitas. Cara yang tepat untuk memahami "Edinburgh telah menjadi ibu kota Skotlandia sejak 1999" adalah dengan mengatakan

Skotlandia telah memiliki ibukota sejak 1999 dan ibukota itu adalah Edinburgh.

Kalimat ini tidak dapat diubah menjadi gila. Masalah terpecahkan! Maksud Quine adalah untuk mengatakan bahwa bahasa alami itu berantakan, atau paling tidak rumit, karena dibuat nyaman untuk penggunaan praktis, tetapi para filsuf dan ahli logika harus memberikan kejelasan dengan memahami mereka dengan cara yang benar. Transparansi referensial adalah alat yang digunakan untuk membawa kejelasan makna .

Apa hubungannya semua ini dengan pemrograman? Sebenarnya tidak terlalu banyak. Seperti yang kami katakan, transparansi referensial adalah alat untuk digunakan dalam memahami bahasa, yaitu, dalam menetapkan makna . Christopher Strachey , yang mendirikan bidang semantik bahasa pemrograman, menggunakannya dalam studinya tentang makna. Makalah dasarnya " Konsep dasar dalam bahasa pemrograman " tersedia di web. Ini adalah kertas yang indah dan semua orang bisa membaca dan memahaminya. Jadi, tolong lakukan itu. Anda akan jauh lebih tercerahkan. Dia memperkenalkan istilah "transparansi referensial" dalam paragraf ini:

Salah satu sifat ekspresi yang paling berguna adalah yang disebut dengan transparansi referensial Quine. Pada dasarnya ini berarti bahwa jika kita ingin menemukan nilai ekspresi yang berisi sub-ekspresi, satu-satunya hal yang perlu kita ketahui tentang sub-ekspresi adalah nilainya. Ciri-ciri lain dari sub-ekspresi, seperti struktur internalnya, jumlah dan sifat komponen-komponennya, urutan di mana mereka dievaluasi atau warna tinta tempat mereka dituliskan, tidak relevan dengan nilai utama. ekspresi.

Penggunaan "pada dasarnya" menunjukkan bahwa Strachey memparafrasekan untuk menjelaskannya secara sederhana. Pemrogram fungsional tampaknya memahami paragraf ini dengan caranya sendiri. Ada 9 kejadian lain dari "transparansi referensial" di koran, tetapi mereka tampaknya tidak peduli tentang yang lain. Bahkan, seluruh makalah Strachey dikhususkan untuk menjelaskan arti bahasa pemrograman imperatif . Tapi, hari ini, programmer fungsional mengklaim bahwa bahasa pemrograman imperatif tidak transparan secara referensi. Strachey akan berbalik di kuburnya.

Kita bisa menyelamatkan situasi. Kami mengatakan bahwa bahasa alami "berantakan, atau paling tidak rumit" karena dibuat nyaman untuk penggunaan praktis. Bahasa pemrograman adalah cara yang sama. Mereka "berantakan, atau setidaknya rumit" karena dibuat nyaman untuk penggunaan praktis. Itu tidak berarti bahwa mereka perlu membingungkan kita. Mereka hanya harus dipahami dengan cara yang benar, menggunakan bahasa meta yang secara transparan transparan sehingga kita memiliki kejelasan makna. Dalam makalah yang saya kutip, Strachey melakukan hal itu. Dia menjelaskan arti bahasa pemrograman imperatif dengan memecahnya menjadi konsep-konsep dasar, tidak pernah kehilangan kejelasan di mana pun. Bagian penting dari analisisnya adalah untuk menunjukkan bahwa ekspresi dalam bahasa pemrograman memiliki dua jenis "nilai",nilai-r . Sebelum karya Strachey, ini tidak dipahami dan kebingungan memerintah tertinggi. Saat ini, definisi C menyebutkannya secara rutin dan setiap programmer C memahami perbedaannya. (Apakah programmer dalam bahasa lain memahaminya sama baiknya adalah sulit untuk dikatakan.)

Baik Quine dan Strachey prihatin dengan makna konstruksi bahasa yang melibatkan beberapa bentuk ketergantungan konteks. Sebagai contoh, contoh kami "Edinburgh telah menjadi ibu kota Skotlandia sejak 1999" menandakan fakta bahwa "ibu kota Skotlandia" tergantung pada waktu di mana ia dipertimbangkan. Ketergantungan konteks seperti itu adalah kenyataan, baik dalam bahasa alami maupun bahasa pemrograman. Bahkan dalam pemrograman fungsional, variabel bebas dan terikat harus ditafsirkan sehubungan dengan konteks di mana mereka muncul. Ketergantungan konteks dari segala jenis blok transparansi referensial dalam beberapa cara atau yang lain. Jika Anda mencoba memahami arti istilah tanpa memperhatikan konteks yang menjadi sandarannya, Anda akan berakhir dengan kebingungan. Quine memperhatikan arti dari logika modal. Dia memegang itumodal logika secara rujukan bersifat buram dan harus dibersihkan dengan menerjemahkannya ke dalam kerangka kerja yang transparan secara referensial (misalnya, dengan menganggap perlunya sebagai provabilitas). Dia sebagian besar kehilangan perdebatan ini. Ahli logika dan filsuf sama-sama menemukan kemungkinan semantik dunia Kripke menjadi sangat memadai. Situasi serupa juga berkuasa dengan pemrograman imperatif. Ketergantungan negara dijelaskan oleh Strachey dan ketergantungan toko dijelaskan oleh Reynolds (dengan cara yang mirip dengan semantik dunia Kripke yang mungkin) sangat memadai. Pemrogram fungsional tidak tahu banyak tentang penelitian ini. Gagasan mereka tentang transparansi referensi harus diambil dengan sebutir garam besar.

[Catatan tambahan: Contoh-contoh di atas menggambarkan bahwa frasa sederhana seperti "ibu kota Skotlandia" memiliki banyak tingkat makna. Pada satu tingkat, kita mungkin berbicara tentang modal saat ini. Di tingkat lain, kita mungkin berbicara tentang semua ibukota yang mungkin dimiliki Skotlandia selama perjalanan waktu. Kita dapat "memperbesar" konteks tertentu dan "memperkecil" untuk menjangkau semua konteks dengan mudah dalam praktik normal. Efisiensi bahasa alami memanfaatkan kemampuan kita untuk melakukannya. Bahasa pemrograman imperatif sangat efisien dengan cara yang hampir sama. Kita dapat menggunakan variabel x di sisi kanan penugasan (nilai -r ) untuk berbicara tentang nilainya dalam keadaan tertentu. Atau, kita mungkin berbicara tentang nilai-lnyayang mencakup semua negara. Orang jarang bingung dengan hal-hal seperti itu. Namun, mereka mungkin atau mungkin tidak dapat secara tepat menjelaskan semua lapisan makna yang melekat dalam konstruksi bahasa. Semua lapisan makna seperti itu belum tentu 'jelas' dan itu adalah masalah ilmu pengetahuan untuk mempelajarinya dengan benar. Namun, ketidakberesan orang-orang biasa untuk menjelaskan makna berlapis seperti itu tidak menyiratkan bahwa mereka bingung tentang hal itu.]

"Catatan tambahan" di bawah ini mengaitkan diskusi ini dengan masalah pemrograman fungsional dan imperatif .

Uday Reddy
sumber
10
Terima kasih, tetapi saya tidak berpendapat bahwa ada gagasan ekstensional tentang kesetaraan yang 'jelas'. Ketika saya mengatakan "ibu kota Skotlandia" mengacu pada kota Edinburgh, Anda tidak berpikir dua kali tentang itu. Tetapi ketika saya mulai berbicara tentang "sejak 1999", Anda tiba-tiba menjadi sadar bahwa ada waktu yang terlibat. Jadi, gagasan ekstensional tentang kesetaraan bisa sangat halus dan diformalkan oleh para peneliti bahasa pemrograman. Orang yang ingin memiliki pemahaman yang sempurna tentang kesetaraan ekstensional perlu mempelajari buah dari penelitian itu. Sama sekali tidak 'jelas'.
Uday Reddy
5
Fantastis! Sebuah bantuan selamat datang untuk kesalahpahaman populer tentang RT, misalnya, menghubungkannya dengan fungsi . Atau mendefinisikan melalui mengganti ekspresi dengan nilainya (seperti di Wikipedia) - anehnya karena ekspresi dan nilai adalah berbagai hal. Mungkin satu tempat di mana orang salah dalam mempertimbangkan RT-ness bahasa imperatif adalah dengan menganggap bahwa "nilai-nilai" ini adalah hal-hal sederhana seperti angka daripada hal-hal yang lebih kompleks seperti fungsi dari sebuah toko.
Conal
13
@sclv Adapun dampak yang lebih luas dari filsafat analitis pada Ilmu Komputer, saya harus mengatakan bahwa Ilmu Komputer, seperti yang kita kenal, didirikan oleh Godel, Gereja, Kleene dan Turing. Orang-orang ini adalah ahli logika dan mereka berpengalaman dalam aspek matematika dan filosofis dari logika, khususnya tradisi Peano, Frege, Russell, Whitehead, Carnap dan Quine. Para pelopor awal Ilmu Komputer modern tahu hubungannya. Tetapi pertumbuhan pesat Ilmu Komputer telah memutuskan mereka. Kita harus kembali ke mereka.
Uday Reddy
5
@sclv Logic secara tradisional ditafsirkan sebagai ilmu konsekuensi . Tapi saya pikir ini lebih luas. Ini adalah ilmu informasi . Quine, saya melihat sebagai orang pertama yang memunculkan pandangan yang lebih luas. "Kata dan objek" adalah analisis isi informasi pernyataan bahasa alami. Namun, baik filsuf maupun matematikawan tidak pernah memiliki minat aktif dalam perhitungan , yang cukup membingungkan, mengingat bagaimana komputasi sentral telah untuk peradaban dan ilmu pengetahuan sejak zaman dahulu. Kita perlu menemukan cara untuk membuat mereka tertarik.
Uday Reddy
3
@Conal: Saya telah menambahkan jawaban baru yang memperkuat poin Anda. Mungkin akan ada di bagian bawah halaman.
Uday Reddy
134

Transparansi referensial, istilah yang umum digunakan dalam pemrograman fungsional, berarti bahwa dengan diberi fungsi dan nilai input, Anda akan selalu menerima output yang sama. Artinya tidak ada kondisi eksternal yang digunakan dalam fungsi.

Berikut adalah contoh fungsi transparan referensial:

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

Dengan fungsi transparan referensial, diberi input dan fungsi, Anda bisa menggantinya dengan nilai alih-alih memanggil fungsi. Jadi alih-alih memanggil plusOne dengan parameter 5, kita bisa menggantinya dengan 6.

Contoh bagus lainnya adalah matematika secara umum. Dalam matematika diberi fungsi dan nilai input, itu akan selalu memetakan ke nilai output yang sama. f (x) = x + 1. Oleh karena itu fungsi dalam matematika secara referensi transparan.

Konsep ini penting bagi para peneliti karena itu berarti bahwa ketika Anda memiliki fungsi transparan referensial, itu cocok untuk paralelisasi dan caching otomatis yang mudah.

Transparansi referensial selalu digunakan dalam bahasa fungsional seperti Haskell.

-

Sebaliknya ada konsep kekaburan referensial. Ini berarti sebaliknya. Memanggil fungsi mungkin tidak selalu menghasilkan output yang sama.

//global G
int G = 10;

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

Contoh lain, adalah fungsi anggota dalam bahasa pemrograman berorientasi objek. Fungsi anggota biasanya beroperasi pada variabel anggotanya dan karena itu akan menjadi referensial buram. Fungsi anggota tentu saja dapat secara transparan transparan.

Contoh lain adalah fungsi yang membaca dari file teks dan mencetak hasilnya. File teks eksternal ini dapat berubah kapan saja sehingga fungsinya akan menjadi kurang jelas.

Brian R. Bondy
sumber
1
Hanya dengan kepala saja, dimungkinkan untuk memiliki objek transparan yang sepenuhnya merujuk, dengan fungsi anggota yang transparan Lihat okmij.org/ftp/Scheme/oop-in-fp.txt
Jonathan Arkell
1
Dan di sini adalah kode yang sedang dibicarakan dalam artikel itu: okmij.org/ftp/Scheme/pure-oo-system.scm
Jonathan Arkell
Dalam hal kelas transparan sepenuhnya referensial, Anda mungkin akan memiliki semua fungsi anggota statis.
Brian R. Bondy
13
Apa yang Anda bicarakan di sini bukanlah transparansi referensial, meskipun biasanya disebut demikian. Lihat dua jawaban Uday dan komentar mereka. Secara khusus, apa yang Anda sebut "output" bukanlah denotasi. Jika Anda mengganti "plusG 3" dengan ekspresi lain yang memiliki nilai / denotasi yang sama, Anda memang akan mendapatkan program dengan arti yang sama, jadi RT memang menggunakan bahasa imperatif. Ungkapan "3 + 10" atau "13" tidak memiliki arti yang sama dengan "plusG 3", karena makna dalam bahasa imperatif adalah fungsi dari "store" (negara bagian).
Conal
1
Saya baru saja membaca sebuah artikel tentang efek samping dan perubahan keadaan dan telah mendapatkan intuisi bahwa itu ada hubungannya dengan RT. Bisakah Anda menambahkan catatan di atasnya?
Gaurav
91

Fungsi transparan referensial adalah yang hanya bergantung pada inputnya.

Draemon
sumber
4
Itulah sebabnya sulit dalam pemrograman OO karena objek memiliki keadaan.
Kris
5
Jadi apakah benar untuk mengatakan "transparan referensial" identik dengan "deterministik" saat menggambarkan fungsi? Jika tidak, apa perbedaan antara kedua istilah tersebut?
mwolfe02
1
Ini juga terdengar seperti definisi fungsi "murni".
Evgeny A.
75

[Ini adalah catatan tambahan untuk jawaban saya sejak 25 Maret, dalam upaya untuk membawa diskusi lebih dekat dengan masalah pemrograman fungsional / imperatif.]

Gagasan programmer fungsional tentang transparansi referensial tampaknya berbeda dari gagasan standar dalam tiga cara:

  • Sedangkan para filsuf / ahli logika menggunakan istilah seperti "referensi", "denotasi", "designatum" dan " bedeutung " (istilah Jerman Frege), programmer fungsional menggunakan istilah "nilai". (Ini bukan sepenuhnya pekerjaan mereka. Saya perhatikan bahwa Landin, Strachey dan keturunan mereka juga menggunakan istilah "nilai" untuk berbicara tentang referensi / denotasi. Ini mungkin hanya penyederhanaan terminologis yang diperkenalkan oleh Landin dan Strachey, tetapi tampaknya membuat suatu perbedaan besar ketika digunakan dengan cara yang naif.)

  • Pemrogram fungsional tampaknya percaya bahwa "nilai" ini ada dalam bahasa pemrograman, bukan di luar. Dalam melakukan ini, mereka berbeda dari para filsuf dan semantikis bahasa pemrograman.

  • Mereka tampaknya percaya bahwa "nilai-nilai" ini seharusnya diperoleh dengan evaluasi.

Sebagai contoh, artikel Wikipedia tentang transparansi referensial mengatakan, pagi ini:

Ekspresi dikatakan transparan referensial jika dapat diganti dengan nilainya tanpa mengubah perilaku suatu program (dengan kata lain, menghasilkan program yang memiliki efek dan output yang sama pada input yang sama).

Ini sepenuhnya berbeda dengan apa yang dikatakan oleh para filsuf / ahli logika. Mereka mengatakan bahwa konteks adalah referensial atau transparan referensial jika suatu ekspresi dalam konteks itu dapat digantikan oleh ekspresi lain yang merujuk pada hal yang sama ( ekspresi coreferential ). Siapa para filsuf / ahli logika ini? Mereka termasuk Frege , Russell , Whitehead , Carnap , Quine , Churchdan banyak lainnya. Masing-masing dari mereka adalah sosok yang menjulang tinggi. Kekuatan intelektual gabungan dari para ahli logika ini sangat mengejutkan. Semuanya dengan suara bulat dalam posisi bahwa referensi / denotasi ada di luar bahasa formal dan ekspresi dalam bahasa hanya dapat berbicara tentang mereka. Jadi, yang bisa dilakukan seseorang dalam bahasa adalah mengganti satu ekspresi dengan ekspresi lain yang mengacu pada entitas yang sama. Referensi / denotasi itu sendiri tidak ada dalam bahasa. Mengapa programmer fungsional menyimpang dari tradisi yang sudah mapan ini?

Orang mungkin menganggap bahwa semantikis bahasa pemrograman mungkin telah menyesatkan mereka. Tetapi, mereka tidak melakukannya.

Landin :

(a) setiap ekspresi memiliki struktur subekspresi bersarang, (b) setiap subekspresi menunjukkan sesuatu (biasanya angka, nilai kebenaran atau fungsi numerik) , (c) hal yang ditunjukkan oleh ekspresi, yaitu "nilainya", hanya bergantung pada nilai dari sub-ekspresinya, bukan pada properti lain dari mereka. [Menambahkan penekanan]

Basi :

Satu-satunya hal yang penting tentang ekspresi adalah nilainya, dan subekspresi apa pun dapat diganti dengan nilai lain yang setara [Penekanan ditambahkan]. Lebih dari itu, nilai suatu ekspresi, dalam batas - batas tertentu, sama setiap kali itu terjadi ".

Bird and Wadler :

nilai ekspresi hanya bergantung pada nilai ekspresi konstituennya (jika ada) dan subekspresi ini dapat diganti secara bebas oleh orang lain yang memiliki nilai yang sama [Penambahan penekanan].

Jadi, dalam retrospeksi, upaya Landin dan Strachey untuk menyederhanakan terminologi dengan mengganti "referensi" / "denotasi" dengan "nilai" mungkin telah gegabah. Begitu seseorang mendengar "nilai", ada godaan untuk memikirkan proses evaluasi yang mengarah padanya. Sama-sama menggoda untuk memikirkan apa pun yang dihasilkan evaluasi sebagai "nilai", meskipun mungkin cukup jelas bahwa itu bukan denotasinya. Itulah yang saya kumpulkan telah terjadi pada konsep "transparansi referensial" di mata programmer fungsional. Tetapi "nilai" yang dibicarakan oleh semantikis awal bukanlah hasil dari evaluasi atau output dari suatu fungsi atau hal semacam itu. Ini adalah denotasi dari istilah tersebut.

Begitu kita memahami apa yang disebut "nilai" dari sebuah ekspresi ("referensi" atau "denotasi" dalam wacana filsuf klasik) sebagai objek matematika / konseptual yang kompleks, semua jenis kemungkinan terbuka.

  • Strachey menafsirkan variabel dalam bahasa pemrograman imperatif sebagai nilai-L , sebagaimana disebutkan dalam jawaban 25 Maret saya, yang merupakan objek konseptual canggih yang tidak memiliki representasi langsung dalam sintaksis bahasa pemrograman.
  • Dia juga menafsirkan perintah dalam bahasa seperti fungsi state-to-state, contoh lain dari objek matematika yang kompleks yang bukan "nilai" dalam sintaksis.
  • Bahkan pemanggilan fungsi efek samping dalam C memiliki "nilai" yang didefinisikan dengan baik sebagai transformator status yang memetakan status ke pasangan status dan nilai (yang disebut "monad" dalam terminologi fungsional programmer).

Keengganan pemrogram fungsional untuk menyebut bahasa-bahasa seperti itu "transparan referensial" hanya menyiratkan bahwa mereka enggan mengakui objek matematika / konseptual yang rumit seperti "nilai". Di sisi lain, mereka tampaknya sangat bersedia menyebut transformator negara sebagai "nilai" ketika dimasukkan ke dalam sintaks favorit mereka sendiri dan didandani dengan kata buzz seperti "monad". Saya harus mengatakan bahwa mereka sepenuhnya tidak konsisten, bahkan jika kita mengabulkan kepada mereka bahwa ide mereka tentang "transparansi referensial" memiliki beberapa koherensi.

Sedikit sejarah mungkin menyoroti bagaimana kebingungan ini muncul. Periode antara 1962 hingga 1967 adalah periode yang sangat intensif bagi Christopher Strachey. Antara 1962-65, ia mengambil pekerjaan paruh waktu sebagai asisten peneliti dengan Maurice Wilkes untuk merancang dan mengimplementasikan bahasa pemrograman yang kemudian dikenal sebagai CPL. Ini adalah bahasa pemrograman imperatif tetapi dimaksudkan untuk memiliki kemampuan bahasa pemrograman fungsional yang kuat juga. Landin, yang adalah seorang karyawan Strachey di perusahaan konsultannya, memiliki pengaruh besar pada pandangan Strachey tentang bahasa pemrograman. Dalam makalah penting 1965 " Next 700 bahasa pemrograman ", Landin tanpa malu-malu mempromosikan bahasa pemrograman fungsional (menyebut mereka denotatifbahasa) dan menjelaskan bahasa pemrograman imperatif sebagai "antitesis" mereka. Dalam diskusi berikutnya, kami menemukan Strachey menimbulkan keraguan tentang posisi Landin yang kuat.

... DLs membentuk subset dari semua bahasa. Mereka adalah himpunan bagian yang menarik, tetapi salah satu yang tidak nyaman untuk digunakan kecuali Anda terbiasa. Kami membutuhkannya karena saat ini kami tidak tahu bagaimana membangun bukti dengan bahasa yang termasuk imperatif dan lompatan. [Menambahkan penekanan]

Pada 1965, Strachey mengambil posisi sebagai Pembaca di Oxford dan tampaknya telah bekerja penuh waktu untuk mengembangkan teori imperatif dan lompatan. Pada 1967, dia siap dengan teori, yang dia ajarkan dalam kursus tentang " konsep dasar dalam bahasa pemrograman " di sekolah musim panas Kopenhagen. Catatan kuliah itu seharusnya telah diterbitkan tetapi "sayangnya, karena pengeditan yang dilatory, prosesnya tidak pernah terwujud; seperti banyak pekerjaan Strachey di Oxford, bagaimanapun, makalah ini memiliki sirkulasi pribadi yang berpengaruh." ( Martin Campbell-Kelly )

Kesulitan mendapatkan tulisan-tulisan Strachey bisa menyebabkan kebingungan disebarkan, dengan orang-orang mengandalkan sumber-sumber sekunder dan kabar angin. Tapi, sekarang " konsep-konsep dasar " sudah tersedia di web, tidak perlu lagi menggunakan upaya menebak. Kita harus membacanya dan memutuskan apa yang dimaksud Strachey. Khususnya:

  • Dalam bagian 3.2, ia berurusan dengan "ekspresi" di mana ia berbicara tentang "transparansi referensial nilai-R".
  • Bagian 3.3 membahas "perintah" di mana ia berbicara tentang "transparansi referensial nilai-L".
  • Dalam bagian 3.4.5, ia berbicara tentang "fungsi dan rutinitas" dan menyatakan bahwa "setiap keberangkatan transparansi referensial nilai-R dalam konteks nilai-R harus dihilangkan dengan mendekomposisi ekspresi menjadi beberapa perintah dan ekspresi yang lebih sederhana, atau, jika ini ternyata sulit, subjek komentar. "

Setiap pembicaraan tentang "transparansi referensial" tanpa memahami perbedaan antara nilai-L, nilai-R dan objek kompleks lainnya yang mengisi semesta konseptual programmer imperatif secara fundamental salah.

Uday Reddy
sumber
10
Saya pikir perlu ditekankan bahwa membingungkan kedua gagasan tentang "nilai" (evaluasi vs denotasi) menyesatkan programmer fungsional dalam kritik mereka terhadap bahasa imperatif , di mana kesenjangan antara gagasan sangat besar.
Conal
8
yaitu, gagasan evaluasi mengarah pada kesimpulan bahwa bahasa imperatif bukan RT, sedangkan gagasan denotasi tidak.
Conal
12
Tampaknya bagi saya bahwa sekali Anda benar-benar telah memahami semantik denotasi suatu bahasa, itu tidak dapat membantu tetapi menjadi transparan secara referensial. Jadi ini sepertinya sama saja dengan mengatakan bahwa istilah tersebut tidak berguna berkaitan dengan bahasa pemrograman.
Tom Crockett
20
Jadi sepertinya orang-orang memiliki kebiasaan menggunakan istilah untuk mengartikan sesuatu yang berbeda secara materi dari apa yang orang lain maksudkan ketika mereka menggunakan istilah itu di masa lalu. Yang saya katakan: Selamat datang di bahasa Inggris.
Daniel Pratt
17
@DanielPratt: Jika efek samping kebebasan adalah apa yang diinginkan oleh pemrogram fungsional, lalu mengapa mereka menyebutnya "transparansi referensial"? Mereka bisa menyebutnya "efek samping-kebebasan", yang merupakan ide yang sangat jelas. Tidak seorang pun di perlu bertanya di stackexchange apa arti "efek samping-kebebasan". Di mana perlunya purloin istilah klasik muluk yang tampaknya tidak ada yang mengerti?
Uday Reddy
23

Ekspresi transparan referensial jika dapat diganti dengan nilainya, tanpa mengubah algoritma, menghasilkan algoritma yang memiliki efek dan output yang sama pada input yang sama.

CMS
sumber
18

Fungsi transparan referensial adalah fungsi yang berfungsi seperti fungsi matematika; diberi input yang sama, selalu akan menghasilkan output yang sama. Ini menyiratkan bahwa keadaan yang disahkan tidak dimodifikasi, dan bahwa fungsi tidak memiliki keadaan sendiri.

Barry Kelly
sumber
10

Bagi mereka yang membutuhkan penjelasan singkat saya akan membahayakan satu (tetapi baca pengungkapan di bawah).

Transparansi referensial dalam bahasa pemrograman mempromosikan penalaran persamaan - semakin banyak transparansi referensial yang Anda miliki, semakin mudah untuk melakukan penalaran persamaan. Misalnya dengan definisi fungsi (semu),

fx = x + x,

kemudahan yang Anda dapat (dengan aman) mengganti f (foo) dengan foo + foo dalam lingkup definisi ini, tanpa memiliki terlalu banyak kendala di mana Anda dapat melakukan pengurangan ini, merupakan indikasi yang baik tentang seberapa banyak transparansi referensial bahasa pemrograman Anda telah.

Sebagai contoh jika foo adalah x ++ dalam pengertian pemrograman C maka Anda tidak bisa melakukan reduksi ini dengan aman (artinya, jika Anda melakukan reduksi ini, Anda tidak akan berakhir dengan program yang sama dengan yang Anda mulai).

Dalam bahasa pemrograman praktis Anda tidak akan melihat transparansi referensial yang sempurna tetapi programmer fungsional lebih memperhatikannya daripada kebanyakan (cf Haskell, di mana itu adalah tujuan inti).

(Pengungkapan penuh: Saya seorang programmer fungsional sehingga dengan jawaban teratas Anda harus mengambil penjelasan ini dengan sebutir garam.)

chrisdornan
sumber
3
Saya tidak punya masalah dengan bahasa yang memfasilitasi penalaran yang sama. Tetapi saya akan berpendapat bahwa itu ada hubungannya dengan "transparansi referensial" seperti yang didefinisikan secara klasik. Kedua, sebagai seorang programmer praktis, saya pikir penalaran yang sama dilebih-lebihkan. Alasan yang penting dalam praktik berkaitan dengan pra-kondisi, pasca-kondisi, invarian dan abstraksi data. Bagi orang yang mengandalkan teknik penalaran seperti itu, efek samping tampaknya tidak terlalu berarti. Jadi, sementara saya setuju dengan Anda bahwa efek samping dalam ekspresi adalah ide yang buruk, mereka tampaknya tidak mewakili argumen pembunuh.
Uday Reddy
1
@UdayReddy Hanya karena programmer fungsional telah memilih metode tertentu untuk meningkatkan transparansi referensial dalam program mereka (menghilangkan efek samping dan mengembangkan aljabar program yang canggih dan kuat), atau memiliki beberapa praktisi yang mungkin tidak memahami transparansi referensial serta menurut mereka, tidak berarti bahwa bahasa pemrograman fungsional gagal meningkatkan transparansi referensial atau bahwa programmer bahasa fungsional dan penulis kompiler tidak mengeksploitasi peningkatan ketertelusuran formal ini untuk banyak tujuan baik.
chrisdornan
2
Chris: Uday menunjukkan bahwa Strachey menghilangkan masalah opacity referensial dalam semantik bahasa pemrograman, terutama untuk bahasa imperatif. Jadi programmer fungsional tidak dapat "menekan transparansi referensial dalam program mereka". Sebagai contoh konkret, Haskell IO ada bantuan dengan RT karena tidak ada bantuan RT diperlukan.
Conal
2
@chrisdornan: Maaf untuk komentar pertama saya di atas. Saya sendiri mengalami kesulitan untuk memahami apa yang ingin saya katakan dalam dua kalimat pertama :-( Tapi, inilah penjelasannya. Pertimbangkan kalkulasi pementasan dua tingkat atau multi-level. Setiap operator pementasan secara referensi bersifat buram. Sebenarnya ., operator kutip Namun, Anda dapat melakukan penalaran equational dalam setiap tahap baik-baik saja Jadi, masing-masing operator referentially buram mengatur batas-batas untuk penalaran equational Tapi Anda masih memiliki alasan equational dalam batas-batas...
Uday Reddy
1
@chrisdomain: Selain itu, sangat sedikit orang yang ingin menjadi puritan transparansi referensial untuk menghalau operator pementasan tersebut. Operator-operator itu sangat berguna. Pemrograman tanpa mereka dengan melakukan pementasan secara manual akan membosankan, rawan kesalahan dan jelek. Dan, melakukan pementasan secara manual tidak akan memberi Anda alasan yang lebih adil daripada apa yang Anda miliki sebelumnya. Jadi, melarang perangkat pemrograman yang baik dalam mengejar alasan rasional sama saja seperti memotong hidung Anda untuk menggerutu.
Uday Reddy
8

Jika Anda tertarik dengan etimologi (mis. Mengapa konsep ini memiliki nama khusus ini), lihat posting blog saya tentang topik tersebut. Terminologi berasal dari filsuf / ahli logika Quine.

Andrew Birkett
sumber
4
  1. Denotational-semantik didasarkan pada bahasa pemodelan dengan membangun domain yang merupakan nilai yang dapat didenotasikan .
  2. Programmer fungsional menggunakan istilah nilai untuk menggambarkan konvergensi dari perhitungan berdasarkan aturan penulisan ulang yaitu bahasa. semantik operasionalnya.

Dalam 1 ada kejelasan dua bahasa yang dipertanyakan:

  • yang dimodelkan, bahasa objek
  • bahasa pemodelan, bahasa meta

Dalam 2, berkat kedekatan objek dan bahasa logam, mereka bisa bingung.

Sebagai pelaksana bahasa, saya menemukan bahwa saya harus selalu mengingat perbedaan ini.

Jadi, Prof. Reddy, saya perkirakan Anda :-)

Dalam konteks pemrograman fungsional dan semantik, istilah Transparansi Referensi tidak secara transparan transparan.

Anuradha
sumber
1
Ha ha. Terima kasih untuk penjelasannya. Masalahnya adalah bahwa pemrogram fungsional bertindak seolah-olah mereka memiliki gagasan umum tentang "transparansi referensial" yang berlaku untuk semua bahasa pemrograman . Tetapi ini tergantung pada pengertian mereka tentang "nilai," yang mungkin atau mungkin tidak masuk akal untuk bahasa lain. Untuk mengklaim teori umum "transparansi referensial," mereka perlu menghasilkan "nilai" teori umum. Itu hilang sejauh ini.
Uday Reddy
4

Saya berharap jawaban berikut menambah dan memenuhi kualifikasi jawaban 1 dan 3 yang kontroversial.

Mari kita akui bahwa suatu ungkapan menunjukkan atau merujuk pada beberapa referensi. Namun, pertanyaannya adalah apakah rujukan-rujukan ini dapat dikodekan secara isomorfis sebagai bagian dari ekspresi itu sendiri, menyebut ungkapan-ungkapan seperti itu 'nilai'. Sebagai contoh, nilai angka literal adalah himpunan bagian dari himpunan ekspresi aritmatika, nilai-nilai kebenaran adalah himpunan himpunan ekspresi boolean, dll. Idenya adalah untuk mengevaluasi ekspresi ke nilainya (jika ada). Jadi kata 'nilai' dapat merujuk pada denotasi atau elemen khusus dari rangkaian ekspresi. Tetapi jika ada isomorfisme (suatu penimbunan) antara referensi dan nilai, kita dapat mengatakan mereka adalah hal yang sama. (Ini mengatakan, seseorang harus berhati-hati untuk mendefinisikan referensi dan isomorfisme, sebagaimana dibuktikan oleh bidang semantik denotasional. Untuk memberi contoh yang disebutkan oleh balasan ke jawaban ke-3,data Nat = Zero | Suc Nat tidak sesuai seperti yang diharapkan pada himpunan bilangan asli.)

Mari kita menulis E[·]untuk ekspresi dengan lubang, juga dikenal di beberapa tempat sebagai 'konteks'. Dua contoh konteks untuk ekspresi mirip-C adalah [·]+1dan [·]++.

Mari kita menulis [[·]]untuk fungsi yang mengambil ekspresi (tanpa lubang) dan memberikan maknanya (referensi, denotasi, dll.) Di beberapa semesta yang menyediakan makna. (Saya meminjam notasi dari bidang semantik denotasional.)

Mari kita sesuaikan definisi Quine secara formal sebagai berikut: konteks E[·] adalah referensial transparan jika diberikan dua ekspresi E1dan E2(tidak ada lubang di sana) sehingga [[E1]] = [[E2]](yaitu ekspresi menunjukkan / merujuk ke referensi yang sama) maka itu adalah kasus yang [[E[E1]]] = [[E[E2]]](yaitu mengisi -dalam lubang dengan salah satu E1atau E2menghasilkan ekspresi yang juga menunjukkan referensi yang sama).

Aturan Leibniz untuk mengganti sama dengan sama biasanya dinyatakan sebagai 'jika E1 = E2kemudian E[E1] = E[E2]', yang mengatakan itu E[·]adalah fungsi. Fungsi (atau dalam hal ini program menghitung fungsi) adalah pemetaan dari sumber ke target sehingga ada paling banyak satu elemen target untuk setiap elemen sumber. Fungsi non-deterministik adalah misnomer, mereka adalah hubungan, fungsi yang memberikan set, dll. Jika dalam aturan Leibniz persamaan =adalah denotasional maka kurung ganda hanya diterima begitu saja dan diabaikan. Jadi konteks yang secara transparan transparan adalah fungsi. Dan aturan Leibniz adalah unsur utama dari penalaran persamaan, jadi alasan persamaan pasti terkait dengan transparansi referensial.

Meskipun [[·]]merupakan fungsi dari ekspresi ke denotasi, ini bisa berupa fungsi dari ekspresi hingga 'nilai' yang dipahami sebagai subset ekspresi terbatas, dan [[·]]dapat dipahami sebagai evaluasi.

Sekarang, jika E1ini adalah ekspresi dan E2merupakan nilai, kita memiliki apa yang saya pikir dimaksud oleh kebanyakan orang ketika mendefinisikan transparansi referensial dalam hal ekspresi, nilai, dan evaluasi. Tetapi seperti yang diilustrasikan oleh jawaban pertama dan ketiga di halaman ini, ini adalah definisi singkat.

Masalah dengan konteks seperti [·]++bukan efek samping, tetapi nilainya tidak didefinisikan dalam C secara isomorfis dengan artinya. Fungsi bukan nilai (well, pointer ke fungsi) sedangkan dalam bahasa pemrograman fungsional mereka adalah. Landin, Strachey, dan pelopor semantik denotasional cukup pintar dalam menggunakan dunia fungsional untuk memberikan makna.

Untuk bahasa mirip C yang imperatif, kami dapat (secara kasar) menyediakan semantik untuk ekspresi menggunakan fungsi [[·]] : Expression -> (State -> State x Value).

Valueadalah bagian dari Expression. Statemengandung pasangan (pengidentifikasi, nilai). Fungsi semantik mengambil ekspresi dan memberikan sebagai artinya fungsi dari keadaan saat ini ke pasangan dengan keadaan yang diperbarui dan nilai. Sebagai contoh, [[x]]adalah fungsi dari kondisi saat ini ke pasangan yang komponen pertamanya adalah kondisi saat ini dan yang komponen kedua adalah nilai x. Sebaliknya, [[x++]]adalah fungsi dari kondisi saat ini ke pasangan yang komponen pertamanya adalah keadaan di mana nilai x bertambah, dan komponen kedua mana yang sangat bernilai. Dalam pengertian ini, konteksnya [·]++adalah transparan referensial jika memenuhi definisi yang diberikan di atas.

Saya pikir programmer fungsional berhak menggunakan transparansi referensial dalam arti bahwa mereka secara alami pulih [[·]]sebagai fungsi dari ekspresi ke nilai. Fungsinya adalah nilai kelas satu dan negara juga bisa menjadi nilai, bukan denotasi. State monad adalah (sebagian) mekanisme bersih untuk melewati (atau threading) negara.


sumber
Mungkin jawaban "1" & "3" masing-masing adalah jawaban "25 Maret" & "postscript" UdayReddy. Ordinals bukan cara yang baik untuk merujuk jawaban di SO. Pilihan & penerimaan tidak hanya dapat berubah seiring waktu tetapi ada beberapa pemesanan yang dapat dipilih.
philipxy
2

Perhatikan bahwa konsep "makna" ini adalah sesuatu yang terjadi dalam pikiran pengamat. Dengan demikian, "referensi" yang sama dapat memiliki arti yang berbeda bagi orang yang berbeda. Jadi, misalnya, kami memiliki halaman disambiguasi Edinburgh di Wikipedia.

Masalah terkait yang dapat muncul dalam konteks pemrograman mungkin polimorfisme.

Dan mungkin kita harus memiliki nama untuk kasus khusus polimorfisme (atau mungkin bahkan casting) di mana untuk tujuan kita kasus polimorfik yang berbeda setara secara semantik (bukan hanya menjadi serupa. Misalnya, angka 1 - yang mungkin diwakili menggunakan tipe integer, atau tipe kompleks atau salah satu dari berbagai tipe lainnya - dapat diperlakukan secara polimorfik).

rdm
sumber
0

Saya menemukan definisi transparansi referensial dalam buku " Struktur dan Implementasi Program Komputer " (Buku Panduan) berguna karena dilengkapi dengan penjelasan tentang bagaimana transparansi referensial dilanggar dengan memperkenalkan operasi penugasan . Lihat slide deck berikut yang saya buat tentang subjek: https://www.slideshare.net/pjschwarz/introducing-assignment-invalidates-the-substitusi-model-of-evaluation-and-violates-referential-transparency-as- menjelaskan-dalam-sicp-the-wisaya-buku

Philip Schwarz
sumber
0

Transparansi referensial dapat dengan sederhana dinyatakan sebagai:

  • Ekspresi yang selalu mengevaluasi hasil yang sama dalam konteks apa pun [1] ,
  • Suatu fungsi, jika diberi parameter yang sama dua kali, harus menghasilkan hasil yang sama dua kali [2] .

Sebagai contoh, bahasa pemrograman Haskell adalah bahasa fungsional murni; yang berarti bahwa itu transparan referensial.

Bisa
sumber