다층 프로그래밍

Multitier programming

멀티티어 프로그래밍(또는 계층 없는 프로그래밍)은 분산 소프트웨어프로그래밍 패러다임으로, 일반적으로 멀티티어 아키텍처를 따르며 소프트웨어의 다양한 기능적 측면을 다른 계층(예: 웹 애플리케이션의[1] 클라이언트, 서버 및 데이터베이스)으로 물리적으로 분리합니다.멀티티어 프로그래밍은 이러한 여러 계층에 걸친 기능을 단일 프로그래밍 언어를 사용하여 단일 컴파일 단위로 개발할 수 있도록 합니다.멀티티어 프로그래밍이 없으면 웹 클라이언트용 JavaScript, 서버용 PHP,[2] 데이터베이스용 SQL 등 다양한 언어를 사용하여 계층이 개발됩니다.멀티계층 프로그래밍은 배포 [3]지원을 통해 확장함으로써 범용 언어로 통합되는 경우가 많습니다.

멀티티어 프로그래밍의 개념은 Hop [5] Links 언어[4] 의해 개척되었으며 Ocsigen,[6] Opa,[7] WebSharper,[8] Meteor[9] 또는 GWT와 [10]같은 솔루션에서 산업적으로 채택되었습니다.

다중 계층 프로그래밍은 분산 시스템에 대한 전역 보기를 제공합니다.이러한 측면은 안무 프로그래밍,[11] 매크로프로그래밍,[12] 애그리게이트 [13][14]컴퓨팅 등의 다른 프로그래밍 패러다임과 유사합니다.

맥락

서로 다른 계층의 코드는 서로 다른 네트워크로 연결된 컴퓨터에서 분산된 방식으로 실행될 수 있습니다.예를 들어, 3계층 아키텍처에서는 시스템은 3개의 주요 계층(일반적으로 프레젠테이션, 비즈니스 및 데이터 계층)으로 나뉩니다.이 접근법은 시스템을 계층으로 분할함으로써 계층 중 하나에 구현된 기능이 다른 계층과 독립적으로 변경될 수 있다는 이점이 있다.한편, 이 아키텍처 결정은 여러 계층에 속하는 교차 기능을 여러 컴파일 단위로 분산시킨다.

멀티티어 프로그래밍에서는 다른 계층이 단일 프로그래밍 언어를 사용하여 구현됩니다.다른 컴파일 백엔드는 대상 계층(서버의 경우 Java, 웹 브라우저의 경우 JavaScript 등)을 고려합니다.이것에 의해, 계층에 걸쳐져 있는 기능을, 멀티 계층 프로그램의 단일의 컴파일 단위로 실장할 수 있다.

기본적으로 멀티티어 언어를 사용하면 개발자는 코드가 속한 계층을 다른 코드에 대해 정의할 수 있습니다.이 정의를 가능하게 하는 언어 기능은 스테이징, 주석, 유형 등 다양한 멀티계층 언어 간에 매우 다양합니다.다음으로 다양한 접근방식을 나타내는Echo 클라이언트/서버 어플리케이션의 예를 나타냅니다.이 예에서 클라이언트는 서버에 메시지를 발송하고 서버는 동일한 메시지를 클라이언트에 반환합니다.이 메시지는 수신된 메시지 목록에 추가됩니다.

Hop.js의 에코 어플리케이션

서비스 메아리치다() {   변화하다 입력 = <입력> 입력="텍스트" />   돌아가다 <blocks>     <바디> 온로드=~{       변화하다 ws = 신규 웹 소켓("ws://localhost:" + ${hop.port} + "/hop/ws")       ws.onmessage = 기능.(이벤트) { document.getElemenetBy아이디(리스트).append Child(자녀 추가)(<li>${event.data}<li>) }     }>       <div>         ${입력}         <버튼 클릭=~{ 송신(${input}값) }> 에코!</버튼       </div>       <UL> id=리스트 />     </body>   </filters> }  변화하다 wss = 신규 Web Socket Server("ws") 온커넥션 = 기능.(이벤트){   변화하다 ws = event.value(이벤트.값)   ws.onmessage = 기능.(이벤트) { 송신(event.value(이벤트.값)) } } 

