ZuriHac: funktsionaalse programmeerimise harjutamine

Selle aasta juunis toimus Ć veitsi vĂ€ikelinnas Rapperswilis ĂŒritus nn ZuriHac. Seekord tĂ”i see kokku ĂŒle viiesaja Haskelli armastaja algajatest kuni keele rajajateni. Kuigi korraldajad nimetavad seda ĂŒritust hackathoniks, pole see konverents ega hackathon klassikalises mĂ”ttes. Selle formaat erineb traditsioonilistest programmeerijatest. Saime ZuriHacist teada Ă”nnega, vĂ”tsime sellest osa ja nĂŒĂŒd peame oma kohuseks ebatavalisest leiust rÀÀkida!

ZuriHac: funktsionaalse programmeerimise harjutamine

Firmast

Selle artikli koostasid kaks Peterburi Riikliku UurimisĂŒlikooli KĂ”rgema Majanduskooli programmi “Rakendusmatemaatika ja informaatika” 3. kursuse ĂŒliĂ”pilast: Vassili Alferov ja Elizaveta Vasilenko. Kirg funktsionaalse programmeerimise vastu sai meie mĂ”lema jaoks alguse D. N. Moskvini loengusarjast ĂŒlikooli 2. kursusel. Vassili osaleb praegu programmis Google Summer of Code, mille raames rakendab projektimeeskonna juhendamisel algebralisi graafikuid Haskellis. Alga. Elizaveta rakendas omandatud funktsionaalse programmeerimise oskusi kursusetöös, mis oli pĂŒhendatud unifitseerimisvastase algoritmi rakendamisele koos jĂ€rgneva rakendamisega tĂŒĂŒbiteoorias.

SĂŒndmuse formaat

SihtrĂŒhmaks on avatud lĂ€htekoodiga projektide omanikud, programmeerijad, kes soovivad nende arenduses osaleda, funktsionaalse programmeerimise uurijad ja inimesed, kes on lihtsalt Haskellist kirglikud. Sel aastal kogunesid enam kui viiekĂŒmne avatud lĂ€htekoodiga Haskelli projekti arendajad ĂŒle kogu maailma HSR Hochschule fĂŒr Technik Rapperswilisse, et rÀÀkida oma toodetest ja panna vĂ€rskeid inimesi nende arenduse vastu huvi tundma.

ZuriHac: funktsionaalse programmeerimise harjutamine

Foto Twitterist ZuriHac

Skeem on vĂ€ga lihtne: peate oma projekti kohta eelnevalt paar ettepanekut kirjutama ja saatma need korraldajatele, kes postitavad teie projekti kohta teabe ĂŒrituse lehele. Lisaks on projektide autoritel esimesel pĂ€eval kolmkĂŒmmend sekundit aega, et lavalt vĂ€ga lĂŒhidalt rÀÀkida, millega nad tegelevad ja mida on vaja teha. SeejĂ€rel otsivad huvilised autoreid ja kĂŒsivad tĂ€psemalt ĂŒlesannete kohta.

Meil ei ole veel oma avatud projekte, kuid tahame vĂ€ga panustada olemasolevatesse, seega registreerisime end tavalisteks osalejateks. Kolme pĂ€eva jooksul tegime koostööd kahe arendajarĂŒhmaga. Selgub, et koodi ja reaalajas suhtluse ĂŒhine uurimine muudab projekti autorite ja kaastööliste vahelise suhtluse vĂ€ga produktiivseks – saime ZuriHacis mĂ”istma valdkondi, mis olid meie jaoks uued ja suutsime aidata kahte tĂ€iesti erinevat meeskonda, tĂ€ites mĂ”lemas ĂŒhe ĂŒlesande. projektidest.

Lisaks vÀÀrtuslikule praktikale peeti ZuriHacis ka mitmeid loenguid ja meistriklasse. Eriti on meeles kaks loengut. Esimesel neist rÀÀkis Andrey Mokhov Newcastle'i ĂŒlikoolist selektiivsetest rakendusfunktoritest – tĂŒĂŒpide klassist, mis peaks muutuma vahepealseks rakenduslike funktorite ja monaadide vahel. Teises loengus rÀÀkis ĂŒks Haskelli asutajatest Simon Peyton Jones, kuidas tĂŒĂŒbijĂ€reldus GHC kompilaatoris töötab.

