Accueil🇫🇷Chercher

Opa (logiciel)

Opa est un langage de programmation d'applications et services web utilisable sous licence Affero GPL ou sous licence privée.

Opa
Logo.
Date de première version 2010 (Première citation), 2011 (Release open source)
Paradigme multiparadigme : impérative, fonctionnelle
Auteur MLstate
Dernière version 1.1.1 ()
Typage Fort, statique
Influencé par OCaml
Système d'exploitation Linux, MacOSX, Windows
Licence Affero GPL
Site web opalang.org

Philosophie

Opa est une technologie de développement d’applications Web distribuées. C’est un nouveau langage de programmation fortement couplé à une bibliothèque Web standard qui remplit toutes les fonctions : de serveur d’applications Web, à serveur de base de données.

En un mot, Opa ne dépend pas des piles serveurs actuelles, comme Apache plus PHP plus MySQL plus Symfony. Un code source Opa est compilé en un binaire autonome du service, qui se contente d’une distribution GNU/Linux nue (même MiniLinux) pour l’exécution.

Opa est spécialement conçu pour le Web et spécifie l’ensemble des aspects de l’application :

  • le code client comme le code serveur sont Ă©crits en Opa : le compilateur dĂ©termine automatiquement les parties client et serveur (des annotations existent pour lui forcer la main), traduit le code client en JavaScript et automatise les Ă©changes entre client et serveur ;
  • la structure de la base de donnĂ©es et les requĂŞtes sont Ă©galement Ă©crites en Opa : lĂ  aussi, le compilateur analyse les requĂŞtes pendant la compilation et gĂ©nère le code d’accès aux donnĂ©es.

Exemple de code

L'exemple ci-dessous est le code complet d'un webchat minimal en Opa.

/**
 * Le type des messages échangés sur la chatroom
 */
type message = 
  { author: string // Le nom de l'auteur
  ; text: string }   // Le texte du message
/**
 * Le principal "objet" : la room des messages
 */
@publish room = Network.cloud("room"): Network.network(message)
/**
 * Mise à jour de l'interface d'un utilisateur lors de l'arrivée d'un nouveau message
 *
 * @param x Le message
 */
user_update(x: message) =
  line = <div class="line">
            <div class="user">{x.author}:</div>
            <div class="message">{x.text}</div>
         </div>
  do Dom.transform([#conversation +<- line ])
  Dom.scroll_to_bottom(#conversation)
/**
 * Broadcast un message sur la room
 *
 * Lit le contenu de [#entry], envoie le message Ă  [room] puis efface [#entry].
 *
 * @param author
 */
broadcast(author) =
   do Network.broadcast({~author text=Dom.get_value(#entry)}, room)
   Dom.clear_value(#entry)
/**
 * Construit l'interface client
 *
 * Choisit aléatoirement un nom d'auteur qui sera utilisé dans le chat
 *
 * @return L'interface utilisateur, envoyée par le serveur lors de la connexion d'un client.
 */
start() =
   author = Random.string(8)
   <div id=#header><div id=#logo></div></div>
   <div id=#conversation onready={_ -> Network.add_callback(user_update, room)}></div>
   <div id=#footer>
        <input id=#entry  onnewline={_ -> broadcast(author)}/>
        <div class="button" onclick={_ -> broadcast(author)}>Post</div>
   </div>
/**
 * Programme principal
 *
 * Construit une application "Chat" (sera Ă©galement le titre de la page),
 * inclut statiquement le répertoire "resources" qui contient CSS et images du style
 * et appelle la fonction [start] définie précédemment dès qu'un client se connecte.
 */
server = Server.one_page_bundle("Chat",
       [@static_resource_directory("resources")],
       ["resources/css.css"], start)

Liens externes

Cet article est issu de wikipedia. Text licence: CC BY-SA 4.0, Des conditions supplémentaires peuvent s’appliquer aux fichiers multimédias.