คำว่าการอ้างอิงความโปร่งใสหมายถึงอะไร? ฉันได้ยินว่ามันอธิบายว่า "หมายความว่าคุณสามารถแทนที่เท่ากับด้วย" ได้ แต่นี่ดูเหมือนจะเป็นคำอธิบายที่ไม่เพียงพอ
คำว่าการอ้างอิงความโปร่งใสหมายถึงอะไร? ฉันได้ยินว่ามันอธิบายว่า "หมายความว่าคุณสามารถแทนที่เท่ากับด้วย" ได้ แต่นี่ดูเหมือนจะเป็นคำอธิบายที่ไม่เพียงพอ
คำตอบ:
คำว่า "การอ้างอิงโปร่งใส" มาจากปรัชญาการวิเคราะห์สาขาวิชาปรัชญาที่วิเคราะห์การสร้างภาษาธรรมชาติคำแถลงและข้อโต้แย้งตามวิธีการของตรรกะและคณิตศาสตร์ ในคำอื่น ๆ ก็เป็นเรื่องวิทยาศาสตร์คอมพิวเตอร์นอกใกล้เคียงกับสิ่งที่เราเรียกว่าการเขียนโปรแกรมภาษาความหมาย นักปรัชญา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ซึ่งครอบคลุมทุกรัฐ ผู้คนมักไม่ค่อยสับสนกับเรื่องแบบนี้ อย่างไรก็ตามพวกเขาอาจจะหรืออาจจะไม่สามารถอธิบายทุกชั้นของความหมายที่มีอยู่ในโครงสร้างภาษา เลเยอร์ความหมายทั้งหมดไม่จำเป็นต้อง 'ชัดเจน' และเป็นเรื่องของวิทยาศาสตร์ที่จะศึกษาอย่างเหมาะสม อย่างไรก็ตามความไม่เป็นทางการของคนธรรมดาที่จะอธิบายความหมายแบบเลเยอร์ดังกล่าวไม่ได้หมายความว่าพวกเขาสับสนกับพวกเขา]
แยก "วรรณกรรม" ด้านล่างที่เกี่ยวข้องกับการสนทนานี้ความกังวลของการเขียนโปรแกรมการทำงานและความจำเป็น
ความโปร่งใสอ้างอิงคำที่ใช้บ่อยในการเขียนโปรแกรมฟังก์ชั่นหมายความว่าได้รับฟังก์ชั่นและค่าการป้อนข้อมูลคุณจะได้รับผลลัพธ์ที่เหมือนกัน กล่าวคือไม่มีสถานะภายนอกที่ใช้ในฟังก์ชัน
นี่คือตัวอย่างของฟังก์ชันโปร่งใส 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
อีกตัวอย่างหนึ่งคือฟังก์ชั่นที่อ่านจากไฟล์ข้อความและพิมพ์เอาต์พุต ไฟล์ข้อความภายนอกนี้สามารถเปลี่ยนแปลงได้ตลอดเวลาดังนั้นฟังก์ชันจะเป็นแบบทึบแสงแบบอ้างอิง
ฟังก์ชั่นอ้างอิงที่โปร่งใสคือฟังก์ชันที่ขึ้นอยู่กับอินพุตเท่านั้น
[นี่เป็นบทความจากคำตอบของฉันตั้งแต่วันที่ 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" ในการสนทนาของนักปรัชญาคลาสสิก) ในฐานะที่เป็นวัตถุทางคณิตศาสตร์ / แนวความคิดที่ซับซ้อนความเป็นไปได้ทุกชนิดจะเปิดขึ้น
ความไม่เต็มใจของโปรแกรมเมอร์ที่ใช้งานได้ในการเรียกภาษาดังกล่าวว่า "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 โดยเฉพาะอย่างยิ่ง:
การพูดถึง "ความโปร่งใสในการอ้างอิง" โดยไม่เข้าใจความแตกต่างระหว่างค่า L, ค่า R- และวัตถุที่ซับซ้อนอื่น ๆ ที่เติมความคิดเชิงเอกภพของนักเขียนโปรแกรมที่จำเป็นต้องมีพื้นฐานความเข้าใจผิด
นิพจน์นั้นอ้างอิงโปร่งใสหากสามารถแทนที่ด้วยค่าได้โดยไม่ต้องเปลี่ยนอัลกอริทึมโดยให้อัลกอริทึมที่มีเอฟเฟกต์และเอาต์พุตเดียวกันกับอินพุตเดียวกัน
ฟังก์ชันโปร่งใสที่อ้างอิงได้คือฟังก์ชันที่ทำหน้าที่เหมือนกับฟังก์ชันคณิตศาสตร์ เนื่องจากอินพุตเดียวกันมันจะสร้างเอาต์พุตเหมือนกันเสมอ แสดงว่าสถานะที่ผ่านเข้ามานั้นไม่ได้ถูกแก้ไขและฟังก์ชั่นนั้นไม่มีสถานะเป็นของตัวเอง
สำหรับผู้ที่ต้องการคำอธิบายสั้น ๆ ฉันจะทำอันตรายอย่างใดอย่างหนึ่ง (แต่อ่านการเปิดเผยด้านล่าง)
ความโปร่งใสของการอ้างอิงในภาษาการเขียนโปรแกรมส่งเสริมการใช้เหตุผลที่เท่าเทียม - ยิ่งการอ้างอิงที่มีความโปร่งใสมากเท่าไหร่คุณก็ยิ่งมีเหตุผลที่ง่ายขึ้นในการใช้เหตุผลเชิงเหตุผล เช่นกับนิยามฟังก์ชัน (หลอก)
fx = x + x,
ความสะดวกที่คุณสามารถ (ปลอดภัย) แทนที่ f (foo) ด้วย foo + foo ในขอบเขตของคำจำกัดความนี้โดยไม่มีข้อ จำกัด มากเกินไปในการที่คุณสามารถทำการลดนี้ได้เป็นการบ่งบอกถึงความโปร่งใสของการอ้างอิงภาษาโปรแกรมของคุณ มี
ตัวอย่างเช่นถ้า foo เป็น x ++ ในแง่การเขียนโปรแกรม C คุณจะไม่สามารถทำการลดนี้ได้อย่างปลอดภัย (ซึ่งก็คือถ้าคุณต้องทำการลดขนาดนี้คุณจะไม่จบลงด้วยโปรแกรมเดียวกันกับที่คุณเริ่มด้วย)
ในภาษาการเขียนโปรแกรมเชิงปฏิบัติคุณจะไม่เห็นความโปร่งใสในการอ้างอิงที่สมบูรณ์แบบ แต่โปรแกรมเมอร์ที่ใช้งานได้ใส่ใจมากกว่านั้น (cf Haskell ซึ่งเป็นจุดประสงค์หลัก)
(การเปิดเผยอย่างเต็มรูปแบบ: ฉันเป็นโปรแกรมเมอร์ที่ทำหน้าที่ได้ดังนั้นโดยคำตอบที่ดีที่สุดคุณควรใช้คำอธิบายนี้ด้วยเม็ดเกลือ)
หากคุณสนใจนิรุกติศาสตร์ (เช่นทำไมแนวคิดนี้มีชื่อเฉพาะนี้) ให้ดูที่โพสต์บล็อกของฉันในหัวข้อ คำศัพท์มาจาก Quine ปราชญ์ / นักตรรกวิทยา
ใน 1 มีคำถามสองภาษาที่ชัดเจน:
ใน 2 ต้องขอบคุณความใกล้ชิดของวัตถุและโลหะทำให้พวกเขาสับสน
ในฐานะผู้ดำเนินการด้านภาษาฉันพบว่าฉันต้องจำความแตกต่างนี้อย่างต่อเนื่อง
ดังนั้นศาสตราจารย์ Reddy ขอให้ฉันถอดความคุณดังนั้น :-)
ในบริบทของการเขียนโปรแกรมการทำงานและความหมายคำว่าReferential Transparencyไม่โปร่งใสในการอ้างอิง
คำตอบต่อไปนี้ฉันหวังว่าจะเพิ่มและมีคุณสมบัติคำตอบที่ 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)
ให้ความหมายในการแสดงออกโดยใช้ฟังก์ชั่น
Value
Expression
เป็นส่วนหนึ่งของ State
มีคู่ (ตัวระบุค่า) ฟังก์ชั่นความหมายใช้การแสดงออกและส่งตามความหมายของฟังก์ชั่นจากสถานะปัจจุบันไปยังคู่ที่มีสถานะการปรับปรุงและค่า ตัวอย่างเช่น[[x]]
เป็นฟังก์ชันจากสถานะปัจจุบันไปยังคู่ที่มีองค์ประกอบแรกคือสถานะปัจจุบันและองค์ประกอบที่สองคือค่าของ x ในทางตรงกันข้าม[[x++]]
คือฟังก์ชั่นจากสถานะปัจจุบันไปยังคู่ที่องค์ประกอบแรกคือสถานะที่ค่าของ x จะเพิ่มขึ้นและมีองค์ประกอบที่สองคือที่คุ้มค่ามาก ในแง่นี้บริบท[·]++
มีความโปร่งใสในการอ้างอิงถ้ามันเป็นไปตามข้อกำหนดที่กำหนดไว้ข้างต้น
ฉันคิดว่าโปรแกรมเมอร์ที่ใช้งานได้มีสิทธิ์ใช้ความโปร่งใสในการอ้างอิงในแง่ที่ว่าพวกเขาจะกู้คืนโดยธรรมชาติ[[·]]
เป็นหน้าที่จากการแสดงออกถึงคุณค่า ฟังก์ชั่นเป็นค่าชั้นหนึ่งและรัฐยังสามารถเป็นค่าไม่ใช่ denotation Monad เป็นกลไกที่สะอาดในการผ่าน (หรือทำเกลียว) สถานะ
โปรดทราบว่าแนวคิด "ความหมาย" นี้เป็นสิ่งที่เกิดขึ้นในใจของผู้สังเกตการณ์ ดังนั้น "การอ้างอิง" เดียวกันอาจหมายถึงสิ่งที่แตกต่างกับคนอื่น ตัวอย่างเช่นเรามีหน้าแก้ความกำกวมเอดินเบอระในวิกิพีเดีย
ปัญหาที่เกี่ยวข้องซึ่งสามารถแสดงในบริบทของการเขียนโปรแกรมอาจเป็น polymorphism
และบางทีเราควรจะมีชื่อสำหรับกรณีพิเศษของ polymorphism (หรืออาจจะคัดเลือก) ที่ซึ่งจุดประสงค์ของเรากรณี polymorphic ที่แตกต่างกันนั้นมีความหมายเชิงความเท่าเทียมกัน ใช้ชนิดจำนวนเต็มหรือชนิดที่ซับซ้อนหรือชนิดอื่น ๆ ที่หลากหลาย - สามารถรักษา polymorphically)
ผมพบความหมายของความโปร่งใสอ้างอิงในหนังสือ " โครงสร้างและการดำเนินงานของโปรแกรมคอมพิวเตอร์ " (ตัวช่วยสร้าง Book) ที่มีประโยชน์เพราะมันจะสมบูรณ์โดยคำอธิบายของวิธีการที่โปร่งใสอ้างอิงการละเมิดโดยการแนะนำการดำเนินงานที่ได้รับมอบหมาย ตรวจสอบเด็คสไลด์ต่อไปนี้ที่ฉันทำเกี่ยวกับเรื่องนี้: https://www.slideshare.net/pjschwarz/introducing-assignment-invalidates-the-substitution-model-of-evaluation-and-violates-referential-transparency-as- อธิบายใน SICP-the-ตัวช่วยสร้างหนังสือ
ความโปร่งใสอ้างอิงสามารถระบุได้ง่าย ๆ เป็น:
ตัวอย่างเช่นภาษาการเขียนโปรแกรม Haskell เป็นภาษาที่ใช้งานได้จริง หมายความว่ามันโปร่งใส referential