ความโปร่งใสอ้างอิงคืออะไร?


285

คำว่าการอ้างอิงความโปร่งใสหมายถึงอะไร? ฉันได้ยินว่ามันอธิบายว่า "หมายความว่าคุณสามารถแทนที่เท่ากับด้วย" ได้ แต่นี่ดูเหมือนจะเป็นคำอธิบายที่ไม่เพียงพอ


1
ว้าวฉันสงสัยว่าทำไมขึ้นอย่างฉับพลันในความนิยมของคำถามนี้ ...
Claudiu

1
@ Claudia: ฉันไม่สามารถพูดได้อย่างแน่นอน แต่r / haskellได้รับลมและหลายคนรู้สึกว่า Uday นั้นถึงแม้ว่าจะค่อนข้างแม่นยำ
efrey

6
@efrey Jibe บางทีมันอาจจะเป็น แต่เมื่อโปรแกรมเมอร์ทำงานฟังก์ชั่นลดลงภาษาการเขียนโปรแกรมที่จำเป็นและภาษาที่ใช้งานได้ผลข้างเคียง (เช่น Lisp และ ML) ที่อ้างว่าพวกเขาไม่ได้อ้างอิงอย่างโปร่งใสพวกเขาไม่ได้รับความสนใจหรือไม่? อย่างน้อยพวกเขาไม่ควรได้รับข้อเท็จจริงของพวกเขาก่อนที่จะทำเช่นนั้น?
Uday Reddy

2
@Claudiu ฉันได้โพสต์ไว้ใน Haskell Reddit และ Conal ได้ทวีตแล้ว ฉันพบว่าการสนทนาน่าสนใจและคิดว่ามันเป็นการสนทนาที่กว้างขึ้น ฉันดึงความสนใจไปที่ jibe ของ Uday เพื่อกระตุ้นการสนทนา ฉันยอมรับว่าบางครั้ง FPers ของเราสามารถพึงพอใจและต้องการผลิตภัณฑ์ที่ดี - ทำได้ดีมากกับ Uday ที่ให้บริการ!
chrisdornan

7
@efrey นั่นเป็นเหตุผลว่าทำไมฉันถึงเลือกอ้างอิงจาก Bird and Wadler (semanticists?) ในโพสต์ที่สองของฉัน คนที่มีความรู้รู้ว่าแนวคิดเรื่องความโปร่งใสของการอ้างอิงที่เป็นที่นิยมนั้นคลุมเครือและอาจไม่เชื่อมโยงกัน แต่มันไม่เคยมีการอธิบายไปยังชุมชนการเขียนโปรแกรมอย่างถูกต้อง หวังว่างานเขียนของฉันที่นี่จะสร้างความแตกต่าง
Uday Reddy

คำตอบ:


362

คำว่า "การอ้างอิงโปร่งใส" มาจากปรัชญาการวิเคราะห์สาขาวิชาปรัชญาที่วิเคราะห์การสร้างภาษาธรรมชาติคำแถลงและข้อโต้แย้งตามวิธีการของตรรกะและคณิตศาสตร์ ในคำอื่น ๆ ก็เป็นเรื่องวิทยาศาสตร์คอมพิวเตอร์นอกใกล้เคียงกับสิ่งที่เราเรียกว่าการเขียนโปรแกรมภาษาความหมาย นักปรัชญาWillard Quineมีหน้าที่รับผิดชอบในการเริ่มต้นแนวคิดของความโปร่งใสในการอ้างอิง แต่มันก็เป็นนัยในแนวทางของ Bertrand Russell และ Alfred Whitehead

หัวใจของ "การอ้างอิงโปร่งใส" เป็นแนวคิดที่ง่ายและชัดเจน คำว่า "อ้างอิง" ถูกนำมาใช้ในปรัชญาการวิเคราะห์เพื่อพูดคุยเกี่ยวกับสิ่งที่แสดงออกหมายถึง มันเป็นสิ่งเดียวกับสิ่งที่เราหมายถึงโดย "ความหมาย" หรือ "denotation" ในความหมายของการเขียนโปรแกรมภาษา ใช้ตัวอย่างของ Andrew Birkett ( บล็อกโพสต์ ) คำว่า "เมืองหลวงของสกอตแลนด์" หมายถึงเมืองเอดินเบอระ นั่นเป็นตัวอย่างที่ชัดเจนของ "ผู้อ้างอิง"

บริบทในประโยคคือ "โปร่งใสอ้างอิง" ถ้าแทนที่คำในบริบทนั้นด้วยคำอื่นที่อ้างถึงหน่วยงานเดียวกันไม่ได้เปลี่ยนความหมาย ตัวอย่างเช่น

รัฐสภาสกอตแลนด์พบกันที่เมืองหลวงของสกอตแลนด์

หมายถึงเช่นเดียวกับ

รัฐสภาสกอตแลนด์พบกันที่เอดินเบิร์ก

บริบท "รัฐสภาสก็อตพบใน ... " จึงเป็นบริบทที่โปร่งใสอ้างอิง เราสามารถแทนที่ "เมืองหลวงแห่งสกอตแลนด์" ด้วย "Edinburgh" โดยไม่เปลี่ยนความหมาย หากต้องการกล่าวอีกนัยหนึ่งบริบทจะสนใจเฉพาะสิ่งที่คำนั้นอ้างถึงและไม่มีอะไรอื่น นั่นคือความหมายที่บริบทมี "การอ้างอิงที่โปร่งใส"

ในทางกลับกันในประโยค

เอดินบะระเป็นเมืองหลวงของสกอตแลนด์มาตั้งแต่ปี 2542

เราไม่สามารถทำสิ่งทดแทนได้ ถ้าเราทำเราจะได้ "เอดินเบิร์กมาเป็นเอดินเบิร์กตั้งแต่ปี 2542" ซึ่งเป็นสิ่งที่ควรพูดและไม่ได้สื่อความหมายเหมือนประโยคเดิม ดังนั้นจึงดูเหมือนว่าบริบท "เอดินเบิร์กเป็น ... ตั้งแต่ปี 1999" นั้นทึบแสงแบบอ้างอิง (ตรงกันข้ามกับความโปร่งใสแบบอ้างอิง) เห็นได้ชัดว่ามันสนใจบางสิ่งมากกว่าคำที่อ้างถึง มันคืออะไร?

สิ่งต่าง ๆ เช่น "เมืองหลวงของสกอตแลนด์" เรียกว่าคำศัพท์ที่ชัดเจนและพวกเขาไม่ได้ปวดหัวกับนักลอจิสติกและนักปรัชญามานาน รัสเซลและควินจัดเรียงพวกเขาออกมาบอกว่าพวกเขาไม่ใช่ "อ้างอิง" จริง ๆ แล้วมันคือความผิดพลาดที่จะคิดว่าตัวอย่างข้างต้นใช้เพื่ออ้างถึงเอนทิตี้ของ วิธีที่ถูกต้องในการทำความเข้าใจ "เอดินเบิร์กเป็นเมืองหลวงของสกอตแลนด์มาตั้งแต่ปี 2542" คือการพูด

สกอตแลนด์มีเมืองหลวงมาตั้งแต่ปี 1999 และเมืองหลวงนั้นคือเอดินเบอระ

ประโยคนี้ไม่สามารถเปลี่ยนเป็นประโยคที่บ้าได้ แก้ไขปัญหา! ประเด็นของควินคือการพูดว่าภาษาธรรมชาตินั้นยุ่งเหยิงหรืออย่างน้อยก็มีความซับซ้อนเพราะมันถูกสร้างขึ้นเพื่อความสะดวกในการใช้งานจริง แต่นักปรัชญาและนักตรรกวิทยาควรนำความชัดเจนมาทำความเข้าใจโดยวิธีที่ถูกต้อง ความโปร่งใสอ้างอิงเป็นเครื่องมือที่จะใช้สำหรับนำความชัดเจนของความหมายดังกล่าว

