ZuriHac: harjutame funktsionaalset programmeerimist

Sel aasta juunis toimus Ć veitsi vĂ€ikeses linnas Rapperswilis juba kĂŒmnendat korda ĂŒritus nimega ZuriHac. Seekord kogunes sinna ĂŒle viiesaja Haskell'i sĂ”bra, alates algajatest kuni keele asutajateni. Kuigi korraldajad nimetavad seda ĂŒritust hackathoniks, ei ole see siiski klassikalises mĂ”ttes konverents vĂ”i hackathon. Selle formaat erineb traditsioonilistest programmeerijate ĂŒritustest. Me saime ZuriHac'ist teada Ă”nneliku juhuse lĂ€bi, osalesime selles ja nĂŒĂŒd peame kohuseks rÀÀkida sellest erakordsest leidust!

ZuriHac: harjutame funktsionaalset programmeerimist

Meist

Selle artikli koostasid kaks 3. kursuse tudengit NII VSHE - Peterburi rakendatud matemaatika ja informaatika programmist: Vasili Alfjorov ja Elizaveta Vasilenko. Meie kummagi huvi funktsionaalse programmeerimise vastu algas D. N. Moskvin'i loengusari teisel ĂŒlikooli aastal. Praegu osaleb Vasili Google Summer of Code programmis, mille raames tegeleb algebraliste graafide realiseerimisega Haskell'i keeles projekti meeskonna juhendamisel. Alga. Elizaveta kasutas funktsionaalse programmeerimise oskusi oma kursusetöös, mis puudutab anti-unifikatsiooni algoritmi realiseerimist, millele jĂ€rgnes rakendamine tĂŒĂŒpiteoorias.

Ürituse formaat

Sihtgrupiks on avatud lĂ€htekoodiga projektide omanikud, programmeerijad, kes soovivad nende arengus osaleda, funktsionaalse programmeerimise uurijad ja lihtsalt Haskellist inspireeritud inimesed. Sel aastal toimus ĂŒritus HSR Hochschule fĂŒr Technik Rapperswilis, kus kogunes arendajaid ĂŒle viiekĂŒmne Haskell'i avatud projekti kogu maailmast, et rÀÀkida oma toodetest ja köita uusi inimesi nende arengusse.

ZuriHac: harjutame funktsionaalset programmeerimist

Twitterist foto ZuriHac

Schema on vĂ€ga lihtne: tuleb ette valmistada paar lauset oma projekti kohta ja saata need korraldajatele, kes postitavad teabe teie projekti kohta ĂŒrituse lehele. Lisaks on esimesel pĂ€eval projektide autoritel kolmkĂŒmmend sekundit, et lavalt vĂ€ga lĂŒhidalt rÀÀkida, millega nad tegelevad ja mida on vaja teha. SeejĂ€rel otsivad huvitatud inimesed autori ĂŒles ja kĂŒsivad detailide kohta.

Meil pole praegu oma avatud projekte, kuid tahame vĂ€ga panustada juba olemasolevatesse, seetĂ”ttu registreerisime end tavaliste osalejatena. Kolme pĂ€eva jooksul tegutsesime kahe arendajagrupiga. Selgus, et koodi ĂŒhisĂ”pe ja otsekontakt muudab projekti autorite ja kaastöötajate koostöö vĂ€ga produktiivseks – ZuriHacis suutsime aru saada meile uudsetest valdkondadest ja aitasime kahes tĂ€iesti erinevas meeskonnas, lahendades igas projektis ĂŒlesande.

Lisaks vÀÀrtuslikule praktikale kanti ZuriHacis ĂŒle mitmeid loenguid ja töötube. Meelde jĂ€id eriti kaks loengut. Esimeses rÀÀkis Andrei Mohov Newcastle'i ĂŒlikoolist selektiivsetest aplikaatorfunktsioonidest — tĂŒĂŒpperekonnast, mis peaks jÀÀma vahepeale aplikaatorfunktsioonide ja monaadide vahel. Teises loengus rÀÀkis ĂŒks Haskelliga seotud asutajatest, Simon Peyton Jones, sellest, kuidas toimub tĂŒĂŒpide jĂ€reldamine GHC kompilaatoris.

