[Mono-list] PHP# - feasibility study so far - for comment

Miguel de Icaza miguel@ximian.com
15 Dec 2002 15:54:04 -0500


Hello Alan,

> I've just put up a short description of the current state of the 
> research on the feasibility on PHP#, developing a .net CIL bytecode 
> compiler for PHP. If anyone wants to add 'constructive comments' to it, 
> please fire away..
> 
> http://www.akbkhome.com/Projects/PHP_Sharp

This is an interesting effort, here are some bits that you might find
useful:

	* Microsoft's JavaScript compiler is also a dynamically typed
	  language.  You might want to look at the compiler output for
	  `jsc' to see which tricks they use to deal with dynamic types.

	* Microsoft VB.NET compiler also does tricks like that, for
	  example if the compiler can infer the types of variables,
	  it will use the most efficient mechanism possible.

	  For example, `int + int' can be encoded directly using CIL
	  instructions:
	
		load-integer a
		load-integer b
		add

	  but when the compiler can not decide what to
	  do, it has to call a support routine in the runtime:

		load-thing a
		load-thing b
		call Add_two_unknown_objects

	  Or even:

		load-integer a
		load-thing b
		call Add_Integer_And_Unknown
		
	* The Microsoft JSC compiler is interesting, because its
	  implemented in C#, and is available as a runtime class
	  this allows `eval' to actually compile code freshly.

* Optimizing dynamic typed languages

        It has been debated that the CIL is a language that is good for
        statically typed languages, but a poor choice for dynamic
        languages.  I think that this is a gross miss-representation.
        
        In fact every computer architecture works better with statically
        typed languages than dynamic languages (ie, the x86 is not an
        architecture for "hosting" dynamically typed languages), but
        clever tricks can be used to host any language on them. 
        
        For example the Mono JIT inlines a few calls (Math.Sin,
        Math.Cos) with direct FPU instructions.  
        
        I would be entirely possible to extend this mechanism in the
        future to handle particular calls to supporting routines in the
        runtime to inline the code directly (if we believe that they
        make sense, or that they are a performance improvement).  
        
        So say your language needs to do an indirect call, and you use a
        helper function for this:
        
        	load-args
        
        	ldobj TheObjectToCall
        	ld-int some-index.
        	call IntPtr [MyPHPRuntime]Runtime.ExecuteMethodByLookingMethodUp(object,string)
        	call-by-pointer
        
        And lets imagine that the routine above returns a pointer, and
        that it could be inlined nicely by doing some kind of static
        lookup, we could extend the JIT (or have a JIT plugin mechanism)
        that would inline the above call into, say, an indirect call
        with an offset without having to call the lookupmethod routine.
        
Miguel