ZuriHac: funktsionaalse programmeerimise harjutamine

Simon Peyton Jonesi loeng. Foto Twitterist ZuriHac

HĂ€katonil toimunud meistriklassid jagati kolme kategooriasse olenevalt osalejate treenituse tasemest. Projektide vĂ€ljatöötamisega liitunud osalejatele pakutavad ĂŒlesanded olid samuti mĂ€rgitud raskusastmega. VĂ€ike, kuid sĂ”bralik funktsionaalsete programmeerijate kogukond tervitab uusi tulijaid rÔÔmuga oma ridadesse. Andrey Mokhovi ja Simon Peyton Jonesi loengutest arusaamiseks oli aga ĂŒlikoolis lĂ€bitud funktsionaalse programmeerimise kursus vĂ€ga kasulik.

Üritusele registreerimine on nii tavalistele osalejatele kui ka projekti autoritele tasuta. Osalemisavaldused esitasime juuni alguses, misjĂ€rel viidi meid kiirelt ootenimekirjast kinnitatud osalejate nimekirja.

Ja nĂŒĂŒd rÀÀgime projektidest, mille vĂ€ljatöötamisel osalesime.

pandoc

pandoc on universaalne tekstidokumentide konverter, tegelikult mis tahes vormingust mis tahes vormingusse. NĂ€iteks docx-st pdf-i vĂ”i Markdownist MediaWikisse. Selle autor John MacFarlane on California Berkeley ĂŒlikooli filosoofiaprofessor. Üldiselt on Pandoc ĂŒsna kuulus ja mĂ”ned meie sĂ”brad olid ĂŒllatunud, kui said teada, et Pandoc on kirjutatud Haskellis.

ZuriHac: funktsionaalse programmeerimise harjutamine

Pandoci toetatud dokumendivormingute loend. Saidil on ka terve graafik, kuid see pilt ei sobi artiklisse.

Loomulikult ei paku Pandoc otsest teisendamist iga vormingupaari jaoks. Taoliste erinevate teisenduste toetamiseks kasutatakse standardset arhitektuurset lahendust: esmalt tĂ”lgitakse kogu dokument spetsiaalseks sisemiseks vaheesitluseks ja seejĂ€rel genereeritakse sellest siseestusest erinevas formaadis dokument. Arendajad nimetavad sisemist esitust "AST", mis tĂ€histab abstraktset sĂŒntaksipuud vĂ”i abstraktne sĂŒntaksipuu. Vahepealset esitust saab vaadata vĂ€ga lihtsalt: kĂ”ik, mida pead tegema, on seada vĂ€ljundvorminguks “native”

$ cat example.html
<h1>Hello, World!</h1>

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

Lugejad, kes on Haskelliga vÀhemalt natuke koostööd teinud, vÔivad juba selle vÀikese nÀite pÔhjal eeldada, et Pandoc on kirjutatud Haskellis: selle kÀsu vÀljundiks on Pandoci sisemiste struktuuride stringesitus, mis on loodud sarnaselt sellega, kuidas seda tavaliselt tehakse. Haskellis, nÀiteks standardraamatukogus.

Niisiis, siin nĂ€ete, et sisemine esitus on rekursiivne struktuur, mille igas sisemises sĂ”lmes on loend. NĂ€iteks ĂŒlemisel tasemel on loend ĂŒhest elemendist - esimese taseme pĂ€is atribuutidega “tere-maailm”,[],[]. Selle pĂ€ise sees on peidetud stringi "Tere" loend, millele jĂ€rgneb tĂŒhik ja string "Maailm!".

Nagu nÀete, ei erine sisemine esitus HTML-ist palju. See on puu, kus iga sisemine sÔlm annab teatud teavet oma jÀrglaste vormingu kohta ja lehed sisaldavad dokumendi tegelikku sisu.

