سؤال

ماذا يعني هذا المصطلح الشفافية المرجعية يقصد؟لقد سمعت أنه يوصف بأنه "يعني أنه يمكنك استبدال المتساويين بالمتساويين" ولكن هذا يبدو وكأنه تفسير غير كاف.

هل كانت مفيدة؟

المحلول

مصطلح "الشفافية المرجعية" يأتي من الفلسفة التحليلية, ، فرع الفلسفة الذي يحلل بنيات اللغة الطبيعية والبيانات والحجج القائمة على أساليب المنطق والرياضيات.بمعنى آخر، هو أقرب موضوع خارج علوم الكمبيوتر لما نسميه دلالات لغة البرمجة.الفيلسوف ويلارد كوين كان مسؤولاً عن إطلاق مفهوم الشفافية المرجعية، ولكنه كان أيضًا ضمنيًا في مقاربات برتراند راسل وألفريد وايتهيد.

تعد "الشفافية المرجعية" في جوهرها فكرة بسيطة وواضحة للغاية.ويستخدم مصطلح "المرجع" في الفلسفة التحليلية للحديث عنه الشيء الذي يشير إليه التعبير.إنه تقريبًا نفس ما نعنيه بـ "المعنى" أو "الدلالة" في دلالات لغة البرمجة.باستخدام مثال أندرو بيركيت (مشاركة مدونة)، يشير مصطلح "عاصمة اسكتلندا" إلى مدينة إدنبرة.هذا مثال مباشر على "المرجع".

يكون السياق في الجملة "شفافًا مرجعيًا" في حالة استبدال مصطلح في هذا السياق بمصطلح آخر يشير إلى نفس الكيان لا يغير المعنى.على سبيل المثال

يجتمع البرلمان الاسكتلندي في عاصمة اسكتلندا.

يعني نفس

يجتمع البرلمان الاسكتلندي في ادنبره.

لذا فإن سياق "يجتمع البرلمان الاسكتلندي في..." هو سياق مرجعي شفاف.يمكننا استبدال "عاصمة اسكتلندا" بـ "إدنبرة" دون تغيير المعنى.وبعبارة أخرى، فإن السياق يهتم فقط بما يشير إليه المصطلح ولا شيء آخر.وهذا هو المعنى الذي يكون فيه السياق "شفافًا مرجعيًا".

ومن ناحية أخرى، في الجملة،

أصبحت إدنبره عاصمة اسكتلندا منذ عام 1999.

لا يمكننا أن نفعل مثل هذا الاستبدال.إذا فعلنا ذلك، فسنحصل على "إدنبرة هي إدنبرة منذ عام 1999"، وهو أمر غريب أن نقوله، ولا ينقل نفس معنى الجملة الأصلية.لذلك، يبدو أن السياق "كانت إدنبرة ..."منذ عام 1999" معتمًا من الناحية المرجعية (عكس الشفافية المرجعية).ويبدو أنه يهتم شيء أكثر مما يشير إليه المصطلح.ما هذا؟

أشياء مثل "عاصمة اسكتلندا" تسمى مصطلحات محددة ولم يعطوا أي قدر ضئيل من وجع الرأس للمنطقيين والفلاسفة لفترة طويلة.قام راسل وكواين بتصنيفها قائلين إنها ليست في الواقع "مرجعية"، أي أنه من الخطأ الاعتقاد بأن الأمثلة المذكورة أعلاه تستخدم للإشارة إلى الكيانات.الطريقة الصحيحة لفهم أن "إدنبرة كانت عاصمة اسكتلندا منذ عام 1999" هي القول

اسكتلندا لديها عاصمة منذ عام 1999 وعاصمتها هي إدنبرة.

لا يمكن تحويل هذه الجملة إلى جملة جوزية.تم حل المشكلة!كان هدف كواين هو القول بأن اللغة الطبيعية فوضوية، أو على الأقل معقدة، لأنها مصممة لتكون ملائمة للاستخدام العملي، ولكن يجب على الفلاسفة وعلماء المنطق تحقيق الوضوح من خلال فهمها بالطريقة الصحيحة.الشفافية المرجعية هي أداة يمكن استخدامها لتحقيق ذلك وضوح المعنى.