ZuriHac: harjutame funktsionaalset programmeerimist

Simon Peyton Jonesi loeng. Foto Twitterist ZuriHac

Hakatoni ajal toimunud töötubasid jagati kolme kategooriasse osalejate ettevalmistustaseme pĂ”hjal. Osalejatele, kes liitusid projektide arendamisega, pakuti ka ĂŒlesandeid, mis olid mĂ€rgitud keerukuse tasemega. VĂ€heste, kuid ĂŒhtse funktsionaalse programmeerimise kogukond vĂ”tab rÔÔmuga uusi liikmeid. Siiski oli vajalik, et oleksime kĂ€inud ĂŒlikooli funktsionaalse programmeerimise kursusel, et mĂ”ista Andrei Mohovi ja Simon Peyton Jonesi loenguid.

N nii tavaliste osalejate kui ka projektide autorite jaoks on ĂŒritusele registreerimine tasuta. Esitasime osalemise taotlused juuni alguses, pĂ€rast mida viidi meid suhteliselt kiiresti ootejĂ€rjekorrast kinnitatud osalejate nimekirja.

Ja nĂŒĂŒd rÀÀgime projektidest, mille arenduses me osalesime.

Pandoc

Pandoc on universaalne tekstidokumendi konverter, tegelikult — mis tahes formaadist mis tahes formaati. NĂ€iteks docx-st pdf-ks vĂ”i Markdown-ist MediaWiki-ks. Selle autor, John MacFarlane, on Berkeley California ĂŒlikooli filosoofia professor. Üldiselt on Pandoc ĂŒsna tuntud ja mĂ”ned meie tuttavad olid ĂŒllatunud, kui teada said, et Pandoc on kirjutatud Haskellis.

ZuriHac: harjutame funktsionaalset programmeerimist

Dokumentide formaadid, mida Pandoc toetab. Veebisaidil on ka terve diagramm, kuid see pilt ei mahu artiklisse.

Kahjuks ei toeta Pandoc iga vormingu paari otse konversiooni. Laia valiku teisenduste toetamiseks kasutatakse standardset arhitektuurilahendust: kĂ”igepealt konverteeritakse kogu dokument spetsiaalsesse sisemisse vahepealsesse esitusele ja seejĂ€rel genereeritakse selle sisemise esitusviisi pĂ”hjal dokument teises formaadis. Arendajad nimetavad sisemist esitust «AST» ehk abstraktne sĂŒntaksipuu. abstraktne sĂŒntaksipuu. Sisemise esitusviisi vaatamine on vĂ€ga lihtne: selleks tuleb vaid mÀÀrata vĂ€ljundi formaadiks «native».

$ cat example.html
<h1>Tere, maailm!</h1>

$ pandoc -f html -t native example.html
[Header 1 ("hello-world",[],[]) [Str "Tere,",Space,Str "Maailm!"]]

Lugijad, kes on vÀhemalt pisut töötanud Haskelliga, vÔivad selle vÀikese nÀite pÔhjal jÀreldada, et Pandoc on kirjutatud just Haskellis: selle kÀsu vÀljund on Pandoci sisemiste struktuuride esitus stringina, mis on loodud sarnaselt sellele, kuidas seda tavaliselt Haskellis tehakse, nÀiteks standardraamatukogus.

Nii et siin on nĂ€ha, et sisemine esitus on rekursiivne struktuur, kus igas sisemises sĂ”lmes on nimekiri. NĂ€iteks ĂŒlemisel tasemel on ĂŒhe elemendi nimekiri - esimesse jĂ€rku pealkiri atribuutidega “hello-world”, [], []. Selle pealkirja sees on peidetud nimekiri stringist “Hello,”, tĂŒhikust ja stringist “World!”.

