Programação multicamadas

A programação multicamada (ou programação sem camadas ) é um paradigma de programação para software distribuído , que normalmente segue uma arquitetura multicamada , separando fisicamente diferentes aspectos funcionais do software em diferentes camadas (por exemplo, o cliente, o servidor e o banco de dados em um aplicativo da Web [1 ] ). A programação multicamada permite que funcionalidades que abrangem várias dessas camadas sejam desenvolvidas em uma única unidade de compilação usando uma única linguagem de programação . Sem programação multicamadas, as camadas são desenvolvidas usando diferentes linguagens, por exemplo, JavaScript para o cliente Web, PHPpara o servidor Web e SQL para o banco de dados. [2] A programação multicamada é frequentemente integrada em linguagens de uso geral , estendendo-as com suporte para distribuição. [3]

Conceitos de programação multicamada foram introduzidos pelas linguagens Hop [4] e Links [5] e encontraram adoção industrial em soluções como Ocsigen, [6] Opa , [7] WebSharper , [8] Meteor [9] ou GWT . [10]

A programação multicamada fornece uma visão global do sistema distribuído. Este aspecto tem se mostrado similar a outros paradigmas de programação como programação coreográfica , [11] macroprogramação , [12] e computação agregada. [13] [14]

Contexto

O código das diferentes camadas pode ser executado de forma distribuída em diferentes computadores em rede . Por exemplo, em uma arquitetura de três camadas , um sistema é dividido em três camadas principais – geralmente as camadas de apresentação, negócios e dados. Essa abordagem tem a vantagem de dividir um sistema em camadas, a funcionalidade implementada em uma das camadas pode ser alterada independentemente das outras camadas. Por outro lado, essa decisão arquitetônica espalha uma funcionalidade transversal pertencente a várias camadas em várias unidades de compilação.

Na programação multicamada, as diferentes camadas são implementadas usando uma única linguagem de programação. Diferentes back-ends de compilação levam em consideração a camada de destino (por exemplo, Java para um servidor e JavaScript para um navegador da web). Conseqüentemente, uma funcionalidade espalhada por camadas pode ser implementada em uma única unidade de compilação de um programa multicamadas.

Exemplo

Em seu núcleo, as linguagens multicamadas permitem que os desenvolvedores definam para diferentes partes do código as camadas às quais o código pertence. Os recursos de linguagem que permitem essa definição são bastante diversos entre diferentes linguagens multicamadas, variando de preparação a anotações e tipos . O exemplo a seguir mostra um aplicativo cliente-servidor Echo que ilustra diferentes abordagens. No exemplo, o cliente envia uma mensagem ao servidor e o servidor retorna a mesma mensagem ao cliente, onde é anexada a uma lista de mensagens recebidas.

Aplicação de eco em Hop.js

eco de serviço () {  
  var input = < tipo de entrada= "texto" />     
  retornar <html> 
    <body onload=~{ 
      var ws = new WebSocket ( "ws://localhost:" + ${hop.port} + "/hop/ws" )        
      ws.onmessage = function ( evento ) { document.getElemenetById ( "list" ) . appendChild ( <li>${event.data}</li> ) }     
    }>
      <div>
        ${entrada}
        <button onclick=~{ ws.send ( ${input}.value ) }>Echo!</button>   
      </div>
      <ul id= "lista" />  
    </body>
  </html>
}

var wss = new WebSocketServer ( "ws" )    
wss.onconnection = function ( evento ) {  
  var ws = event.value   
  ws.onmessage = function ( event ) { ws.send ( event.value ) }     
}

Hop usa a preparação para incorporar o código que deve ser executado no cliente em um programa do lado do servidor: Usando a notação ~{…}, o código para os manipuladores onload (Linha 4) e onclick (Linha 10) não é executado imediatamente, mas o servidor gera o código para posterior execução no cliente. Por outro lado, a notação ${…} escapa um nível de geração do programa. As expressões hop.port (Linha 5), ​​event.data (Linha 6) e input (Linha 9 e 10) são avaliadas pelo programa servidor externo e os valores aos quais elas avaliam são injetados no programa cliente gerado. Hop suporta programação de estágio completo , ou seja, expressões ~{...} podem ser aninhadas arbitrariamente de forma que não apenas programas do lado do servidor possam gerar programas do lado do cliente, mas também programas do lado do cliente sejam capazes de gerar outros programas do lado do cliente.