ما علاقة كل هذا بالبرمجة؟ليس كثيرا، في الواقع.كما قلنا، الشفافية المرجعية هي أداة تستخدم في فهم اللغة، أي في التعيين معنى. كريستوفر ستراشي, الذي أسس مجال دلالات لغة البرمجة، استخدمه في دراسته للمعنى.ورقته التأسيسية "المفاهيم الأساسية في لغات البرمجة"متاح على الويب.إنها ورقة جميلة ويمكن للجميع قراءتها وفهمها.لذا، من فضلك افعل ذلك.سوف تكون مستنيرًا كثيرًا.ويقدم مصطلح "الشفافية المرجعية" في هذه الفقرة:

واحدة من أكثر الخصائص المفيدة للتعبيرات هي تلك التي تسمى بالشفافية المرجعية لكوين.في جوهرها هذا يعني أنه إذا كنا نرغب في العثور على قيمة التعبير الذي يحتوي على تعبير فرعي، الشيء الوحيد الذي نحتاج إلى معرفته عن التعبير الفرعي هو قيمته.أي سمات أخرى للتعبير الفرعي، مثل هيكله الداخلي، والعدد وطبيعة مكوناته وترتيب تقييمه أو لون الحبر التي كتبت فيها، لا علاقة لها بقيمة التعبير الرئيسي.

يشير استخدام عبارة "في الجوهر" إلى أن ستراشي يعيد صياغتها لشرحها بعبارات بسيطة.يبدو أن المبرمجين الوظيفيين يفهمون هذه الفقرة بطريقتهم الخاصة.هناك 9 حالات أخرى من "الشفافية المرجعية" في الورقة، لكن لا يبدو أنها تهتم بأي من الحالات الأخرى.في الواقع، ورقة ستراشي بأكملها مخصصة لشرح معنى لغات البرمجة الضرورية.لكن اليوم، يدعي المبرمجون الوظيفيون أن لغات البرمجة الحتمية هي كذلك لا شفافة مرجعيا.سوف يتقلب ستراشي في قبره.

يمكننا إنقاذ الوضع.قلنا أن اللغة الطبيعية "فوضوية، أو على الأقل معقدة" لأنها مصممة لتكون ملائمة للاستخدام العملي.لغات البرمجة هي بنفس الطريقة.إنها "فوضوية، أو على الأقل معقدة" لأنها مصنوعة لتكون ملائمة للاستخدام العملي.هذا لا يعني أنهم بحاجة إلى إرباكنا.يجب فقط أن يتم فهمها بالطريقة الصحيحة، وذلك باستخدام لغة وصفية تتسم بالشفافية المرجعية حتى يكون لدينا وضوح في المعنى.في الورقة التي استشهدت بها، يفعل ستراتشي ذلك بالضبط.وهو يشرح معنى لغات البرمجة الحتمية من خلال تقسيمها إلى مفاهيم أولية، دون فقدان الوضوح في أي مكان.جزء مهم من تحليله هو الإشارة إلى أن التعبيرات في لغات البرمجة لها نوعان من "القيم"، تسمى ل القيم و قيم ص.قبل بحث ستراشي، لم يكن هذا مفهومًا وكان الارتباك هو السائد.اليوم، يتم ذكر تعريف لغة C بشكل روتيني وكل مبرمج لغة C يفهم هذا الفرق.(من الصعب القول ما إذا كان المبرمجون الذين يتحدثون لغات أخرى يفهمونها بشكل متساوٍ).

كان كل من كواين وستراتشي مهتمين بمعنى الإنشاءات اللغوية التي تتضمن شكلاً من أشكال الاعتماد على السياق.على سبيل المثال، يشير مثالنا "إدنبرة هي عاصمة اسكتلندا منذ عام 1999" إلى حقيقة أن "عاصمة اسكتلندا" تعتمد على الوقت الذي يتم فيه النظر فيها.يعد هذا الاعتماد على السياق حقيقة واقعة، سواء في اللغات الطبيعية أو لغات البرمجة.حتى في البرمجة الوظيفية، يجب تفسير المتغيرات الحرة والمقيدة فيما يتعلق بالسياق الذي تظهر فيه.إن الاعتماد على السياق من أي نوع يمنع الشفافية المرجعية بطريقة أو بأخرى.إذا حاولت فهم معنى المصطلحات دون النظر إلى السياقات التي تعتمد عليها، فسوف ينتهي بك الأمر مرة أخرى إلى الارتباك.كان كواين مهتمًا بمعنى المنطق المشروط.لقد عقد ذلك منطق مشروط كان مبهمًا من الناحية المرجعية ويجب تنظيفه من خلال ترجمته إلى إطار شفاف مرجعي (على سبيل المثال، من خلال اعتبار الضرورة بمثابة قابلية للإثبات).لقد خسر هذا النقاش إلى حد كبير.وجد المنطقيون والفلاسفة على حد سواء أن دلالات العالم الممكنة لكريبك كافية تمامًا.يسود وضع مماثل أيضًا مع البرمجة الحتمية.إن اعتماد الدولة الذي أوضحه ستراشي والاعتماد على المتجر الذي أوضحه رينولدز (بطريقة مشابهة لدلالات العالم المحتملة لكريبك) مناسبان تمامًا.لا يعرف المبرمجون الوظيفيون الكثير من هذا البحث.ويجب أن تؤخذ أفكارهم بشأن الشفافية المرجعية بقدر كبير من الشك.