สิ่งทั้งหมดนี้เกี่ยวกับการเขียนโปรแกรม? ไม่มากจริง ๆ ที่เรากล่าวว่าโปร่งใสอ้างอิงเป็นเครื่องมือที่จะนำมาใช้ในภาษาเข้าใจคือในการกำหนดความหมาย Christopher Stracheyผู้ก่อตั้งสาขาความหมายของภาษาโปรแกรมใช้ในการศึกษาความหมายของเขา กระดาษพื้นฐานของเขา " แนวคิดพื้นฐานในภาษาโปรแกรม " มีอยู่บนเว็บ มันเป็นกระดาษที่สวยงามและทุกคนสามารถอ่านและเข้าใจได้ ดังนั้นโปรดทำเช่นนั้น คุณจะรู้แจ้งมาก เขาแนะนำคำว่า "การอ้างอิงโปร่งใส" ในย่อหน้านี้:

หนึ่งในคุณสมบัติที่มีประโยชน์ที่สุดของนิพจน์คือความโปร่งใสในการอ้างอิงของ Quine ในสาระสำคัญนี้หมายความว่าถ้าเราต้องการที่จะหาค่าของการแสดงออกซึ่งมีการแสดงออกย่อยสิ่งเดียวที่เราต้องรู้เกี่ยวกับการแสดงออกย่อยคือค่าของมัน คุณสมบัติอื่น ๆ ของนิพจน์ย่อยเช่นโครงสร้างภายในจำนวนและลักษณะของส่วนประกอบลำดับของสิ่งที่พวกเขาได้รับการประเมินหรือสีของหมึกที่พวกเขาเขียนนั้นไม่เกี่ยวข้องกับค่าของหลัก การแสดงออก

การใช้ "ในสาระสำคัญ" แสดงให้เห็นว่า Strachey ถอดความมันเพื่ออธิบายในแง่ง่าย ๆ โปรแกรมเมอร์ฟังก์ชั่นดูเหมือนจะเข้าใจวรรคนี้ในทางของตัวเอง มีการอ้างอิง "ความโปร่งใสอ้างอิง" อีก 9 เหตุการณ์ในกระดาษ แต่ดูเหมือนว่าพวกเขาจะไม่สนใจคนอื่น ในความเป็นจริงกระดาษทั้ง Strachey ทุ่มเทให้กับการอธิบายความหมายของการเขียนโปรแกรมภาษาจำเป็น แต่ในปัจจุบันผู้เขียนโปรแกรมที่ใช้งานได้อ้างว่าภาษาการเขียนโปรแกรมที่จำเป็นนั้นไม่มีความโปร่งใสในการอ้างอิง Strachey จะเปลี่ยนในหลุมฝังศพของเขา

เราสามารถกอบกู้สถานการณ์ได้ เราบอกว่าภาษาธรรมชาตินั้น "ยุ่งหรืออย่างน้อยก็ซับซ้อน" เพราะมันถูกสร้างขึ้นเพื่อความสะดวกในการใช้งานจริง ภาษาการเขียนโปรแกรมเป็นวิธีเดียวกัน พวกเขา "ยุ่งหรืออย่างน้อยก็ซับซ้อน" เพราะพวกเขาถูกสร้างขึ้นเพื่อความสะดวกในการใช้งานจริง นั่นไม่ได้หมายความว่าพวกเขาต้องทำให้เราสับสน พวกเขาต้องเข้าใจถูกวิธีโดยใช้เมตาดาต้าที่มีความโปร่งใสในการอ้างอิงเพื่อให้เรามีความชัดเจนในความหมาย ในเอกสารที่ฉันอ้างถึง Strachey ทำอย่างนั้น เขาอธิบายความหมายของภาษาการเขียนโปรแกรมที่จำเป็นโดยการแบ่งพวกเขาออกเป็นแนวคิดพื้นฐานไม่เคยสูญเสียความชัดเจนทุกที่ ส่วนสำคัญของการวิเคราะห์ของเขาคือการชี้ให้เห็นว่าการแสดงออกในภาษาการเขียนโปรแกรมมี "ค่า" สองชนิดR ค่า ก่อนที่กระดาษของ Strachey จะไม่เข้าใจและสับสนมากที่สุด วันนี้คำจำกัดความของ C กล่าวถึงเป็นประจำและโปรแกรมเมอร์ C ทุกคนเข้าใจความแตกต่าง (ไม่ว่าโปรแกรมเมอร์ในภาษาอื่นจะเข้าใจดีหรือไม่ก็ยากที่จะพูด)

ทั้ง Quine และ Strachey เกี่ยวข้องกับความหมายของการสร้างภาษาที่เกี่ยวข้องกับการพึ่งพาบริบทบางรูปแบบ ตัวอย่างเช่นตัวอย่าง "เอดินเบิร์กเป็นเมืองหลวงของสกอตแลนด์มาตั้งแต่ปี 2542" บ่งบอกถึงความจริงที่ว่า "เมืองหลวงแห่งสกอตแลนด์" ขึ้นอยู่กับเวลาที่พิจารณา การพึ่งพาบริบทดังกล่าวเป็นจริงทั้งในภาษาธรรมชาติและภาษาโปรแกรม แม้ในการเขียนโปรแกรมเชิงฟังก์ชันตัวแปรอิสระและขอบเขตจะถูกตีความโดยคำนึงถึงบริบทที่ปรากฏขึ้นการพึ่งพาบริบทของบล็อกชนิดใดก็ตามที่อ้างอิงโปร่งใสในบางวิธีหรืออย่างอื่น หากคุณพยายามที่จะเข้าใจความหมายของคำศัพท์โดยไม่คำนึงถึงบริบทที่พวกเขาต้องพึ่งพาคุณจะต้องสับสนอีกครั้ง Quine เกี่ยวข้องกับความหมายของตรรกะโมดอล เขาถือได้ว่าตรรกะโมดัลเป็นแบบทึบแสงแบบอ้างอิงและควรทำความสะอาดโดยการแปลเป็นกรอบโปร่งใสแบบอ้างอิง (เช่นโดยคำนึงถึงความจำเป็นเท่าที่สามารถพิสูจน์ได้) เขาส่วนใหญ่สูญเสียการอภิปรายนี้ นักตรรกวิทยาและนักปรัชญาพบว่าความหมายของ Kripke ที่เป็นไปได้ในโลกนั้นเพียงพอแล้ว สถานการณ์ที่คล้ายกันก็ขึ้นอยู่กับการเขียนโปรแกรมที่จำเป็น การพึ่งพารัฐอธิบายโดย Strachey และการพึ่งพาอาศัยร้านค้าที่อธิบายโดย Reynolds (ในลักษณะที่คล้ายคลึงกับความหมายโลกของ Kripke ที่เป็นไปได้) นั้นเพียงพอแล้ว โปรแกรมเมอร์ที่ใช้งานได้ไม่ค่อยรู้จักงานวิจัยนี้มากนัก ความคิดของพวกเขาเกี่ยวกับความโปร่งใสในการอ้างอิงจะถูกนำมาพร้อมกับเม็ดเกลือขนาดใหญ่