O HTML pode ser incorporado diretamente no código Hop. O HTML gerado no servidor (Linha 2–14) é passado para o cliente. O HTML gerado no cliente pode ser adicionado à página usando a API DOM padrão (Linha 6). O Hop oferece suporte à comunicação bidirecional entre um servidor em execução e uma instância de cliente em execução por meio de sua biblioteca padrão. O cliente se conecta ao servidor WebSocket por meio da API HTML5 padrão (Linha 5) e envia o valor de entrada atual (Linha 10). O servidor abre um servidor WebSocket (Linha 17) que retorna o valor para o cliente (Linha 20). Os chamados serviços, que são executados no servidor e produzem um valor que é devolvido ao cliente que invocou o serviço. Por exemplo, o serviço echo (Linha 1) produz a página HTML fornecida ao cliente da Web do aplicativo Echo. Assim, o código em um bloco de serviço é executado no servidor.

Aplicação de eco em Links

fun echo ( item ) servidor {   
  item
}

fun principal () servidor {   
  página
    <html> _ _
      < corpo >
        < form l : onsubmit = "{appendChildren(<li>{stringToXml(echo(item))}</li>, getNodeById(" list "))}" > 
          < input l : nome = "item" />  
          < tipo de botão = "enviar" > Eco !</ botão > 
        </forma> _ _
        < ul id = "lista" />  
      </ corpo >
    </html> _ _
}

principal ()

Links usa anotações em funções para especificar se elas são executadas no cliente ou no servidor (Linhas 1 e 5). A pedido do cliente, o servidor executa a função principal (Linha 18), que constrói o código que é enviado ao cliente. Links permite a incorporação de código XML (Linha 7–15). Os atributos XML com o prefixo l: são tratados de forma especial. O atributo l:name (Linha 10) declara um identificador ao qual o valor do campo de entrada está vinculado. O identificador pode ser usado em outro lugar (Linha 9). O código a ser executado para o manipulador l:onsubmit (Linha 9) não é executado imediatamente, mas compilado para JavaScript para execução no lado do cliente. As chaves indicam o código do Links embutido no XML. O manipulador l:onsubmit envia o item de valor de entrada atual para o servidor chamando echo. O item é retornado pelo servidor e anexado à lista de itens recebidos usando APIs DOM padrão. A chamada ao servidor (Linha 9) não bloqueia o cliente. Em vez disso, a continuação no cliente é invocada quando o resultado da chamada está disponível. A interação cliente-servidor é baseada no estilo de passagem de retomada: Usandotransformação de estilo de passagem de continuação e desfuncionalização , as chamadas remotas são implementadas passando o nome de uma função para a continuação e os dados necessários para continuar a computação.

Aplicação de eco no ScalaLoci

Aplicativo de objeto @multitier {   
  @peer type Server <: { type Tie <: Single [ Client ] }         
  @peer type Client <: { type Tie <: Single [ Server ] }         

  val mensagem = on [ Cliente ] { Evento [ String ] () }      
  val echoMessage = on [ Servidor ] { mensagem . asLocal }      

  def principal () = em [ Cliente ] {    
    itens val = echoMessage . asLocal . lista   
    val list = Signal { ol ( items () map { message => li ( message ) }) }            
    val inp = entrada . renderizar   
    dom . documento . corpo = corpo (  
      div (
        inp ,
        botão ( onclick := { () => message . fire ( inp . value ) })( "Echo!" )),      
      lista . asFrag ). renderizar
  }
}

ScalaLoci é uma linguagem voltada para sistemas distribuídos genéricos e não apenas para a Web, ou seja, não se restringe a uma arquitetura cliente-servidor. Para esse fim, o ScalaLoci oferece suporte a tipos de pares para codificar as diferentes camadas no nível de tipo . Os tipos de posicionamento são usados ​​para atribuir locais a dados e cálculos. O ScalaLoci suporta reativos multicamadas – abstrações de linguagem para programação reativa que são colocadas em locais específicos – para compor fluxos de dados entre diferentes pares.

O aplicativo primeiro define um campo de entrada (Linha 11) usando a biblioteca ScalaTags. [15] O valor deste campo é usado no manipulador de eventos de clique de um botão (Linha 15) para disparar o evento de mensagem com o valor atual do campo de entrada. O valor é então propagado para o servidor (Linha 6) e de volta para o cliente (Linha 9). No cliente, os valores do evento são acumulados usando a função list e mapeados para uma lista HTML (Linha 10). Essa lista é então usada no HTML (Linha 16) para exibir as entradas anteriores.