홉은 스테이징을 사용하여 클라이언트에서 실행되는 코드를 서버 측 프로그램에 포함합니다.~{...} 표기법을 사용하면 온로드(4행) 및 온클릭(10행) 핸들러의 코드는 즉시 실행되지 않지만 서버는 클라이언트에서 나중에 실행할 코드를 생성합니다.한편, ${…} 표기법은 프로그램 생성의 한 수준을 회피합니다.표현식 hop.port(5행), event.data(6행), 입력(9행 및 10행)은 외부 서버 프로그램에 의해 평가되며 평가 대상 값은 생성된 클라이언트프로그램에 삽입됩니다.Hop은 풀스테이지 프로그래밍을 지원합니다.즉, 서버 측 프로그램뿐만 아니라 클라이언트 측 프로그램도 다른 클라이언트 측 프로그램을 생성할 수 있도록 ~{…}개의 식을 임의로 중첩할 수 있습니다.

HTML은 Hop 코드에 직접 삽입할 수 있습니다.서버에서 생성된 HTML(2~14행)이 클라이언트에 전달됩니다.클라이언트에서 생성된 HTML은 표준 DOM API (Line 6)를 사용하여 페이지에 추가할 수 있습니다.홉은 표준 라이브러리를 통해 실행 중인 서버와 실행 중인 클라이언트인스턴스 간의 양방향 통신을 지원합니다.클라이언트는 표준 HTML5 API(5행)를 통해 WebSocket 서버에 접속하여 현재 입력값(10행)을 전송합니다.서버는 WebSocket 서버(17행)를 열어 클라이언트(20행)에 값을 반환합니다.서버상에서 실행되어 서비스를 호출한 클라이언트에 반환되는 값을 생성하는 이른바 서비스입니다.예를 들어 에코 서비스(회선 1)는 에코 애플리케이션의 웹 클라이언트에 제공되는HTML 페이지를 생성합니다.따라서 서비스 블록 내의 코드가 서버에서 실행됩니다.

링크 내의 에코 어플리케이션

재밌어요 메아리치다(아이템) 서버 {   아이템 }  재밌어요 주된() 서버 {   페이지입니다.     < >html>       < >>         < >형태 l:온서밋="{appendChildren(<li>{stringToXml(에코(항목)))}<li>, getNodeById()목록."))}">           < >입력 l:이름.="항목" />           < >단추 유형="실패">에코!//단추>         </형태>         < > 아이디=리스트 />       </>     </html> }  주된() 

링크는 함수에 대한 주석을 사용하여 함수가 클라이언트 또는 서버(행 1 및 5)에서 실행될지 지정합니다.클라이언트의 요구에 따라 서버는 클라이언트에 송신되는 코드를 구성하는 메인 함수(Line 18)를 실행합니다.링크를 사용하면 XML 코드(7~15행)를 삽입할 수 있습니다.프리픽스가 l:인 XML Atribut은 특별히 취급됩니다.l:name 속성(행 10)은 입력 필드의 값이 바인드되는 식별자를 선언합니다.식별자는 다른 곳에서 사용할 수 있습니다(9행).l:onsubmit 핸들러(Line 9)에 대해 실행되는 코드는 즉시 실행되지 않고 클라이언트 측 실행을 위해 JavaScript로 컴파일됩니다.중괄호는 XML에 포함된 Links 코드를 나타냅니다.l:onsubmit 핸들러는 에코를 호출하여 현재 입력 값 항목을 서버로 보냅니다.이 항목은 서버에서 반환되며 표준 DOM API를 사용하여 수신된 항목 목록에 추가됩니다.서버(회선9)로의 콜은 클라이언트를 차단하지 않습니다.대신에, 콜의 결과가 사용 가능하게 되었을 때에, 클라이언트의 계속이 호출됩니다.클라이언트와 서버의 상호작용은 재개 패스 스타일에 근거하고 있습니다.계속 통과 스타일의 변환과 기능 해제를 사용하여 원격 호출은 계속에 필요한 함수의 이름과 계산을 계속하기 위해 필요한 데이터를 전달함으로써 구현됩니다.

