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ı). 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. Kóp dárejeli programmalastırıw kóbinese ulıwma maqsetli tillerge olardı bólistiriwdi qollap-quwatlaw menen keńeytiw arqalı integraciyalanadı.

Kóp dárejeli programmalastırıw koncepciyaları Hop hám Links tillerinde birinshi bolıp islep shıǵıldı hám Ocsigen, Opa, WebSharper, Meteor yamasa GWT 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, makroprogrammalastırıw, hám agregatlı esaplaw sıyaqlı basqa programmalastırıw paradigmalarına uqsas ekeni kórsetilgen.

## 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ı

```lisp
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ı

```java
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ı

```scala
@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). 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

__BÖLİDİMÖNDEMEW__