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

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

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

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

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

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

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

يستخدم

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

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

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

أمثلة

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

A handle is an abstract reference, and may be represented in various ways. A common example are file handles (the FILE data structure in the C standard I/O library), used to abstract file content. It usually represents both the file itself, as when requesting a lock on the file, and a specific position within the file's content, as when reading a file.

In distributed computing, the reference may contain more than an address or identifier; it may also include an embedded specification of the network protocols used to locate and access the referenced object, the way information is encoded or serialized. Thus, for example, a WSDL description of a remote web service can be viewed as a form of reference; it includes a complete specification of how to locate and bind to a particular web service. A reference to a live distributed object is another example: it is a complete specification for how to construct a small software component called a proxy that will subsequently engage in a peer-to-peer interaction, and through which the local machine may gain access to data that is replicated or exists only as a weakly consistent message stream. In all these cases, the reference includes the full set of instructions, or a recipe, for how to access the data; in this sense, it serves the same purpose as an identifier or address in memory.

If we have a set of keys K and a set of data objects D, any well-defined (single-valued) function from K to D ∪ {null} defines a type of reference, where null is the image of a key not referring to anything meaningful.

An alternative representation of such a function is a directed graph called a reachability graph. Here, each datum is represented by a vertex and there is an edge from u to v if the datum in u refers to the datum in v. The maximum out-degree is one. These graphs are valuable in garbage collection, where they can be used to separate accessible from inaccessible objects.

External and internal storage

In many data structures, large, complex objects are composed of smaller objects. These objects are typically stored in one of two ways:

  1. With internal storage, the contents of the smaller object are stored inside the larger object.
  2. With external storage, the smaller objects are allocated in their own location, and the larger object only stores references to them.

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

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

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

الدعم اللغوي

حَشد

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

التلعثم

كانت إحدى أقدم المراجع المبهمة هي خلية 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 .