[หมายเหตุเพิ่มเติม: ตัวอย่างด้านบนแสดงให้เห็นว่าวลีง่ายๆเช่น "เมืองหลวงแห่งสกอตแลนด์" มีความหมายหลายระดับ ในระดับหนึ่งเราอาจพูดถึงทุนในเวลาปัจจุบัน ในอีกระดับหนึ่งเราอาจพูดถึงเมืองหลวงที่เป็นไปได้ทั้งหมดซึ่งสกอตแลนด์อาจผ่านมาในช่วงเวลาหนึ่ง เราสามารถ "ซูมเข้า" บริบทเฉพาะและ "ย่อ" เพื่อขยายบริบททั้งหมดได้อย่างง่ายดายในการปฏิบัติตามปกติ ประสิทธิภาพของภาษาธรรมชาติใช้ประโยชน์จากความสามารถของเราในการทำเช่นนั้น ภาษาโปรแกรมเชิงซ้อนนั้นมีประสิทธิภาพในลักษณะเดียวกัน เราสามารถใช้ตัวแปรxทางด้านขวามือของการมอบหมาย ( r-value ) เพื่อพูดคุยเกี่ยวกับค่าของมันในสถานะเฉพาะ หรือเราอาจพูดถึงค่า lซึ่งครอบคลุมทุกรัฐ ผู้คนมักไม่ค่อยสับสนกับเรื่องแบบนี้ อย่างไรก็ตามพวกเขาอาจจะหรืออาจจะไม่สามารถอธิบายทุกชั้นของความหมายที่มีอยู่ในโครงสร้างภาษา เลเยอร์ความหมายทั้งหมดไม่จำเป็นต้อง 'ชัดเจน' และเป็นเรื่องของวิทยาศาสตร์ที่จะศึกษาอย่างเหมาะสม อย่างไรก็ตามความไม่เป็นทางการของคนธรรมดาที่จะอธิบายความหมายแบบเลเยอร์ดังกล่าวไม่ได้หมายความว่าพวกเขาสับสนกับพวกเขา]

แยก "วรรณกรรม" ด้านล่างที่เกี่ยวข้องกับการสนทนานี้ความกังวลของการเขียนโปรแกรมการทำงานและความจำเป็น


10
ขอบคุณ แต่ฉันไม่คิดว่ามันมีความคิดเชิงมิติที่ชัดเจนเกี่ยวกับความเท่าเทียมกัน เมื่อฉันพูดว่า "เมืองหลวงแห่งสกอตแลนด์" หมายถึงเมืองเอดินเบอระคุณไม่ได้คิดเกี่ยวกับมันสองครั้ง แต่เมื่อฉันเริ่มพูดถึง "ตั้งแต่ปี 1999" คุณก็รู้ตัวว่ามีเวลาที่เกี่ยวข้อง ดังนั้นความคิดเชิงมิติของความเท่าเทียมกันนั้นค่อนข้างที่จะลึกซึ้งและมันก็เป็นทางการโดยนักวิจัยด้านการเขียนโปรแกรมภาษา ผู้ที่ต้องการมีความเข้าใจอย่างสมบูรณ์เกี่ยวกับความเสมอภาคในมิติต้องเรียนรู้ผลของการวิจัยนั้น อาจไม่ชัดเจนเลย
Uday Reddy

5
Fantastic! บรรเทายินดีต้อนรับสู่ความเข้าใจผิดเกี่ยวกับความนิยม RT เช่นผูกมันฟังก์ชั่น หรือการกำหนดด้วยการแทนที่นิพจน์ด้วยค่าของมัน (เช่นเดียวกับบน Wikipedia) - แปลกดังนั้นตั้งแต่การแสดงออกและค่าต่าง ๆ เป็นสิ่งที่แตกต่างกัน บางทีที่เดียวที่ผู้คนผิดพลาดในการพิจารณา RT-ness ของภาษาที่จำเป็นก็คือสมมติว่า "ค่านิยม" เหล่านี้เป็นสิ่งที่เรียบง่ายเช่นตัวเลขแทนที่จะเป็นสิ่งที่ซับซ้อนกว่าเช่นฟังก์ชั่นจากร้านค้า
Conal

13
@sclv สำหรับผลกระทบที่กว้างขึ้นของปรัชญาการวิเคราะห์เกี่ยวกับวิทยาศาสตร์คอมพิวเตอร์ฉันควรจะพูดว่าวิทยาศาสตร์คอมพิวเตอร์อย่างที่เรารู้นั้นก่อตั้งขึ้นโดย Godel, Church, Kleene และ Turing คนเหล่านี้เป็นนักตรรกวิทยาและพวกเขามีความรอบรู้ในด้านคณิตศาสตร์และปรัชญาของตรรกะโดยเฉพาะประเพณีของ Peano, Frege, Russell, Whitehead, Carnap และ Quine ผู้บุกเบิกยุคแรกของวิทยาการคอมพิวเตอร์สมัยใหม่รู้จักการเชื่อมต่อ แต่การเติบโตอย่างรวดเร็วของวิทยาศาสตร์คอมพิวเตอร์ได้ทำลายพวกเขา เราต้องกลับไปหาพวกเขา
Uday Reddy

5
@sclv ลอจิกจะตีความแบบดั้งเดิมที่เป็นวิทยาศาสตร์ของผล แต่ฉันคิดว่ามันกว้างกว่า มันเป็นวิทยาศาสตร์ของข้อมูล Quine ฉันเห็นว่าเป็นคนแรกที่ทำให้เกิดมุมมองที่กว้างขึ้น "คำพูดและวัตถุ" เป็นการวิเคราะห์เนื้อหาข้อมูลของข้อความภาษาธรรมชาติ อย่างไรก็ตามนักปรัชญาและนักคณิตศาสตร์ไม่เคยมีความสนใจในการคำนวณซึ่งค่อนข้างน่างงงวยเนื่องจากการคำนวณจากส่วนกลางมีความสำคัญต่ออารยธรรมและวิทยาศาสตร์มาตั้งแต่ไหน แต่ไร เราต้องหาวิธีที่จะทำให้พวกเขาสนใจ
Uday Reddy

3
@ Conal: ฉันได้เพิ่มคำตอบใหม่ที่ขยายจุดของคุณ มันอาจจะอยู่ที่ด้านล่างของหน้า
Uday Reddy

134

ความโปร่งใสอ้างอิงคำที่ใช้บ่อยในการเขียนโปรแกรมฟังก์ชั่นหมายความว่าได้รับฟังก์ชั่นและค่าการป้อนข้อมูลคุณจะได้รับผลลัพธ์ที่เหมือนกัน กล่าวคือไม่มีสถานะภายนอกที่ใช้ในฟังก์ชัน

นี่คือตัวอย่างของฟังก์ชันโปร่งใส referential:

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

ด้วยฟังก์ชันโปร่งใสแบบอ้างอิงได้รับอินพุตและฟังก์ชันคุณสามารถแทนที่ด้วยค่าแทนที่จะเรียกใช้ฟังก์ชัน ดังนั้นแทนที่จะเรียก plusOne ด้วยพารามิเตอร์ 5 เราก็สามารถแทนที่มันด้วย 6

อีกตัวอย่างที่ดีคือคณิตศาสตร์โดยทั่วไป ในคณิตศาสตร์ที่กำหนดฟังก์ชั่นและค่าอินพุตมันจะแม็พกับค่าเอาต์พุตเดียวกันเสมอ f (x) = x + 1 ดังนั้นฟังก์ชั่นในคณิตศาสตร์มีความโปร่งใสในการอ้างอิง

แนวคิดนี้มีความสำคัญต่อนักวิจัยเพราะมันหมายถึงว่าเมื่อคุณมีฟังก์ชั่นอ้างอิงที่โปร่งใสมันจะทำให้ตัวเองสามารถทำการขนานและแคชอัตโนมัติได้ง่าย

ความโปร่งใสอ้างอิงมักใช้ในภาษาที่ใช้งานได้เช่น Haskell

-

ในทางตรงกันข้ามมีแนวคิดของความทึบแสงอ้างอิง ซึ่งหมายความว่าตรงกันข้าม การเรียกใช้ฟังก์ชั่นอาจไม่ได้ให้ผลลัพธ์ที่เหมือนกันทุกครั้ง

//global G
int G = 10;

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

อีกตัวอย่างหนึ่งคือฟังก์ชั่นสมาชิกในภาษาโปรแกรมเชิงวัตถุ ฟังก์ชั่นสมาชิกทั่วไปทำงานกับตัวแปรสมาชิกของมันและดังนั้นจึงจะเป็นทึบแสงอ้างอิง ฟังก์ชั่นสมาชิกแม้ว่าแน่นอนสามารถโปร่งใส referential

อีกตัวอย่างหนึ่งคือฟังก์ชั่นที่อ่านจากไฟล์ข้อความและพิมพ์เอาต์พุต ไฟล์ข้อความภายนอกนี้สามารถเปลี่ยนแปลงได้ตลอดเวลาดังนั้นฟังก์ชันจะเป็นแบบทึบแสงแบบอ้างอิง


