سؤال

ما هي وما هي جيدة ؟

أنا لم يكن لديك CS درجة خلفيتي هو VB6 -> ASP -> ASP.NET/C#.يمكن لأي شخص أن يشرح ذلك بطريقة واضحة وموجزة ؟

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

المحلول

تخيل لو كل سطر في البرنامج كانت وظيفة منفصلة.كل يقبل ، المعلمة ، السطر التالي/وظيفة تنفيذ.

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

نصائح أخرى

ربما يفهم منها أفضل مما كنت أعتقد أنك فعلت.

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

بيثون على سبيل المثال:

try:
    broken_function()
except SomeException:
    # jump to here
    pass

def broken_function():
    raise SomeException() # go back up the stack
    # stuff that won't be evaluated

مولدات أمثلة من "الهبوط فقط" متابعات.أنها تسمح رمز إلى إدخال حلقة ، على سبيل المثال ، إلى خلق قيم جديدة.

بيثون على سبيل المثال:

def sequence_generator(i=1):
    while True:
        yield i  # "return" this value, and come back here for the next
        i = i + 1

g = sequence_generator()
while True:
    print g.next()

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

رؤساء هذا المثال ليس موجزة ولا واضح للغاية.وهذا دليل قوي تطبيق متابعات.كما VB/ASP/C# مبرمج, قد لا تكون مألوفة مع مفهوم نظام كومة أو إنقاذ الدولة ، وبالتالي فإن الهدف من هذا الجواب مظاهرة و لا تفسيرا.

متابعات هي متعددة للغاية و هي طريقة حفظ تنفيذ الدولة واستئنافها في وقت لاحق.هنا هو مثال صغير التعاونية خاصية تعدد البيئة باستخدام استمرارا في المخطط:

(نفترض أن عمليات إدراج بقائمة الانتظار و dequeue يعمل كما هو متوقع على نطاق عالمي طابور لا يعرف هنا)

