IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Projets Discussion :

Extended Hypertext Preprocessor


Sujet :

Projets

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Février 2008
    Messages : 95
    Points : 74
    Points
    74
    Par défaut Extended Hypertext Preprocessor
    Bonjour.

    Travaillant actuellement sur un projet décrit ci-dessous, je crée ce sujet pour savoir plusieurs choses.

    1. Tout d'abord qu'en pensez vous de ce projet ? L'idée est-elle intéressante ? Utile ? Allez-vous essayer d'utiliser les fruits de ce projet s'il aboutit un jour ?
    2. Est-ce qu'il existe déjà des projets similaires ?
    3. Souhaitez-vous éventuellement collaborer pour ce projet ?

    Description générale du projet

    Extended Hypertext Preprocessor (EHP) vise à combler un certain nombre de lacunes du PHP, en fournissant un langage avec une syntaxe plus proche du C# ou du Java. Les fichiers écrits dans ce langage peuvent être ensuite transformés en PHP natif pour être déployés sur tout serveur supportant PHP.

    Malgré un certain nombre d'avantages, PHP possède de grands inconvénients rendant son utilisation difficile, souvent énervante.

    1. Les noms des fonctions natives de PHP n'ont aucune consistance : (needle, haystack) ou (haystack, needle), ou some_function(), ou function_some(), ou someFunction(), et sont pour certains mal "decouvrables" (par exemple PHP_EOL ou DIRECTORY_SEPARATOR, qu'il est indispensable d'utiliser à la place de "[\r]\n" ou de "\" ou "/" pour tout projet sérieux, mais que peu de gens utilisent, car ne savent pas que ça existe).
    2. PHP ne permet pas de typage strict pour un certain nombre de types.
    3. PHP n'est pas réellement orienté objet.
    4. PHP n'encourage ni oblige la séparation entre business logic et HTML.
    5. Les fichiers PHP sont fournis en clair. Les produits permettant d'obscurcir (traduction libre d'obfuscate) le code sont soit de très mauvaise qualité, soit très chers.
    6. PHP force d'écrire des choses inutiles. Exemple : le mot "function" pour designer une méthode dans une classe.

    En revanche, il y a des hypothèses où le site final doit tourner avec PHP (à commencer par le "parce que le client le veut").

    Le projet EHP tente de résoudre ces difficultés en apportant une syntaxe différente. Dans l'ordre :

    1. Les noms des méthodes natives de EHP correspondent à des spécifications clairement déterminées. Pour l'instant, je me suis inspiré du .NET Framework (exemple : String.Replace(inWhat, what, byWhat)), mais d'autres standards peuvent être posés, pourvu que l'ensemble soit cohérent.
    2. EHP permet le typage fort des arguments. [Le typage des variables est en cours de réflexion].
    3. [L'ajout des formes d'OOP sont en cours de réflexion.]
    4. Les fichiers EHP ne peuvent contenir que du code. Il est nettement plus difficile (mais possible) de mélanger EHP et HTML que de passer par des templates.
    5. Le code PHP natif produit à partir de PHP peut être obscurci si besoin, avec refractoring des noms des variables/méthodes, suppression basique de whitespace et des commentaires, inlining des méthodes si ceci optimise/accélère le code, etc. Un certain nombre d'optimisations est d'ailleurs faite, comme par exemple la possibilité de joindre plusieurs fichiers pour ne former qu'un seul (par exemple chaque page du site utilise forcement vingt classes. Pour la clarté du code, chaque classe va se situer forcement dans un fichier EHP propre, mais les vingt fichiers vont former un seul fichier PHP natif).
    6. EHP permet de ne pas spécifier les choses suffisamment explicites.

    Exemple : le code PHP suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    public function GetHello($name)
     {
      $a = 'Hello ' . $name . '!';
      return str_replace('e', '', $a);
     }
    
    echo GetHello('My name here');
    ?>
    peut être écrit en EHP ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    namespace MyCompany.MyGreatApplication
    {
      // Here my great application classes.
      public partial static class MyBusiness
      {
        // Gets hello string for a user name.
        public string GetHello(string $name)
        {
          $a = String.Concat('Hello ', $name, '!');
          return String.Replace($a, 'e', String.Empty);
        }
      }
    
      // Main class.
      public static class WebApplication
      {
        // Main entry point, called to generate page contents.
        public void GetResponse()
        {
          WebOutput.Write(MyBusiness.GetHello('My name here'));
        }
      }
    }
    et sera transformé en PHP natif (pas destiné à être lu) en mode debug sans inline sous une forme similaire à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
    require_once('ehp/extensibility.php');
    
    static class MyCompany_MyGreatApplication_a
    {
      public function a($a)
      {
        if (!is_string($a)) throw new ArgumentException('source/demo.ehp', 7, 'MyCompany.MyGreatApplication.MyBusiness.GetHello', 'The argument "name" of method GetHello expects string, current type is ' . gettype($a));
        $b = 'Hello ' . $name . '!';
        $c = str_replace('e', '', $b);
        if (!is_null($c) && !is_string($c)) throw new Exception('source/demo.ehp', 10, 'MyCompany.MyGreatApplication.MyBusiness.GetHello', 'The method "GetHello" must return string.');
        return $c;
      }
    }
    
    static class mep
    {
      public function _mep()
      {
        $a = MyCompany_MyGreatApplication_a::a('My name here');
        if (!is_object($a) || method_exists($a, '__toString'))
        {
          print_r((string)$a);
        }
        else
        {
          throw new ArgumentException('source/demo.ehp', 20, 'MyCompany.MyGreatApplication.WebApplication.GetResponse', 'The argument "text" of method Write expects object convertissable to string. Implement ToString() method in the object passed as argument.');
        }
      }
    }
    
    mep::_mep();
    ?>
    ou bien en release sans inline sous une forme plus compacte (pour les plus maso), réduisant, si besoin, les messages des exceptions afin d'obscurcir/racourcir davantage le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php require_once('ehp/extensibility.php');static class MyCompany_MyGreatApplication_a{public function a($a){if(!is_string($a))throw new ArgumentException('source/demo.ehp',7,null,'The argument expects string, current type is '.gettype($a));$b='Hello '.$name.'!';$c=str_replace('e','',$b);if(!is_null($c)&&!is_string($c))throw new  Exception('source/demo.ehp', 10, null, 'The method must return string.');return $c;}}static class mep{public function _mep(){$a = MyCompany_MyGreatApplication_a::a('My name here');if(!is_object($a)||method_exists($a,'__toString')){print_r((string)$a);}else{throw new ArgumentException('source/demo.ehp', 20, null, 'The argument expects object convertissable to string.  Implement ToString() method in the object passed as argument.');}}}mep::_mep(); ?>
    À noter une particularité. L'utilisation d'EHP tend à n'enlever aucune fonctionnalité du PHP natif. Par exemple, si dans un contexte précis le typage strict est inadapté, il est toujours possible de déclarer un type comme étant dynamique (l'analogue de dynamic en .NET 4.0). Un autre exemple, le "debogage" avec les __FILE__ et __LINE__ ne doit pas poser problème, vu que EHP introduit __SOURCEFILE__, __SOURCELINE__ etc. qui seront convertis automatiquement en chaines de caractères ou nombres correspondants au nom du fichier ou le numéro de la ligne lors de la transformation en PHP natif.

    Le code est certainement plus long (à la fois le code EHP et le code PHP natif produit).

    Composition du projet

    Compte tenu des travaux actuels, je comptais aboutir à une composition tripartite suivante.

    • Un convertisseur de code EHP vers du PHP natif, c'est-à-dire un exécutable permettant, à partir d'un ou plusieurs fichiers EHP, former un fichier de code brut. [Partiellement fait]
    • Une intégration dans Visual Studio. [Bloqué au tout début]
    • Une bibliothèque d'extensibilité pour PHP, comportant des méthodes qui n'existent pas en PHP (comme String.IsNullOrEmpty) ou des différentes choses (comme ArgumentException).

    Alternatives au projet

    Il y avait un certain nombre d'alternatives que j'ai décidé d'écarter.

    1. Le fait de créer plusieurs assemblies .NET reprenant les fonctions natives de PHP à la manière du .NET (exemple : File.ReadAllText comme alias de file_get_contents), mais juste les noms, sans écrire de code à l'intérieur. Ensuite, tout sera écrit en C#/VB.NET sur la base de ces assemblies, puis converti en PHP natif. Cette solution me parait particulièrement tordue, et ne permettra pas de bénéficier de tous les avantages de la syntaxe de PHP.
    2. Le fait d'avoir un framework pur PHP reprenant les fonctions natives de PHP à la manière du .NET. L'inconvénient, c'est que ceci ne résout pas tous les problèmes, mais uniquement celui de la consistance des noms des méthodes.

    Conclusion

    Il s'agit donc à travers ce projet de créer "quelque chose" permettant (du moins c'était l'idée d'origine) d'écrire un code syntaxiquement plus proche à C#/Java.
    En revanche, travaillant seul sur le projet, j'ai l'inconvénient de ne pas avoir de points de vue d'autres développeurs, ni de pouvoir accomplir le projet rapidement.
    C'est pour ces deux raisons que j'expose ce projet ici, voulant savoir ce que vous en pensez.

    Merci à tous les courageux qui ont lu.

  2. #2
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Passé ma première réaction "Quoi, encore un langage ?", j'avoue que le projet est intéressant. J'avais d'ailleurs il y a quelques temps proposé un truc un peu similaire pour le javascript (voir ici ). Ce n'est pas tout à fait la même chose, mais la finalité est la même: pouvoir vérifier la syntaxe des langages interprétés plutôt que d'attendre que ça plante en production.

    Quelques questions:

    - Est-ce que c'est envisageable d'avoir un convertisseur dans l'autre sens (PHP -> EHP) ? L'intérêt serait de reprendre les projets existants.

    - Plus tordu (et peut-être complètement idiot, je ne connais pratiquement pas l'asp): suppose que le client demande de l'ASP, est-il envisageable de faire un convertisseur EHP -> ASP ? L'idée serait bien sûr d'avoir un langage unique pour écrire n'importe quel site, sans se préoccuper de la plate-forme, de la version, tous ces paramètres étant gérés par le convertisseur.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Février 2008
    Messages : 95
    Points : 74
    Points
    74
    Par défaut
    Citation Envoyé par 10_GOTO_10 Voir le message
    Passé ma première réaction "Quoi, encore un langage ?", j'avoue que le projet est intéressant. J'avais d'ailleurs il y a quelques temps proposé un truc un peu similaire pour le javascript (voir ici ). Ce n'est pas tout à fait la même chose, mais la finalité est la même: pouvoir vérifier la syntaxe des langages interprétés plutôt que d'attendre que ça plante en production.
    Je vois l'idée, oui.

    Est-ce que c'est envisageable d'avoir un convertisseur dans l'autre sens (PHP -> EHP) ? L'intérêt serait de reprendre les projets existants.
    Je n'ai jamais envisagé jusqu'à présent un tel convertisseur. Personnellement, je reprend rarement les projets existants en entier, mais uniquement des parties de code, qui sont pour la plupart écrites de telle façon qu'il est très facile de les convertir à la main (pas de code HTML au sein des fichiers PHP par exemple).
    Après, je comprend très bien le besoin. À l'heure actuelle, je n'arrive pas vraiment à savoir si c'est faisable et si oui, est-ce qu'il y a des difficultés particulières. Je peux en imaginer deux.

    • La première, c'est que EHP étant plus strict dans sa syntaxe et autres, le fait de convertir du PHP mal écrit peut ne pas être aisé, voire échouer en aboutissant à un code avec un résultat différent.
    • Aussi, il ne s'agit pas toujours du rapport 1:1 pour un certain nombre de choses. Par exemple, String.IsNullOrEmpty de EHP n'a pas d'analogue en PHP pur, par conséquent, un convertisseur inverse ne pourra pas savoir qu'à un moment donné, il faut mettre cette méthode-là.
    • Et enfin, PHP a des choses qui rendent son interprétation et sa conversion très difficile. Il s'agit par exemple des noms dynamiques de variables ($$varName) ou encore d'eval(), qui, lui, va d'ailleurs poser pas mal de problèmes dans un autre sens aussi.

    Plus tordu (et peut-être complètement idiot, je ne connais pratiquement pas l'asp): suppose que le client demande de l'ASP, est-il envisageable de faire un convertisseur EHP -> ASP ? L'idée serait bien sûr d'avoir un langage unique pour écrire n'importe quel site, sans se préoccuper de la plate-forme, de la version, tous ces paramètres étant gérés par le convertisseur.
    Je ne connais pas davantage ASP. Pour ce qui est du ASP.NET en tout cas (ou pourquoi pas donc du Java), un tel convertisseur double me semble impossible.

    Les langages sont juste trop différents, avec des approches différentes. Grosso modo, ça revient à ce que j'ai dit au sujet de la première alternative du projet : en rapprochant davantage EHP vers ASP.NET, on va perdre inévitablement les points forts du PHP.

    Par ailleurs, non seulement EHP reprend en substance PHP, mais il permet d'écrire la plupart du temps du code PHP. Par exemple si EHP propose la syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($arrayItem in $array)
    {
    }
    il n'interdit pas moins d'utiliser la syntaxe de PHP natif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($array as $arrayKey => $arrayItem)
    {
    }
    et donc de bénéficier à ce titre d'accès à la clé au sein de la boucle, ce que C# ne permet pas. Imaginons maintenant qu'il faut convertir le deuxième exemple en ASP.NET. Le convertisseur doit donc transformer le foreach en for ? Mais dans ce cas, il change inévitablement le sens de code si par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $array = array(1 => 'Hello', 'myKeyHere' => 'World');
    Il faut donc passer par Dictionary<string, string>, ce qui nécessite un travail laborieux, et des casts dans tous les sens (string -> uint) sur les clés des entités de la liste.
    En passant, à noter que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $array = array(1 => 'Hello', '1' => 'World', 'myKeyHere' => '!');
    affiche "2", et non "3", ce qui permet justement de passer par un dictionnaire avec des clés sous forme de chaines de caractères. À noter aussi que si la clé est un objet qui contient ou ne contient pas de méthode __toString(), PHP va automatiquement assigner un entier spécifique.

Discussions similaires

  1. [FLASH 5] Comment créer un lien hypertexte
    Par ajit dans le forum Flash
    Réponses: 4
    Dernier message: 30/03/2006, 12h26
  2. [Lien hypertexte]Mettre un lien dans un JTextPane
    Par Pill_S dans le forum Composants
    Réponses: 8
    Dernier message: 23/05/2004, 19h20
  3. Problème lors du EXTEND d'un tableau
    Par banana31 dans le forum Oracle
    Réponses: 14
    Dernier message: 10/02/2004, 10h58
  4. lien hypertexte dans une anim flash
    Par vedder dans le forum Flash
    Réponses: 17
    Dernier message: 14/01/2004, 14h11
  5. Liens Hypertexte simple comme en HTML ?!
    Par oazar dans le forum Flash
    Réponses: 3
    Dernier message: 17/10/2003, 00h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo