[MTASC] - la compilation libre.
Par Laurent Deketelaere le vendredi, janvier 27 2006, 16:34 - Flash plateforme - Lien permanent
MTASC == Motion-Twin ActionScript 2 Compiler;
Un an après la sortie de MTASC, je suis surpris du peu d'informations disponible en français sur le web à propos du compilateur ActionScript 2 open-source de Nicolas Cannasse. Je me permets donc de vous offrir un billet sur le sujet.
Historique
Décembre 2003, ASML == ActionScriptMetaLanguage;
Ce lançais avait le compilateur Flash
Ajoute le «Type Inference» à l'ActionScript 2.
Accélère la compilation.Avril 2004, Motion Types;
J'ai assez peut d'infos sur ce compilateur.Janvier 2005, MTASC 1.0;
Je passe le reste du billet à décrire MTASC.Novembre 2005, haXe;
C'est fin octobre que Nicolas nous annonce que MTASC n'irait pas plus loin que l'ActionScript2. Lors du Spark Europe, Nicolas nous a présenté son nouveau projet.
La réalisation d'un nouveau langage de programmation open-source pour le web.
Sous ce langage serrait regroupé la partie serveur et client, à partir de haXe on pourra créé des swf du javaScript et du Neko (nouveau langage serveur créé pour l'occasion). Un site est consacré au projet haXe - haXe.org.
Utilisation du compilateur MTASC
Par défaut MTASC s'utilise en ligne de commande, pour un usage basic seul cinq paramètres sont nécessaire.
Les paramètres de base
-swf fichier.swf
Cible sur le fichier swf que l'on veut en entrée, ce qui permet d'imputer du code dans un swf existant.-cp chemin
Ajoute le chemin d'un dossier comme «ClassPath» (Flash < préférences < ActionScript < Paramètres d'ActionScript < Chemin de Classes). Vous pouvez utiliser une série de -cp pour ajouter un série de dossiers.-main
Force l'appel de la fonction statique «main» dans toutes les classes enregistrée.-header width:height:fps:bgcolor
Si aucun swf n'est chargé en entrée (-swf fichier.swf), ces paramètres seront utilisé pour créer un nouveau swf. Le «bgcolor» est facultatif, c'est une valeur hexadécimal.-mx
Permet d'utiliser les classes précompilé de Flash (en cas d'utilisation des composants V2 de MM).
Les paramètres avancées
-version nombre
Défini la version du swf généré : 6 pour générer un swf compatible avec le Flash Player 6r89 ou 8 pour accéder au nouveautés de Flash 8.-v
Active le mode «verbose» (bavard) ce qui permet d'avoir des informations complémentaire dur le processus de compilation.-out fichier.swf
change le nom du fichier obtenu en sortie.-msvc
Emploie le formatage d'erreurs de Microsoft Visual Studio au lieu du modèle de Java (pour le le nom des fichiers et le nombre de lignes).-strict
Emploie le mode strict pour la compilation ce qui oblige d'avoir toutes les variables explicitement typé.-exclude chemin
Exclu la génération de code des classes contenu dans les dossiers imbriqué (un chemin par ligne).-trace fonction
Spécifie une fonction personnel pour la fonction trace, si le paramètre est vide toutes les fonctions trace sont neutralisé.-keep
Maintient les classes déjà présentent dans le swf utilisé en entré (il peut donc arriver d'avoir deux fois la même classe dans un swf).-frame image-clef
Défini l'image-clef où seront chargé les classes ActionScript.-pack chemin
Permet de définir un chemin de sortie, équivalent au chemin de sortie défini des paramètres de publication de l'IDE de Flash - non récurcif (exemple sous osX pour compiler dans le dossier /User/ali_o_kan/document/monProjet/sortie faite -cp /User/ali_o_kan/document/monProjet -pack monProjet/sortie).-group
Fusionne les classes dans un seul clip (permet de réduire le poids du swf mais peut poser problème si les paramètres -keep ou -mx sont utilisé).-wimp
Ajoute des messages d'erreur pour les import non utilisé dans les swf.-infer
Type automatiquement les variables locales, ce qui permet d'éviter des redondances(ex. var monOccurence:MaClasse = new MaClasse (); ).
Explication d'utilisation
Pour pouvoir compiler avec MTASC il faut, MTASC et une classe d'entrée. Pour installer MTASC suivez les liens( Linux, osX, Win ). Pour ce qui est de la classe d'entrée il s'agit d'une classe qui pocède une fonction statique «main». C'est par cette fonction que l'application sera lancé. Chose interressante à savoir, la fonction «main» pocède un argument, il s'agit du level0 du swf (le _root). Maintenant il ne vous reste plus qu'a publier avec MTASC et vous obtiendrez un joli swf en sortie, «elle est pas belle la vie?»
Exemple basic
Dans cette exemple aucun swf ne serra utilisé en entrée, uniquement une classe ActionScript2.
La classe d'exemple
class Exemple { static var app : Exemple; function Exemple( mc:MovieClip ) { // créé un TextField 'tf' de 800x600 en position 0,0 mc.createTextField("tf",0,0,0,800,600); // ecrit le text «Hello world !» dedans mc.tf.text = "Hello world !"; } // Point d'entrée static function main( mcRoot:MovieClip ) : Void { app = new Exemple( mcRoot ); } }
La ligne de commande
/opt/mtasc/mtasc -swf exemple.swf -main -header 800:600:30 Exemple.as
/opt/mtasc/mtasc -> cible le compilateur MTASC
-swf exemple.swf -> cible le swf utilisé en entré, comme inexistant dans l'exemple exemple.swf sera le nom du fichier en sortie.
-main -> Lance la fonction statique main de Exemple.as
-header 800:600:30 -> paramètres du fichier swf créé, 800px x 600px, 30fps.
Exemple.as -> utilise Exemple.as comme fichier d'initialisation, qui contient la fonction statique main.
Dans cette exemple aucun ciblage vers un chemin de classe (-cp) n'a du être fait, car l'objet TextField utilisé est un objet intrinsèque de Flash,
càd que sont code est contenu dans le Flash playeur.
Exemple d'utilisation d'un composant d'Adobe.
Avant de continuer, je vous conseil d'aller jetter un oeil au projet ActionStep.
Pour utiliser les composant V2 d'Adobe avec MTASC, il faut utiliser le parametre -mx.
- Pour commencer on écrit la classe Test qui utilise le composant Alert.
-
class Test { function Test() { mx.controls.Alert.show("Salut les gens!","titre"); } }
- Ensuite dans l'IDE de Flash créer un nouveau fla (test.fla).
- Placer sur la première image-clef le code suivant :
var t:Test = new Test();
- Placer le composant Alert dans la bibliothèque.
- Publier, le composant devrait apparaître dans le swf (test.swf).
- A partir de maintenant on peut fermer Flash, le swf contient tout ce dont on a besoin.
- Il reste plus qu'a modifier la classe Test.as à notre guise et de publier avec MTASC.
-
mtasc -main -mx -swf test.swf -out sortie.swf -cp "(le chemin de classe de Macromedia)" -cp Test.as
Petite remarque concernant le chemin de classe sous MacOsX, par défaut le chemin contient des espace dans le nom du dossier Flash : "/Applications/Macromedia Flash 8/First Run/Classes", ce qui entraîne l'erreur suivante : "(unknown) : type error class not found : Flash". erixtekila à donné une solution sur la ML d'osFlash cette semaine, il suffit de créer un lien symbolique UNIX («Alias») qui ne contient pas d'espace et qui renvoi directement sur le dossier mx. Enfin c'est la méthode élégante, il en existe une autre, qui conciste à copier le dossier mx pour ne plus avoir le «Macromedia Flash 8/First Run», à vous de voir
Exemple d'utilisation du parametre -trace.
Avec MTASC on peut utiliser des fonction trace personnalisée.
class Test { function Test() { TRACE("coucou, c'est moi!"); } }
Après compilation avec MTASC
mtasc -trace MaClasse.monTracePerso
MTASC remplace les trace() par la fonction MaClasse.monTracePerso.
MaClasse.monTracePerso("coucou, c'est moi!", "Test::test", "Test.as", 3 );
Comme on peut le voir MTASC ajoute 3 arguments :
- le nom de la classe suivit de la fonction
- Le nom du fichier
- le numéro de la ligne
Transformer les trace en Logger.LOG de pixLib
La plus part de mes ancien projet j'utilisais la fonction trace() pour déboguer, mais depuis quelques semaines j'utilise les logguer de pixLib, je viens donc monté une petite classe pour transformer les trace() en Logger.LOG
/** * @author [ali_o_kan] - Laurent Deketelaere */ import com.bourre.log.LogLevel; import com.bourre.log.LogChannel; class LOG2MTASC extends com.bourre.log.Logger { public static var traceChannel : LogChannel = new LogChannel("TRACE"); /* * @param o contenu du trace() * @param sFunction nom de la classe et de la methode d'où est appelé le trace() * @param sFile nom du fichier * @param nLine numéro de la ligne */ public static function LOG( o, sFunction:String, sFile:String, nLine:Number ) : Void { var oTrace = {_trace:o, _fonction:sFunction, _fichier:sFile, _ligne:nLine}; getInstance().log( oTrace, LogLevel.DEBUG, traceChannel ); } }
Utilisation
/** * @author [ali_o_kan] - Laurent Deketelaere */ import com.bourre.utils.LuminicTracer; import com.bourre.log.Logger; class Main { static var app : Main; function Main() { Logger.getInstance().addLogListener( LuminicTracer.getInstance(), LOG2MTASC.traceChannel ); boucle(); } public static function main() : Void { app = new Main(); } function boucle() : Void { for(var i:Number = 0; i<15; i++) { trace("une boucle"+i); } } }
MTASC
/opt/mtasc/mtasc -header 800:600:25 -main -swf test_trace.swf -trace LOG2MTASC.LOG -cp /Users/ali_o_kan/Documents/eclipse/tester/pixLib -cp /Users/ali_o_kan/Documents/eclipse/pixLib/src Main
Sortie
Je retrouve dans le FlashInspector mes trace qui renvoit un objet contenant :
{ _trace: une boucle0, _function: Main::boucle, _fichier: Users/ali_o_kan/Documents/eclipse/tester/src/Main.as _ligne: 27 }
-trace no
Pour finir avec l'argument -trace, lorsque le débogue est fini, il suffit de faire:
/opt/mtasc/mtasc -header 800:600:25 -main -swf test_trace.swf -trace no -cp /Users/ali_o_kan/Documents/eclipse/tester/pixLib -cp /Users/ali_o_kan/Documents/eclipse/pixLib/src Main
Comparaison avec le compilateur de Macromedia (Adobe).
Plus rapide,
il faut 3 à 4 secondes à MTASC pour compiler 300 classes, ce qui met entre 20 à 30 secondes avec le compilateur de MM.Moins cher,
MTASC est gratuit et open-source, ce qui fait qu'on est certains que son amélioration ne serra jamais stoppé.Gestion du scoppage des variables local,
function f() { var x = 1; if( true ) { var x = "hello"; // ... } trace(x+1); }
Sortie MM : hello1, Sortie MTASC : type error Local variable redefinition : x, MTASC interdit la redéfinition de variable local pour éviter tous problèmes au niveau du typage.
function f() { { var x : Number = 1; // ... ici x est un nombre } // ici aucun accès à x { var x : String = "hello"; // ... ici x est une chaine } // ici aucun accès à x }
#include,
n'est plus géré car devenu obsolète avec l'ActionScript 2.Fonctions local,
alors que le compilateur Macromedia accèpte les fonctions nommé,function f(x) { function g(y) { return x+y; } }
MTASC autorise que la définition de fonctions local anonyme.
function f(x) { var g:Function = function(y) { trace(x+y); } }
Typage strict des Tableaux,
permet de typé les données contenu dans un Array.var tmp = new Array(); var a : /*Number*/ Array = tmp;
Typage local des variable inférence (-infer),
var x : String = "hello"; var x : Number = Math.cos(Math.PI); var x : MyClass = new MyClass();
var x = "hello"; var x = Math.cos(Math.PI); var x = new MyClass();
- Changements mineurs,
- arguments est supporté, mais pas via des appel dynamique (par exemple eval('arguments"); ).
- Le retour variables getter doit être le même que celui des setter et doit être spécifié.
- Les fonctions sans retour sont automatiquement typé en Void.
- eval("this") n'est pas effectué.
Je terminerai en disant merci à Nicolas, qui nous offre un compilateur digne du nom.
infos +
- ncannasse.free.fr, blog de Nicolas Cannasse.
- mtasc.org, site officiel de MTASC.
- haxe.org, site officiel de haXe.
- Hacking Mtasc, ajouter des fonctions à MTASC.
- MTASC + swfmill, comment gèrer ses bibliothèques avec MTASC.
- SOSTracer de LAlex, une classe libre de toute librairies pour logguer.
- Tableaux typés, comment utiliser le typage des Arrays.
- opinionz.be, MTASC + Eclipse sous Linux.
- flashdevelop.org, utiliser MTASC et SWFMILL de manière transparente (win only).
- Animatlantique, une bonne introduction, pour ceux qui on pas compris ce que j'ai marqué plus haut.
Commentaires
On peut citer aussi l'éditeur FlashDevelop (Windows) qui permet d'utiliser de MTASC et SWFMILL de manière transparente.
Hello
tu as testé sur les dernières version de MTASC le TRACE en majuscule ? car chez moi cela marche pas Faut écrire trace en minuscule si possible Ou alors j'ai raté un truc ?
Sinon moi je dirais que le gros manque actuellement c'est le #include ... cela éviterai pas mal de problème de l'avoir dans MTASC ^_^ Ou alors une possibilité d'injecter dans le swf avant les classe un code directement sur la timeLine du scénario principal pour traficotter certains objets natifs.
Sinon manque dans ton article à mon avis les tutos de mediabox et comme le dit Phillipe au dessus les éditeurs comme SEPY , FlashDevelop etc. qui permettent de l'utiliser sans Eclipse
EKA+
Oui, il faut écrire "trace" sans majuscule depuis qq versions.
Ce qui est géniale quand on reprends un ancien projet.
Pour ce qui est de MTASC dans Eclipse, un billet est prévu sur son utilisation avec FDT.
Sinon n'hésitez pas à laisser les URL d'articles intéressants en commentaires.
sympa ton article. je tai envoye un message sur motion-twin. lunivers mtasc avance jour a jour, ya toujours pleins de nouveauté, si tu veux je peux tenvoyer quelques liens.
Toujours preneur de nouveaux liens. Sinon je n'ai rien reçu sur Motion Types, tu as utilisé quoi comme moyen ?
Hello !
Très bon ton billet, bien mieux que le mien
J'ai trackbacké ton billet sur mon blog et arf en le repinguant il s'est dupliqué 3 fois, super désolé ! N'hésite pas à n'en garder qu'un !!
Par rapport au trace, je signale que si on utilise FAME(S) on peut utiliser le trace de flashout en ajoutant comme paramètre à MTASC : -trace Flashout.traceReplacer
Ensuite il faut "l'initialiser" en appelant au moins une fois (le mieux est au début genre dans le Main statique) : trace(Flashout.INFO + "Welcome !");
Salut jide,
J'ai fait le tri dans les trackback, pour une fois que c'est pas moi qui ping 3x le blog d'un autre