Articulo de referencia

Programación de múltiples niveles

La programación multicapa (o programación sin capas ) es un paradigma de programación para software distribuido , que generalmente sigue una arquitectura multicapa , separando f...

La programación multicapa (o programación sin capas ) es un paradigma de programación para software distribuido , que generalmente sigue una arquitectura multicapa , separando físicamente los diferentes aspectos funcionales del software en distintas capas (por ejemplo, el cliente, el servidor y la base de datos en una aplicación web [ 1 ] ). La programación multicapa permite desarrollar funcionalidades que abarcan varias de estas capas en una única unidad de compilación utilizando un único lenguaje de programación . Sin la programación multicapa, las capas se desarrollan utilizando diferentes lenguajes, por ejemplo, JavaScript para el cliente web, PHP para el servidor web y SQL para la base de datos. [ 2 ] La programación multicapa a menudo se integra en lenguajes de propósito general extendiéndolos con soporte para distribución. [ 3 ]

Los conceptos de programación de múltiples capas fueron iniciados por los lenguajes Hop [ 4 ] y Links [ 5 ] y han encontrado adopción industrial en soluciones como Ocsigen, [ 6 ] Opa , [ 7 ] WebSharper , [ 8 ] Meteor [ 9 ] o GWT . [ 10 ]

La programación multinivel proporciona una visión global del sistema distribuido. Se ha demostrado que este aspecto es similar a otros paradigmas de programación como la programación coreográfica , [ 11 ] la macroprogramación , [ 12 ] y la computación agregada . [ 13 ] [ 14 ]

Contexto

El código de las distintas capas se puede ejecutar de forma distribuida en diferentes ordenadores conectados en red . Por ejemplo, en una arquitectura de tres capas , un sistema se divide en tres capas principales: normalmente, las de presentación, lógica de negocio y datos. Este enfoque tiene la ventaja de que, al dividir un sistema en capas, la funcionalidad implementada en una de ellas se puede modificar independientemente de las demás. Por otro lado, esta decisión arquitectónica dispersa la funcionalidad transversal perteneciente a varias capas en varias unidades de compilación.

En la programación multicapa, las distintas capas se implementan utilizando un único lenguaje de programación. Los diferentes sistemas de compilación tienen en cuenta la capa de destino (por ejemplo, Java para un servidor y JavaScript para un navegador web). En consecuencia, una funcionalidad que se distribuye entre varias capas puede implementarse en una única unidad de compilación de un programa multicapa.

Ejemplo

En esencia, los lenguajes multicapa permiten a los desarrolladores definir las capas a las que pertenece cada fragmento de código. Las características que posibilitan esta definición varían considerablemente entre los distintos lenguajes multicapa, desde la gestión de tareas hasta las anotaciones y los tipos . El siguiente ejemplo muestra una aplicación cliente-servidor Echo que ilustra diferentes enfoques. En este ejemplo, el cliente envía un mensaje al servidor, y este devuelve el mismo mensaje al cliente, donde se añade a una lista de mensajes recibidos.

Aplicación Echo en Hop.js

servicio echo () {var input = <input type= "text" />devolver <html><body onload=~{var ws = new WebSocket ( "ws://localhost:" + ${hop.port} + "/hop/ws" )ws.onmessage = function ( event ) { document.getElemenetById ( "list" ) . appendChild ( <li>${event.data}</li> ) }}><div>${input}<button onclick=~{ ws.send ( ${input}.value ) }>¡Echo!</button></div><ul id= "list" /></body></html>}var wss = new WebSocketServer ( "ws" )wss.onconnection = función ( evento ) {var ws = evento.valorws.onmessage = function ( event ) { ws.send ( event.value ) }}

Hop utiliza la técnica de staging para incrustar código que se ejecutará en el cliente dentro de un programa del lado del servidor: mediante la notación ~{…}, el código para los manejadores onload (línea 4) y onclick (línea 10) no se ejecuta inmediatamente, sino que el servidor genera el código para su posterior ejecución en el cliente. Por otro lado, la notación ${…} omite un nivel de generación de programa. Las expresiones hop.port (línea 5), ​​event.data (línea 6) e input (líneas 9 y 10) son evaluadas por el programa del servidor externo y los valores que producen se inyectan en el programa del cliente generado. Hop admite programación por etapas completa , es decir, las expresiones ~{…} se pueden anidar arbitrariamente, de modo que no solo los programas del lado del servidor pueden generar programas del lado del cliente, sino que también los programas del lado del cliente pueden generar otros programas del lado del cliente.

