Posts Tagged ‘execution context’

ترجمة ECMA-262-3 الفصل الأول : سياقات التنفيذ

21/04/2010

هذه المقالة ترجمة ECMA-262-3 in detail Chapter1. Executions Contexts للكاتب Dmitry A. Soshnikov

1- مقدمة
2- تعريفات
3- أنواع الكود القابل للتنفيذ
كود ال global
كود الوظائف
كود الوظيفة eval
4- إستنتاج
5- المزيد

مقدمة

فى هذا المقال سأقوم بذكر أنواع سياقات التنفيذ execution contexts ب ECMAScript و أنواع الكود القابل للتنفيذ المرتبط بهم .

تعريفات

فى كل مرة ينتقل فيها التحكم إلى كود قابل للتنفيذ فى ECMAScript فإن الكود يدخل فى سياق للتنفيذ execution context. سياق التنفيذ execution context إختصارا EC هو مفهوم تجريدى تستخدمه مواصفات ال ECMAScript لتصنيف وتمييز الأكواد القابلة للتنفيذ.

منطقيا , مجموعة من سياقات التنفيذ النشطة تقوم بتشكيل stack ، أسفل هذا ال Stack غالبا ما يكون السياق الشامل global context ، أما بالأعلى فيكون سياق التنفيذ النشط الحالى . يتم تعديل ال stack – يضاف إلى و يحذف من أعلاه – خلال الدخول إلى و الخروج من أنواع سياقات التنفيذ المختلفة .

أنواع الكود القابل للتنفيذ

مع هذا المفهود التجريدى لسياق التنفيذ ، نوع الكود القابل للتنفيذ executable code مرتبط به . عند الحديث عن نوع الكود فإنه من الممكن فى بعض الأوقات ان نقصد به سياق التنفيذ.

فى الأمثلة سنعرف stack سياقات التنفيذ كمصفوفة :

ECStack = [];

يتم الإضافة إلى هذا ال stack فى كل مرة عند دخول وظيفة حتى إذا إستدعت هذه الوظيفة نفسها recursively أو كانت constructor ، و إيضا عند تنفيذ كود من خلال الوظيفة eval .

كود ال global

هذا النوع من الكود الذى يتم تنفيذه فى مستوى البرنامج مباشرة داخل ال script tag او الذى يتم تحميلة من ملف خارجى خارج أى وظيفة ، عندما يتم بدأ تطبيق البرنامج فإن ال ECStack يبدو هكذا :

ECStack = [
    globalContext
];

كود ال Function

عند دخول كود الوظيفة (كل أنواع الوظائف) ، فإن ال ECStack يتم الإضافة عليها عناصر جديدة ، من المهم ان تلاحظ ان سياق كود الوظيفة لا يضمن سياق الوظائف الداخلية ، على سبيل المثال هذه الوظيفة تستدعى نفسها مرة واحدة فقط :

(function foo(bar) {
if (bar) {
return;
}
foo(true);
})();

التعديلات التى تطرأ على ECStack :

// عند دخول foo لأول مرة لتنفيذ الكود
ECStack = [
  <foo> functionContext
  globalContext
];

// عندما نادت foo نفسها
ECStack = [
  <foo> functionContext – recursively
  <foo> functionContext
  globalContext
];

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

كود الوظيفة eval

الأمور أكثر إثارة عندما نتحدث عن كود ال eval ، ينشأ هنا مفهوم سياق الإستدعاء calling context السياق الذى يتم منه إستدعاء الوظيفة eval ، حيث ان التأثير الذى تحدثه الوظيفة eval مثل انشاء المتغيرات و الدوال يؤثر على سياق الإستدعاء :

eval('var x = 10');

(function foo() {
  eval('var y = 20');
})();

alert(x); // 10
alert(y); // "y" is not defined

التعديلات التى تطرأ على ECStack :


ECStack = [
  globalContext
];

// eval('var x = 10');
ECStack.push(
  evalContext,
  callingContext: globalContext
);

// eval خرجت من السياق
ECStack.pop();

// عند إستدعاء الوظيفة foo
ECStack.push(<foo> functionContext);

// eval('var y = 20');
ECStack.push(
  evalContext,
  callingContext: <foo> functionContext
);

// الإنتهاء من تنفيذ eval
ECStack.pop();

// الإنتهاء من تنفيذ foo
ECStack.pop();

فى SpiderMonkey محرك ترجمة الجافاسكربت الموجود فى فايرفوكس و سندربرد لغاية النسخة 1.7 من الممكن تمرير عبارة تانية للوظيفة eval لكى تمثل سياق الإستدعاء calling context ، ومن الممكن عن طرق ذلك التأثير على المتغيرات الخاصة كما يسميها البعض :

function foo() {
  var x = 1;
  return function () { alert(x); };
};

var bar = foo();

bar(); // 1

// تمرير سياق الإستدعاء للتأثير على المتغير الداخلى إكس
eval('x = 2', bar);

bar(); // 2

إستنتاج

هذه المعالجة النظرية مطلوبة لمزيد من التحليل لتفاصيل المواضيع الاخرى المرتبطة بسياقات التنفيذ مثل كائن المتغير Variable object و سلسلة المدى scope chain … الخ .

للمزيد

القسم المقابل فى مواصفات ECMA-262-3  Execution Contexts


تابع

Get every new post delivered to your Inbox.