On Wed, 26 Feb 2003, David Brown wrote:
> This may well be a stupid question, but I've spend enough time staring
> blankly at zend_compile.c/zend_execute.c that I figured it was time to
> ask. :)
>
> Say I have a section of code like this:
>
> <?php
> $s1 = 'foo' . 'bar' . 'baz';
> $s2 = 'foobarbaz';
> ?>
>
> In the PHP bytecode (I hope I'm using the right terminology - I mean the
> stuff in the opline; the stuff that gets stored in the cache under APC
> or Zend cache), is there any functional difference between the
> assignment to $s1 and the assignment to $s2? Or, to put it more
> precisely, is Zend currently able to figure out that the strings on both
> sides of the concatenation operator are constants, and don't need to be
> concatenated at runtime?
No, the engine doesn't do this at compile time. This first one produces:
number of ops: 5
line # op fetch ext operands
-------------------------------------------------------------------------------
1 0 CONCAT ~1, 'foo', 'bar'
1 CONCAT ~2, ~1, 'baz'
2 FETCH_W local $0, 's1'
3 ASSIGN $3, $0, ~2
3 4 RETURN 1
The second one:
line # op fetch ext operands
-------------------------------------------------------------------------------
1 0 FETCH_W local $0, 's2'
1 ASSIGN $1, $0, 'foobarbaz'
2 2 RETURN 1
> If not, can anyone explain the barriers to doing something like this?
It's the job of an optimizer, not of a compiler. And because PHP doesn't
have an internal optimizer, this is not optimized out. You can either
check the ZendOptimiser (I can't show you the opcodes that that
generates) or PEAR::Optimizer, which is in Pecl (which might not do this
optimization yet btw).
Derick
--
Stop mad cowboy disease!
-------------------------------------------------------------------------
Derick Rethans http://derickrethans.nl/
PHP Magazine - PHP Magazine for Professionals http://php-mag.net/
-------------------------------------------------------------------------
--
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php