Imagine you’ve made a very huge flash application and many users will play with it every day.
python
Java coffee factory
I just read a really exhilarant post by Digital Davide, unfortunately it’s only in italian so many of you will not understand that, but for those who can I suggest to take a reading!
It’s really funny and it describes perfectly what I think about Java and java way of coding too 🙂
Don’t miss to read “Il pitone dell’isola di Java“ !
Actionscript parsing experiences: PyBison & PLY
My experiments with text-parsing continue..
PyBison
Last day I founded a python library (pybison) which runs the generated python parser at near the speed of C-based parsers, due to direct hooks into bison-generated C code.
Cool, unfortunately I couldn’t compiled it for Windows and so I made my test on Ubuntu only. What I did was just to export the already written lexer/grammar using bison2py (boundled with pybison) and run it.
If you want to take a look at the python parser try it by downloading the source code here.
The run.py file accept these parameters:
usage: run.py [options]
options:
-h, --help show this help message and exit
-v, --verbose Turn on verbose mode
-o OUTPUT_FILE, --output=OUTPUT_FILE
Don't print to stdout but to the output file
-i INPUT_FILE, --input=INPUT_FILE
Input file to be parsed
-x, --to-xml Returns a human-readable xml representation of the
parse tree
-b, --bison-debug Print the Bison/Flex debug
You can download the source code here
PLY
The second test I did was using PLY, an implementation of lex and yacc parsing tools for Python. Being implemented entirely in python it should be much more slower that pybison, but I didn’t find any difference with the pybison parser version. In fact PLY , like the traditional bison, creates tables starting from the grammar syntax.
Ok, Both of the implementations are slower that the pure C parser, but extremely faster that antlr!
(They took more or less 0.02 to 0.5 secs for parsing and generating the AST.)
Unlike pybison PLY is still mantained and offers more features and a better error handling.. even if the whole grammar has to be rewritten in python, and it can be compiled in Windows too.
To run the test just write:
python run.py {filename}
P.S. Unfortunately the yacc parser isn’t yet complete because I still need to find a way for parsing correctly E4X and XML syntax..
An experience with antlr, java and python
I just wanted to share a little experience with generating an AS3 parser using antlr and python.
I was trying first to create the parser using GNU Flex and Bison in C, probably the best way for a very performancing parser.
Yeah, that’s right.. but looking at the antlr syntax I realized that’s easier and easier.
Moreover I start using this very useful eclipse plugin for antlr debugging which made my life easier!
The grammar file I created is a compromise between the asdt grammar file and the ECMA-262 grammar specification.
Once finished working on my eclipse project I’ve managed to parse succesfully all the adobe corelibs files using this java test file:
package org.sepy.core.parsers.as3;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import antlr.CommonAST;
import antlr.RecognitionException;
import antlr.TokenStreamException;
public class Application {
public static void main(String argv[])
{
if(argv.length > 0)
{
File file = new File(argv[0]);
if(file.exists())
{
FileInputStream is = null;
try {
is = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
AS3Lexer L = new AS3Lexer(is);
AS3Parser P = new AS3Parser(L);
try {
P.compilationUnit();
} catch (RecognitionException e) {
// TODO Auto-generated catch block
System.out.println(" line=" + e.line + ", column="+ e.column);
System.out.println(e.getMessage());
e.printStackTrace(System.err);
} catch (TokenStreamException e) {
// TODO Auto-generated catch block
System.out.println(" line=" + L.getLine() + ", column="+ L.getColumn());
System.out.println(L.getGuessInfo());
System.out.println(e.getMessage());
e.printStackTrace(System.err);
}
CommonAST.setVerboseStringConversion(false, P.getTokenNames());
CommonAST ast = (CommonAST) P.getAST();
System.out.println("Tree:");
System.out.println(ast.toStringTree());
}
}
}
}
Ok, done that I decided to export the grammar file for python (thanks to antrl python export feature).
Everything works fine also for python, but I realized that the python script were so much slower than the java one!
import sys
import antlr
import AS3Parser
import AS3Lexer
L = AS3Lexer.Lexer(filename);
P = AS3Parser.Parser(L);
P.setFilename(filename)
try:
P.compilationUnit();
ast = P.getAST();
except:
pass
On a 75Kb actionscript file the python script took about 7 seconds to run, while the java application only 2 seconds. I know python interpreter caould be slower than many other languages, but I never thought so much slower.
So I run the python hotshot profiler to see which could be the bottleneck in the python script and I found most of the problems were due to unuseless antlr (the python module) method’s calls.
After making corrections to the antlr.py file the same script took exactly half of the time. Now 3 seconds. Wow 🙂
But not fast enough.
So I enabled for the antlr python script psyco module and this time the same script took only 1.6 seconds.
Now the python script is fast enough, even if I’m sure I can make more optimizations in the antlr module…
Red5, first thoughts
As I promised myself, I started to spend some of the time in testing red5 since I’ve read the about the 0.6RC1 release.
Unfortunately I wasn’t able to run it on my Windows Vista so I try it on an older Windows XP. Once unpacked the installer I first tested some of the example applications boundled, everything worked fine.. cool, nice, great project indeed!
But then I wanted to migrate one of my FCS2 projects to Red5 in order to test “the real world”.
Ok, I need to write in Java? (there’s Python support, but it’s Jython) Cool.. I never seen Java, I thought it was a monster with eight heads 🙂
Got the first Java editor I found on the net, IntelliJIdea (what a wonderful editor indeed! much expensive, but really cool), and started with headache..
But at least, for a newbie like me, it seems to me like editing ActionScript3 files, so it wasn’t so difficult to make things running.
I’m still “trying” to re-write the application (with minor changes also in the flash files) but I managed to make remote sharedobjects, streams and remote calls running like in the FCS2 original application and I’m so happy 🙂
I just encounter a couple of time a Windows blue screen error while getting webcam streams (I need to make a snapshot next time) and some human unreadable java exceptions (It’s indeed a my fault) but I think it was a positive beginning after all.
Great great compliments to red5 developers!
Installing python msi on Windows Vista
Finally I’ve managed to install python on my Windows Vista!
Every time I tried to install the .msi package it was stopping work just after selecting the destination folder and I was going crazy to find a solution..
Then I managed to install it correctly using msiexec
msiexec /i python-2.4.3.msi TARGETDIR="C:\Program Files\Python24" ALLUSERS=1 /qb
ActionScript 3, … (rest) parameter, finally!
Yesterday I was reading the latest actionscript 3 documentation on adobe labs and I found that they finally introduced the … (rest) function’s argument, as also described in the ECMA Script 4 specifications.
I say “finally” because it’s since I discovered python *args and **kwds function arguments that I pray for them also in actionscript.
In actionscript3 rest parameter is used for example:
[cc lang=”actionscript3″]
public function log(message:String, … rest):void
{
logging.text += message + “\n”;
for(var i:uint = 0; i < rest.length; i++)
{
logging.text += rest[i] + “\n”;
}
}
log(“hello”, “spammed”, “world”);
[/cc]
The reference says about the rest parameter: specifies that a function will accept any number of comma delimited arguments. The list of arguments becomes an array that is available throughout the function body.
Now I just will wait till they will intoduce also the **kwds python equivalent parameter and I will an happy man! 🙂
Read more here