El HTML se puede incrustar directamente en el código de Hop. El HTML generado en el servidor (líneas 2-14) se pasa al cliente. El HTML generado en el cliente se puede agregar a la página usando la API DOM estándar (línea 6). Hop admite la comunicación bidireccional entre una instancia de servidor y una instancia de cliente en ejecución a través de su biblioteca estándar. El cliente se conecta al servidor WebSocket a través de la API HTML5 estándar (línea 5) y envía el valor de entrada actual (línea 10). El servidor abre un servidor WebSocket (línea 17) que devuelve el valor al cliente (línea 20). Los llamados servicios, que se ejecutan en el servidor y producen un valor que se devuelve al cliente que invocó el servicio. Por ejemplo, el servicio de eco (línea 1) produce la página HTML que se sirve al cliente web de la aplicación Echo. Por lo tanto, el código en un bloque de servicio se ejecuta en el servidor.

fun echo ( elemento ) servidor {artículo}fun main () servidor {página< html >< cuerpo >< form l : onsubmit = "{appendChildren(<li>{stringToXml(echo(item))}</li>, getNodeById(" list "))}" >< input l : name = "item" />< button type = " submit" > ¡Echo ! </button></form>< ul id = "list" /></body></html>}principal ()

Links utiliza anotaciones en las funciones para especificar si se ejecutan en el cliente o en el servidor (líneas 1 y 5). A petición del cliente, el servidor ejecuta la función principal (línea 18), que construye el código que se envía al cliente. Links permite incrustar código XML (líneas 7-15). Los atributos XML con el prefijo l: se tratan de forma especial. El atributo l:name (línea 10) declara un identificador al que se vincula el valor del campo de entrada. El identificador se puede utilizar en otros lugares (línea 9). El código que se ejecutará para el controlador l:onsubmit (línea 9) no se ejecuta inmediatamente, sino que se compila a JavaScript para su ejecución en el lado del cliente. Las llaves indican código Links incrustado en XML. El controlador l:onsubmit envía el valor de entrada actual al servidor mediante la llamada a echo. El servidor devuelve el elemento y lo añade a la lista de elementos recibidos utilizando las API DOM estándar. La llamada al servidor (línea 9) no bloquea al cliente. En cambio, la continuación en el cliente se invoca cuando el resultado de la llamada está disponible. La interacción cliente-servidor se basa en el estilo de paso de reanudación: mediante la transformación y desfuncionalización del estilo de paso de continuación , las llamadas remotas se implementan pasando el nombre de una función para la continuación y los datos necesarios para continuar el cálculo.

Aplicación Echo en ScalaLoci

@multitier objeto Aplicación {@peer tipo Servidor <: { tipo Vínculo <: Único [ Cliente ] }@peer tipo Cliente <: { tipo Vínculo <: Único [ Servidor ] }val mensaje = en [ Cliente ] { Evento [ Cadena ]() }val echoMessage = on [ Server ] { message . asLocal }def main () = on [ Cliente ] {val items = echoMessage . asLocal . listval lista = Señal { ol ( elementos () mapa { mensaje => li ( mensaje ) }) }val inp = input.renderdom.document.body = body (div (entrada ,botón ( onclick := { () => mensaje . fire ( inp . value ) })( "¡Echo!" )),lista . comoFrag ). renderizar}}

ScalaLoci es un lenguaje orientado a sistemas distribuidos genéricos, no solo a la web; es decir, no se limita a una arquitectura cliente-servidor. Para ello, ScalaLoci admite tipos de pares para codificar las diferentes capas a nivel de tipo . Los tipos de ubicación se utilizan para asignar ubicaciones a datos y cálculos. ScalaLoci admite reactivos multicapa (abstracciones de lenguaje para programación reactiva que se ubican en posiciones específicas) para componer flujos de datos entre diferentes pares.

La aplicación define primero un campo de entrada (línea 11) utilizando la biblioteca ScalaTags. [ 15 ] El valor de este campo se utiliza en el controlador de eventos de clic de un botón (línea 15) para activar el evento de mensaje con el valor actual del campo de entrada. El valor se propaga al servidor (línea 6) y de vuelta al cliente (línea 9). En el cliente, el valor del evento se acumula utilizando la función de lista y se asigna a una lista HTML (línea 10). Esta lista se utiliza posteriormente en el HTML (línea 16) para mostrar las entradas anteriores.

Lista de lenguajes de programación de múltiples niveles

Referencias

  1. ^ Casco, Richard; Thiemann, Peter; Wadler, Philip (2007). "Resultados del grupo de trabajo 07051 - Paradigmas de programación para la Web: programación web y servicios web" . Paradigmas de programación para la Web: programación web y servicios web . Actas del seminario Dagstuhl. 07051 . Dagstuhl, Alemania: Internationales Begegnungs- und Forschungszentrum für Informatik (IBFI).
  2. Weisenburger, Pascal; Wirth, Johannes; Salvaneschi, Guido (2020). "Una revisión de la programación multinivel" (PDF) . ACM Comput. Surv . 53 (4): 81:1–81:35. doi : 10.1145/3397495 . S2CID 218517772 . 
  3. Caldwell, Sam (2016). "Lenguajes de propósito general extendidos para distribución" . En Miller, Heather (ed.). Modelos de programación para computación distribuida .
  4. 1 2 Serrano, Manuel (2012). "Programación de múltiples niveles en Hop" . Commun. ACM . 55 (8): 53– 59. doi : 10.1145/2240236.2240253 . S2CID 2152326 . 
  5. 1 2 Cooper, Ezra (2006). "Links: Web Programming Without Tiers". Formal Methods for Components and Objects . Lecture Notes in Computer Science. 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. S2CID 16397220 . 
  6. 1 2 Balat, Vincent (2006). "Ocsigen: tipificación de la interacción web con Caml objetivo" : 84–94 . doi : 10.1145/1159876.1159889 . S2CID 6131454 . {{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  7. 1 2 Rajchenbach-Teller, D., & Sinot, François-Régis. (2010). Opa: Soporte de lenguaje para una web sana, segura y protegida. Actas de la OWASP AppSec Research , 2010 (1).
  8. 1 2 Bjornson, Joel; Tayanovskyy, Anton; Granicz, Adam (2010). "Composición de interfaces gráficas de usuario reactivas en F# con WebSharper". Implementación y aplicación de lenguajes funcionales . Notas de clase en informática. Vol. 6647. Berlín, Heidelberg: Springer-Verlag. pág. 49. doi : 10.1007/978-3-642-24276-2_13 . ISBN   978-3-642-24275-5.
  9. 1 2 Strack, Isaac (enero de 2012). Introducción al framework JavaScript Meteor . Birmingham. ISBN 978-1-78216-083-0OCLC 823718999 .​ {{cite book}}: CS1 mantenimiento: falta el editor de ubicación ( enlace )
  10. 1 2 Kereki, Federico, 1960- (2011). Essential GWT: building for the web with Google Web Toolkit 2 . Upper Saddle River, NJ: Addison-Wesley. ISBN 978-0-321-70563-1OCLC 606556208 {{cite book}}: CS1 maint: nombres múltiples: lista de autores ( enlace ) CS1 maint: nombres numéricos: lista de autores ( enlace )
  11. Giallorenzo, Saverio; Montesi, Fabricio; Peressotti, Marco; Richter, David; Salvaneschi, Guido; Weisenburger, Pascal (2021). Moller, Anders; Sridharan, Manu (eds.). "Lenguajes multipartidistas: los casos coreográficos y multinivel" . 35ª Conferencia Europea sobre Programación Orientada a Objetos (ECOOP 2021) . Procedimientos internacionales de informática de Leibniz (LIPIcs). 194 . Dagstuhl, Alemania: Schloss Dagstuhl – Leibniz-Zentrum für Informatik: 22:1–22:27. doi : 10.4230/LIPIcs.ECOOP.2021.22 . ISBN 978-3-95977-190-0. S2CID 235748561 . 
  12. Casadei, Roberto (2023-01-11). "Macroprogramación: conceptos, estado del arte y oportunidades del modelado de comportamiento macroscópico" . ACM Computing Surveys . 55 (13s). Association for Computing Machinery (ACM): 1–37 . arXiv : 2201.03473 . doi : 10.1145/3579353 . ISSN 0360-0300 . S2CID 245837830 .  
  13. Beal, Jacob; Pianini, Danilo; Viroli, Mirko (2015). "Programación agregada para el Internet de las cosas". Computer . 48 (9). Instituto de Ingenieros Eléctricos y Electrónicos (IEEE): 22– 30. doi : 10.1109/mc.2015.261 . hdl : 11585/520779 . ISSN 0018-9162 . S2CID 26413 .  
  14. Audrito, Giorgio; Casadei, Roberto; Damiani, Ferruccio; Salvaneschi, Guido; Viroli, Mirko (2022). Ali, Karim; Vitek, Jan (eds.). "Programación funcional para sistemas distribuidos con XC" . 36.ª Conferencia Europea sobre Programación Orientada a Objetos (ECOOP 2022) . Actas Internacionales Leibniz en Informática (LIPIcs). 222. Dagstuhl, Alemania: Schloss Dagstuhl – Leibniz-Zentrum für Informatik: 20:1–20:28. doi : 10.4230/LIPIcs.ECOOP.2022.20 . ISBN 978-3-95977-225-9. S2CID 249961384 . 
  15. "ScalaTags" . www.lihaoyi.com . Consultado el 11 de octubre de 2021 .
  16. Serrano, Manuel (2006). "Hop: un lenguaje para programar la web 2.0" : 975–985 . doi : 10.1145/1176617.1176756 . S2CID 14306230 . {{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  17. Serrano, Manuel (2016). "Un vistazo a Hopjs". Actas de la 21.ª Conferencia Internacional ACM SIGPLAN sobre Programación Funcional . págs. 180–192 . doi : 10.1145/2951913.2951916 . ISBN  9781450342193. S2CID 18393160 . 
  18. Fowler, Simon (2019). "Tipos de sesión asíncronos excepcionales: tipos de sesión sin niveles" . Proc. ACM Program. Lang . 3 (POPL): 28:1–28:29. doi : 10.1145/3290341 . hdl : 1808/27512 . S2CID 57757469 . 
  19. Chlipala, Adam (2015). "Ur/Web: Un modelo simple para programar la web" : 153–165 . doi : 10.1145/2676726.2677004 . S2CID 9440677 . {{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  20. Radanne, Gabriel (2018). "Programación web sin niveles a gran escala". Companion of the Web Conference 2018 on the Web Conference 2018 - WWW '18 . pp. 681–689 . doi : 10.1145/3184558.3185953 . ISBN  9781450356404. S2CID 3304415 . 
  21. Weisenburger, Pascal (2018). "Desarrollo de sistemas distribuidos con ScalaLoci" . Proc. ACM Program. Lang . 2 (OOPSLA): 129:1–129:30. doi : 10.1145/3276499 . S2CID 53090153 . 
  22. Philips, Laure (2014). «Hacia el desarrollo web sin capas sin lenguajes sin capas». Actas del Simposio Internacional ACM de 2014 sobre Nuevas Ideas, Nuevos Paradigmas y Reflexiones sobre Programación y Software . págs. 69–81 . doi : 10.1145/2661136.2661146 . ISBN  9781450332101. S2CID 15774367 . 
  23. Philips, Laure (2018). "Asignación de niveles basada en búsqueda para optimizar la disponibilidad sin conexión en aplicaciones web de múltiples niveles" . Programming Journal . 2 (2): 3. arXiv : 1712.01161 . doi : 10.22152/programming-journal.org/2018/2/3 . S2CID 11256561 . 
  24. Reynders, Bob (2014). «Programación reactiva funcional multinivel para la web». Actas del Simposio Internacional ACM de 2014 sobre Nuevas Ideas, Nuevos Paradigmas y Reflexiones sobre Programación y Software . págs. 55–68 . doi : 10.1145/2661136.2661140 . ISBN  9781450332101. S2CID 16761616 . 
  25. Carreton, Andoni Lombide (2010). «Programación reactiva distribuida débilmente acoplada en redes móviles ad hoc». Objetos, modelos, componentes, patrones . Notas de clase en informática. Vol. 6141. pp. 41–60 . doi : 10.1007/978-3-642-13953-6_3 . ISBN   978-3-642-13952-9.
  26. Dedecker, Jessie (2006). "Programación orientada al entorno en Ambient Talk " . Programación orientada al entorno en AmbientTalk . Lecture Notes in Computer Science. Vol. 4067. pp. 230–254 . doi : 10.1007/11785477_16 . ISBN   978-3-540-35726-1.
  27. VII, Tom Murphy (2007). "Programación distribuida con tipado seguro mediante ML5". Computación global confiable . Notas de clase en ciencias de la computación. Vol. 4912. págs. 108–123 . doi : 10.1007/978-3-540-78663-4_9 . ISBN   978-3-540-78662-7. S2CID 12534714 . 
  28. Ekblad, Anton; Claessen, Koen (11 de mayo de 2015). "Un modelo de programación centrado en el cliente y sin fisuras para aplicaciones web con tipado seguro" . ACM SIGPLAN Notices . 49 (12): 79– 89. doi : 10.1145/2775050.2633367 . ISSN 0362-1340 . 
  29. "Fun (un lenguaje de programación para la web en tiempo real)" . marcuswest.in . Consultado el 4 de mayo de 2020 .
  30. Leijen, Daan (2014). "Koka: Programación con tipos de efectos polimórficos de fila" . Actas electrónicas en informática teórica . 153 : 100–126 . arXiv : 1406.2061 . doi : 10.4204/EPTCS.153.8 . S2CID 14902937 . 
  31. Neubauer, Matthias (2005). «De programas secuenciales a aplicaciones multicapa mediante la transformación de programas». Actas del 32.º simposio ACM SIGPLAN-SIGACT sobre principios de lenguajes de programación . págs. 221-232 . doi : 10.1145/1040305.1040324 . ISBN  158113830X. S2CID 10338936 . 
  32. ChongStephen; LiuJed; C, MyersAndrew; QiXin; VikramK; ZhengLantian; ZhengXin (2007-10-14). "Aplicaciones web seguras mediante particionamiento automático" . ACM SIGOPS Operating Systems Review . 41 (6): 31– 44. doi : 10.1145/1323293.1294265 . hdl : 1813/5769 .
  33. Manolescu, Dragos (2008). "Volta: Desarrollo de aplicaciones distribuidas mediante recompilación" . IEEE Software . 25 (5): 53– 59. doi : 10.1109/MS.2008.131 . S2CID 24360031 . 
  34. Tilevich, Eli (2002). "J-Orchestra: Particionamiento automático de aplicaciones Java". ECOOP 2002 — Programación orientada a objetos . Lecture Notes in Computer Science. Vol. 2374. pp. 178–204 . doi : 10.1007/3-540-47993-7_8 . hdl : 1853/6531 . ISBN   978-3-540-43759-8.
  35. Berry, Gérard; Nicolas, Cyprien; Serrano, Manuel (2011). «Hiphop» . Actas del 1er taller internacional ACM SIGPLAN sobre lenguajes de programación y tecnologías de sistemas para clientes de Internet . Nueva York, Nueva York, EE. UU.: ACM Press. pág. 49. doi : 10.1145/2093328.2093337 . ISBN  978-1-4503-1171-7. S2CID 1280230 . 
  36. Thywissen, John A. (2016). "Distribución implícita de programas concurrentes generalizados: resumen extendido" : 1. doi : 10.1145/2957319.2957370 . S2CID 6124391 . {{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  37. Zdancewic, Steve (2002). "Particionamiento seguro de programas" . ACM Trans. Comput. Syst . 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 for JavaScript" . 2nd Summit on Advances in Programming Languages ​​(SNAPL 2017) . Leibniz International Proceedings in Informatics (LIPIcs). 71. Dagstuhl, Alemania: Schloss Dagstuhl–Leibniz-Zentrum fuer Informatik: 5:1–5:13. doi : 10.4230/LIPIcs.SNAPL.2017.5 . ISBN 978-3-95977-032-3.
  39. Chong, Stephen (2007). "SIF: Garantizando la confidencialidad y la integridad en las aplicaciones web" .{{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  40. Groenewegen, Danny M. (2008). "WebDSL: un lenguaje específico de dominio para aplicaciones web dinámicas" : 779–780 . doi : 10.1145/1449814.1449858 . S2CID 8073129 . {{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  41. Sewell, Peter (2005). "Acute: diseño de lenguaje de programación de alto nivel para computación distribuida" : 15–26 . doi : 10.1145/1086365.1086370 . S2CID 1308126 . {{cite journal}}: Para citar una revista se requiere |journal=( ayuda )
  42. Hemel, Zef (2011). «Programación declarativa de la web móvil con Mobl». Actas de la conferencia internacional ACM de 2011 sobre sistemas, lenguajes y aplicaciones de programación orientada a objetos . pp. 695–712 . doi : 10.1145/2048066.2048121 . ISBN  9781450309400. S2CID 10480906 . 
  43. Richard-Foy, Julien (2013). «Abstracciones de alto nivel eficientes para la programación web». Actas de la 12.ª conferencia internacional sobre programación generativa: conceptos y experiencias . pp. 53–60 . doi : 10.1145/2517208.2517227 . ISBN  9781450323734. S2CID 14305623 .