Nagu nÀha, ei erine sisemine esitus palju HTML-ist. See esindab puu, kus iga sisemine sÔlm edastab teavet oma jÀreltulijate vormindamise kohta, ja lehtedes on dokumendi sisu.

Kui minna konkreetse rakenduse tasemele, on kogu dokumendi andmetĂŒĂŒp mÀÀratletud jĂ€rgmiselt:

data Pandoc = Pandoc Meta [Block]

Siin on Block just need sisemised tipud, millest ĂŒlalpool rÀÀgiti, ja Meta on dokumendi metaandmed, nagu pealkiri, loomiskuupĂ€ev, autorid - eri formaadid sisaldavad erinevat teavet ja Pandoc pĂŒĂŒab seda teavet vĂ”imalusel sĂ€ilitada formaadi vahetamisel.

Peaaegu kĂ”ik Block-tĂŒĂŒpi konstructorid — nĂ€iteks Header vĂ”i Para (paragraft) — vĂ”tavad argumentidena atribuudid ja madalama taseme tipud — tavaliselt Inline. NĂ€iteks Space vĂ”i Str on Inline-tĂŒĂŒpi konstructorid, samuti muutub HTML-element oma eriliseks Inline'iks. Me ei nĂ€e mĂ”tet tuua vĂ€lja nende tĂŒĂŒpide tĂ€pset mÀÀratlust, kuid mĂ€rgime, et seda saab vaadata siin: siin.

Huvitav, et Pandoc'i tĂŒĂŒp on monoid. See tĂ€hendab, et olemas on mĂ”ni tĂŒhi dokument ja et dokumente saab omavahel liita. Seda on mugav kasutada Reader'ite kirjutamisel — dokumenti saab jagada osadeks, kasutada esitlust loogikaga, analĂŒĂŒsida iga osa eraldi ja siis kogu kokku panna ĂŒheks dokumendiks. Samuti koondatakse metaandmed otse dokumenti kĂ”igist osadest.

Konverteerimisel nĂ€iteks LaTeX'ist HTML'isse, kĂ”igepealt spetsiaalne moodul nimega LaTeXReader teisendab sisenddokumendi AST-ks, seejĂ€rel teine moodul nimega HTMLWriter teisendab AST'i HTML'iks. Sellise arhitektuuri tĂ”ttu ei pea kirjutama kvadratiivset arvu konversioone — piisab iga uue formaadi jaoks kirjutada Reader ja Writer ning kĂ”ik vĂ”imalikud konversioonipaarid hakkavad automaatselt toetama.

On selge, et sellisel arhitektuuril on ka oma puudused, mida on juba ammu ennustatud tarkvaraarhitektuuri spetsialistide poolt. KĂ”ige olulisem on sĂŒntakspuidu muutmise kulu. Kui muudatus on piisavalt tĂ”sine, tuleb muuta koodi kĂ”igis Reader'ites ja Writer'ites. NĂ€iteks ĂŒks Pandoc'i arendajate ees seisvaid ĂŒlesandeid on keeruliste tabeliformaatide toetamine. Praegu suudab Pandoc luua vaid kĂ”ige lihtsamaid tabeleid, millel on pealkiri, veerud ja vÀÀrtused igas lahtris. NĂ€iteks HTML'is ignoreeritakse lihtsalt colspan atribuuti. Üks pĂ”hjusi sellise kĂ€itumise taga on, et puudub ĂŒhtne skeem tabelite esitamiseks kĂ”igis vĂ”i vĂ€hemalt paljudes formaatides — seega on ebaselge, millises vormis tuleb tabelid salvestada sisemises esitusviisis. Kuid isegi pĂ€rast konkreetse esitlusviisi valimist tuleb muuta absoluutset kĂ”iki Reader'ite ja Writer'ite, mis toetavad tabelitega töötamist.