[مذكرة إضافية:توضح الأمثلة أعلاه أن عبارة بسيطة مثل "عاصمة اسكتلندا" لها مستويات متعددة من المعنى.على مستوى ما، قد نتحدث عن العاصمة في الوقت الحالي.على مستوى آخر، قد نتحدث عن جميع العواصم المحتملة التي ربما كانت اسكتلندا تمتلكها على مر الزمن.يمكننا "تكبير" سياق معين و"تصغيره" ليشمل كل السياقات بسهولة تامة في الممارسة العادية.وتستفيد كفاءة اللغة الطبيعية من قدرتنا على القيام بذلك.لغات البرمجة الحتمية فعالة بنفس الطريقة إلى حد كبير.يمكننا استخدام متغير س على الجانب الأيمن من المهمة ( قيمة ص) للحديث عن قيمتها في دولة معينة.أو ربما نتحدث عنها ل القيمة الذي يشمل جميع الولايات.نادرا ما يتم الخلط بين الناس بمثل هذه الأشياء.ومع ذلك، فقد يكونون قادرين أو لا يكونوا قادرين على شرح جميع طبقات المعنى المتأصلة في بنيات اللغة بدقة.كل هذه الطبقات من المعنى ليست بالضرورة "واضحة" ومن الأمور العلمية دراستها بشكل صحيح.ومع ذلك، فإن عدم قدرة الناس العاديين على شرح مثل هذه المعاني المتعددة الطبقات لا يعني أنهم مرتبكون بشأنها.]

"تذييل" منفصل أدناه يربط هذه المناقشة باهتمامات البرمجة الوظيفية والحتمية.

نصائح أخرى

الشفافية المرجعية، وهو مصطلح شائع الاستخدام في البرمجة الوظيفية، تعني أنه بالنظر إلى دالة وقيمة إدخال، ستتلقى دائمًا نفس المخرجات.وهذا يعني أنه لا توجد حالة خارجية مستخدمة في الوظيفة.

فيما يلي مثال على دالة شفافة مرجعية:

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

باستخدام دالة مرجعية شفافة، مع وجود مدخلات ووظيفة، يمكنك استبدالها بقيمة بدلاً من استدعاء الوظيفة.لذا بدلاً من استدعاء plusOne بمعلمة 5، يمكننا فقط استبدال ذلك بالمعامل 6.

مثال جيد آخر هو الرياضيات بشكل عام.في الرياضيات، عند إعطاء دالة وقيمة إدخال، سيتم دائمًا تعيينها لنفس قيمة الإخراج.و(خ) = س + 1.ولذلك فإن الوظائف في الرياضيات شفافة بشكل مرجعي.

هذا المفهوم مهم للباحثين لأنه يعني أنه عندما يكون لديك وظيفة شفافة مرجعيًا، فإنها تفسح المجال أمام الموازاة التلقائية والتخزين المؤقت السهل.

يتم استخدام الشفافية المرجعية دائمًا في اللغات الوظيفية مثل هاسكل.

--

وفي المقابل هناك مفهوم الغموض المرجعي.وهذا يعني العكس.قد لا ينتج عن استدعاء الدالة نفس الإخراج دائمًا.

//global G
int G = 10;

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

مثال آخر، هو وظيفة عضو في لغة برمجة كائنية التوجه.تعمل وظائف الأعضاء عادة على متغيرات الأعضاء الخاصة بها، وبالتالي ستكون مرجعية مبهمة.على الرغم من ذلك، يمكن بالطبع أن تكون وظائف الأعضاء شفافة بشكل مرجعي.

مثال آخر هو وظيفة تقرأ من ملف نصي وتطبع المخرجات.يمكن أن يتغير هذا الملف النصي الخارجي في أي وقت بحيث تكون الوظيفة غير شفافة بشكل مرجعي.

الوظيفة الشفافة مرجعيًا هي الوظيفة التي تعتمد فقط على مدخلاتها.

[هذا ملحق لإجابتي بتاريخ 25 مارس، في محاولة لتقريب المناقشة من اهتمامات البرمجة الوظيفية/الحتمية.]

يبدو أن فكرة المبرمجين الوظيفيين حول الشفافية المرجعية تختلف عن الفكرة القياسية في ثلاث طرق:

  • بينما يستخدم الفلاسفة/المنطقيون مصطلحات مثل "المرجع" و"الدلالة" و"التعيين" و"com.bedeutung"(مصطلح فريجه الألماني)، يستخدم المبرمجون الوظيفيون مصطلح "القيمة".(وهذا ليس من فعلهم تمامًا.لاحظت أن Landin وStrachey وأحفادهم استخدموا أيضًا مصطلح "القيمة" للحديث عن المرجع/الدلالة.قد يكون هذا مجرد تبسيط مصطلحي قدمه لاندين وستراتشي، ولكن يبدو أنه يحدث فرقًا كبيرًا عند استخدامه بطريقة ساذجة.)

  • ويبدو أن المبرمجين الوظيفيين يعتقدون أن هذه "القيم" موجودة داخل لغة البرمجة، وليس خارجها.وهم في القيام بذلك يختلفون عن كل من الفلاسفة وعلماء دلالات لغة البرمجة.

  • ويبدو أنهم يعتقدون أن هذه "القيم" من المفترض أن يتم الحصول عليها عن طريق التقييم.

على سبيل المثال، مقالة ويكيبيديا عن الشفافية المرجعية يقول هذا الصباح:

يُقال إن التعبير شفاف مرجعيًا إذا كان من الممكن استبداله بقيمته دون تغيير سلوك البرنامج (بمعنى آخر، إنتاج برنامج له نفس التأثيرات والمخرجات على نفس المدخلات).

وهذا يخالف تماماً ما يقوله الفلاسفة/المنطقة.يقولون أن السياق يكون مرجعيًا أو شفافًا مرجعيًا إذا كان من الممكن استبدال تعبير في هذا السياق بآخر تعبير الذي يشير إلى نفس الشيء (أ المرجعية الأساسية تعبير).من هم هؤلاء الفلاسفة/المنطقيين؟يشملوا فريج, راسل, وايتهيد, كارناب, كواين, كنيسة وعدد لا يحصى من الآخرين.كل واحد منهم شخصية شاهقة.إن القوة الفكرية المجمعة لهؤلاء المنطقيين هي أقل ما يقال عنه أنها مزلزلة.وكلهم مجمعون على أن المرجعيات/ الدلالات موجودة خارج اللغة الشكلية وأن التعبيرات داخل اللغة لا يمكن إلا أن تتكلم عن هم.لذا، كل ما يمكن للمرء فعله داخل اللغة هو استبدال تعبير بتعبير آخر يشير إلى نفس الكيان.المراجع/الدلالات نفسها لا موجودة داخل اللغة.لماذا ينحرف المبرمجون الوظيفيون عن هذا التقليد الراسخ؟

قد يفترض المرء أن علماء دلالات لغة البرمجة ربما ضللوهم.لكنهم لم يفعلوا ذلك.

هبط في:

(أ) كل تعبير له تداخل بنية التعبير الفرعي، (ب) كل تعبير فرعي يشير إلى شيء ما (عادة ما يكون رقمًا أو قيمة حقيقة أو دالة عددية), ، (ج) الشيء الذي يشير إليه التعبير، أي أن "قيمتها" تعتمد فقط على قيمها الفرعية التعبيرات، وليس على الخصائص الأخرى لها.[تم إضافة التأكيد]

ستوي:

الشيء الوحيد المهم في التعبير هو قيمته، ويمكن استبدال أي تعبير فرعي به أي شيء آخر مساوي له في القيمة [تم إضافة التأكيد].علاوة على ذلك، فإن قيمة التعبير تكون، ضمن حدود معينة، هي نفسها كلما وردت".

الطيور ووادلر:

تعتمد قيمة التعبير فقط على قيم مكوناته التعبيرات (إن وجدت) ويمكن استبدال هذه التعبيرات الفرعية بحرية الآخرين الذين يمتلكون نفس القيمة [تم إضافة التأكيد].