(define (fork)
  (display "forking\n")
  (call-with-current-continuation
   (lambda (cc)
     (enqueue (lambda ()
                (cc #f)))
     (cc #t))))

(define (context-switch)
  (display "context switching\n")
  (call-with-current-continuation
   (lambda (cc)
     (enqueue
      (lambda ()
        (cc 'nothing)))
     ((dequeue)))))

(define (end-process)
  (display "ending process\n")
  (let ((proc (dequeue)))
    (if (eq? proc 'queue-empty)
        (display "all processes terminated\n")
        (proc))))

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

هنا مثال على استخدامها:

(define (test-cs)
  (display "entering test\n")
  (cond
    ((fork) (cond
              ((fork) (display "process 1\n")
                      (context-switch)
                      (display "process 1 again\n"))
              (else (display "process 2\n")
                    (end-process)
                    (display "you shouldn't see this (2)"))))
    (else (cond ((fork) (display "process 3\n")
                        (display "process 3 again\n")
                        (context-switch))
                (else (display "process 4\n")))))
  (context-switch)
  (display "ending process\n")
  (end-process)
  (display "process ended (should only see this once)\n"))

يجب أن يكون الإخراج

entering test
forking
forking
process 1
context switching
forking
process 3
process 3 again
context switching
process 2
ending process
process 1 again
context switching
process 4
context switching
context switching
ending process
ending process
ending process
ending process
ending process
ending process
all processes terminated
process ended (should only see this once)

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

P. S.- أعتقد أنني أتذكر شيئا من هذا القبيل إلى هذا في Lisp, لذلك إذا كنت ترغب في رؤية المهنية كود يجب عليك التحقق من الكتاب.

طريقة واحدة للتفكير في استمرار مثل المعالج المكدس.عند "الدعوة-مع-الحالي-استمرار ج" ويدعو وظيفة الخاص بك "ج" و المعلمات التي تم تمريرها إلى "ج" هو كومة الحالي مع كل التلقائي الخاص بك المتغيرات على ذلك (ممثلة أخرى وظيفة ، الذي يطلق عليه "ك").وفي الوقت نفسه المعالج يبدأ خلق جديد المكدس.عند استدعاء "ك" ينفذ "العودة من روتين" (RTS) التعليمات على كومة الأصلي ، القفز مرة أخرى في سياق الأصلي "الدعوة-مع-الحالي-استمرار" ("الدعوة-cc" من الآن فصاعدا) و يسمح البرنامج أن يستمر كما كان من قبل.إذا كنت تمرير المعلمة إلى "ك" ثم يصبح هذا قيمة الإرجاع "الدعوة-cc".

من وجهة نظر الأصلي الخاص بك كومة ، "الدعوة-cc" تبدو وكأنها طبيعية استدعاء دالة.من وجهة نظر "ج" ، الأصلي الخاص بك كومة يشبه وظيفة أن لا يعود أبدا.

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

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

في الأساس استمرار قدرة وظيفة لوقف التنفيذ ومن ثم اختيار نسخة احتياطية من حيث توقفت في وقت لاحق في الوقت المناسب.في C#, يمكنك القيام بذلك باستخدام الكلمة العائد.أستطيع الخوض في مزيد من التفاصيل إذا كنت ترغب, ولكن أردت موجزة التفسير.;-)

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

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

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

لذلك استمرار يمكن أن ينظر إليها على مستوى عال نموذج من جهاز كمبيوتر ، والذي هو السبب في أنه من الناحية النظرية يستوعب العادية استدعاء الإجراء/عودة (مثلما القديمة الحديد هل استدعاء الإجراء/العودة عبر مستوى منخفض القفز ، الملقب غوتو ، تعليمات بالإضافة إلى تسجيل من جهاز الكمبيوتر على المكالمات وإعادة منه على عودة) وكذلك الاستثناءات ، المواضيع ، coroutines ، إلخ.

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

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

في جوهرها استمرار تمثيل "ماذا تفعل عندما الاحتجاج" ، وعلى هذا النحو ، يمكن أن يكون (وفي بعض اللغات في استمرار تمرير طراز البرامج في كثير من الأحيان هو) من الدرجة الأولى الكائن الذي هو مثيل, مرت حولها, و تجاهل تماما مثل معظم أي نوع بيانات آخر ، و كيف الكلاسيكية الكمبيوتر يعامل مواقع الذاكرة vis-a-vis جهاز الكمبيوتر -- ما يقرب من للتبادل مع العاديين الاعداد الصحيحه.

في C#, لديك حق الوصول إلى اثنين استمرارا.واحد الوصول إليها من خلال return, يتيح أسلوب الاستمرار من حيث كان يسمى.أخرى يتم الوصول إليها من خلال throw, يتيح وسيلة تواصل في أقرب مطابقة catch.

بعض اللغات تمكنك من التعامل مع هذه البيانات من الدرجة الأولى القيم ، لذلك يمكنك تعيين وتمريرها حول المتغيرات.ما يعنيه هذا هو أنه يمكنك خبأ قيمة return أو من throw وندعو لهم في وقت لاحق عندما كنت حقا على استعداد للعودة أو رمي.

Continuation callback = return;
callMeLater(callback);

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

أنا استخدامها في عدة مشاريع أعمل عليهافي واحد أنا استخدامها حتى أستطيع وقف البرنامج بينما أنا في انتظار IO عبر الشبكة ، ثم تستأنف في وقت لاحق.في الآخر أنا أكتب لغة البرمجة حيث تعطي المستخدم إمكانية الوصول إلى متابعات-كما-القيم حتى يتمكنوا من الكتابة return و throw لأنفسهم أو التحكم في التدفق, مثل while الحلقات دون الحاجة إلى القيام بذلك.

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

استمرارا كان الاهتمام المتجدد مع برمجة الويب لأنها لطيف مرآة وقفة/استئناف حرف من طلبات ويب.ملقم يمكن بناء continaution يمثل المستخدمين الدورة واستئناف إذا استمر المستخدم الدورة.

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