Kóp dárejeli programmalastırıw
Kóp dárejeli programmalastırıw (yamasa dárejesiz programmalastırıw) — bul ádette kóp dárejeli arxitekturaǵa sáykes keletuǵın, programmalıq támiynattıń hár túrli funkcional aspektlerin fizikalıq túrde hár túrli dárejelerge ajıratatuǵın bólistirilgen programmalıq támiynat ushın programmalastırıw paradigması (mısalı, Veb qosımshasında klient, server hám maǵlıwmatlar bazası[1]). Kóp dárejeli programmalastırıw bunday bir neshe dárejelerdi qamtıytuǵın funkcional imkaniyatlardı bir programmalastırıw tilin paydalanıp, bir kompilyaciya birliginde islep shıǵıwǵa imkaniyat beredi. Kóp dárejeli programmalastırıwsız, dárejeler hár túrli tillerdi paydalanıp islep shıǵıladı, mısalı, Veb klienti ushın JavaScript, Veb serveri ushın PHP hám maǵlıwmatlar bazası ushın SQL[2]. Kóp dárejeli programmalastırıw kóbinese ulıwma maqsetli tillerge olardı bólistiriwdi qollap-quwatlaw menen keńeytiw arqalı integraciyalanadı[3].
Kóp dárejeli programmalastırıw koncepciyaları Hop[4] hám Links[5] tillerinde birinshi bolıp islep shıǵıldı hám Ocsigen,[6] Opa, WebSharper,[7] Meteor[8] yamasa GWT[9] sıyaqlı sheshimlerde sanaatlıq qabıl etiliwge eristi.
Kóp dárejeli programmalastırıw bólistirilgen sistemaǵa ulıwma kózqaras usınadı. Bul aspekt xoreografiyalıq programmalastırıw,[10] makroprogrammalastırıw,[11] hám agregatlı esaplaw sıyaqlı basqa programmalastırıw paradigmalarına uqsas ekeni kórsetilgen[12][13].
Kontekst
Hár túrli dárejelerdiń kodı hár túrli tarmaqqa jalǵanǵan kompyuterlerde bólistirilgen túrde orınlanıwı múmkin. Mısalı, úsh dárejeli arxitekturada sistema úsh tiykarǵı qatlamǵa bólinedi – ádette usınıw, biznes hám maǵlıwmat dárejeleri. Bul usıldıń paydası — sistemanı qatlamlarǵa bóliw arqalı, qatlamlardıń birinde ámelge asırılǵan funkcional imkaniyat basqa qatlamlardan ǵárezsiz ózgertiliwi múmkin. Ekinshi tárepten, bul arxitekturalıq sheshim bir neshe dárejelerge tiyisli bolǵan kesip ótiwshi funkcional imkaniyattı bir neshe kompilyaciya birlikleri boyınsha shashıratadı.
Kóp dárejeli programmalastırıwda hár túrli dárejeler bir programmalastırıw tilin paydalanıp ámelge asırıladı. Hár túrli kompilyaciya backendleri maqsetli dárejeni esapqa aladı (mısalı, server ushın Java hám veb brauzer ushın JavaScript). Nátiyjede, dárejeler boyınsha tarqalǵan funkcional imkaniyat kóp dárejeli programmanıń bir kompilyaciya birliginde ámelge asırılıwı múmkin.
Mısal
Negizinde, kóp dárejeli tiller baǵdarlamashılarǵa kodtıń hár túrli bólimleri ushın kodtıń tiyisli bolǵan dárejelerin anıqlawǵa múmkinshilik beredi. Bul anıqlamanı múmkin etetuǵın til ózgeshelikleri hár túrli kóp dárejeli tiller arasında júdá hár qıylı bolıp, basqıshlawdan annotaciyalarǵa, tiplerge shekem. Tómendegi mısal hár túrli usıllardı kórsetetuǵın Echo klient-server qosımshasın kórsetedi. Mısalda klient serverge xabar jiberedi hám server sol xabardı klientke qaytaradı, onda ol qabıl etilgen xabarlar dizimine qosıladı.
Hop.js tilindegi Echo qosımshası
service echo() {
var input = <input type="text" />
return <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 = function(event){
var ws = event.value
ws.onmessage = function(event) { ws.send(event.value) }
}
Hop klientte orınlanıwı kerek bolǵan kodtı server táreptegi programmaǵa jaylastırıw ushın basqıshlawdı paydalanadı: ~{…} belgisin paydalanıp, onload (4-qatar) hám onclick (10-qatar) qayta islewshileri ushın kod dárhal orınlanbaydı, biraq server klientte keyinirek orınlanıw ushın kodtı payda etedi. Ekinshi tárepten, ${…} belgisi programma generaciyasınıń bir dárejesinen qashadı. hop.port (5-qatar), event.data (6-qatar) hám input (9 hám 10-qatarlar) ańlatpaları sırtqı server programması tárepinen bahalanadı hám olar bahalanǵan mánisler payda bolǵan klient programmasına kirgiziledi. Hop tolıq basqıshlı programmalastırıwdı qollap-quwatlaydı, yaǵnıy ~{…} ańlatpaları qálegen dárejede ishki jaylasıwı múmkin, solay etip tek server táreptegi programmalar ǵana klient táreptegi programmalardı payda ete almaydı, al klient táreptegi programmalar da basqa klient táreptegi programmalardı dúze aladı.
HTML Hop kodına tikkeley jaylastırılıwı múmkin. Serverde dúzilgen HTML (2–14-qatarlar) klientke beriledi. Klientte dúzilgen HTML standart DOM API (6-qatar) arqalı betke qosılıwı múmkin. Hop standart kitapxanası arqalı islep turǵan server menen islep turǵan klient instanciyası arasında eki tárepleme baylanıstı qollap-quwatlaydı. Klient standart HTML5 API (5-qatar) arqalı WebSocket serverine jalǵanadı hám aǵımdaǵı kirgiziw mánisin jiberedi (10-qatar). Server mánisti klientke qaytaratuǵın WebSocket serverin ashadı (20-qatar). Serverde orınlanatuǵın hám xızmetti shaqırǵan klientke mánis qaytaratuǵın «xızmetler» dep atalatuǵın nárseler. Mısalı, echo xızmeti (1-qatar) Echo qosımshasınıń veb klientine beriletuǵın HTML betin payda etedi. Solay etip, xızmet blogındaǵı kod serverde orınlanadı.
Links tilindegi Echo qosımshası
fun echo(item) server {
item
}
fun main() server {
page
<html>
<body>
<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>
}
main()
Links funkciyalardıń klientte yamasa serverde isleytuǵının kórsetiw ushın funkciyalardaǵı annotaciyalardı paydalanadı (1 hám 5-qatarlar). Klientten soraw kelgende, server main funkciyasın orınlaydı (18-qatar), bul klientke jiberiletuǵın kodtı quraydı. Links XML kodın jaylastırıwǵa imkaniyat beredi (7–15-qatarlar). l: prefiksi bar XML atributları arnawlı túrde qayta islenedi. l:name atributı (10-qatar) kirgiziw maydanınıń mánisi baylanıstırılǵan identifikator járiyalaydı. Bul identifikator basqa jerlerde paydalanılıwı múmkin (9-qatar). l:onsubmit qayta islewshisi ushın orınlanıwı kerek bolǵan kod (9-qatar) dárhal orınlanbaydı, al klient tárepte orınlanıw ushın JavaScriptke kompilyaciya etiledi. Figuralı qawsırmalar XML-ge jaylastırılǵan Links kodın bildiredi. l:onsubmit qayta islewshisi echo-nı shaqırıw arqalı aǵımdaǵı kirgiziw mánisi item-di serverge jiberedi. item server tárepinen qaytarıladı hám standart DOM API-lerin paydalanıp qabıl etilgen elementler dizimine qosıladı. Serverge shaqırıw (9-qatar) klientti bloklamaydı. Onıń ornına, klienttegi dawam etiw shaqırıwdıń nátiyjesi bar bolǵanda shaqırıladı. Klient-server óz-ara tásiri qayta baslawdı beriw stiline tiykarlanǵan: dawam etiwdi beriw stilin túrlendiriw hám defunkcionalizaciya paydalanıp, aralıq shaqırıwlar dawam etiw ushın funkciyanıń atın hám esaplawdı dawam etiw ushın kerekli maǵlıwmatlardı beriw arqalı ámelge asırıladı.
ScalaLoci tilindegi Echo qosımshası
@multitier object Application {
@peer type Server <: { type Tie <: Single[Client] }
@peer type Client <: { type Tie <: Single[Server] }
val message = on[Client] { Event[String]() }
val echoMessage = on[Server] { message.asLocal }
def main() = on[Client] {
val items = echoMessage.asLocal.list
val list = Signal { ol(items() map { message => li(message) }) }
val inp = input.render
dom.document.body = body(
div(
inp,
button(onclick := { () => message.fire(inp.value) })("Echo!")),
list.asFrag).render
}
}
ScalaLoci tek ǵana Vebke emes, al ulıwma bólistirilgen sistemalarǵa baǵdarlanǵan til, yaǵnıy ol klient-server arxitekturası menen sheklenbegen. Usı maqsette, ScalaLoci hár túrli dárejelerdi tip dárejesinde kodlaw ushın teń tipin qollap-quwatlaydı. Jaylastırıw tipleri maǵlıwmatlarǵa hám esaplawlarǵa jaylasıw ornın tayınlaw ushın paydalanıladı. ScalaLoci kóp dárejeli reaktivlerdi — hár túrli teńler arasında maǵlıwmat aǵımların dúziw ushın belgili bir orınlarda jaylasqan reaktiv programmalastırıw ushın til abstrakciyaların — qollap-quwatlaydı.
Qosımsha birinshi ScalaTags kitapxanasın paydalanıp kirgiziw maydanın anıqlaydı (11-qatar)[14]. Bul maydan mánisi túymeniń basıw waqıyası qayta islewshisinde (15-qatar) kirgiziw maydanınıń aǵımdaǵı mánisi menen xabar waqıyasın iske túsiriw ushın paydalanıladı. Mánis sonnan keyin serverge (6-qatar) hám klientke qaytarıladı (9-qatar). Klientte waqıya mánisi dizim funkciyası arqalı jıynaladı hám HTML dizimine (10-qatar) sáwlelendiriledi. Bul dizim keyin aldınǵı kirgiziwlerdi kórsetiw ushın HTML-de (16-qatar) qollanıladı.
Derekler
- ↑ 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. http://drops.dagstuhl.de/opus/volltexte/2007/1127.
- ↑ Weisenburger, Pascal; Wirth, Johannes; Salvaneschi, Guido (2020). "A Survey of Multitier Programming". ACM Comput. Surv. 53. http://www.alexandria.unisg.ch/267228/1/2020_A-Survey-of-Multitier-Programming.pdf.
- ↑ Caldwell, Sam. Programming Models for Distributed Computing, 2016.
- ↑ Serrano, Manuel (2012). Multitier programming in Hop.. 55. pp. 53–59. doi:10.1145/2240236.2240253. https://dblp.org/rec/journals/cacm/SerranoB12.html.
- ↑ Cooper, Ezra „Links: Web Programming Without Tiers“,. Formal Methods for Components and Objects, Lecture Notes in Computer Science, 2006 — 266–296 bet. DOI:10.1007/978-3-540-74792-5_12. ISBN 978-3-540-74791-8.
- ↑ Balat, Vincent (2006). Ocsigen: typing web interaction with objective Caml.. pp. 84–94. doi:10.1145/1159876.1159889. https://dblp.org/rec/conf/ml/Balat06.html.
- ↑ Bjornson, Joel „Composing Reactive GUIs in F# Using WebSharper“,. Implementation and Application of Functional Languages, Lecture Notes in Computer Science, 2010. DOI:10.1007/978-3-642-24276-2_13. ISBN 978-3-642-24275-5.
- ↑ Strack, Isaac. Getting started with Meteor JavaScript framework, January 2012. ISBN 978-1-78216-083-0.
- ↑ Kereki, Federico, 1960-. Essential GWT: building for the web with Google Web toolkit 2, 2011. ISBN 978-0-321-70563-1.
- ↑ 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. https://drops.dagstuhl.de/opus/volltexte/2021/14065.
- ↑ 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)) 55: 1–37. doi:10.1145/3579353.
- ↑ Beal, Jacob; Pianini, Danilo; Viroli, Mirko. "Aggregate Programming for the Internet of Things". Computer (Institute of Electrical and Electronics Engineers (IEEE)) 48: 22–30. doi:10.1109/mc.2015.261.
- ↑ 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. https://drops.dagstuhl.de/opus/volltexte/2022/16248.
- ↑ «ScalaTags». www.lihaoyi.com. Qaraldı: 2021-jıl 11-oktyabr.