Haskell'i keel ei valitud mitte ainult autorite suurt armastust funktsionaalse programmeerimise vastu. Haskell on tuntud oma ulatuslike tekstide töötlemise vĂ”imaluste poolest. Üks nĂ€iteid on kirjasto parsec — könylibibliok, mis kasutab aktiivselt funktsionaalse programmeerimise kontseptsioone — monoidid, monaadid, applicative ja alternatiivsed funtorid — suvaliste parserite kirjutamiseks. Terve Parsec'i vĂ€gi on nĂ€htav nĂ€ites HaskellWiki's, kus kĂ€sitletakse lihtsa imperatiivse programmeerimiskeele tĂ€iendavat parserit. Loomulikult kasutatakse Parsec'i aktiivselt ka Pandoc'is.

LĂŒhidalt öeldes kasutatakse monaade jĂ€rjestikuseks parsimiseks, kus alul kĂ€ib ĂŒks, siis teine. NĂ€iteks sellises nĂ€ites:

whileParser :: Parser Stmt
whileParser = whiteSpace >> statement

Esmalt tuleb lugeda tĂŒhik ja siis statement — mis on ka tĂŒĂŒp Parser Stmt.

Alternatiivseid funtoreid kasutatakse tagasiastumiseks, kui parsimine ebaÔnnestub. NÀiteks,

statement :: Parser Stmt
statement = parens statement  sequenceOfStmt

See tĂ€hendab, et tuleb kas proovida lugeda statement'i sulgudes vĂ”i jĂ€rjest proovida lugeda mitut statement’i.

Applicative funtoreid kasutatakse peamiselt lĂŒhikeste teedena monaadide jaoks. NĂ€iteks, oletame, et funktsioon tok loeb mingi token'i (see on reaalselt funktsioon LaTeXReader'ist). Vaatame sellist kombinatsiooni

const <$ tok  tok

See loeb kaks token'it jÀrjest ja tagastab neist esimesena.

Kogu selle klassi jaoks on Haskell'is olemas ilusad sĂŒmboolsed operaatorid, mis muudavad Reader'ite programmeerimise sarnaseks ASCII-art'iga. Ainult imetlege seda imelise koodi.

Meie ĂŒlesanded olid seotud LaTeXReader'iga. Vasja ĂŒlesanne oli toetada mbox ja hbox kĂ€ske, mis on kasulikud LaTeX'i paketide kirjutamisel. Elizabeti vastutusala oli epigraph kĂ€su tugi, mis vĂ”imaldab kujundada epigraafe LaTeX dokumentides.

Hatrace

UNIX-laadsetes operatsioonisĂŒsteemides on sageli rakendatud sĂŒsteemikutsu ptrace. See on kasulik programmi keskkondade tĂ”rgeteotsingul ja simuleerimisel, vĂ”imaldades jĂ€lgida sĂŒsteemikutsesid, mida programm teeb. NĂ€iteks vĂ€ga kasulik utiliit strace kasutab enda sees just ptrace'i.

Hatrace on Haskell'i ptrace'i liidese pakkuv teekond. Asi on selles, et ptrace ise on vĂ€ga keeruline ja selle otsene kasutamine on ĂŒsna raske, eriti funktsionaalsetes keeltes.

Hatrace töötab kÀivitamisel strace'i sarnaselt ja vÔtab vastu sarnaseid argumente. Selle erinevus strace'ist on see, et see on ka teekond, mis pakub lihtsamat liidest kui lihtsalt ptrace.

Hatrace'i abil on juba tuvastatud ĂŒks ebameeldiv bug Haskell'i GHC kompilaatoris — kui see tapetakse vale hetkel, genereerib see vale objekti faile ja ei rekompileeri neid uuesti kĂ€ivitamisel. SĂŒsteemikĂ”nede skriptimine vĂ”imaldas vea jĂ€rjepidevat korrata ĂŒhe kĂ€ivitamisega, kui juhuslikud tapmised kordasid viga umbes kahe tunni jooksul.

Me oleme liitnud teeki sĂŒsteemikĂ”nede liideseid - Elizabeth lisas brk ja Vasili lisas mmap. Meie töö tulemusena on nende sĂŒsteemikĂ”nede argumente lihtsam ja tĂ€psem kasutada teegi kasutamisel.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster