جهاز جنسن

جهاز جنسن هو تقنية برمجة حاسوبية تستغل خاصية الاستدعاء بالاسم . ابتكره عالم الحاسوب الدنماركي يورن جنسن ، الذي عمل مع بيتر نور في مركز الأبحاث Regnecentralen . وقد عملا معًا على مُصرّف GIER ALGOL ، وهو أحد أوائل التطبيقات الصحيحة للغة ALGOL 60. استخدمت ALGOL 60 خاصية الاستدعاء بالاسم. [ 1 ] [ 2 ] [ 3 ] وخلال خطابه عند استلام جائزة تورينج، أشار نور إلى عمله مع جنسن على GIER ALGOL.

وصف

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

من الأمثلة الكلاسيكية على جهاز جنسن إجراء يحسب مجموع متسلسلة.ك=uأك{\displaystyle \textstyle \sum _{k=\ell }^{u}a_{k}}: [ 4 ] [ 5 ] [ 6 ]

إجراء حقيقي Sum(k, l, u, ak) القيمة l، u؛ عدد صحيح k، l، u؛ عدد حقيقي ak؛ تعليق: يتم تمرير k و ak بالاسم؛ ابدأ عدد حقيقي s؛ s := 0; for k := l step 1 until u do s := s + ak; المجموع := s نهاية ؛

في هذه العملية، يتم تمرير متغير الفهرس kومعامل الجمع akبالاسم. يُمكّن الاستدعاء بالاسم العملية من تغيير قيمة متغير الفهرس أثناء تنفيذ الحلقة for. كما يؤدي الاستدعاء بالاسم akإلى إعادة تقييم الوسيط في كل تكرار للحلقة. عادةً، akيعتمد ذلك على التغيير (التأثير الجانبي) k.

V[]على سبيل المثال، سيكون الكود لحساب مجموع أول 100 عنصر من مصفوفة حقيقية كما يلي :

Sum(i, 1, 100, V[i]).

أثناء تنفيذ ، ستزداد Sumقيمة الوسيط الفعلي خلال كل خطوة من خطوات الحلقة ، وسيستخدم كل تقييم من تقييمات الإجراء القيمة الحالية للوصول إلى عناصر المصفوفة المتتالية .iforakiV[i]

جهاز جنسن عام. يمكن إجراء عملية الجمع المزدوج على النحو التالي:

Sum(i, l, m, Sum(j, l, n, A[i,j]))

يمكن استخدام هذه Sumالدالة مع أي دالة أخرى بمجرد استخدام التعبيرات المناسبة. فإذا أردنا مجموع أعداد صحيحة، يكون التعبير هو Sum(i,1,100,i);، وإذا أردنا مجموع مربعات أعداد صحيحة، يكون التعبير Sum(i,1,100,i*i);هو ، وهكذا. [ 7 ] ويمكن استخدام تعديل بسيط لبدء التكامل العددي لتعبير ما بطريقة مشابهة جدًا لطريقة Sum.

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

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

نظام تحديد المواقع العالمي (GPS)

مثال آخر هو GPS (حل المشكلات العامة)، الموصوف في ALGOL 60 السري لـ DE Knuth و JN Merner . [ 8 ]

إجراء حقيقي GPS(I, N, Z, V)؛ حقيقي I، N، Z، V؛ ابدأ من أجل I := 1 خطوة 1 حتى N افعل Z := V؛ GPS := 1 نهاية ؛

فيما يلي عبارة واحدة تجد العدد الأولي رقم m باستخدام نظام تحديد المواقع العالمي (GPS).

I := GPS(I, إذا كان I=0 فإن -1.0 وإلا I, P, إذا كان I=1 فإن 1.0 وإلا إذا GPS(A, I, Z, إذا كان A=1 فإن 1.0 وإلا إذا كان entier(A)×(entier(I)÷entier(A))=entier(I) ∧ A<I فإن 0.0 وإلا Z) = Z ثم ( إذا كان P<m فإن P+1 وإلا I×GPS(A, 1.0, I, -1.0)) وإلا P)