ScalaLoci의 에코 어플리케이션

@더 많은 물건 어플 {   @peer 유형 서버 <: { 유형 넥타이 <: 싱글[고객] }   @peer 유형 고객 <: { 유형 넥타이 <: 싱글[서버] }     메세지 = [고객] { 이벤트[스트링]() }    에코 메시지 = [서버] { 메세지.로컬로서 }    방어하다 주된() = [고객] {      항목들 = 에코 메시지.로컬로서.목록.      목록. = 신호. { ol(항목들() 지도 { 메세지 => (메세지) }) }      입력 = 입력.표현하다     .문서. = (       나누다(         입력,         단추(클릭 := { () => 메세지.(입력.가치) })("메아리!")),       목록..asFrag).표현하다   } } 

ScalaLoci는 웹이 아닌 범용 분산 시스템을 대상으로 하는 언어입니다.즉, 클라이언트와 서버 아키텍처에 한정되지 않습니다.이를 위해 ScalaLoci는 피어 타입을 지원하여 타입 레벨에서 다른 계층을 부호화합니다.배치 유형은 데이터 및 계산에 위치를 할당하는 데 사용됩니다.ScalaLoci는 여러 피어 간에 데이터 흐름을 구성하기 위해 멀티티어 리액티브(특정 위치에 배치된 리액티브 프로그래밍용 언어 추상화)를 지원합니다.

애플리케이션은 먼저 ScalaTags [15]라이브러리를 사용하여 입력 필드(11행)를 정의합니다.이 필드의 값은 입력 필드의 현재 값으로 메시지이벤트를 기동하기 위해 버튼(행 15)의 클릭 이벤트핸들러에서 사용됩니다.그 후 값은 서버(회선 6)로 전파되어 클라이언트(회선 9)로 돌아갑니다.클라이언트에서는, 리스트 기능을 사용해 이벤트의 값을 축적해, HTML 리스트(10행)에 매핑 합니다.이 목록은 HTML(16행)에서 이전 입력을 표시하기 위해 사용됩니다.

다중 계층 프로그래밍 언어 목록