1
เพียงแค่หัวขึ้นก็เป็นไปได้ที่จะมีวัตถุโปร่งใสอ้างอิงอย่างเต็มที่ด้วยฟังก์ชั่นสมาชิกโปร่งใสอ้างอิง ดูokmij.org/ftp/Scheme/oop-in-fp.txt
Jonathan Arkell

1
และนี่คือรหัสที่กำลังพูดถึงในบทความนั้น: okmij.org/ftp/Scheme/pure-oo-system.scm
Jonathan Arkell

ในกรณีของคลาสโปร่งใสที่อ้างอิงอย่างเต็มที่คุณอาจจะมีฟังก์ชั่นสมาชิกทั้งหมดคงที่
Brian R. Bondy

13
สิ่งที่คุณกำลังพูดถึงที่นี่ไม่ได้เป็นความโปร่งใสอ้างอิงแม้ว่ามันมักจะเรียกว่าเป็นเช่นนี้ ดูคำตอบสองข้อของ Uday และความคิดเห็นต่อพวกเขา โดยเฉพาะอย่างยิ่งสิ่งที่คุณเรียกว่า "เอาท์พุท" ไม่ได้เป็น denotation หากคุณแทนที่ "plusG 3" ด้วยนิพจน์อื่นใดที่มีค่า / denotation เดียวกันคุณจะได้รับโปรแกรมที่มีความหมายเหมือนกันดังนั้น RT จึงมีภาษาที่จำเป็น นิพจน์ "3 + 10" หรือ "13" ไม่มีความหมายเหมือนกับ "plusG 3" เนื่องจากความหมายในภาษาที่จำเป็นคือฟังก์ชันของ "store" (สถานะ)
Conal

1
ฉันเพิ่งอ่านบทความเกี่ยวกับผลข้างเคียงและการเปลี่ยนแปลงของรัฐและมีสัญชาตญาณว่ามันเกี่ยวข้องกับ RT คุณช่วยเพิ่มบันทึกลงในมันได้ไหม
Gaurav

91

ฟังก์ชั่นอ้างอิงที่โปร่งใสคือฟังก์ชันที่ขึ้นอยู่กับอินพุตเท่านั้น


4
ซึ่งเป็นสาเหตุที่ทำให้การเขียนโปรแกรม OO ยากเนื่องจากวัตถุมีสถานะ
กริช

5
ดังนั้นมันถูกต้องหรือไม่ที่จะพูดว่า "referential transparent" เหมือนกับ "deterministic" เมื่ออธิบายฟังก์ชัน? ถ้าไม่เป็นเช่นนั้นข้อแตกต่างระหว่างสองคำคืออะไร
mwolfe02

1
ฟังก์ชั่นนี้ยังดูเหมือนคำจำกัดความของฟังก์ชั่น "บริสุทธิ์"
Evgeny A.

75

[นี่เป็นบทความจากคำตอบของฉันตั้งแต่วันที่ 25 มีนาคมเพื่อให้การอภิปรายใกล้เคียงกับความกังวลของการเขียนโปรแกรมใช้งาน / จำเป็น]

แนวคิดการทำงานของโปรแกรมเมอร์เกี่ยวกับความโปร่งใสในการอ้างอิงดูเหมือนจะแตกต่างจากแนวคิดมาตรฐานในสามวิธี:

  • ในขณะที่นักปรัชญา / นักตรรกวิทยาใช้คำเช่น "อ้างอิง", "denotation", "designatum" และ " bedeutung " (คำศัพท์ภาษาเยอรมันของ Frege) โปรแกรมเมอร์ที่ใช้งานจะใช้คำว่า "คุณค่า" (นี่ไม่ใช่การกระทำทั้งหมดของพวกเขาฉันสังเกตเห็นว่า Landin, Strachey และลูกหลานของพวกเขาใช้คำว่า "คุณค่า" เพื่อพูดคุยเกี่ยวกับการอ้างอิง / denotation มันอาจเป็นเพียงการทำให้เป็นศัพท์ง่ายขึ้นที่ Landin และ Strachey แนะนำ แต่ดูเหมือนว่า ความแตกต่างครั้งใหญ่เมื่อใช้อย่างไร้เดียงสา)

  • โปรแกรมเมอร์ที่ใช้งานได้ดูเหมือนจะเชื่อว่า "คุณค่า" เหล่านี้มีอยู่ในภาษาการเขียนโปรแกรมไม่ใช่ด้านนอก ในการทำเช่นนี้พวกเขาแตกต่างจากนักปรัชญาและนักตรรกวิทยาภาษาโปรแกรม

  • พวกเขาดูเหมือนจะเชื่อว่า "คุณค่า" เหล่านี้ควรได้รับจากการประเมิน

ตัวอย่างเช่นบทความ Wikipedia เกี่ยวกับความโปร่งใสในการอ้างอิงกล่าวว่าเช้านี้:

นิพจน์จะกล่าวว่ามีความโปร่งใสในการอ้างอิงถ้ามันสามารถถูกแทนที่ด้วยค่าของมันโดยไม่เปลี่ยนแปลงพฤติกรรมของโปรแกรม (กล่าวอีกนัยหนึ่งคือยอมให้โปรแกรมที่มีเอฟเฟกต์และเอาต์พุตเดียวกันในอินพุตเดียวกัน)

นี่คือความแตกต่างอย่างสมบูรณ์กับสิ่งที่นักปรัชญา / นักตรรกวิทยาพูด พวกเขาบอกว่าบริบทนั้นอ้างอิงหรือโปร่งใสอ้างอิงถ้าการแสดงออกในบริบทนั้นสามารถถูกแทนที่ด้วยการแสดงออกอื่นที่หมายถึงสิ่งเดียวกัน (การแสดงออกcoreferential ) ใครคือนักปรัชญา / นักบัญชี พวกเขารวมถึงFrege , รัสเซล , เฮด , Carnap , Quine , โบสถ์และอื่น ๆ อีกมากมาย แต่ละคนมีรูปร่างสูงตระหง่าน พลังทางปัญญารวมของนักบันทึกเหล่านี้คือการทำให้โลกแตกเป็นเสี่ยงพูดน้อยที่สุด พวกเขาทั้งหมดเป็นเอกฉันท์ในตำแหน่งที่อ้างอิง / denotations อยู่นอกภาษาที่เป็นทางการและการแสดงออกในภาษาที่สามารถพูดคุยเกี่ยวกับพวกเขาเท่านั้น ดังนั้นทุกสิ่งที่สามารถทำได้ภายในภาษาคือการแทนที่นิพจน์หนึ่งด้วยนิพจน์อื่นที่อ้างถึงเอนทิตีเดียวกัน อ้างอิง / denotations ตัวเองไม่ได้อยู่ในภาษา เหตุใดโปรแกรมเมอร์ที่ทำงานจึงเบี่ยงเบนไปจากประเพณีที่มีชื่อเสียงนี้

หนึ่งอาจสันนิษฐานว่า semanticists ภาษาการเขียนโปรแกรมอาจเข้าใจผิดพวกเขา แต่พวกเขาไม่ได้

แลนดิน :

(a) แต่ละนิพจน์มีโครงสร้าง subexpression แบบซ้อน (b) แต่ละนิพจน์ย่อย แสดงถึงบางสิ่ง (โดยปกติจะเป็นตัวเลขค่าความจริงหรือฟังก์ชันตัวเลข) (c) สิ่งที่นิพจน์หมายถึงคือ "ค่า" ของมันขึ้นอยู่กับ ค่าของการแสดงออกย่อยไม่ได้อยู่ในคุณสมบัติอื่น ๆ ของพวกเขา [เน้นเพิ่ม]

Stoy :

สิ่งเดียวที่มีความสำคัญเกี่ยวกับนิพจน์คือค่าของมันและนิพจน์ย่อยใด ๆ สามารถถูกแทนที่ด้วยค่าที่เท่ากัน [เพิ่มการเน้น] ยิ่งกว่านั้นค่าของนิพจน์คือภายในขอบเขตที่แน่นอนเหมือนกันทุกครั้งที่มันเกิดขึ้น "