Kui lĂ€heme alla juurutustasemele, mÀÀratletakse kogu dokumendi andmetĂŒĂŒp jĂ€rgmiselt:

data Pandoc = Pandoc Meta [Block]

Siin on Block just eelpool mainitud sisemised tipud ja Meta on metainfo dokumendi kohta, nagu pealkiri, loomise kuupĂ€ev, autorid – see on erinevate vormingute puhul erinev ja Pandoc pĂŒĂŒab vĂ”imalusel sellist infot vormingust teise tĂ”lkides sĂ€ilitada. vormingus.

Peaaegu kĂ”ik plokitĂŒĂŒpi konstruktorid - nĂ€iteks pĂ€is vĂ”i lĂ”ik (lĂ”ik) - vĂ”tavad argumentidena atribuute ja madalama taseme tippude loendit - reeglina Inline. NĂ€iteks Space vĂ”i Str on Inline tĂŒĂŒpi konstruktorid ja ka HTML-mĂ€rgend muutub oma spetsiaalseks Inline'iks. Me ei nĂ€e mĂ”tet nende tĂŒĂŒpide tĂ€ielikku mÀÀratlust esitada, kuid pange tĂ€hele, et selle leiate siit siin.

Huvitav on see, et Pandoci tĂŒĂŒp on monoid. See tĂ€hendab, et seal on mingi tĂŒhi dokument ja dokumente saab kokku virnastada. Seda on mugav kasutada Readeri kirjutamisel – saate dokumendi suvalise loogika abil osadeks jagada, igaĂŒht eraldi sĂ”eluda ja seejĂ€rel kĂ”ik ĂŒheks dokumendiks kokku panna. Sel juhul kogutakse metainfot korraga kĂ”igist dokumendi osadest.

Kui teisendada nĂ€iteks LaTeX-ist HTML-i, teisendab esmalt spetsiaalne moodul nimega LaTeXReader sisenddokumendi AST-iks, seejĂ€rel teisendab teine ​​moodul nimega HTMLWriter AST-i HTML-iks. TĂ€nu sellele arhitektuurile pole vaja kirjutada ruutarvu konversioone – piisab, kui iga uue vormingu jaoks kirjutada Reader ja Writer ning kĂ”ik vĂ”imalikud teisenduspaarid toetatakse automaatselt.

Selge on see, et sellisel arhitektuuril on ka omad puudused, mida tarkvaraarhitektuuri valdkonna eksperdid ammu ennustasid. KĂ”ige olulisem on sĂŒntaksipuu muudatuste tegemise hind. Kui muudatus on piisavalt tĂ”sine, peate koodi muutma kĂ”igis lugejates ja kirjutajates. NĂ€iteks on Pandoci arendajate ĂŒks vĂ€ljakutseid keerukate tabelivormingute toetamine. NĂŒĂŒd saab Pandoc luua ainult vĂ€ga lihtsaid tabeleid, mille igas lahtris on pĂ€is, veerud ja vÀÀrtus. NĂ€iteks HTML-i atribuuti colspan lihtsalt ignoreeritakse. Üheks sellise kĂ€itumise pĂ”hjuseks on ĂŒhtse skeemi puudumine tabelite esitamiseks kĂ”igis vĂ”i vĂ€hemalt paljudes vormingutes – sellest tulenevalt on ebaselge, millisel kujul tuleks tabeleid siseesituses salvestada. Kuid isegi pĂ€rast konkreetse vaate valimist peate muutma absoluutselt kĂ”iki lugejaid ja kirjutajaid, mis toetavad tabelitega töötamist.

Haskelli keel ei valitud mitte ainult autorite suure armastuse tĂ”ttu funktsionaalse programmeerimise vastu. Haskell on tuntud oma ulatuslike tekstitöötlusvĂ”imaluste poolest. Üks nĂ€ide on raamatukogu parsek on raamatukogu, mis kasutab suvaliste parserite kirjutamiseks aktiivselt funktsionaalse programmeerimise mĂ”isteid – monoidid, monaadid, rakenduslikud ja alternatiivsed funktorid. Parseci kogu vĂ”imsus on nĂ€ha nĂ€ide HaskellWikist, kus sĂ”elutakse lihtsa kohustusliku programmeerimiskeele tĂ€ielik parser. Loomulikult kasutatakse Parseci aktiivselt ka Pandocis.

