views:

134

answers:

5

suppose that no bytecode is generated for a program, like in Ruby, Perl, or PHP, in this case, is line 1 below re-interpreted every time the execution reach line 1 again?

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

that is, if the loop runs 100,000 times, then that line will be re-interpreted 100,000 times?

and if so, the bytecode creation helps not only the initial start up of he program, but also during the execution? (because code doesn't need to be re-interpreted again)

+2  A: 

The answer to your question, as all consultants know, is "it depends."

You're right, in some interpreted languages, that line may be reinterpreted each time. I suspect most shells handle it roughly this way.

The original versions of Basic also did it this way.

Most current interpreters will at least tokenize the language, so that the text doesn't need to be re-scanned each time. That is, a BASIC-ish program like

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

would convert it at the least to small tokens for the keywords, and addresses for the variable, something like

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

where each word in upper case in the translation is a single integer internally. That way, there's a single lexical analysis pass to translate it, followed by the interpreter being able to just interpret the token values.

Of course, once you go that far, you find yourself thinking "gee, why not use real opcodes?"

Charlie Martin
do you mean consultants like to answer "it depends" as a formal answer? how about for the case of Ruby running on the command line? or PHP running on the command line?
動靜能量
It's a running joke about consultants, really. Consultants often answer "it depends" because they don't really know enough yet, but don't want to answer "I don't know".
Charlie Martin
i don't know any BASIC that didn't tokenize before execution. even CP/M based basics, as did old Apple ones (both FP (from microsoft) and Int (by the Woz!)).
Javier
Sure, sure, I'm old, rub it in. ;-)
Charlie Martin
+5  A: 

Typically, it'll be converted into byte code and that byte code will then be executed.

But in the case of PHP for example, the byte code is regenerated on every request/page view. Unless you install a byte code (or opcode as it's called often in the case of PHP) cache, such as XCache, APC or EAccelerator.

Wim Leers
+3  A: 

For recent languages, including perl, the code is precompiled before being executed. So most of the analysis work is performed only once.

This is not the case for shells, which interpret every line each time they execute them.

mouviciel
+2  A: 

If the interpreter is sensible it would hopefully check if $countArrayMoviesData or $countNewlyAddedMoviesData were altered during the loop and if they weren't then the sum could be calculated and kept.

If the values are updated within the loop then in all likelihood even the bytecode would require an addition operation to take place, not making it any more efficient.

Chris
+2  A: 

Very, very few interpreters will do this. An example is the ages-old, no longer used Hypertalk interpreter for Hypercard where you could actually rewrite the text of your code programatically (it's just a string!)

Even interpreters that don't produce byte code will parse your code first, as it's hard to do that line by line and much easier to do it all at once. So a really simple interpreter will basically have a tree, with a node for the "where" loop with two children: one "less than" expression for the conditional, and one block for the body of the loop.

Dietrich Epp
Perl does that, executes the syntactic tree instead of bytecode.
Javier