นกและนกเด๊ดเลอร์ :

ค่าของนิพจน์ขึ้นอยู่กับค่าของนิพจน์ที่เป็นส่วนประกอบ (ถ้ามี) และนิพจน์ย่อยเหล่านี้อาจถูกแทนที่อย่างอิสระโดยผู้อื่นที่มีค่าเดียวกัน [เพิ่มการเน้น]

ดังนั้นเมื่อมองย้อนกลับไปความพยายามของ Landin และ Strachey เพื่อทำให้คำศัพท์ง่ายขึ้นโดยแทนที่ "อ้างอิง" / "denotation" ด้วย "value" อาจทำให้เกิดความเสียหายได้ ทันทีที่ใครคนหนึ่งได้ยิน "คุณค่า" มีสิ่งล่อใจให้คิดถึงกระบวนการประเมินที่นำไปสู่ มันเป็นเรื่องที่ดึงดูดอย่างเท่าเทียมกันที่จะคิดว่าการประเมินใด ๆ ที่ก่อให้เกิด "คุณค่า" แม้ว่ามันอาจจะค่อนข้างชัดเจนว่าไม่ใช่การให้เปล่า นั่นคือสิ่งที่ฉันรวบรวมได้เกิดขึ้นกับแนวคิดของ "การอ้างอิงโปร่งใส" ในสายตาของโปรแกรมเมอร์ที่ใช้งานได้ แต่ "คุณค่า" ที่ถูกพูดถึงโดย semanticists ต้นไม่ได้เป็นผลมาจากการประเมินผลหรือการส่งออกของฟังก์ชั่นหรือสิ่งใด ๆ มันคือการมอบอำนาจ

เมื่อเราเข้าใจสิ่งที่เรียกว่า "คุณค่า" ของการแสดงออก ("การอ้างอิง" หรือ "denotation" ในการสนทนาของนักปรัชญาคลาสสิก) ในฐานะที่เป็นวัตถุทางคณิตศาสตร์ / แนวความคิดที่ซับซ้อนความเป็นไปได้ทุกชนิดจะเปิดขึ้น

  • Strachey ตีความตัวแปรในภาษาการเขียนโปรแกรมที่จำเป็นเป็นค่า Lตามที่ระบุไว้ในคำตอบของฉัน 25 มีนาคมซึ่งเป็นวัตถุแนวคิดที่ซับซ้อนที่ไม่ได้เป็นตัวแทนโดยตรงภายในไวยากรณ์ของภาษาการเขียนโปรแกรม
  • นอกจากนี้เขายังตีความคำสั่งในภาษาต่าง ๆ เช่นฟังก์ชัน state-to-state อีกอินสแตนซ์ของวัตถุทางคณิตศาสตร์ที่ซับซ้อนซึ่งไม่ใช่ "ค่า" ภายในไวยากรณ์
  • แม้แต่การเรียกใช้ฟังก์ชันข้างเคียงใน C ก็มี "value" ที่กำหนดไว้อย่างดีในฐานะหม้อแปลงไฟฟ้าที่แมปอเมริกากับคู่ของอเมริกาและค่า (เรียกว่า "monad" ในคำศัพท์การทำงานของโปรแกรมเมอร์)

ความไม่เต็มใจของโปรแกรมเมอร์ที่ใช้งานได้ในการเรียกภาษาดังกล่าวว่า "referential transparent" เพียงนัยว่าพวกเขาไม่เต็มใจที่จะยอมรับวัตถุทางคณิตศาสตร์ / แนวคิดที่ซับซ้อนเช่น "ค่า" ในทางกลับกันพวกเขาดูเหมือนจะเต็มใจที่จะเรียกหม้อแปลงสถานะว่า "คุณค่า" อย่างสมบูรณ์เมื่อมันถูกวางในรูปแบบที่โปรดปรานของพวกเขาเองและแต่งตัวด้วยคำว่า "monad" ฉันต้องบอกว่าพวกเขามีความไม่สอดคล้องกันอย่างสิ้นเชิงแม้ว่าเราจะให้มันแก่พวกเขาว่าความคิดของพวกเขาในเรื่อง "ความโปร่งใสในการอ้างอิง" มีความสอดคล้องกันบ้าง

ประวัติศาสตร์ซักหน่อยอาจทำให้เกิดความสับสนเกี่ยวกับความสับสนเหล่านี้ ช่วงเวลาระหว่างปี 1962 ถึง 1967 เป็นช่วงเวลาที่ยากลำบากอย่างมากสำหรับ Christopher Strachey ระหว่างปีพ. ศ. 2505-2565 เขาทำงานนอกเวลาในฐานะผู้ช่วยวิจัยกับมอริซวิลค์สเพื่อออกแบบและใช้ภาษาการเขียนโปรแกรมที่รู้จักกันในชื่อ นี่เป็นภาษาการเขียนโปรแกรมที่จำเป็น แต่ก็หมายถึงการมีความสามารถด้านภาษาโปรแกรมที่มีประสิทธิภาพเช่นกัน Landin ซึ่งเป็นพนักงานของ Strachey ใน บริษัท ที่ปรึกษาของเขามีอิทธิพลอย่างมากต่อมุมมองของภาษาการเขียนโปรแกรมของ Strachey ในสถานที่สำคัญ 1,965 กระดาษ " ถัดไป 700 การเขียนโปรแกรมภาษา " ร่อนลงแสดงออกส่งเสริมการเขียนโปรแกรมภาษาทำงาน (เรียกพวกเขาdenotativeภาษา) และอธิบายภาษาการเขียนโปรแกรมที่จำเป็นในฐานะ "สิ่งที่ตรงกันข้าม" ในการสนทนาที่ตามมาเราพบว่า Strachey เพิ่มความสงสัยในสถานะที่แข็งแกร่งของ Landin

... DLs สร้างชุดย่อยของทุกภาษา พวกเขาเป็นส่วนย่อยที่น่าสนใจ แต่ไม่สะดวกที่จะใช้เว้นแต่คุณจะคุ้นเคยกับมัน เราต้องการพวกเขาเพราะในขณะนี้เราไม่ทราบวิธีการสร้างหลักฐานด้วยภาษาซึ่งรวมถึงความจำเป็นและการกระโดด [เน้นเพิ่ม]

ในปี 1965 Strachey ดำรงตำแหน่ง Reader ที่ Oxford และดูเหมือนว่าจะทำงานเต็มเวลาเป็นหลักในการพัฒนาทฤษฎีของสิ่งจำเป็นและการกระโดด ในปี 1967 เขาพร้อมกับทฤษฎีที่เขาสอนในหลักสูตร " แนวคิดพื้นฐานในภาษาโปรแกรม " ในโรงเรียนฤดูร้อนในโคเปนเฮเกน การบรรยายควรจะได้รับการตีพิมพ์ แต่ "น่าเสียดายเพราะเจือจางแก้ไขการพิจารณาคดีไม่ปรากฏ; เหมือนงานของ Strachey ออกซ์ฟอร์ดอย่างไรกระดาษมีอิทธิพลต่อการหมุนเวียนส่วนตัว" ( Martin Campbell-Kelly )

ความยากลำบากในการได้รับงานเขียนของ Strachey อาจนำไปสู่ความสับสนที่ถูกเผยแพร่โดยผู้คนพึ่งพาแหล่งข้อมูลทุติยภูมิและข่าวลือ แต่ตอนนี้ที่ " แนวคิดพื้นฐาน " พร้อมใช้งานบนเว็บไม่จำเป็นต้องหันไปคาดเดางาน เราควรอ่านและทำความเข้าใจกับความหมายของ Strachey โดยเฉพาะอย่างยิ่ง:

  • ในส่วน 3.2 เขาจัดการกับ "นิพจน์" ซึ่งเขาพูดถึง "ความโปร่งใสของการอ้างอิงค่า R"
  • ส่วนที่ 3.3 ของเขาเกี่ยวข้องกับ "คำสั่ง" ซึ่งเขาพูดถึง "ความโปร่งใสอ้างอิง L-value"
  • ในส่วน 3.4.5 เขาพูดถึง "ฟังก์ชั่นและกิจวัตร" และประกาศว่า "การออกจากความโปร่งใสของการอ้างอิง R-value ใด ๆ ในบริบท R-value ควรถูกกำจัดโดยการสลายการแสดงออกในหลายคำสั่งและการแสดงออกที่ง่ายขึ้นหรือถ้า สิ่งนี้กลายเป็นเรื่องยากหัวข้อของความคิดเห็น "

