Servidor REST no Prolog, como ele é?

Como uma pequena digressão para os não iniciados na programação lógica
neste texto, uma sessão mágica será realizada com a abordagem dada pela exposição
para criar um servidor REST e seus parâmetros são medidos.

Qual é o problema? E tudo é simples - faremos isso no Prolog (na implementação do SWI-prolog) ...

Então o que você precisa. Primeiro, faça o download (se ainda não o tiver feito) e coloque o swi-prólogo real
do site www.swi-prolog.org . É mais fácil criar um pequeno arquivo do tipo rest.pl com o conteúdo inicial do tipo
servidor
continue fazendo o download e edite-o usando o próprio sistema de prólogo, como este
(exemplos são dados para o console linux, mas não muito diferente do windows):

$echo "." > rest.pl $swipl ... ?- [rest]. true. ?- edit(). 

Depois disso, um editor semelhante ao emacs será iniciado e você poderá digitar tudo nele.

Então, no começo, indicaremos que usaremos bibliotecas e escreveremos o que isso significa
inicialização do servidor - nos caracteres de prólogo: - pode ser lido como "this is":

 :- use_module(library(http/http_server)). :- use_module(library(http/http_json)). :- http_handler(/,(M), [method(M),methods([get,post]),time_limit(10000)]).  :- http_server(http_dispatch, [port(8080)]). 

Como você pode ver, planejamos que o serviço responda aos métodos get e post.

Problema no modelo


Agora, na verdade, o que faremos. Mediante solicitação, responderemos com uma página com um campo de entrada de número; ao inseri-la, solicitaremos o método de postagem e calcularemos esse número de Fibonacci.

Isto é:

 (get,_) :- (X),(X). (post,) :- http_parameters(,[val(,[integer])]), (). 

Bem, é isso! Já escrevemos nosso servidor ... O prólogo é uma linguagem declarativa - por isso declaramos as opções de processamento. A propósito, qualquer idioma pode ser usado - eu decidi escrever em alguns lugares em russo.

Mas ei, o que ele está fazendo? Afinal, a “forma”, a “resposta” e a “redução” são nossos predicados e ainda não estão definidos. Vamos consertar:

 ():- format('Content-type: text/html~n~n <html><body>  <br/> ~w </body></html>~n', []). ('<form method="POST"><input name="val"/></form>'). 

Bem, aqui estão duas opções para o cálculo - vamos ter apenas números positivos de Fibonacci:

 ():-  > 0, (0,1,1,,),(X), format(atom(),'~w    ~w<br/>~w',[,,X]), (). ():- (X), format(atom(),'  ~w  0<br/>~w',[,X]), (). 

Bem, resta determinar realmente qual é o número de Fibonacci:

 (_F, F1, N, N, F1) :- !. (F0, F1, I, N, F) :- F2 is F0+F1, I2 is I + 1, !,(F1, F2, I2, N, F). 

Essa definição, é claro, não é muito familiar no Feng Shui , mas é considerada quase mais rápida do que se escrevêssemos em C ...

Então isso vai funcionar? Verificamos:

  ?- . % Started server at http://localhost:8080/ true. 

Portanto, o servidor parece ter iniciado. A propósito, é multithread! Para verificar, você precisa abrir o endereço
127.0.0.1 : 8080 / e digite algum número - por exemplo, 1000:
Cálculo dos números de Fibonacci
1000 o número de Fibonacci é igual a
4346655768693745643568852767504062580
2564660517371780402481729089536555417
9490518904038798400792551692959225930
8032263477520968962323987332247116164
2996440906533187938298969649928516003
704476137795166849228875
Bem, funciona!

Um pequeno estudo de desempenho do servidor - vamos verificar o método GET (o POST obviamente depende fortemente de um determinado número, portanto, um número de 10.000.000 é considerado, é claro, mas alguns segundos ...)

  $ ab -k -c 4 -n 4000 http://127.0.0.1:8080/ ... Concurrency Level: 4 Time taken for tests: 0.283 seconds Complete requests: 4000 Failed requests: 0 Keep-Alive requests: 4000 Total transferred: 1108000 bytes HTML transferred: 544000 bytes Requests per second: 14140.57 [#/sec] (mean) Time per request: 0.283 [ms] (mean) Time per request: 0.071 [ms] (mean, across all concurrent requests) Transfer rate: 3825.14 [Kbytes/sec] received ... 

O que 14140 solicita por segundo com 10 threads - isso é muito bom para um computador comum!

E sim, o prólogo tem essa oportunidade - uma aparência lógica. Então, se você alterar algo no código, basta digitar o console

  ?- make. 

E todas as suas alterações funcionarão em novas solicitações - nada precisa ser sobrecarregado, parado, etc.

Espero que você esteja interessado em ver como criar um servidor de descanso com um exemplo tão simples. Obviamente, você pode descrever a interface restante estaticamente, como foi feito no exemplo, você pode inserir todos os tipos de variáveis, usar parte do caminho da URL como variáveis ​​- bem, em geral, tudo é como sempre.

Você pode fazer isso dinamicamente, alterar a lógica do programa criando, excluindo e modificando predicados - uma espécie de servidor auto-modificável, cujo trabalho depende do histórico. Você pode conectar bancos de dados. Em geral, tudo é como sempre, apenas trabalhar é simples e agradável.

Source: https://habr.com/ru/post/pt471610/


All Articles