50 votes

Quelle est la méthode préférée pour exécuter l'application Web Lisp?

En tant que développeur PHP, j'ai été à la recherche pour plus de puissance de langue pour notre prochain projet. Et donc s'intéresse au Lisp.

Maintenant, je trouve que, contrairement à PHP, la plupart des compilateurs Lisp avez à courir à côté de du serveur web en tant que service. Mais Reddit expérience dit qu'ils avaient toujours surveiller le service à partir de la plante. En PHP, nous n'avons jamais eu à prendre soin de cette chose. L'autre solution pourrait être d'utiliser Lisp comme CGI. Mais alors que nous sommes en voyage territoire inconnu, et je ne suis pas sûr si c'est même préféré ou quelqu'un l'a essayé.

D'autres ont proposé d'utiliser Clojure. Un excellent choix qui apporte dans toutes les bibliothèques Java. Mais le problème c'est que c'est Lisp-1, et pas Lisp-2. La seule raison pour laquelle nous essayons d'utiliser Lisp est en raison de son puissant multi paradigme de codage de la langue où l'on commence à ressentir les bienfaits que le logiciel devient de plus en plus complexe. Je ne suis pas sûr de savoir comment une grande partie de cette prestation sera sacrifié par commutation de Régime au lieu de Common Lisp.

Quelqu'un a même mentionné ici dans stackoverflow que la différence entre le Régime et le Lisp est comme Java et C++. Pour un lisper Java et en C++ sont presque les mêmes.

Maintenant, revenons à ma question/

  1. Qu'est-ce que le moderne, le moyen privilégié pour développer Lisp application et la déployer?
  2. Qui compilateur Lisp utilisez-vous pour les applications web?

58voto

vsedach Points 977

J'ai écrit plusieurs applications web en Common Lisp, dont l'un est actuellement en déploiement et de faire de l'argent (une compagnie charter système de réservation qui étonnamment n'a rien à voir avec ITA), et d'autres qui sont encore en cours de développement (financier du système de modélisation pour les grands projets pétroliers - j'ai laissé, mais ils ont signé avec un éminent VC entreprise il y a quelques mois, à une nouvelle génération de négociation/de TA plate-forme pour les contrats à terme et des produits de base - mon projet en cours) ou ont été mis en veilleuse, mais sont de bonne idées d'entreprise (web "reverse proxy" pour les annonceurs et les visser sur les solutions de fixation des applications web que vous ne pouvez pas fixer n'importe quel autre moyen, je suis toujours intéressé à l'élaboration de cette).

Résultat: j'ai une certaine expérience dans le déploiement de Lisp web apps, cependant, comme vous pouvez le voir, il est fortement biaisée en faveur de la haute performance des applications Intranet avec pas que beaucoup d'utilisateurs, et en particulier la nécessité de rendre le navigateur web de l'expérience de se sentir aussi sensible comme une application de bureau. Si mon projet actuel se passe selon le plan, je devrais avoir l'occasion de tester mon approche sur un site web public.

Voici comment j'ai configuré Lisp applications web:

Tout (y compris le contenu statique (images) est servi directement à partir de Hunchentoot en cours d'exécution sur SBCL sur Linux. Hunchentoot utilise un thread par modèle de requête, ce qui est exactement ce que mes applications web besoin. SBCL sur Linux utilise NPTL, qui, selon certains tests de fait thread-par-requête plus vite que futzing avec NIO. Je n'ai pas fait mes propres repères, mais je ne suis pas inquiet à propos de Hunchentoot garder comme un serveur web.

Je commence SBCL à l'intérieur de GNU écran à l'aide de setuidgid à exécuter en vertu d'un verrouillée, compte non privilégié et d'avoir encore accès à la REPL pour la mise à niveau du système sans les interruptions de service.

Tout le HTML de la génération se fait par CL-QUI. J'ai ma propre Lisp-à-compilateur JavaScript appelé Parenscript. Sur les champs pétroliers projet de modélisation, nous avons évalué à peu près tout pour l'écriture d'applications web et s'installe sur faire notre propre en adoptant Parenscript de ses précédents responsables. L'écriture d'applications web qui fonctionnent comme des applications de bureau est difficile - la différence entre quelque chose qui se sent "natif" et quelque chose qui est inutilisable indésirable est généralement un couple de lignes de code. Trouver le bon couple de lignes sans être capable de générer et de instrument de code JS dans une façon intelligente est une tâche immense.

Pour le stockage j'utilise le CLSQL de la bibliothèque. Il a vraiment une dingo de la syntaxe pour l'écriture de la première classe de requêtes SQL (ie - objets réels et non pas seulement des chaînes de caractères) en Lisp, mais après utilisation, je pense que c'est plus d'ennuis que cela vaut la peine. Pour la réservation de projet, j'ai écrit un certain nombre de macros qui a eu une entreprise description de l'objet et SQL généré des schémas (vraiment simple à l'aide de types SQL sans aucune sorte de Lisp encodage ou des métadonnées), des fonctions pour produire des formulaires HTML pour la saisie et l'édition de ces objets, et après des gestionnaires pour la manipulation et la vérification de ces soumissions de formulaire tout en traitant avec de multiples soumettre et CSRF questions. Qui s'est avéré vraiment RESTy.

Celui qui prétend que cette configuration n'est pas fiable a de graves problèmes avec leurs serveurs. Le système de réservation que j'ai conçu a été exécuté pendant plus d'un an avec le seul temps d'arrêt due à une défaillance du matériel.

Belles choses que j'ai fait facilement avec cette approche:

  • Comète (il suffit de demander Hunchentoot pour le ruisseau et continuer à écrire)
  • Au moment de la compilation intra-lien demande de vérification (voir mon billet de blog)
  • Portable de profilage pour l'ensemble de votre code JS
  • Générer des versions spécifiques à un navigateur JS et ressources de contenu sont parfaitement mis en cache

Je n'aime pas les cadres, préférant l'Unix idéal de mettre ensemble orthogonal outils, donc je ne peux pas vraiment recommander UCW ou Webactions.

J'utilise CL-QUI parce que la plupart du HTML dans les applications est générée. Si vous avez un document orienté web app et quelqu'un pour HTML et CSS, vous voudrez probablement une sorte de système de template.

Une chose que vous devez regarder dehors pour lorsque le déploiement est la question que Brian Carpes mentionné avec les Vps. Le principal coupable semble être Virtuozzo - leur système de mémoire virtuelle ne peut pas gérer overcommitment sur tout, mais les instances de l'hôte. SBCL fait cela, mais d'autres implémentations différentes de la mémoire de stratégies de gestion n'aurez pas ce problème. Pour information, le système de réservation est effectivement déployées sur l'hôte VZ instances.

13voto

Brian Carper Points 40078

Je suis à l'aide de Common Lisp (SBCL) pour un petit site que j'ai conçu, à l'aide de Hunchentoot. Hunchentoot peut l'écouter sur le port 80 ou vous pouvez utiliser Apache mod_proxy comme un frontend pour Hunchentoot s'exécutant sur un autre port. Pour garder Lisp cours d'exécution en arrière-plan vous pouvez utiliser GNU écran ou quelque chose comme detachtty qui est similaire mais plus léger. Probablement vous aurez le plaisir d'écrire vos propres scripts de démarrage de votre serveur au moment du démarrage, et d'autres de telles subtilités.

Common Lisp est à montrer son âge et vous ferez face à des difficultés à l'utiliser. En revanche Clojure est très nouveau et pas stable ou mature que les autres langues. Dur choix. J'ai l'intention de passer à Clojure en partie parce que Common Lisp n'est pas une joie pour déployer et en partie à cause de la façon dont beaucoup de joie Clojure a été pour moi de l'utiliser jusqu'à présent. M'a fallu un temps assez long, même pour aller SBCL en cours d'exécution sur un serveur VPS, jamais l'esprit les bibliothèques. Clojure va exécuter n'importe où à la JVM s'exécute. Mais votre kilométrage peut varier.

Un site web prend une requête et retourne un peu de texte pour l'affichage dans un navigateur. Alternativement, il peut accéder à certaines ressources partagées côté serveur dans une multithread. C'est le genre de chose Clojure a été conçue pour, à mon avis. Il y a quelques bons frameworks web pour Clojure (par exemple Compojure). Clojure est pas Régime par un long shot. Très différentes philosophies de conception.

J'ai essayé et échoué à obtenir Hunchentoot de travailler avec FastCGI. Je pense que Lisp CGI va être douloureux. Mais encore une fois, votre kilométrage peut varier.

9voto

Ken Points 1877

Ce fil suggère que l'exécution de votre application à l'intérieur de GNU écran est un moyen populaire. Mais il y a de nombreuses approches différentes. Je pense que la plupart des Lisp web des bibliothèques sont eux-mêmes des serveurs web, de sorte que vous n'avez pas besoin d'un "serveur web" sauf (ou avant) il offre quelque chose dont vous avez besoin.

Si Clojure répond à vos besoins, puis aller de l'avant et de l'utiliser. (Je n'ai jamais utilisé parce qu'il n'a pas rencontré le mien, mais les vôtres sont bien évidemment différents.) C'est pas Régime, et je ne suis pas sûr de ce que les problèmes spécifiques d'un Lisp-1 a, donc je ne sais pas quels sont les problèmes que vous êtes l'anticipation. Mon impression a été qu'un Lisp-1 est plus simple, mais un Lisp-2 rend plus facile pour les rédacteurs du compilateur pour générer du code plus efficace. Je doute que mon code s'appuie sur CL d'être un Lisp-2, à l'exception de besoin FUNCALL et à APPLIQUER.

Je suis l'aide de SBCL, mais puisque c'est de Common Lisp, tout CL compilateur de travail. Parfois je l'ai utilisé CLISP dans les tests.

3voto

JasonFruit Points 3709

À l'aide de Hunchentoot avec ou sans Apache, comme suggéré par Brian C., est probablement votre meilleure approche si vous faites quelque chose de complexe. Il est vraiment facile à faire CGI avec Common Lisp, mais, surtout avec CLISP, et il y a plusieurs bibliothèques qui pourront vous aider. Un exemple est lisp-cgi-utils, et il en existe d'autres, qui sont de fantaisie, mais qui sont toutes aussi efficaces. Mon hébergeur n'autorise pas persistant Lisp processus, j'ai donc utilisé CLISP et lisp-cgi-utils avec un certain plaisir.

Clojure sonne comme une bonne chose - mais je n'ai jamais utilisé moi-même; sa nouveauté qui me rend nerveux.

3voto

Friedrich Points 4058

Ok. 1) UCW 2) AllegroServer + Webactions 3) Hunchentoot 4) mod_lisp et apache 5) http://weblocks.viridian-project.de/ 6) http://www.cliki.net/bknr

Je suppose que l'un d'eux vous conviendra.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X