การพูดถึง "ความโปร่งใสในการอ้างอิง" โดยไม่เข้าใจความแตกต่างระหว่างค่า L, ค่า R- และวัตถุที่ซับซ้อนอื่น ๆ ที่เติมความคิดเชิงเอกภพของนักเขียนโปรแกรมที่จำเป็นต้องมีพื้นฐานความเข้าใจผิด


10
ฉันคิดว่ามันคุ้มค่าที่จะเน้นว่าการทำให้เกิดความสับสนทั้งสองเรื่องของ "คุณค่า" (การประเมินเทียบกับการปฏิเสธ) ทำให้นักเขียนโปรแกรมที่ทำงานผิดพลาดในการวิจารณ์ภาษาที่จำเป็นซึ่งช่องว่างระหว่างความคิดมีขนาดใหญ่
Conal

8
เช่นความคิดการประเมินผลนำไปสู่ข้อสรุปว่าภาษาที่จำเป็นไม่ใช่ RT ในขณะที่แนวคิดเรื่องการปฏิเสธไม่ได้
Conal

12
สำหรับฉันแล้วดูเหมือนว่าเมื่อคุณตอกย้ำความหมายเชิงลบของภาษาอย่างเต็มที่แล้วมันก็อดไม่ได้ที่จะอ้างอิง ดังนั้นนี่ดูเหมือนจะเท่ากับว่าคำนี้ไม่มีประโยชน์สำหรับภาษาโปรแกรม
Tom Crockett

20
ดังนั้นดูเหมือนว่าผู้คนมักจะใช้คำศัพท์เพื่อหมายถึงบางสิ่งที่แตกต่างไปจากที่คนอื่นหมายถึงเมื่อพวกเขาใช้คำนั้นในอดีต ที่ฉันพูดว่า: ยินดีต้อนรับสู่ภาษาอังกฤษ
Daniel Pratt

17
@DanielPratt: หากผลข้างเคียง - อิสระเป็นสิ่งที่โปรแกรมเมอร์ฟังก์ชั่นต้องการที่จะหมายถึงแล้วทำไมพวกเขาเรียกมันว่า "ความโปร่งใสอ้างอิง"? พวกเขาสามารถเรียกมันว่า "ผลข้างเคียง - อิสรภาพ" ซึ่งเป็นแนวคิดที่ชัดเจนอย่างสมบูรณ์ ไม่มีใครที่จะต้องถามใน stackexchange ความหมายของ "ผลข้างเคียง - เสรีภาพ" ความจำเป็นที่จะต้องใช้คำศัพท์ดั้งเดิมที่ยิ่งใหญ่ซึ่งไม่มีใครเข้าใจดูเหมือนอยู่ที่ไหน?
Uday Reddy

23

นิพจน์นั้นอ้างอิงโปร่งใสหากสามารถแทนที่ด้วยค่าได้โดยไม่ต้องเปลี่ยนอัลกอริทึมโดยให้อัลกอริทึมที่มีเอฟเฟกต์และเอาต์พุตเดียวกันกับอินพุตเดียวกัน


18

ฟังก์ชันโปร่งใสที่อ้างอิงได้คือฟังก์ชันที่ทำหน้าที่เหมือนกับฟังก์ชันคณิตศาสตร์ เนื่องจากอินพุตเดียวกันมันจะสร้างเอาต์พุตเหมือนกันเสมอ แสดงว่าสถานะที่ผ่านเข้ามานั้นไม่ได้ถูกแก้ไขและฟังก์ชั่นนั้นไม่มีสถานะเป็นของตัวเอง


10

สำหรับผู้ที่ต้องการคำอธิบายสั้น ๆ ฉันจะทำอันตรายอย่างใดอย่างหนึ่ง (แต่อ่านการเปิดเผยด้านล่าง)

ความโปร่งใสของการอ้างอิงในภาษาการเขียนโปรแกรมส่งเสริมการใช้เหตุผลที่เท่าเทียม - ยิ่งการอ้างอิงที่มีความโปร่งใสมากเท่าไหร่คุณก็ยิ่งมีเหตุผลที่ง่ายขึ้นในการใช้เหตุผลเชิงเหตุผล เช่นกับนิยามฟังก์ชัน (หลอก)

fx = x + x,

ความสะดวกที่คุณสามารถ (ปลอดภัย) แทนที่ f (foo) ด้วย foo + foo ในขอบเขตของคำจำกัดความนี้โดยไม่มีข้อ จำกัด มากเกินไปในการที่คุณสามารถทำการลดนี้ได้เป็นการบ่งบอกถึงความโปร่งใสของการอ้างอิงภาษาโปรแกรมของคุณ มี

ตัวอย่างเช่นถ้า foo เป็น x ++ ในแง่การเขียนโปรแกรม C คุณจะไม่สามารถทำการลดนี้ได้อย่างปลอดภัย (ซึ่งก็คือถ้าคุณต้องทำการลดขนาดนี้คุณจะไม่จบลงด้วยโปรแกรมเดียวกันกับที่คุณเริ่มด้วย)

ในภาษาการเขียนโปรแกรมเชิงปฏิบัติคุณจะไม่เห็นความโปร่งใสในการอ้างอิงที่สมบูรณ์แบบ แต่โปรแกรมเมอร์ที่ใช้งานได้ใส่ใจมากกว่านั้น (cf Haskell ซึ่งเป็นจุดประสงค์หลัก)

(การเปิดเผยอย่างเต็มรูปแบบ: ฉันเป็นโปรแกรมเมอร์ที่ทำหน้าที่ได้ดังนั้นโดยคำตอบที่ดีที่สุดคุณควรใช้คำอธิบายนี้ด้วยเม็ดเกลือ)


3
ฉันไม่มีปัญหากับภาษาที่ใช้ในการให้เหตุผลที่เท่าเทียมกัน แต่ฉันจะประกวดว่ามันเกี่ยวข้องกับ "ความโปร่งใสในการอ้างอิง" ตามที่นิยามไว้ในระดับคลาสสิก ประการที่สองในฐานะโปรแกรมเมอร์ที่ใช้งานได้ฉันคิดว่าการใช้เหตุผลเชิงเหตุผลเกินจริง การให้เหตุผลที่มีความสำคัญในทางปฏิบัตินั้นเกี่ยวเนื่องกับเงื่อนไขล่วงหน้าการโพสต์เงื่อนไขค่าคงที่และข้อมูลนามธรรม สำหรับคนที่ใช้เทคนิคการให้เหตุผลเช่นนั้นผลข้างเคียงดูเหมือนจะไม่สำคัญนัก ดังนั้นในขณะที่ฉันเห็นด้วยกับคุณว่าผลข้างเคียงในการแสดงออกเป็นความคิดที่ไม่ดี แต่ดูเหมือนว่าพวกเขาจะไม่ได้เป็นตัวแทนนักฆ่า
Uday Reddy

1
@UdayReddy เพียงเพราะโปรแกรมเมอร์ที่ใช้งานได้เลือกวิธีการเฉพาะในการเพิ่มความโปร่งใสในการอ้างอิงโปรแกรมของพวกเขา (กำจัดผลข้างเคียงและพัฒนาพีชคณิตที่ซับซ้อนและมีประสิทธิภาพของโปรแกรม) หรือมีผู้ปฏิบัติงานบางคนที่อาจไม่เข้าใจความโปร่งใสของการอ้างอิง พวกเขาคิดว่าพวกเขาทำไม่ได้หมายความว่าภาษาโปรแกรมที่ใช้งานล้มเหลวในการเพิ่มความโปร่งใสในการอ้างอิงหรือว่าโปรแกรมเมอร์ภาษาที่ใช้งานได้และผู้เขียนคอมไพเลอร์ไม่ได้ใช้ประโยชน์จากการเพิ่มขึ้นนี้
chrisdornan

2
Chris: Uday ชี้ให้เห็นว่า Strachey ขจัดปัญหาความทึบในการอ้างอิงในการเขียนโปรแกรมความหมายภาษาโดยเฉพาะอย่างยิ่งสำหรับภาษาที่จำเป็น ดังนั้นโปรแกรมเมอร์ที่ใช้งานได้จะไม่สามารถ "เรียกเลขหมายความโปร่งใสอ้างอิงในโปรแกรม" ตัวอย่างที่เป็นรูปธรรม Haskell IO ไม่ช่วย RT อย่างแน่นอนเพราะไม่ต้องการความช่วยเหลือ RT
Conal

2
@chrisdornan: ขออภัยสำหรับความคิดเห็นแรกของฉันด้านบน ตัวฉันเองมีปัญหาในการทำสิ่งที่ฉันพยายามจะพูดในสองประโยคแรก :-( แต่นี่คือคำอธิบายพิจารณาแคลคูลัสระยะสองระดับหรือหลายระดับตัวดำเนินการ staging แต่ละตัวทึบแสงอ้างอิงจริง ๆ แล้วมันเป็นความจริง ตัวดำเนินการใบเสนอราคาอย่างไรก็ตามคุณสามารถใช้เหตุผลเชิงสมการภายในแต่ละขั้นตอนได้อย่างสมบูรณ์ดังนั้นตัวดำเนินการทึบแสง referential ตั้งค่าขอบเขตสำหรับการให้เหตุผล equational แต่คุณยังคงมีเหตุผล equational ภายในขอบเขตเหล่านั้น
Uday Reddy

1
@chrisdomain: ยิ่งไปกว่านั้นมีคนเพียงไม่กี่คนที่ต้องการเป็นผู้อ้างอิงที่โปร่งใสเพื่อขับไล่ผู้ประกอบการจัดเตรียมดังกล่าว ผู้ประกอบการเหล่านั้นมีประโยชน์มาก การเขียนโปรแกรมโดยไม่มีพวกเขาโดยการจัดเตรียมด้วยตนเองจะน่าเบื่อข้อผิดพลาดได้ง่ายและน่าเกลียด และการแสดงละครด้วยตนเองจะไม่ซื้อเหตุผลที่เท่าเทียมกันมากกว่าสิ่งที่คุณเคยทำมาก่อน ดังนั้นการห้ามอุปกรณ์การเขียนโปรแกรมที่ดีในการแสวงหาเหตุผลที่เท่าเทียมกันนั้นจะเหมือนกับการตัดจมูกของคุณออกไปเพื่อทำให้ใบหน้าของคุณ
Uday Reddy

8

หากคุณสนใจนิรุกติศาสตร์ (เช่นทำไมแนวคิดนี้มีชื่อเฉพาะนี้) ให้ดูที่โพสต์บล็อกของฉันในหัวข้อ คำศัพท์มาจาก Quine ปราชญ์ / นักตรรกวิทยา


4
  1. Denotational-semantics นั้นใช้ภาษาการสร้างแบบจำลองโดยการสร้างโดเมนที่มีค่าที่สามารถปฏิเสธได้
  2. ฟังก์ชั่นโปรแกรมเมอร์ใช้ค่าคำเพื่ออธิบายการบรรจบกันของการคำนวณตามกฎการเขียนใหม่ของภาษาคือ ความหมายของการดำเนินงาน

ใน 1 มีคำถามสองภาษาที่ชัดเจน:

  • ภาษาที่เป็นแบบอย่าง
  • ภาษาของการสร้างแบบจำลองภาษาเมตา

ใน 2 ต้องขอบคุณความใกล้ชิดของวัตถุและโลหะทำให้พวกเขาสับสน

ในฐานะผู้ดำเนินการด้านภาษาฉันพบว่าฉันต้องจำความแตกต่างนี้อย่างต่อเนื่อง

ดังนั้นศาสตราจารย์ Reddy ขอให้ฉันถอดความคุณดังนั้น :-)

ในบริบทของการเขียนโปรแกรมการทำงานและความหมายคำว่าReferential Transparencyไม่โปร่งใสในการอ้างอิง


1
ฮ่า. ขอบคุณสำหรับคำอธิบาย ปัญหาคือว่าโปรแกรมเมอร์ทำงานทำราวกับว่าพวกเขามีความคิดทั่วไปของ "ความโปร่งใสอ้างอิง" ที่มีผลบังคับใช้กับทุกภาษาการเขียนโปรแกรม แต่สิ่งนี้ขึ้นอยู่กับแนวคิด "คุณค่า" ซึ่งอาจหรืออาจไม่สมเหตุสมผลสำหรับภาษาอื่น เพื่ออ้างถึงทฤษฎีทั่วไปของ "ความโปร่งใสในการอ้างอิง" พวกเขาจำเป็นต้องสร้างทฤษฎี "คุณค่า" โดยทั่วไป ที่หายไปจนถึงตอนนี้
Uday Reddy

4

คำตอบต่อไปนี้ฉันหวังว่าจะเพิ่มและมีคุณสมบัติคำตอบที่ 1 และ 3 ที่ถกเถียงกัน

ให้เรายอมรับว่าการแสดงออกหมายถึงหรืออ้างอิงถึงผู้อ้างอิงบางส่วน อย่างไรก็ตามคำถามคือว่าผู้อ้างอิงเหล่านี้สามารถเข้ารหัส isomorphically เป็นส่วนหนึ่งของการแสดงออกตัวเองเรียกค่า 'นิพจน์' ดังกล่าว ตัวอย่างเช่นค่าตัวเลขตามตัวอักษรเป็นชุดย่อยของชุดของการแสดงออกทางคณิตศาสตร์ค่าความจริงเป็นส่วนย่อยของชุดของการแสดงออกบูลีน ฯลฯ ความคิดคือการประเมินการแสดงออกถึงมูลค่าของมัน (ถ้ามี) ดังนั้นคำว่า 'ค่า' อาจหมายถึง denotation หรือองค์ประกอบที่แตกต่างของชุดของการแสดงออก แต่ถ้ามี isomorphism (bijection) ระหว่างผู้อ้างอิงและค่าเราสามารถพูดได้ว่าพวกเขาเป็นสิ่งเดียวกัน (สิ่งนี้กล่าวว่าเราจะต้องระมัดระวังในการกำหนดผู้อ้างอิงและมอร์ฟิซึ่มส์ตามที่พิสูจน์โดยสนามแห่งความหมายเชิง denotational) ตัวอย่างที่กล่าวถึงโดยการตอบกลับไปยังคำตอบที่ 3data Nat = Zero | Suc Nat ไม่ตรงกับที่คาดไว้กับชุดของตัวเลขธรรมชาติ)

ให้เราเขียนE[·]สำนวนที่มีรูซึ่งรู้จักกันในบางไตรมาสว่า 'บริบท' สองตัวอย่างบริบทสำหรับ C-ชอบแสดงออกและ[·]+1 [·]++

ให้เราเขียน[[·]]ฟังก์ชั่นที่ใช้สำนวน (โดยไม่มีรู) และส่งความหมาย (อ้างอิง, denotation, ฯลฯ ) ในจักรวาลที่ให้ความหมาย (ฉันยืมสัญกรณ์จากสาขาความหมายเชิง Denotational)