لذلك، إذا نظرنا إلى الماضي، فإن الجهود التي بذلها لاندين وستراتشي لتبسيط المصطلحات عن طريق استبدال كلمة "المرجع"/"الدلالة" بكلمة "القيمة" ربما كانت غير حكيمة.بمجرد أن يسمع المرء عن "القيمة"، ينشأ لديه إغراء التفكير في عملية التقييم التي تؤدي إلى هذه القيمة.ومن المغري بنفس القدر التفكير في أي شيء ينتج عن التقييم باعتباره "قيمة"، على الرغم من أنه قد يكون من الواضح تمامًا أن هذا ليس هو الدلالة.وهذا ما أعتقد أنه حدث لمفهوم "الشفافية المرجعية" في نظر المبرمجين الوظيفيين.لكن "القيمة" التي تحدث عنها علماء الدلالة الأوائل هي لا نتيجة تقييم أو مخرجات دالة أو أي شيء من هذا القبيل.وهو دلالة المصطلح.

بمجرد أن نفهم ما يسمى "قيمة" التعبير ("المرجع" أو "الدلالة" في خطاب الفلاسفة الكلاسيكيين) كموضوع رياضي/مفاهيمي معقد، تنفتح جميع أنواع الاحتمالات.

  • قام ستراشي بتفسير المتغيرات في لغات البرمجة الحتمية على أنها قيم L, ، كما هو مذكور في إجابتي في 25 مارس، وهو كائن مفاهيمي متطور ليس له تمثيل مباشر ضمن بناء جملة لغة البرمجة.
  • كما قام أيضًا بتفسير الأوامر بلغات مثل وظائف حالة إلى حالة، وهو مثال آخر لكائن رياضي معقد لا يمثل "قيمة" ضمن بناء الجملة.
  • حتى استدعاء دالة ذات تأثير جانبي في لغة C لها "قيمة" محددة جيدًا كمحول حالة يقوم بتعيين الحالات إلى أزواج من الحالات والقيم (ما يسمى "monad" في مصطلحات المبرمجين الوظيفيين).

إن إحجام المبرمجين الوظيفيين عن تسمية مثل هذه اللغات بـ "الشفافة المرجعية" يعني فقط أنهم مترددون في الاعتراف بمثل هذه الأشياء الرياضية/المفاهيمية المعقدة على أنها "قيم".من ناحية أخرى، يبدو أنهم على استعداد تام لتسمية محول الحالة بـ "قيمة" عندما يتم وضعها في تركيبهم المفضل وملبسها بكلمة طنانة مثل "monad".يجب أن أقول إنهم غير متسقين تمامًا، حتى لو سلمنا لهم أن فكرتهم عن "الشفافية المرجعية" تتمتع ببعض التماسك.

قد يلقي القليل من التاريخ بعض الضوء على كيفية ظهور هذه الالتباسات.كانت الفترة من 1962 إلى 1967 فترة مكثفة للغاية بالنسبة لكريستوفر ستراشي.بين عامي 1962 و1965، حصل على وظيفة بدوام جزئي كمساعد باحث مع موريس ويلكس لتصميم وتنفيذ لغة البرمجة التي أصبحت تعرف باسم CPL.كانت هذه لغة برمجة ضرورية ولكن كان من المفترض أن تتمتع بقدرات لغة برمجة وظيفية قوية أيضًا.كان للاندين، الذي كان موظفًا في Strachey في شركته الاستشارية، تأثيرًا كبيرًا على وجهة نظر Strachey في لغات البرمجة.في ورقة 1965 التاريخية "التالي 700 لغة برمجة"، يروج Landin بلا خجل للغات البرمجة الوظيفية (يطلق عليها دلالي اللغات) ويصف لغات البرمجة الحتمية بأنها "نقيضها".في المناقشة التي تلت ذلك، نجد ستراشي يثير الشكوك حول موقف لاندين القوي.

...تشكل DLs مجموعة فرعية من جميع اللغات.إنها مجموعة فرعية مثيرة للاهتمام، لكنها واحدة وهو أمر غير مريح للاستخدام ما لم تكن معتادًا عليه.نحن بحاجة إليها لأن في اللحظة نحن لا نعرف كيفية بناء البراهين مع اللغات التي تشمل الضرورات والقفزات.[تم إضافة التأكيد]

في عام 1965، تولى ستراشي منصب القارئ في جامعة أكسفورد ويبدو أنه عمل بشكل أساسي بدوام كامل على تطوير نظرية الحتميات والقفزات.بحلول عام 1967، كان جاهزًا للنظرية التي قام بتدريسها في مقرره حول "المفاهيم الأساسية في لغات البرمجة"في مدرسة كوبنهاغن الصيفية.كان من المفترض أن يتم نشر ملاحظات المحاضرة ولكن "للأسف، بسبب المماطلة التحرير، لم تتحقق الإجراءات أبدًا ؛مثل الكثير من أعمال ستراشي في أكسفورد، ومع ذلك، كان للورقة تداول خاص مؤثر ". (مارتن كامبل كيلي)

من الممكن أن تكون صعوبة الحصول على كتابات ستراشي قد أدت إلى انتشار الارتباك، حيث يعتمد الناس على مصادر ثانوية وإشاعات.ولكن الآن بعد أن "مفاهيم اساسية"متاح بسهولة على شبكة الإنترنت، ليست هناك حاجة للجوء إلى أعمال التخمين.يجب أن نقرأه ونقرر بأنفسنا ما يعنيه ستراشي.بخاصة:

  • في القسم 3.2، يتعامل مع "التعبيرات" حيث يتحدث عن "الشفافية المرجعية لقيمة R".
  • يتعامل قسمه 3.3 مع "الأوامر" حيث يتحدث عن "الشفافية المرجعية ذات القيمة L".
  • في القسم 3.4.5، يتحدث عن "الوظائف والروتين" ويعلن أن "أي خروج عن الشفافية المرجعية لقيمة R في سياق قيمة R يجب أن إما أن يتم حذفها عن طريق تحليل التعبير إلى عدة أوامر وأبسط أو، إذا تبين أن هذا صعب، موضوع تعليق ".

أي حديث عن "الشفافية المرجعية" دون فهم التمييز بين قيم L وقيم R والأشياء المعقدة الأخرى التي تملأ الكون المفاهيمي للمبرمج الحتمي هو أمر خاطئ بشكل أساسي.

يكون التعبير شفافًا مرجعيًا إذا كان من الممكن استبداله بقيمته، دون تغيير الخوارزمية، مما ينتج عنه خوارزمية لها نفس التأثيرات والمخرجات على نفس المدخلات.

الدالة الشفافة المرجعية هي التي تعمل كدالة رياضية؛ونظرًا لنفس المدخلات، فإنه سينتج دائمًا نفس المخرجات.إنه يعني أن الحالة التي تم تمريرها لم يتم تعديلها، وأن الوظيفة ليس لها حالة خاصة بها.

إذا كنت مهتمًا بأصل الكلمة (أي.لماذا يحمل هذا المفهوم هذا الاسم بالتحديد)، ألقِ نظرة على ملفي مشاركة مدونة حول هذا الموضوع.المصطلح يأتي من الفيلسوف/المنطق كواين.

بالنسبة لأولئك الذين يحتاجون إلى شرح موجز، سأخاطر بواحد (لكن اقرأ الكشف أدناه).

تعمل الشفافية المرجعية في لغة البرمجة على تعزيز التفكير المعادلي - فكلما زادت الشفافية المرجعية، أصبح من الأسهل القيام بالاستدلال المعادلي.على سبيل المثالمع تعريف الدالة (الزائفة)،

و س = س + س،

إن السهولة التي يمكنك بها (بأمان) استبدال f(foo) بـ foo + foo في نطاق هذا التعريف، دون وجود الكثير من القيود على المكان الذي يمكنك فيه إجراء هذا التخفيض، تعد مؤشرًا جيدًا على مقدار الشفافية المرجعية في لغة البرمجة الخاصة بك لديه.

على سبيل المثال، إذا كان foo هو x++ بمعنى برمجة C، فلن تتمكن من إجراء هذا التخفيض بأمان (أي، إذا كنت ستقوم بهذا التخفيض فلن ينتهي بك الأمر بنفس البرنامج الذي بدأت به).

في لغات البرمجة العملية، لن ترى شفافية مرجعية مثالية ولكن المبرمجين الوظيفيين يهتمون بها أكثر من معظم الأشخاص (راجع Haskell، حيث يعد هدفًا أساسيًا).

