Microsoft ouvre son langage P

Par:
fredericmazue

mer, 12/10/2016 - 11:57

P est un langage de programmation maison de Microsoft. Ce langage est dédié à la programmation asynchrone pilotée par événements.

Microsoft a utilisé le langage P pour coder la pile du pilote USB pour Windows 8 et Windows Phone et souligne être parvenue à un résultat meilleur que ce qui avait été fait précédemment sans P.

P peut trouver des applications dans les applications réseaux, embarquées ou distribuées.

Un programme P modélise des machines à états qui communiquent entre elles par messages. Chaque machine à états a sa queue d'entrée, ses états de transitions, ses gestionnaires d'évènements et un espace local pour le stockage de variables. Les machines à états du programme tournent de manière concurrente. Chacune exécute une boucle d'évènements qui retire les messages de sa queue d'entrée et les traite. Le traitement peut consister en la modification de variables dans l'espace local, l'envoi de messages à d'autres machines, ou la création de nouvelles machines. L'envoi d'un message d'une machine vers une autre est non bloquant, le message étant simplement placé dans la queue de la machine destinataire.

Microsoft vient d'ouvrir le langage et l'a placé sur GitHub. Le langage est multi plates-formes, dans le sens où il s'appuie sur la plate-forme .NET elle-même multi plates-formes désormais.

Sur GitHub on trouvera un manuel de programmation qui dans son introduction, donne le code d'un programme 'Ping-pong' pour satisfaire les curiosités impatientes :-)

// PingPong.p
event PING assert 1: machine;
event PONG assert 1;
event SUCCESS;

main machine Client {
  var server: machine;

  start state Init {
    entry {
      server = new Server();
      raise SUCCESS;
    }
    on SUCCESS goto SendPing;
  } 

  state SendPing {
    entry {
      send server, PING, this;
      raise SUCCESS;
    }
    on SUCCESS goto WaitPong;
  }

  state WaitPong {
    on PONG goto SendPing;
  }
}

machine Server {
    start state WaitPing {
      on PING goto SendPong;
    }

    state SendPong {
      entry (payload: machine) {
        send payload, PONG;
        raise SUCCESS;
      }
      on SUCCESS goto WaitPing;
   }
}