Lista de linguagens de programação multicamadas

  • Hop/Hop.js [4] [16] [17]
  • Ligações [5] [18]
  • Ur/Web [19]
  • Eliom/Ocsigen [6] [20]
  • ScalaLoci [21]
  • StiP.js [22] [23]
  • Scala Multi-Tier FRP [24]
  • Opa [7]
  • AmbientTalk/R [25] [26]
  • ML5 [27]
  • WebSharper [8]
  • pressa [28]
  • Diversão [29]
  • Koka [30]
  • Cálculo Multinível [31]
  • Rápido [32]
  • Volta [33]
  • GWT [10]
  • Meteoro [9]
  • J-Orchestra [34]
  • Hip-hop [35]
  • Orc distribuído [36]
  • Jif/dividir [37]
  • Fissão [38]
  • SIF [39]
  • WebDSL [40]
  • Agudo [41]
  • Mobl [42]
  • Abstrações de alto nível para programação Web [43]

Referências

  1. ^ Casco, Richard; Thiemann, Peter; Wadler, Philip (2007). "Resultados do Grupo de Trabalho 07051 – Paradigmas de Programação para a Web: Programação Web e Serviços Web". Paradigmas de Programação para a Web: Programação Web e Serviços Web . Anais do Seminário Dagstuhl. Dagstuhl, Alemanha: Internationales Begegnungs- und Forschungszentrum für Informatik (IBFI). 07051 .
  2. ^ Weisenburger, Pascal; Wirth, Johannes; Salvaneschi, Guido (2020). "Uma pesquisa de programação multicamada" (PDF) . Computação ACM. Sobreviver . 53 (4): 81:1–81:35. doi : 10.1145/3397495. S2CID  218517772.
  3. ^ Caldwell, Sam (2016). "Linguagens de uso geral estendidas para distribuição" . Em Miller, Heather (ed.). Modelos de Programação para Computação Distribuída .
  4. ^ ab Serrano, Manuel (2012). "Programação multitier em Hop" . Comum. ACM . 55 (8): 53–59. doi : 10.1145/2240236.2240253. S2CID  2152326.
  5. ^ ab Cooper, Ezra (2006). Links: Programação Web Sem Níveis. Notas de aula em Ciência da Computação. Vol. 4709. pp. 266–296. doi : 10.1007/978-3-540-74792-5_12. hdl : 20.500.11820/ef5f100a-0366-4b85-8ef1-622fd7fbb53a. ISBN 978-3-540-74791-8.
  6. ^ ab Balat, Vincent (2006). "Ocsigen: digitando interação na web com Caml objetivo": 84–94. doi : 10.1145/1159876.1159889. S2CID  6131454. {{cite journal}}: Citar periódico requer |journal=( ajuda )
  7. ^ ab Rajchenbach-Teller, D., & Sinot, François-Régis. (2010). Opa: suporte a idiomas para uma web sã, segura e protegida. Proceedings of the OWASP AppSec Research , 2010 (1).
  8. ^ ab Bjornson, Joel; Tayanovskyy, Anton; Granicz, Adam (2010). "Compondo GUIs reativas em F# usando WebSharper". Anais da 22ª Conferência Internacional sobre Implementação e Aplicação de Linguagens Funcionais . Notas de aula em Ciência da Computação. Berlim, Heidelberg: Springer-Verlag. 6647 : 49. doi :10.1007/978-3-642-24276-2_13. ISBN 978-3-642-24275-5.
  9. ^ ab Strack, Isaac (janeiro de 2012). Introdução ao framework Meteor JavaScript. Birmingham. ISBN 978-1-78216-083-0. OCLC  823718999.
  10. ^ ab Kereki, Federico, 1960- (2011). GWT essencial: construindo para a Web com o kit de ferramentas da Web do Google 2. Upper Saddle River, NJ: Addison-Wesley. ISBN 978-0-321-70563-1. OCLC  606556208.{{cite book}}: CS1 maint: vários nomes: lista de autores ( link )
  11. ^ Giallorenzo, Saverio; Montesi, Fabrice; Peressotti, Marco; Richter, David; Salvaneschi, Guido; Weisenburger, Pascal (2021). Møller, Anders; Sridharan, Manu (eds.). "Linguagens multipartidárias: os casos coreográficos e multicamadas". 35ª Conferência Europeia sobre Programação Orientada a Objetos (ECOOP 2021) . Leibniz International Proceedings in Informatics (LIPIcs). Dagstuhl, Alemanha: Schloss Dagstuhl – Leibniz-Zentrum für Informatik. 194 : 22:1–22:27. doi : 10.4230/LIPIcs.ECOOP.2021.22. ISBN 978-3-95977-190-0.
  12. ^ Casadei, Roberto (2023-01-11). "Macroprogramação: Conceitos, Estado da Arte e Oportunidades de Modelagem de Comportamento Macroscópico". ACM Computing Surveys . Associação para Máquinas de Computação (ACM). doi : 10.1145/3579353. ISSN  0360-0300.
  13. ^ Beal, Jacob; Pianini, Danilo; Viroli, Mirko (2015). "Programação Agregada para a Internet das Coisas". Computador . Instituto de Engenheiros Elétricos e Eletrônicos (IEEE). 48 (9): 22–30. doi : 10.1109/mc.2015.261. ISSN  0018-9162.
  14. ^ Audito, Giorgio; Casadei, Roberto; Damiani, Ferruccio; Salvaneschi, Guido; Viroli, Mirko (2022). Ali, Karim; Vitek, Jan (eds.). "Programação Funcional para Sistemas Distribuídos com XC". 36ª Conferência Europeia sobre Programação Orientada a Objetos (ECOOP 2022) . Leibniz International Proceedings in Informatics (LIPIcs). Dagstuhl, Alemanha: Schloss Dagstuhl – Leibniz-Zentrum für Informatik. 222 : 20:1–20:28. doi : 10.4230/LIPIcs.ECOOP.2022.20. ISBN 978-3-95977-225-9. S2CID  249961384.
  15. ^ "ScalaTags". www.lihaoyi.com . Recuperado 2021-10-11 .
  16. ^ Serrano, Manuel (2006). "Hop: uma linguagem para programar a web 2.0": 975–985. doi : 10.1145/1176617.1176756. S2CID  14306230. {{cite journal}}: Citar periódico requer |journal=( ajuda )
  17. ^ Serrano, Manuel (2016). Um vislumbre de Hopjs. pp. 180–192. doi : 10.1145/2951913.2951916. ISBN 9781450342193. S2CID  18393160.
  18. ^ Fowler, Simon (2019). "Tipos de sessão assíncrona excepcionais: tipos de sessão sem camadas". Proc. Programa ACM. Lang . 3 (POPL): 28:1–28:29. doi : 10.1145/3290341. S2CID  57757469.
  19. ^ Chlipala, Adam (2015). "Ur/Web: um modelo simples para programar a Web": 153–165. doi : 10.1145/2676726.2677004. S2CID  9440677. {{cite journal}}: Citar periódico requer |journal=( ajuda )
  20. ^ Radanne, Gabriel (2018). Programação da Web sem camadas em geral. pp. 681–689. doi : 10.1145/3184558.3185953. ISBN 9781450356404. S2CID  3304415.
  21. ^ Weisenburger, Pascal (2018). "Desenvolvimento de sistema distribuído com ScalaLoci". Proc. Programa ACM. Lang . 2 (OOPSLA): 129:1–129:30. doi : 10.1145/3276499. S2CID  53090153.
  22. ^ Philips, Laure (2014). Rumo ao desenvolvimento da Web sem camadas sem linguagens sem camadas. pp. 69–81. doi : 10.1145/2661136.2661146. ISBN 9781450332101. S2CID  15774367.
  23. ^ Philips, Laure (2018). "Atribuição de camada baseada em pesquisa para otimizar a disponibilidade offline em aplicativos da Web de várias camadas". Jornal de Programação . 2 (2): 3. doi : 10.22152/programming-journal.org/2018/2/3. S2CID  11256561.
  24. ^ Reynders, Bob (2014). Programação Reativa Funcional Multicamadas para a Web. pp. 55–68. doi : 10.1145/2661136.2661140. ISBN 9781450332101. S2CID  16761616.
  25. ^ Carreton, Andoni Lombide (2010). Programação Reativa Distribuída Fracamente Acoplada em Redes Ad Hoc Móveis. Notas de aula em Ciência da Computação. Vol. 6141. pp. 41–60. doi : 10.1007/978-3-642-13953-6_3. ISBN 978-3-642-13952-9.
  26. ^ Dedecker, Jessie (2006). "Programação orientada para o ambiente no Ambient Talk". Programação orientada a ambiente em AmbientTalk . Notas de aula em Ciência da Computação. Vol. 4067. pp. 230–254. doi : 10.1007/11785477_16. ISBN 978-3-540-35726-1.
  27. ^ VII, Tom Murphy (2007). Programação distribuída de tipo seguro com ML5. Notas de aula em Ciência da Computação. Vol. 4912. pp. 108–123. doi : 10.1007/978-3-540-78663-4_9. ISBN 978-3-540-78662-7. S2CID  12534714.
  28. ^ Ekblad, Anton; Claessen, Koen (2015-05-11). "Um modelo de programação integrado e centrado no cliente para aplicativos da Web seguros". ACM SIGPLAN Avisos . 49 (12): 79–89. doi : 10.1145/2775050.2633367. ISSN  0362-1340.
  29. ^ "Fun (uma linguagem de programação para a web em tempo real)" . marcuswest.in . Recuperado 2020-05-04 .
  30. ^ Leijen, Daan (2014). "Koka: programação com tipos de efeitos polimórficos de linha". Procedimentos Eletrônicos em Ciência da Computação Teórica . 153 : 100–126. arXiv : 1406.2061 . doi : 10.4204/EPTCS.153.8. S2CID  14902937.
  31. ^ Neubauer, Matthias (2005). De programas sequenciais a aplicativos multicamada por transformação de programa. pp. 221–232. doi : 10.1145/1040305.1040324. ISBN 158113830X. S2CID  10338936.
  32. ^ ChongStephen; LiuJed; C, MyersAndrew; Qixin; VikramK; ZhengLantian; ZhengXin (14/10/2007). "Aplicativos web seguros por meio de particionamento automático". Revisão dos Sistemas Operacionais ACM SIGOPS . 41 (6): 31–44. doi : 10.1145/1323293.1294265. HDL : 1813/5769.
  33. ^ Manolescu, Dragos (2008). "Volta: Desenvolvendo Aplicações Distribuídas por Recompilação". Software IEEE . 25 (5): 53–59. doi : 10.1109/MS.2008.131. S2CID  24360031.
  34. ^ Tilevich, Eli (2002). J-Orchestra: Particionamento Automático de Aplicativos Java. Notas de aula em Ciência da Computação. Vol. 2374. pp. 178–204. doi : 10.1007/3-540-47993-7_8. HDL : 1853/6531. ISBN 978-3-540-43759-8.
  35. ^ Baga, Gérard; Nicolas, Cyprien; Serrano, Manuel (2011). "Hiphop". Anais do 1º Workshop Internacional ACM SIGPLAN sobre Linguagem de Programação e Tecnologias de Sistemas para Clientes de Internet - PLASTIC '11 . Nova York, Nova York, EUA: ACM Press: 49. doi : 10.1145/2093328.2093337. ISBN 978-1-4503-1171-7. S2CID  1280230.
  36. ^ Thywissen, John A. (2016). "Distribuindo Implicitamente Programas Simultâneos Abrangentes: Resumo Estendido": 1. doi : 10.1145/2957319.2957370. S2CID  6124391. {{cite journal}}: Citar periódico requer |journal=( ajuda )
  37. ^ Zdancewic, Steve (2002). "Particionamento de programa seguro". ACM Trans. Comput. sist . 20 (3): 283–328. doi : 10.1145/566340.566343. S2CID  1776939.
  38. ^ Guha, Arjun; Jeannin, Jean-Baptiste; Nigam, Rachit; Tangen, Jane; Shambaugh, Rian (2017). Lerner, Benjamin S.; Bodík, Rastislav; Krishnamurthi, Shriram (eds.). "Fission: Secure Dynamic Code-Splitting para JavaScript". 2º Encontro sobre Avanços em Linguagens de Programação (SNAPL 2017) . Leibniz International Proceedings in Informatics (LIPIcs). Dagstuhl, Alemanha: Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik. 71 : 5:1–5:13. doi : 10.4230/LIPIcs.SNAPL.2017.5. ISBN 978-3-95977-032-3.
  39. ^ Chong, Stephen (2007). "SIF: impondo confidencialidade e integridade em aplicativos da Web". {{cite journal}}: Citar periódico requer |journal=( ajuda )
  40. ^ Groenewegen, Danny M. (2008). "WebDSL: uma linguagem específica de domínio para aplicações web dinâmicas": 779-780. doi : 10.1145/1449814.1449858. S2CID  8073129. {{cite journal}}: Citar periódico requer |journal=( ajuda )
  41. ^ Sewell, Peter (2005). "Agudo: design de linguagem de programação de alto nível para computação distribuída": 15–26. doi : 10.1145/1086365.1086370. S2CID  1308126. {{cite journal}}: Citar periódico requer |journal=( ajuda )
  42. ^ Hemel, Zef (2011). Programando declarativamente a web móvel com Mobl. pp. 695–712. doi : 10.1145/2048066.2048121. ISBN 9781450309400. S2CID  10480906.
  43. ^ Richard-Foy, Julien (2013). Abstrações eficientes de alto nível para programação web. pp. 53–60. doi : 10.1145/2517208.2517227. ISBN 9781450323734. S2CID  14305623.