(الكشف الكامل:أنا مبرمج وظيفي، لذا في الإجابة الأولى يجب أن تأخذ هذا التفسير بحذر.)

  1. تعتمد دلالات الدلالة على لغات النمذجة من خلال بناء المجالات التي تشكل دلالة قيم.
  2. يستخدم المبرمجون الوظيفيون هذا المصطلح قيمة لوصف تقارب الحساب بناءً على قواعد إعادة كتابة اللغة، أي.دلالاتها التشغيلية.

في 1 هناك وضوح في اللغتين المعنيتين:

  • الذي يتم صياغته، لغة الكائن
  • لغة النمذجة، اللغة الفوقية

في 2، بفضل قرب الكائن واللغات المعدنية، يمكن الخلط بينهما.

كمنفذ لغة، أجد أنني بحاجة إلى تذكر هذا التمييز باستمرار.

لذا البروفيسورريدي هل يمكنني إعادة صياغة كلامك على هذا النحو :-)

في سياقات البرمجة الوظيفية ودلالات المصطلح الشفافية المرجعية ليست شفافة مرجعيا.

آمل أن تضيف الإجابة التالية إلى الإجابتين الأولى والثالثة المثيرتين للجدل وتؤهلهما.

دعونا نمنح أن التعبير يدل أو يشير إلى بعض المراجع.ومع ذلك، فإن السؤال المطروح هو ما إذا كان من الممكن تشفير هذه المراجع بشكل متماثل كجزء من التعبيرات نفسها، وتسمية هذه التعبيرات بـ "القيم".على سبيل المثال، قيم الأرقام الحرفية هي مجموعة فرعية من مجموعة التعبيرات الحسابية، وقيم الحقيقة هي مجموعة فرعية من مجموعة التعبيرات المنطقية، وما إلى ذلك.والفكرة هي تقييم التعبير لقيمته (إذا كان لديه واحدة).لذا فإن كلمة "قيمة" قد تشير إلى دلالة أو إلى عنصر مميز من مجموعة العبارات.ولكن إذا كان هناك تشابه بين المرجع والقيمة يمكن أن يقولوا أنهم نفس الشيء.(ومع ذلك، يجب على المرء أن يكون حريصًا على تعريف المراجع والتماثل، كما ثبت من مجال الدلالات الدلالية.لوضع مثال مذكور في الردود على الإجابة الثالثة، تعريف نوع البيانات الجبرية data Nat = Zero | Suc Nat لا يتوافق كما هو متوقع مع مجموعة الأعداد الطبيعية.)

دعونا نكتب E[·] لتعبير به ثقب، معروف أيضًا في بعض الأوساط كـ "سياق".هناك مثالان على السياق للتعبيرات المشابهة لـ C [·]+1 و[·]++.

دعونا نكتب [[·]] للدالة التي تأخذ تعبيرًا (بدون ثقب) وينقل معناها (المرجع، الدلالة، إلخ) في بعض الكون الذي يوفر المعنى.(أنا أستعير تدوينًا من الحقل من الدلالات الدلالية.)

دعونا نكيف تعريف كواين بشكل رسمي إلى حد ما على النحو التالي:سياق E[·]يكون شفافًا مرجعيًا إذا تم إعطاء أي تعبيرين E1 و E2 (لا توجد ثقوب هناك) بحيث [[E1]] = [[E2]] (أي.تشير التعبيرات إلى/تشير إلى نفس المرجع) ثم هو الحال أن [[E[E1]]] = [[E[E2]]] (أي.ملء الحفرة إما E1 أو E2 يؤدي إلى تعبيرات تشير أيضًا إلى نفس المرجع).

عادة ما يتم التعبير عن قاعدة لايبنيز المتمثلة في استبدال المتساوي بالمتساوي بـ "إذا".E1 = E2 ثم E[E1] = E[E2]"، والذي يقول ذلك E[·] هي وظيفة.الدالة (أو في هذه الحالة برنامج يحسب الدالة) هي رسم خرائط من المصدر إلى الهدف بحيث يكون هناك عنصر مستهدف واحد على الأكثر لكل عنصر مصدر.الوظائف غير الحتمية هي تسميات خاطئة، فهي إما علاقات، مجموعات توصيل الوظائف، إلخ.إذا كان في حكم لايبنيز المساواة = دلالي ثم يتم أخذ الأقواس المزدوجة ببساطة كأمر مسلم به وشطبها.لذا فإن السياق الشفاف المرجعي هو وظيفة.وقاعدة لايبنتز هي المكون الرئيسي للاستدلال المعادلي، لذا فإن الاستدلال المعادلي يرتبط بالتأكيد بالشفافية المرجعية.

بالرغم من [[·]] هي دالة من التعبيرات إلى الدلالات، يمكن أن تكون من التعبيرات إلى "القيم" التي تُفهم على أنها مجموعة فرعية مقيدة من التعبيرات، و [[·]] يمكن فهمه على أنه تقييم.

الآن، إذا E1 هو تعبير و E2 هي قيمة لدينا ما أعتقد أنه يقصده معظم الناس عند تعريف الشفافية المرجعية من حيث التعبيرات والقيم والتقييم.ولكن كما هو موضح في الإجابتين الأولى والثالثة في هذه الصفحة، فإن هذا تعريف غير دقيق.

المشكلة مع سياقات مثل [·]++ ليس من الآثار الجانبية، ولكن لم يتم تعريف قيمته في لغة C بشكل متماثل لمعناه.الدوال ليست قيمًا (حسنًا، مؤشرات الدوال هي كذلك) بينما هي كذلك في لغات البرمجة الوظيفية.كانلاندن وستراشي ورواد علم الدلالة الدلالي أذكياء جدًا في باستخدام عوالم وظيفية لتوفير المعنى.

بالنسبة للغات الحتمية الشبيهة بـ C، يمكننا (تقريبًا) توفير دلالات لـ التعبيرات باستخدام الدالة [[·]] : Expression -> (State -> State x Value).

Value هي مجموعة فرعية من Expression. State يحتوي على أزواج (المعرف،القيمة).تأخذ الدالة الدلالية تعبيرًا وتقدمه على النحو التالي معناها دالة من الحالة الحالية إلى الزوج مع تحديث الدولة والقيمة.على سبيل المثال، [[x]] هي الدالة من الحالة الحالية إلى الزوج الذي يكون مكونه الأول هو الحالة الحالية والذي يكون مكونه الثاني المكون هو قيمة س.في المقابل، [[x++]] هي الدالة من الحالة الحالية للزوج الذي يكون مكونه الأول هو الحالة التي تكون فيها القيمة من س يزداد، ومكونه الثاني هو تلك القيمة بالذات.وبهذا المعنى، فإن السياق [·]++ شفاف بشكل مرجعي إذا كان يرضي التعريف الوارد أعلاه.

أعتقد أنه يحق للمبرمجين الوظيفيين استخدام الشفافية المرجعية في الشعور بأنهم يتعافون بشكل طبيعي [[·]] كدالة من التعبيرات إلى القيم.الدوال هي قيم من الدرجة الأولى ويمكن أن تكون الحالة أيضًا قيمة وليست دلالة.الموناد الحكومي هو (جزئيًا) آلية نظيفة لتمرير (أو خيوط) الدولة.

لاحظ أن مفهوم "المعنى" هذا هو شيء يحدث في ذهن المراقب.وبالتالي، فإن نفس "المرجع" يمكن أن يعني أشياء مختلفة لأناس مختلفين.لذلك، على سبيل المثال، لدينا صفحة توضيح إدنبرة في ويكيبيديا.

قد تكون المشكلة ذات الصلة التي يمكن أن تظهر في سياق البرمجة هي تعدد الأشكال.

وربما ينبغي أن يكون لدينا اسم للحالة الخاصة لتعدد الأشكال (أو ربما حتى الصب) حيث تكون حالات تعدد الأشكال المختلفة، لأغراضنا، متكافئة لغويًا (بدلاً من كونها متشابهة فقط.على سبيل المثال، الرقم 1 - الذي يمكن تمثيله باستخدام نوع صحيح، أو نوع معقد أو أي من مجموعة متنوعة من الأنواع الأخرى - يمكن معالجته بشكل متعدد الأشكال).

لقد وجدت تعريف الشفافية المرجعية في هذا الكتاب "هيكل وتنفيذ برامج الكمبيوتر"(كتاب المعالج) مفيد لأنه مكمل بشرح الكيفية الشفافية المرجعية يتم انتهاكه عن طريق إدخال عملية الاحالة.تحقق من مجموعة الشرائح التالية التي قمت بإنشائها حول هذا الموضوع: https://www.slideshare.net/pjschwarz/introducing-signment-invalidates-the-substitution-model-of-evaluation-and-violates-referential-transparency-as-explained-in-sicp-the-wizard-book

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top