ให้เราปรับคำจำกัดความของ Quine อย่างเป็นทางการดังนี้: บริบทE[·] มีความโปร่งใสถ้ามีสองนิพจน์E1และE2(ไม่มีรู) เช่นนั้น[[E1]] = [[E2]](เช่นนิพจน์แสดงถึง / อ้างอิงถึงผู้อ้างอิงเดียวกัน) จากนั้นก็เป็นกรณีที่[[E[E1]]] = [[E[E2]]](เช่นการเติม - ในรูที่มีE1หรือแสดงE2ผลลัพธ์ที่แสดงถึงผู้อ้างอิงเดียวกัน)

กฎของการแทนที่ของไลบนิซเท่ากับเท่ากับจะแสดงเป็น 'ถ้า E1 = E2แล้วE[E1] = E[E2]' ซึ่งบอกว่าE[·]เป็นฟังก์ชั่น ฟังก์ชั่น (หรือสำหรับเรื่องที่โปรแกรมคำนวณฟังก์ชั่น) คือการทำแผนที่จากแหล่งที่มาไปยังเป้าหมายเพื่อให้มีองค์ประกอบเป้าหมายมากที่สุดหนึ่งองค์ประกอบสำหรับแต่ละองค์ประกอบที่มา ฟังก์ชั่นการส่งชุดและอื่น ๆ หากในกฎของ Leibniz ความเท่าเทียมกัน=คือ denotational ดังนั้นวงเล็บคู่จะถูกนำมาใช้เพื่อให้ได้รับและ elided ดังนั้นบริบทที่อ้างอิงโปร่งใสจึงเป็นฟังก์ชัน และกฎของไลบนิซเป็นส่วนผสมหลักของการให้เหตุผลเชิงเหตุผลดังนั้นการให้เหตุผลที่เท่าเทียมกันนั้นเกี่ยวข้องกับความโปร่งใสในการอ้างอิง

แม้ว่า[[·]]จะเป็นฟังก์ชั่นจากการแสดงออกถึงการแสดงออกมันอาจเป็นฟังก์ชั่นจากการแสดงออกถึง 'ค่า' เข้าใจว่าเป็นเซตย่อยของการแสดงออกและ[[·]]สามารถเข้าใจได้เป็นการประเมินผล

ตอนนี้ถ้าE1เป็นการแสดงออกและE2เป็นค่าที่เรามีสิ่งที่ฉันคิดว่ามีความหมายโดยคนส่วนใหญ่เมื่อกำหนดความโปร่งใสอ้างอิงในแง่ของการแสดงออกค่านิยมและการประเมินผล แต่ดังที่แสดงโดยคำตอบที่ 1 และ 3 ในหน้านี้นี่เป็นคำจำกัดความที่ไม่ถูกต้อง

ปัญหาเกี่ยวกับบริบทเช่น[·]++ไม่ใช่ผลข้างเคียง แต่ค่าของมันไม่ได้นิยามไว้ใน C isomorphically ตามความหมายของมัน ฟังก์ชั่นไม่ได้เป็นค่า (เช่นเดียวกับตัวชี้ไปยังฟังก์ชั่น) ในขณะที่พวกเขาเป็นภาษาการเขียนโปรแกรมการทำงาน Landin, Strachey และผู้บุกเบิกความหมายเชิง Denotational ค่อนข้างฉลาดในการใช้โลกที่ใช้งานได้เพื่อให้ความหมาย

สำหรับความจำเป็น C-เช่นภาษาเราสามารถ ( ๆ ) [[·]] : Expression -> (State -> State x Value)ให้ความหมายในการแสดงออกโดยใช้ฟังก์ชั่น

ValueExpressionเป็นส่วนหนึ่งของ Stateมีคู่ (ตัวระบุค่า) ฟังก์ชั่นความหมายใช้การแสดงออกและส่งตามความหมายของฟังก์ชั่นจากสถานะปัจจุบันไปยังคู่ที่มีสถานะการปรับปรุงและค่า ตัวอย่างเช่น[[x]]เป็นฟังก์ชันจากสถานะปัจจุบันไปยังคู่ที่มีองค์ประกอบแรกคือสถานะปัจจุบันและองค์ประกอบที่สองคือค่าของ x ในทางตรงกันข้าม[[x++]]คือฟังก์ชั่นจากสถานะปัจจุบันไปยังคู่ที่องค์ประกอบแรกคือสถานะที่ค่าของ x จะเพิ่มขึ้นและมีองค์ประกอบที่สองคือที่คุ้มค่ามาก ในแง่นี้บริบท[·]++มีความโปร่งใสในการอ้างอิงถ้ามันเป็นไปตามข้อกำหนดที่กำหนดไว้ข้างต้น

ฉันคิดว่าโปรแกรมเมอร์ที่ใช้งานได้มีสิทธิ์ใช้ความโปร่งใสในการอ้างอิงในแง่ที่ว่าพวกเขาจะกู้คืนโดยธรรมชาติ[[·]]เป็นหน้าที่จากการแสดงออกถึงคุณค่า ฟังก์ชั่นเป็นค่าชั้นหนึ่งและรัฐยังสามารถเป็นค่าไม่ใช่ denotation Monad เป็นกลไกที่สะอาดในการผ่าน (หรือทำเกลียว) สถานะ


สันนิษฐานว่าคำตอบ "ที่ 1" และ "ที่ 3" คือคำตอบที่ "25 มีนาคม" & "คำลงท้าย" ของ UdayReddy ตามลำดับ Ordinals ไม่ใช่วิธีที่ดีในการอ้างถึงคำตอบใน SO ไม่เพียง แต่การลงคะแนนและการยอมรับสามารถเปลี่ยนแปลงได้ตลอดเวลา แต่มีการเรียงลำดับแบบเลือกได้หลายแบบ
philipxy

2

โปรดทราบว่าแนวคิด "ความหมาย" นี้เป็นสิ่งที่เกิดขึ้นในใจของผู้สังเกตการณ์ ดังนั้น "การอ้างอิง" เดียวกันอาจหมายถึงสิ่งที่แตกต่างกับคนอื่น ตัวอย่างเช่นเรามีหน้าแก้ความกำกวมเอดินเบอระในวิกิพีเดีย

ปัญหาที่เกี่ยวข้องซึ่งสามารถแสดงในบริบทของการเขียนโปรแกรมอาจเป็น polymorphism

และบางทีเราควรจะมีชื่อสำหรับกรณีพิเศษของ polymorphism (หรืออาจจะคัดเลือก) ที่ซึ่งจุดประสงค์ของเรากรณี polymorphic ที่แตกต่างกันนั้นมีความหมายเชิงความเท่าเทียมกัน ใช้ชนิดจำนวนเต็มหรือชนิดที่ซับซ้อนหรือชนิดอื่น ๆ ที่หลากหลาย - สามารถรักษา polymorphically)


0

ผมพบความหมายของความโปร่งใสอ้างอิงในหนังสือ " โครงสร้างและการดำเนินงานของโปรแกรมคอมพิวเตอร์ " (ตัวช่วยสร้าง Book) ที่มีประโยชน์เพราะมันจะสมบูรณ์โดยคำอธิบายของวิธีการที่โปร่งใสอ้างอิงการละเมิดโดยการแนะนำการดำเนินงานที่ได้รับมอบหมาย ตรวจสอบเด็คสไลด์ต่อไปนี้ที่ฉันทำเกี่ยวกับเรื่องนี้: https://www.slideshare.net/pjschwarz/introducing-assignment-invalidates-the-substitution-model-of-evaluation-and-violates-referential-transparency-as- อธิบายใน SICP-the-ตัวช่วยสร้างหนังสือ


0

ความโปร่งใสอ้างอิงสามารถระบุได้ง่าย ๆ เป็น:

  • การแสดงออกมักจะประเมินให้ผลแบบเดียวกันในบริบทใด ๆ[1] ,
  • ฟังก์ชั่นหากได้รับพารามิเตอร์เดียวกันสองครั้งจะต้องผลิตผลเดียวกันสองครั้ง[2]

ตัวอย่างเช่นภาษาการเขียนโปรแกรม Haskell เป็นภาษาที่ใช้งานได้จริง หมายความว่ามันโปร่งใส referential

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.