هل يتم إعادة تفسير رمز اللغات المفسر في كل مرة يتم الوصول إلى الخط؟

StackOverflow https://stackoverflow.com/questions/922692

  •  06-09-2019
  •  | 
  •  

سؤال

لنفترض أنه لا يتم إنشاء أي bytecode لبرنامج، مثل في Ruby، Perl، أو PHP، في هذه الحالة، هو الخط 1 أدناه إعادة تفسيره في كل مرة تصل فيها التنفيذ إلى الخط 1 مرة أخرى؟

while ($indexArrayMoviesData < $countArrayMoviesData + $countNewlyAddedMoviesData) {
  # do something
}

وهذا هو، إذا كانت الحلقة تدير 100000 مرة، فسيتم إعادة تفسير هذا الخط 100،000 مرة؟

وإذا كان الأمر كذلك، فإن إنشاء BYTECODE ليس فقط بدء التشغيل الأولي للبرنامج، ولكن أيضا خلال الإعدام؟ (لأن الكود لا يحتاج إلى إعادة تفسيره مرة أخرى)

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

المحلول

عادة ما يتم تحويلها إلى رمز البايت وسيتم تنفيذ رمز البايت بعد ذلك.

ولكن في حالة PHP على سبيل المثال، يتم تجديد رمز البايت في كل عرض طلب / صفحة. ما لم تقم بتثبيت رمز البايت (أو Opcode كما يطلق عليه في كثير من الأحيان في حالة PHP) ذاكرة التخزين المؤقت، مثل xcache، APC أو EACCECELATOR.

نصائح أخرى

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

هذا ليس هو الحال بالنسبة للقذائف، والتي تفسر كل سطر في كل مرة تنفذها.

إذا كان المترجم المترجم معقول، فما نأمل أن تحقق إذا تم تغيير CountarrayMoviesData أو CountnewlyaddeddddedMoviesData أثناء الحلقة، وإذا لم يكنوا كذلك، فيمكن احتساب المبلغ والحفاظ عليه.

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

عدد قليل جدا من المترجمين الفوريين سوف يفعلون هذا. مثال على ذلك، لم يعد عمره القديم، لم يعد يستخدم مترجم Hypertalk for HyperCard حيث يمكنك بالفعل إعادة كتابة نص التعليمات البرمجانية (إنها مجرد سلسلة!)

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

الجواب على سؤالك، كما يعرف جميع الاستشاريين، هو "ذلك يعتمد".

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

الإصدارات الأصلية من BASIC كانت كذلك بهذه الطريقة.

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

 00010 LET A=42
 00020 DO WHILE A > 0
 00025    LET A = A - 1
 00030 ENDDO

ستحول ذلك على الأقل إلى الرموز الصغيرة للكلمات الرئيسية، والعناوين للمتغير، شيء مثل

 LET    $0003, 42
 LABEL  00020 
 LETEST A, 0
 IFTRUEGOTO   00030
 SUB    $0005, $0003, 1
 GOTO   00020
 LABEL  00030

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

بالطبع، بمجرد أن تذهب إلى هذا الأمر، تجد نفسك تفكر في "Gee، لماذا لا تستخدم Ored Opcodes؟"

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