(ملاحظة: في الورقة الأصلية، التعبير قرب النهاية هو GPS(A, 1.0. I, 0.0)، بسبب حالة خاصة في تحديد دلالات عبارة ALGOL 60's for .)

نقد

يعتمد جهاز جنسن على الاستدعاء بالاسم، لكن هذه الطريقة دقيقة وتتضمن بعض المشاكل. ونتيجةً لذلك، لا تتوفر هذه الطريقة في معظم لغات البرمجة. ويشير كنوت إلى أن لغة ALGOL 60 لا تستطيع التعبير عن increment(n)إجراء يزيد وسيطه بمقدار واحد؛ إذ increment(A[i])لا يؤدي الاستدعاء الوظيفة المتوقعة إذا iكان وسيطًا دالةً تتغير مع كل وصول. [ 9 ] ويقول كنوت: "إن استخدام إمكانيات تعريف "الماكرو" لتوسيع اللغة، بدلًا من الاعتماد كليًا على الإجراءات لهذا الغرض، ينتج عنه برنامج تشغيل أكثر كفاءة."

يشير آخرون إلى أن إجراء الاستدعاء بالاسم الذي يُبدّل وسيطه قد ينطوي على مشاكل دقيقة. [ 10 ] ومن أمثلة إجراءات التبديل الواضحة ما يلي:

إجراء تبديل (أ، ب) عدد صحيح أ، ب؛ ابدأ عدد صحيح مؤقت؛ temp := a; أ := ب؛ b := temp; نهاية ؛

يُنفّذ الإجراء العملية بشكل صحيح في العديد من الحالات، لكن استدعاءه swap(i,A[i])يُمثّل إشكالية. استخدام قاعدة النسخ يؤدي إلى عمليات الإسناد التالية:

temp := i; i := A[i]; A[i] := temp;

المشكلة تكمن في أن التغيير في المهمة الثانية سيؤدي iعلى A[i]الأرجح إلى اختلاف عنصر المصفوفة في المهمة الثالثة عن العنصر في البداية. أما إذا تمت برمجة الإجراء بالعكس (بحيث يتم حفظ b في متغير مؤقت بدلاً من a )، فسيتم تنفيذ الإجراء المطلوب، إلا إذا تم استدعاؤه بطريقة أخرى swap(A[i],i). (يُفضل swap()استخدام طريقة أكثر أمانًا  ).

temp1 := i; temp2 := A[i]; i := temp2; A[i] := temp1;

.)

انظر أيضاً

مراجع

  1. نور، بيتر (2005). فيديو محاضرة بيتر نور . جوائز ACM . الدنمارك: جمعية آلات الحوسبة . تم الاسترجاع في 11 سبتمبر 2020 .
  2. ديفيد (1 مارس 2006). "رائد البرمجيات بيتر نور يفوز بجائزة تورينج من جمعية آلات الحوسبة" . سياسة جمعية آلات الحوسبة العامة . تم الاطلاع عليه بتاريخ 11 سبتمبر 2020 .
  3. "ACM: زملاء: بيتر نور، أستاذ فخري، جامعة كوبنهاغن، مرجع" . 2005. مؤرشف من الأصل في 12 فبراير 2008. تم الاطلاع عليه في 21 سبتمبر 2020 .أُرشف بتاريخ 12 فبراير 2008 في أرشيف الإنترنت (Wayback Machine) .
  4. ماكلينان، بروس ج. (1987). مبادئ لغات البرمجة: التصميم والتقييم والتنفيذ ( الطبعة الثانية). هولت، راينهارت ووينستون. الصفحات 141-142 . ISBN   0-03-005163-0.
  5. ديكسترا، إي دبليو (نوفمبر 1961). "الدفاع عن ALGOL 60 (رسالة إلى المحرر)" . اتصالات ACM . 4 (11): 502-503 . doi : 10.1145/366813.366844 . S2CID 34185299 . 
  6. كنوت، دي إي (أكتوبر 1967). "المشاكل المتبقية في لغة ALGOL 60" . مجلة اتصالات رابطة مكائن ​​الحوسبة . 10 (10): 611-617 . doi : 10.1145/363717.363743 . S2CID 10070608 . 
  7. يتطلب الأمر وسيطًا للمصطلح، لذلك يُفترض تحويل النوع.Sumreal
  8. ^ نوث ، دونالد إي. ميرنر ، جاك ن. (يونيو 1961). "ALGOL 60 سري" . مشترك. ايه سي ام . 4 (6): 268-272 . دوى : 10.1145 / 366573.366599 . S2CID 22215746 . 
  9. كنوت 1967 ، ص 613. على سبيل المثال،سيزدادمرتين. increment(A[increment(j)])j
  10. ماكلينان 1987