LĂŒhidalt kirjeldades kasutatakse monaade jĂ€rjestikuseks sĂ”elumiseks, kui kĂ”igepealt on ĂŒks asi ja seejĂ€rel teine. NĂ€iteks selles nĂ€ites:

whileParser :: Parser Stmt
whileParser = whiteSpace >> statement

KĂ”igepealt peate loendama tĂŒhiku ja seejĂ€rel avalduse, millel on ka tĂŒĂŒp Parser Stmt.

Kui sÔelumine ebaÔnnestub, kasutatakse tagasipööramiseks alternatiivseid funktsionoreid. NÀiteks,

statement :: Parser Stmt
statement = parens statement <|> sequenceOfStmt

See tĂ€hendab, et peate kas proovima lugeda sulgudes olevat vĂ€idet vĂ”i pĂŒĂŒdma lugeda mitut lauset jĂ€rjest.

Rakendusfunktoreid kasutatakse peamiselt monaadide otseteedena. NÀiteks laske tok-funktsioonil lugeda mÔnd mÀrki (see on LaTeXReaderi tegelik funktsioon). Vaatame seda kombinatsiooni

const <$> tok <*> tok

See loeb kaks mÀrki jÀrjest ja tagastab esimese.

KĂ”igi nende klasside jaoks on Haskellil ilusad sĂŒmboolsed operaatorid, mistĂ”ttu Readeri programmeerimine nĂ€eb vĂ€lja nagu ASCII kunst. Lihtsalt imetlege seda imelist koodi.

Meie ĂŒlesanded olid seotud LaTeXReaderiga. Vassili ĂŒlesanne oli toetada kĂ€ske mbox ja hbox, mis on kasulikud pakettide kirjutamisel LaTeX-is. Elizabeth vastutas epigraafikĂ€su toetamise eest, mis vĂ”imaldab teil LaTeX-i dokumentides epigraafe luua.

Hatrace

UNIX-i sarnased operatsioonisĂŒsteemid rakendavad sageli ptrace sĂŒsteemikutset. See on kasulik programmikeskkondade silumisel ja simuleerimisel, vĂ”imaldades teil jĂ€lgida programmi tehtavaid sĂŒsteemikĂ”nesid. NĂ€iteks vĂ€ga kasulik utiliit strace kasutab ptrace'i sisemiselt.

Hatrace on teek, mis pakub Haskelli ptrace'i liidest. Fakt on see, et ptrace ise on vĂ€ga keerukas ja seda on ĂŒsna keeruline otse kasutada, eriti funktsionaalsetest keeltest.

Hatrace töötab kÀivitamisel nagu strace ja aktsepteerib sarnaseid argumente. See erineb strace'ist selle poolest, et see on ka teek, mis pakub lihtsamat liidest kui lihtsalt ptrace.

Hatrace'i abil oleme juba tabanud ĂŒhe ebameeldiva vea GHC Haskelli kompilaatoris - valel hetkel tapetud, genereerib see valesid objektifaile ega kompileeri neid taaskĂ€ivitamisel uuesti. SĂŒsteemikĂ”nede abil skriptimine vĂ”imaldas vea usaldusvÀÀrselt reprodutseerida ĂŒhe jooksuga, samal ajal kui juhuslikud tapmised kordasid vea umbes kahe tunniga.

Lisasime teeki sĂŒsteemikĂ”nede liidesed – Elizaveta lisas brk ja Vassili mmap. Meie töö tulemuste pĂ”hjal on vĂ”imalik raamatukogu kasutamisel lihtsamalt ja tĂ€psemalt kasutada nende sĂŒsteemikutsete argumente.

Allikas: www.habr.com

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster