مرجع (علوم الحاسوب)

في برمجة الحاسوب ، المرجع هو قيمة تُمكّن البرنامج من الوصول غير المباشر إلى معلومة معينة ، مثل قيمة متغير أو سجل ، في ذاكرة الحاسوب أو في أي جهاز تخزين آخر . يُقال إن المرجع يشير إلى المعلومة، ويُسمى الوصول إلى المعلومة "فكّ مرجعية المرجع " . المرجع يختلف عن المعلومة نفسها.

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

التمثيل الرسمي

المرجع R هو قيمة تقبل عملية واحدة، dereference( R )، تُنتج قيمة. عادةً ما يُحدد نوع المرجع بحيث يُعيد قيمًا من نوع مُحدد، على سبيل المثال: [ 1 ] [ 2 ]

واجهة مرجعية < T > { T قيمة (); }

غالباً ما يسمح المرجع أيضاً بعملية إسناد store( R ، x )، مما يعني أنه متغير مجرد . [ 1 ]

يستخدم

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

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

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

أمثلة

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

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

في الحوسبة الموزعة ، قد يحتوي المرجع على أكثر من مجرد عنوان أو مُعرِّف؛ فقد يتضمن أيضًا مواصفات مُضمَّنة لبروتوكولات الشبكة المُستخدمة لتحديد موقع الكائن المُشار إليه والوصول إليه، وطريقة ترميز المعلومات أو تسلسلها. على سبيل المثال، يُمكن اعتبار وصف WSDL لخدمة ويب بعيدة بمثابة مرجع؛ فهو يتضمن مواصفات كاملة لكيفية تحديد موقع خدمة ويب مُعينة والربط بها . يُعد المرجع إلى كائن موزع نشط مثالًا آخر: فهو مواصفات كاملة لكيفية إنشاء مُكوِّن برمجي صغير يُسمى وكيلًا ، والذي سيُشارك لاحقًا في تفاعل نظير إلى نظير، ومن خلاله يُمكن للجهاز المحلي الوصول إلى البيانات المُكرَّرة أو الموجودة فقط كتدفق رسائل ضعيف الاتساق. في جميع هذه الحالات، يتضمن المرجع مجموعة كاملة من التعليمات، أو وصفة، لكيفية الوصول إلى البيانات؛ وبهذا المعنى، فإنه يُؤدي نفس الغرض الذي يُؤديه المُعرِّف أو العنوان في الذاكرة.

إذا كان لدينا مجموعة من المفاتيح K ومجموعة من كائنات البيانات D ، فإن أي دالة محددة جيدًا (ذات قيمة واحدة) من K إلى D ∪ { null } تحدد نوعًا من المراجع ، حيث null هي صورة مفتاح لا يشير إلى أي شيء ذي معنى.

يُعدّ الرسم البياني الموجّه، المعروف باسم رسم بياني إمكانية الوصول ، تمثيلاً بديلاً لهذه الدالة . في هذا الرسم، يُمثّل كل عنصر بيانات برأس، وتوجد حافة من u إلى v إذا كان العنصر في u يشير إلى العنصر في v . الحد الأقصى لدرجة الخروج هو واحد. تُعدّ هذه الرسوم البيانية قيّمة في جمع البيانات المهملة ، حيث يمكن استخدامها لفصل العناصر التي يمكن الوصول إليها عن تلك التي لا يمكن الوصول إليها .

التخزين الخارجي والداخلي

في العديد من هياكل البيانات، تتكون الكائنات الكبيرة والمعقدة من كائنات أصغر. وعادةً ما يتم تخزين هذه الكائنات بإحدى طريقتين:

  1. في حالة التخزين الداخلي، يتم تخزين محتويات الجسم الأصغر داخل الجسم الأكبر.
  2. باستخدام التخزين الخارجي، يتم تخصيص الكائنات الأصغر في موقعها الخاص، بينما يقوم الكائن الأكبر بتخزين مراجع لها فقط.

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

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

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

الدعم اللغوي

حَشد

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

التلعثم

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

لغة C/C++

لا يزال المؤشر أحد أكثر أنواع المراجع شيوعًا اليوم. وهو يُشبه تمثيل العنوان الخام في لغة التجميع، إلا أنه يحمل نوع بيانات ثابتًا يُمكن استخدامه أثناء الترجمة لضمان عدم إساءة تفسير البيانات التي يُشير إليها. مع ذلك، نظرًا لأن لغة C تتميز بنظام أنواع ضعيف يُمكن انتهاكه باستخدام التحويلات الصريحة بين أنواع المؤشرات المختلفة، وبين أنواع المؤشرات والأعداد الصحيحة، فإن سوء التفسير لا يزال ممكنًا، وإن كان أكثر صعوبة. حاولت لغة C++، التي خلفتها ، تعزيز أمان أنواع المؤشرات من خلال عوامل تحويل جديدة، ونوع مرجعي ، ومؤشرات ذكية في مكتبتها القياسية ، لكنها احتفظت مع ذلك بإمكانية تجاوز آليات الأمان هذه من أجل التوافق.&

فورتران

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

لغات البرمجة الكائنية

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

اللغات الوظيفية

في لغات البرمجة الوظيفية مثل Standard ML و OCaml وغيرها، تُعتبر معظم القيم ثابتة، أي لا يمكن تعديلها عن طريق الإسناد. توفر "خلايا المرجع" القابلة للإسناد متغيرات قابلة للتغيير ، وهي بيانات يمكن تعديلها. يمكن لهذه الخلايا المرجعية أن تحمل أي قيمة، ولذلك تُعطى النوع متعدد الأشكالα ref ، حيث αيُستبدل نوع القيمة المُشار إليها بنوع القيمة المُشار إليها. يمكن أن تُشير هذه المراجع القابلة للتغيير إلى كائنات مختلفة خلال دورة حياتها. على سبيل المثال، يسمح هذا بإنشاء هياكل بيانات دائرية. تُكافئ خلية المرجع وظيفيًا مصفوفة قابلة للتغيير بطول 1.

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

بيرل/بي إتش بي

يدعم بيرل المراجع الصلبة، التي تعمل بشكل مشابه لتلك الموجودة في لغات البرمجة الأخرى، والمراجع الرمزية ، وهي عبارة عن قيم نصية تحتوي على أسماء المتغيرات. عند محاولة الوصول إلى قيمة ليست مرجعًا صلبًا، يعتبرها بيرل مرجعًا رمزيًا ويُعيد المتغير بالاسم المُحدد في تلك القيمة. [ 3 ] يحتوي PHP على ميزة مشابهة في بنيته $$var. [ 4 ]

انظر أيضاً

مراجع

  1. 1 2 شيرمان، مارك س. (أبريل 1985). باراغون: لغة تستخدم التسلسلات الهرمية للأنواع لتحديد وتنفيذ واختيار أنواع البيانات المجردة . سبرينغر ساينس آند بيزنس ميديا. ص  175. ISBN 978-3-540-15212-5.
  2. "مرجع (منصة جافا SE 7)" . docs.oracle.com . تم الاطلاع عليه بتاريخ 10 مايو 2022 .
  3. "perlref" . perldoc.perl.org . تم الاطلاع عليه بتاريخ 19-08-2013 .
  4. "المتغيرات - دليل المستخدم" . PHP . تم الاطلاع عليه بتاريخ 19-08-2013 .