Ur (programovací jazyk) - Ur (programming language)
Paradigmata | funkční, reaktivní |
---|---|
Rodina | ML |
Navrhl | Adam Chlipala |
Poprvé se objevil | Prosince 2014 [1] |
Stabilní uvolnění | Vydání 20200209 / 9. února 2020 |
Plošina | POSIX |
Licence | otevřený zdroj |
Přípony názvu souboru | .ur, .urs, .urp |
webová stránka | předběžný |
Ovlivněno | |
Haskell, ML[2] |
Ur také zvaný Ur / Web je Volný, uvolnit a Otevřený zdroj funkční programovací jazyk specifické pro vývoj webových aplikací, vytvořil Adam Chlipala na Massachusetts Institute of Technology[3] který produkuje jediný program serveru kód, prohlížeč kód klienta a SQL kód specifický pro zvolený databáze backend.
Ur podporuje silný druh metaprogramování na základě typů řádků.[2]
Ur / Web je Ur plus speciální standardní knihovna a související pravidla pro analýza a optimalizace. Ur / Web podporuje konstrukci dynamické webové aplikace couval SQL databáze. Podpis standardní knihovny je takový, že dobře napsané programy pro Ur / Web „nepokazte se“ ve velmi širokém smyslu. Nejen, že nespadnou během konkrétních generací stránek, ale také nemusí:[2]
- Trpět jakýmkoli druhem vložení kódu útoky
- Návrat je neplatný HTML
- Obsahují mrtvé odkazy v rámci aplikace
- Mít neshody mezi Formuláře HTML a pole očekávaná jejich manipulátory
- Zahrnout kód na straně klienta, který vytváří nesprávné předpoklady o „AJAX "služby stylu, které poskytuje vzdálený webový server
- Pokus je neplatný SQL dotazy
- Používejte nesprávně zařazování nebo unshaling v komunikaci s SQL databáze nebo mezi prohlížeče a webové servery
Tento bezpečnost typu je jen základem metodiky Ur / Web. Je také možné použít metaprogramování k vytvoření významných částí aplikace analýzou struktury typu.[2]
The Ur / Web překladač také vytváří velmi efektivní objektový kód, který se nepoužívá odvoz odpadu.[2]
Implementace toho všeho je otevřený zdroj.[2]
SQL syntaxe šablony vložené v jazyce usnadňují manipulaci s tabulkami.
Ačkoli je syntaxe založena na Standardní ML jazyk zahrnuje koncepty z Haskell s další manipulací s typem.
Ajax volání / odpověď je serializováno pomocí monad volala transakce (odpovídá Haskell IO) a jeho seřaďování a dekódování je zapouzdřeno v RPC funkce.
Zahrnuje stranu klienta prohlížeče funkční reaktivní programování zařízení využívající (zdroj a)
typ a signál monad.
„Řekněme, že chcete mít na své webové stránce widget kalendáře a budete používat knihovnu, která poskytuje widget kalendáře, a na stejné stránce je také reklamní pole založené na kódu poskytovaném reklamní sítí , “Řekl Chlipala.
„Nechcete, aby reklamní síť dokázala změnit fungování kalendáře, nebo autor kódu kalendáře, aby mohl zasahovat do zobrazování reklam.“Ukázkový program
Toto je ukázkový program zobrazující kód klienta, serveru a databáze s Ajax komunikace, z webových ukázek,[5] s dalšími komentáři k obrysu každé ze složek:
Soubor rozhraní (ML -jako podpis) s příponou .urs:
(* prostředí monad se nazývá transakce, odpovídá Haskell IO monad *)val hlavní : jednotka -> transakce strana
Implementační soubor (přípona .ur):
datový typ seznam t = Nula | Nevýhody z t * seznam tstůl t : { Id : int, A : tětiva } HLAVNÍ KLÍČ Id(* přístup k databázi na straně serveru, volán prostřednictvím AJAX XmlHttpRequest zapouzdřený jako funkce '' rpc '' (vzdálené volání procedury) *)zábava přidat id s = (* šablona sql dml s {[výraz]} *) dml (VLOŽIT DO t (Id, A) HODNOTY ({[id]}, {[s]}))zábava del id = dml (VYMAZAT Z t KDE t.Id = {[id]})zábava vzhlédnout id = (* monadický kód ve stylu haskell *) ro <- oneOrNoRows (VYBRAT t.A Z t KDE t.Id = {[id]}); případ ro z Žádný => vrátit se Žádný (* návrat je zvedací funkce '' monad '' *) | Nějaký r => vrátit se (Nějaký r.T.A)(* '' check '' volaný na straně klienta obsluhou události onClick, takže bude zkompilován do JavaScriptu jako klientský skript vložený do stránky *)zábava šek je = případ je z Nula => vrátit se () | Nevýhody (id, to je) => ao <- RPC (vzhlédnout id); (* Volání Ajaxu na stranu serveru *) výstraha (případ ao z Žádný => "Naďa" | Nějaký A => A ); šek to jezábava hlavní () = idAdd <- zdroj ""; aPřidat <- zdroj ""; idDel <- zdroj ""; (* generuje webovou stránku s inkluzemi JavaScriptu *) vrátit se <xml><body> hodnota=„Zkontrolovat hodnoty 1, 2 a 3“ při kliknutí={fn _ => nechat val můj seznam = 1 :: 2 :: 3 :: [] v šek můj seznam konec }/>
<br/> hodnota="Přidat" při kliknutí={fn _ => id <- dostat idAdd; A <- dostat aPřidat; RPC (přidat (readError id) A) (* Ajax volání na stranu serveru *) }/> zdroj={idAdd}/> zdroj={aPřidat}/>
<br/> hodnota="Vymazat" při kliknutí={fn _ => id <- dostat idDel; RPC (del (readError id)) (* Volání Ajaxu na stranu serveru *) }/> zdroj={idDel}/> </body></xml>
Soubor projektu (přípona .urp), musí obsahovat seznam volitelných směrnic následovaný seznamem modulů projektu:[6]
# hash komentáře s předponou řádkupřepsat url Module1 / main # nastavit kořenovou adresu URL na funkci Module1 / mainexe myexenamedatabase dbname = test # database attrib. a parametrysql noisy.sql
$ / seznam # modulů stdlib s předponou „$ /“modul2 # pokud je používán modulem1, musí to předcházetmodul1 # hlavní modul
- strana serveru, funkce načítání stránek bez vedlejších účinků (metoda HTTP GET) jsou přístupné prostřednictvím adresy URL jako / ModulePath / functionName, měly by mít typ (jednotka -> stránka transakce).
- Chcete-li exportovat stránku, která může způsobovat vedlejší účinky, přístupná pouze přes HTTP POST, uveďte jeden argument obslužné rutiny stránky typu Základna. Tělo.[7]
Kompilovat:
modul urweb1 # hledá module1.urp
Provádět jako webový server (ostatní režimy jsou CGI, FastCGI, ...):
./module1.exe -p 8081 # -h: Nápověda k RTS
Knihovny
Speciální funkce a problémy
- Aktualizace záznamu
datový typ mystruc k proti = Prázdný | Uzel z {Klíč: k, Hodnota: proti}zábava setKey [k][proti] (* typ polymorfismu *) (_: ord k) (* implicitní instance třídy ord *) (callerErrNote: tětiva) (k1: k) (můj: mystruc k proti) : mystruc k proti = -li k1 < kmin pak chyba setKey : ilegální k1 {[callerErrNote]}</xml> jiný případ můj z Uzel r => Uzel (r -- #Klíč ++ {Klíč = k1}) | _ => chyba setKey : ne A Uzel {[callerErrNote]}</xml>
odpovídající podpis (druhové poznámky (:: :) implicitní; (: :) explicitní):
ošidit mystruc :: Typ -> Typ -> Typ (* dva konstruktor typu parametrů *)val setKey : k ::: Typ -> proti ::: Typ -> ord k -> tětiva -> k -> mystruc k proti -> mystruc k proti
- Zaznamenejte elipsu polí
případ můj z Uzel {Klíč = k, ...} => dělat cokoliv k | _ => ....
- Chyba „Substituce v konstruktoru je blokována příliš hlubokou proměnnou sjednocení“[8]
K této chybě dochází u typů arity> 0 ve vnořených případ nebo nechat klauzule a zmizí podle typu, který anotuje proměnné ve vnořených klauzulích.
Reference
- ^ UrWeb je mimo beta verzi
- ^ A b C d E F „Rodina programovacích jazyků UR“. impredicative.com/ur. Citováno 3. dubna 2016.
- ^ Chlipala, Adam (Leden 2015). „Ur / Web: jednoduchý model pro programování webu“. MIT / Asociace pro výpočetní techniku (ACM). Citováno 5. ledna 2015.
- ^ „Vyjmutí práce na vývoji webu“. mit.edu. 23. prosince 2014. Citováno 29. prosince 2016.
- ^ Ukázkové programy v jazyce Ur
- ^ Chlipala, Adam (Leden 2015). „Manuál Ur / Web - soubory projektu“. https://enn.github.io/urweb-doc. Citováno 8. ledna 2015. Externí odkaz v
| vydavatel =
(Pomoc) - ^ Příručka Ur / Web - Struktura webových aplikací
- ^ Neočekávaná chyba typu: „Substituce v konstruktoru je blokována příliš hlubokou proměnnou sjednocení“