레퍼런스

  1. ^ Hull, Richard; Thiemann, Peter; Wadler, Philip (2007). "07051 Working Group Outcomes – Programming Paradigms for the Web: Web Programming and Web Services". Programming Paradigms for the Web: Web Programming and Web Services. Dagstuhl Seminar Proceedings. Dagstuhl, Germany: Internationales Begegnungs- und Forschungszentrum für Informatik (IBFI). 07051.
  2. ^ Weisenburger, Pascal; Wirth, Johannes; Salvaneschi, Guido (2020). "A Survey of Multitier Programming" (PDF). ACM Comput. Surv. 53 (4): 81:1–81:35. doi:10.1145/3397495. S2CID 218517772.
  3. ^ Caldwell, Sam (2016). "General Purpose Languages Extended for Distribution". In Miller, Heather (ed.). Programming Models for Distributed Computing.
  4. ^ a b Serrano, Manuel (2012). "Multitier programming in Hop". Commun. ACM. 55 (8): 53–59. doi:10.1145/2240236.2240253. S2CID 2152326.
  5. ^ a b Cooper, Ezra (2006). Links: Web Programming Without Tiers. 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.
  6. ^ a b Balat, Vincent (2006). "Ocsigen: typing web interaction with objective Caml": 84–94. doi:10.1145/1159876.1159889. S2CID 6131454. {{cite journal}}:Cite 저널 요구 사항 journal=(도움말)
  7. ^ a b Rajchenbach-Teller, D., & Sinot, Franois-Régis. (2010).Opa: 건전하고 안전한 웹을 위한 언어 지원.OWASP AppSec Research, 2010 (1)의 진행.
  8. ^ a b Bjornson, Joel; Tayanovskyy, Anton; Granicz, Adam (2010). "Composing Reactive GUIs in F# Using WebSharper". Proceedings of the 22nd International Conference on Implementation and Application of Functional Languages. Lecture Notes in Computer Science. Berlin, Heidelberg: Springer-Verlag. 6647: 49. doi:10.1007/978-3-642-24276-2_13. ISBN 978-3-642-24275-5.
  9. ^ a b Strack, Isaac (January 2012). Getting started with Meteor JavaScript framework. Birmingham. ISBN 978-1-78216-083-0. OCLC 823718999.
  10. ^ a b 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-1. OCLC 606556208.{{cite book}}: CS1 maint: 여러 이름: 작성자 목록(링크)
  11. ^ Giallorenzo, Saverio; Montesi, Fabrizio; Peressotti, Marco; Richter, David; Salvaneschi, Guido; Weisenburger, Pascal (2021). Møller, Anders; Sridharan, Manu (eds.). "Multiparty Languages: The Choreographic and Multitier Cases". 35th European Conference on Object-Oriented Programming (ECOOP 2021). Leibniz International Proceedings in Informatics (LIPIcs). Dagstuhl, Germany: 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). "Macroprogramming: Concepts, State of the Art, and Opportunities of Macroscopic Behaviour Modelling". ACM Computing Surveys. Association for Computing Machinery (ACM). doi:10.1145/3579353. ISSN 0360-0300.
  13. ^ Beal, Jacob; Pianini, Danilo; Viroli, Mirko (2015). "Aggregate Programming for the Internet of Things". Computer. Institute of Electrical and Electronics Engineers (IEEE). 48 (9): 22–30. doi:10.1109/mc.2015.261. ISSN 0018-9162.
  14. ^ Audrito, Giorgio; Casadei, Roberto; Damiani, Ferruccio; Salvaneschi, Guido; Viroli, Mirko (2022). Ali, Karim; Vitek, Jan (eds.). "Functional Programming for Distributed Systems with XC". 36th European Conference on Object-Oriented Programming (ECOOP 2022). Leibniz International Proceedings in Informatics (LIPIcs). Dagstuhl, Germany: 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. Retrieved 2021-10-11.
  16. ^ Serrano, Manuel (2006). "Hop: a language for programming the web 2.0": 975–985. doi:10.1145/1176617.1176756. S2CID 14306230. {{cite journal}}:Cite 저널 요구 사항 journal=(도움말)
  17. ^ Serrano, Manuel (2016). A glimpse of Hopjs. pp. 180–192. doi:10.1145/2951913.2951916. ISBN 9781450342193. S2CID 18393160.
  18. ^ Fowler, Simon (2019). "Exceptional asynchronous session types: session types without tiers". Proc. ACM Program. Lang. 3 (POPL): 28:1–28:29. doi:10.1145/3290341. S2CID 57757469.
  19. ^ Chlipala, Adam (2015). "Ur/Web: A Simple Model for Programming the Web": 153–165. doi:10.1145/2676726.2677004. S2CID 9440677. {{cite journal}}:Cite 저널 요구 사항 journal=(도움말)
  20. ^ Radanne, Gabriel (2018). Tierless Web Programming in the Large. pp. 681–689. doi:10.1145/3184558.3185953. ISBN 9781450356404. S2CID 3304415.
  21. ^ Weisenburger, Pascal (2018). "Distributed system development with ScalaLoci". Proc. ACM Program. Lang. 2 (OOPSLA): 129:1–129:30. doi:10.1145/3276499. S2CID 53090153.
  22. ^ Philips, Laure (2014). Towards Tierless Web Development without Tierless Languages. pp. 69–81. doi:10.1145/2661136.2661146. ISBN 9781450332101. S2CID 15774367.
  23. ^ Philips, Laure (2018). "Search-based Tier Assignment for Optimising Offline Availability in Multi-tier Web Applications". Programming Journal. 2 (2): 3. doi:10.22152/programming-journal.org/2018/2/3. S2CID 11256561.
  24. ^ Reynders, Bob (2014). Multi-Tier Functional Reactive Programming for the Web. pp. 55–68. doi:10.1145/2661136.2661140. ISBN 9781450332101. S2CID 16761616.
  25. ^ Carreton, Andoni Lombide (2010). Loosely-Coupled Distributed Reactive Programming in Mobile Ad Hoc Networks. Lecture Notes in Computer Science. Vol. 6141. pp. 41–60. doi:10.1007/978-3-642-13953-6_3. ISBN 978-3-642-13952-9.
  26. ^ Dedecker, Jessie (2006). "Ambient-Oriented Programming in Ambient Talk". Ambient-Oriented Programming in 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). Type-Safe Distributed Programming with ML5. Lecture Notes in Computer Science. 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). "A seamless, client-centric programming model for type safe web applications". ACM SIGPLAN Notices. 49 (12): 79–89. doi:10.1145/2775050.2633367. ISSN 0362-1340.
  29. ^ "Fun (a programming language for the realtime web)". marcuswest.in. Retrieved 2020-05-04.
  30. ^ Leijen, Daan (2014). "Koka: Programming with Row Polymorphic Effect Types". Electronic Proceedings in Theoretical Computer Science. 153: 100–126. arXiv:1406.2061. doi:10.4204/EPTCS.153.8. S2CID 14902937.
  31. ^ Neubauer, Matthias (2005). From sequential programs to multi-tier applications by program transformation. pp. 221–232. doi:10.1145/1040305.1040324. ISBN 158113830X. S2CID 10338936.
  32. ^ ChongStephen; LiuJed; C, MyersAndrew; QiXin; VikramK; ZhengLantian; ZhengXin (2007-10-14). "Secure web applications via automatic partitioning". ACM SIGOPS Operating Systems Review. 41 (6): 31–44. doi:10.1145/1323293.1294265. hdl:1813/5769.
  33. ^ Manolescu, Dragos (2008). "Volta: Developing Distributed Applications by Recompiling". IEEE Software. 25 (5): 53–59. doi:10.1109/MS.2008.131. S2CID 24360031.
  34. ^ Tilevich, Eli (2002). J-Orchestra: Automatic Java Application Partitioning. 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". Proceedings of the 1st ACM SIGPLAN International Workshop on Programming Language and Systems Technologies for Internet Clients - PLASTIC '11. New York, New York, USA: ACM Press: 49. doi:10.1145/2093328.2093337. ISBN 978-1-4503-1171-7. S2CID 1280230.
  36. ^ Thywissen, John A. (2016). "Implicitly Distributing Pervasively Concurrent Programs: Extended abstract": 1. doi:10.1145/2957319.2957370. S2CID 6124391. {{cite journal}}:Cite 저널 요구 사항 journal=(도움말)
  37. ^ Zdancewic, Steve (2002). "Secure program partitioning". 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). Dagstuhl, Germany: 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: Enforcing Confidentiality and Integrity in Web Applications". {{cite journal}}:Cite 저널 요구 사항 journal=(도움말)
  40. ^ Groenewegen, Danny M. (2008). "WebDSL: a domain-specific language for dynamic web applications": 779–780. doi:10.1145/1449814.1449858. S2CID 8073129. {{cite journal}}:Cite 저널 요구 사항 journal=(도움말)
  41. ^ Sewell, Peter (2005). "Acute: high-level programming language design for distributed computation": 15–26. doi:10.1145/1086365.1086370. S2CID 1308126. {{cite journal}}:Cite 저널 요구 사항 journal=(도움말)
  42. ^ Hemel, Zef (2011). Declaratively programming the mobile web with Mobl. pp. 695–712. doi:10.1145/2048066.2048121. ISBN 9781450309400. S2CID 10480906.
  43. ^ Richard-Foy, Julien (2013). Efficient high-level abstractions for web programming. pp. 53–60. doi:10.1145/2517208.2517227. ISBN 9781450323734. S2CID 14305623.