ZuriHac: praktizē funkcionālo programmÄ“Å”anu

Šā gada jÅ«nijā mazajā Å veices pilsētiņā Rapersvilā notika pasākums ar nosaukumu ZuriHac. Å oreiz tas pulcēja vairāk nekā pieci simti Haskell mīļotāju, sākot no iesācējiem lÄ«dz valodas pamatlicējiem. Lai gan organizatori Å”o pasākumu dēvē par hakatonu, tā nav konference vai hakatons klasiskajā izpratnē. Tās formāts atŔķiras no tradicionālajiem programmētājiem. Par ZuriHac uzzinājām veiksmes dēļ, piedalÄ«jāmies tajā un tagad uzskatām par savu pienākumu pastāstÄ«t par neparasto atradumu!

ZuriHac: praktizē funkcionālo programmÄ“Å”anu

Par mums

Å o rakstu sagatavojuÅ”i divi Nacionālās pētniecÄ«bas universitātes Sanktpēterburgas Ekonomikas augstskolas programmas ā€œLietiŔķā matemātika un informātikaā€ 3. kursa studenti: Vasilijs Alferovs un Elizaveta Vasiļenko. AizrauÅ”anās ar funkcionālo programmÄ“Å”anu mums abiem sākās ar D. N. Moskvina lekciju ciklu universitātes 2. kursā. Å obrÄ«d Vasilijs piedalās Google Summer of Code programmā, kuras ietvaros projekta komandas vadÄ«bā ievieÅ” algebriskos grafikus Haskellā. Aļģe. IegÅ«tās funkcionālās programmÄ“Å”anas prasmes Elizaveta pielietoja kursa darbā, kas bija veltÄ«ts pretunifikācijas algoritma realizācijai ar sekojoÅ”u pielietojumu tipu teorijā.

Pasākuma formāts

MērÄ·auditorija ir atvērtā pirmkoda projektu Ä«paÅ”nieki, programmētāji, kuri vēlas piedalÄ«ties to izstrādē, funkcionālās programmÄ“Å”anas pētnieki un cilvēki, kas vienkārÅ”i aizraujas ar Haskell. Å ogad izstrādātāji no vairāk nekā piecdesmit atvērtā pirmkoda Haskell projektiem no visas pasaules pulcējās norises vietā - HSR Hochschule fĆ¼r Technik Rapperswil -, lai runātu par saviem produktiem un ieinteresētu jaunus cilvēkus par to attÄ«stÄ«bu.

ZuriHac: praktizē funkcionālo programmÄ“Å”anu

Foto no Twitter ZuriHac

Shēma ir ļoti vienkārÅ”a: jums iepriekÅ” jāuzraksta daži priekÅ”likumi par savu projektu un jānosÅ«ta organizatoriem, kuri ievietos informāciju par jÅ«su projektu pasākuma lapā. Turklāt pirmajā dienā projektu autoriem ir trÄ«sdesmit sekundes, lai ļoti Ä«si no skatuves pastāstÄ«tu, ko viņi dara un kas jādara. Tad interesenti meklē autorus un detalizēti jautā par uzdevumiem.

Mums vēl nav savu atvērto projektu, bet ļoti vēlamies dot savu ieguldÄ«jumu jau esoÅ”ajos, tāpēc reÄ£istrējāmies kā pastāvÄ«gie dalÄ«bnieki. TrÄ«s dienu laikā mēs strādājām ar divām izstrādātāju grupām. Izrādās, ka kopÄ«ga koda un dzÄ«vās komunikācijas izpēte padara mijiedarbÄ«bu starp projekta autoriem un lÄ«dzstrādniekiem ļoti produktÄ«vu - ZuriHac mēs varējām izprast jomas, kas mums bija jaunas, un varējām palÄ«dzēt divām pilnÄ«gi atŔķirÄ«gām komandām, katrā izpildot vienu uzdevumu. no projektiem.

Papildus vērtÄ«gai praksei ZuriHac notika arÄ« vairākas lekcijas un meistarklases. ÄŖpaÅ”i atceramies divas lekcijas. Pirmajā no tiem Andrejs Mokhovs no Ņūkāslas universitātes runāja par selektÄ«viem aplikatÄ«vajiem funkcijām - tipu klasi, kam jākļūst par starpposmu starp aplikatÄ«vajiem funkcijām un monādēm. Citā lekcijā viens no Haskell dibinātājiem Saimons Peitons Džounss runāja par to, kā GHC kompilatorā darbojas tipa secinājumi.

ZuriHac: praktizē funkcionālo programmÄ“Å”anu

Saimona Peitona Džounsa lekcija. Foto no Twitter ZuriHac

Hakatona laikā notikuŔās meistarklases tika sadalÄ«tas trÄ«s kategorijās atkarÄ«bā no dalÄ«bnieku sagatavotÄ«bas lÄ«meņa. Ar grÅ«tÄ«bas pakāpi tika atzÄ«mēti arÄ« piedāvātie uzdevumi dalÄ«bniekiem, kuri iesaistÄ«jās projektu izstrādē. Mazā, bet draudzÄ«gā funkcionālo programmētāju kopiena ar prieku uzņem jaunpienācējus savās rindās. Lai saprastu Andreja Mokhova un Saimona Peitona Džounsa lekcijas, ļoti noderēja funkcionālās programmÄ“Å”anas kurss, ko mācÄ«jāmies universitātē.

ReÄ£istrācija pasākumam ir bez maksas gan pastāvÄ«gajiem dalÄ«bniekiem, gan projektu autoriem. Pieteikumus dalÄ«bai iesniedzām jÅ«nija sākumā, pēc kā ātri tikām no gaidÄ«Å”anas saraksta pārcelti uz apstiprināto dalÄ«bnieku sarakstu.

Un tagad mēs runāsim par projektiem, kuru izstrādē mēs piedalījāmies.

Pandoc

Pandoc ir universāls teksta dokumentu pārveidotājs, faktiski no jebkura formāta uz jebkuru. Piemēram, no docx uz pdf vai no Markdown uz MediaWiki. Tās autors Džons Makfarleins ir filozofijas profesors Kalifornijas Universitātē Bērklijā. Kopumā Pandoks ir diezgan slavens, un daži no mūsu draugiem bija pārsteigti, uzzinot, ka Pandoks ir rakstīts Haskellā.

ZuriHac: praktizē funkcionālo programmÄ“Å”anu

Pandoc atbalstÄ«to dokumentu formātu saraksts. Vietnē ir arÄ« vesels grafiks, taču Å”is attēls neiederas rakstā.

Protams, Pandoc nenodroÅ”ina tieÅ”u konvertÄ“Å”anu katram formātu pārim. Lai atbalstÄ«tu tik daudzveidÄ«gas transformācijas, tiek izmantots standarta arhitektÅ«ras risinājums: vispirms viss dokuments tiek tulkots Ä«paŔā iekŔējā starpattēlā un pēc tam no Ŕī iekŔējā attēlojuma tiek Ä£enerēts dokuments citā formātā. Izstrādātāji iekŔējo attēlojumu sauc par ā€œASTā€, kas apzÄ«mē abstrakto sintakses koku vai abstrakts sintakses koks. JÅ«s varat apskatÄ«t starpposma attēlojumu ļoti vienkārÅ”i: viss, kas jums jādara, ir iestatÄ«t izvades formātu uz ā€œnativeā€

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

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

LasÄ«tāji, kuri ir vismaz nedaudz strādājuÅ”i ar Haskell, jau no Ŕī mazā piemēra var pieņemt, ka Pandoc ir rakstÄ«ts Haskell: Ŕīs komandas izvade ir Pandoc iekŔējo struktÅ«ru virknes attēlojums, kas izveidots lÄ«dzÄ«gi kā tas parasti tiek darÄ«ts. Haskell, piemēram, standarta bibliotēkā.

Tātad, Å”eit var redzēt, ka iekŔējais attēlojums ir rekursÄ«va struktÅ«ra, kuras katrā iekŔējā mezglā ir saraksts. Piemēram, augŔējā lÄ«menÄ« ir viena elementa saraksts - pirmā lÄ«meņa galvene ar atribÅ«tiem ā€œhello-worldā€,[],[]. Å ajā galvenē ir paslēpts virknes ā€œSveikiā€ saraksts, kam seko atstarpe un virkne ā€œPasaule!ā€.

Kā redzat, iekŔējais attēlojums daudz neatŔķiras no HTML. Tas ir koks, kurā katrs iekŔējais mezgls sniedz zināmu informāciju par tā pēcnācēju formatējumu, un lapas satur faktisko dokumenta saturu.

Ja mēs ejam uz ievieÅ”anas lÄ«meni, visa dokumenta datu tips tiek definēts Ŕādi:

data Pandoc = Pandoc Meta [Block]

Å eit Bloks ir tieÅ”i iepriekÅ” minētās iekŔējās virsotnes, bet Meta ir metainformācija par dokumentu, piemēram, nosaukums, izveides datums, autori - dažādiem formātiem tas atŔķiras, un Pandoc cenÅ”as, ja iespējams, saglabāt Ŕādu informāciju, tulkojot no formāta uz. formātā.

GandrÄ«z visi bloka tipa konstruktori - piemēram, galvene vai rindkopa (rindkopa) - kā argumentus izmanto atribÅ«tus un zemāka lÄ«meņa virsotņu sarakstu - kā likums. Piemēram, Space vai Str ir Inline tipa konstruktori, un HTML tags arÄ« pārvērÅ”as par savu Ä«paÅ”o Inline. Mēs neredzam jēgu sniegt pilnÄ«gu Å”o veidu definÄ«ciju, taču ņemiet vērā, ka to var atrast Å”eit Å”eit.

Interesanti, ka tips Pandoc ir monoÄ«ds. Tas nozÄ«mē, ka ir kaut kāds tukÅ”s dokuments un ka dokumentus var salikt kopā. Tas ir ērti lietojams, rakstot lasÄ«tājus ā€” varat sadalÄ«t dokumentu daļās, izmantojot patvaļīgu loÄ£iku, parsēt katru atseviŔķi un pēc tam visu apvienot vienā dokumentā. Å ajā gadÄ«jumā metainformācija tiks savākta no visām dokumenta daļām vienlaikus.

Konvertējot, piemēram, no LaTeX uz HTML, vispirms Ä«paÅ”s modulis ar nosaukumu LaTeXReader pārvērÅ” ievades dokumentu par AST, pēc tam cits modulis ar nosaukumu HTMLWriter pārvērÅ” AST par HTML. Pateicoties Å”ai arhitektÅ«rai, nav jāraksta kvadrātiskais reklāmguvumu skaits ā€“ katram jaunam formātam pietiek uzrakstÄ«t Reader un Writer, un automātiski tiks atbalstÄ«ti visi iespējamie reklāmguvumu pāri.

Skaidrs, ka Ŕādai arhitektÅ«rai ir arÄ« savi trÅ«kumi, ko jau sen prognozēja programmatÅ«ras arhitektÅ«ras jomas eksperti. NozÄ«mÄ«gākās ir sintakses koka izmaiņu veikÅ”anas izmaksas. Ja izmaiņas ir pietiekami nopietnas, jums bÅ«s jāmaina kods visos lasÄ«tājos un rakstÄ«tājos. Piemēram, viens no izaicinājumiem, ar ko saskaras Pandoc izstrādātāji, ir sarežģītu tabulu formātu atbalstÄ«Å”ana. Tagad Pandoc var izveidot tikai ļoti vienkārÅ”as tabulas ar galveni, kolonnām un vērtÄ«bu katrā Ŕūnā. Piemēram, HTML atribÅ«ts colspan tiks vienkārÅ”i ignorēts. Viens no Ŕādas uzvedÄ«bas iemesliem ir vienotas shēmas trÅ«kums tabulu attēloÅ”anai visos vai vismaz daudzos formātos - attiecÄ«gi nav skaidrs, kādā formā tabulas jāuzglabā iekŔējā attēlojumā. Bet pat pēc konkrēta skata atlasÄ«Å”anas jums bÅ«s jāmaina absolÅ«ti visi lasÄ«tāji un rakstÄ«tāji, kas atbalsta darbu ar tabulām.

Haskell valoda tika izvēlēta ne tikai autoru lielās mÄ«lestÄ«bas pret funkcionālo programmÄ“Å”anu dēļ. Haskell ir pazÄ«stams ar savām plaÅ”ajām teksta apstrādes iespējām. Viens piemērs ir bibliotēka parsec ir bibliotēka, kas aktÄ«vi izmanto funkcionālās programmÄ“Å”anas jēdzienus - monoÄ«dus, monādes, aplikatÄ«vos un alternatÄ«vos funkciņus -, lai rakstÄ«tu patvaļīgus parsētājus. Parsec pilno jaudu var redzēt piemērs no HaskellWiki, kur tiek parsēts pilnÄ«gs vienkārÅ”as obligātas programmÄ“Å”anas valodas parsētājs. Protams, Parsec aktÄ«vi tiek izmantots arÄ« Pandoc.

ÄŖsumā aprakstÄ«ts, monādes tiek izmantotas secÄ«gai parsÄ“Å”anai, kad vispirms ir viena lieta, bet pēc tam cita. Piemēram, Å”ajā piemērā:

whileParser :: Parser Stmt
whileParser = whiteSpace >> statement

Vispirms jāsaskaita atstarpe un pēc tam priekÅ”raksts, kuram ir arÄ« Parser Stmt tips.

Ja parsÄ“Å”ana neizdodas, atcelÅ”anai tiek izmantoti alternatÄ«vi funkcionāri. Piemēram,

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

Nozīmē, ka jums vai nu jāmēģina izlasīt iekavās ievietotais apgalvojums, vai arī jāmēģina lasīt vairākus apgalvojumus pēc kārtas.

Lietojumfunkcijas galvenokārt tiek izmantotas kā Ä«sceļi monādēm. Piemēram, ļaujiet funkcijai tok nolasÄ«t kādu marÄ·ieri (tā ir reāla LaTeXReader funkcija). ApskatÄ«sim Å”o kombināciju

const <$> tok <*> tok

Tas nolasīs divus žetonus pēc kārtas un atgriezīs pirmo.

Visām Ŕīm klasēm Haskell ir skaisti simboli operatori, kas padara Reader programmÄ“Å”anu lÄ«dzÄ«gu ASCII mākslai. VienkārÅ”i apbrÄ«nojiet Å”o brÄ«niŔķīgo kodu.

MÅ«su uzdevumi bija saistÄ«ti ar LaTeXReader. Vasilija uzdevums bija atbalstÄ«t mbox un hbox komandas, kas ir noderÄ«gas pakotņu rakstÄ«Å”anai LaTeX. Elizabete bija atbildÄ«ga par epigrāfa komandas atbalstÄ«Å”anu, kas ļauj izveidot epigrāfus LaTeX dokumentos.

Hatrace

UNIX lÄ«dzÄ«gas operētājsistēmas bieži Ä«steno ptrace sistēmas izsaukumu. Tā ir noderÄ«ga programmu vides atkļūdoÅ”anā un simulācijā, ļaujot izsekot programmas veiktajiem sistēmas izsaukumiem. Piemēram, ļoti noderÄ«gā utilÄ«ta strace iekŔēji izmanto ptrace.

Hatrace ir bibliotēka, kas nodroÅ”ina saskarni ptrace programmā Haskell. Fakts ir tāds, ka pats ptrace ir ļoti sarežģīts, un to ir diezgan grÅ«ti izmantot tieÅ”i, it Ä«paÅ”i no funkcionālām valodām.

Hatrace startÄ“Å”anas laikā darbojas kā strace un pieņem lÄ«dzÄ«gus argumentus. Tā atŔķiras no strace ar to, ka tā ir arÄ« bibliotēka, kas nodroÅ”ina vienkārŔāku saskarni nekā tikai ptrace.

Ar hatrace palÄ«dzÄ«bu jau esam noķēruÅ”i vienu nepatÄ«kamu kļūdu GHC Haskell kompilatorā - tiek nogalināts nepareizā brÄ«dÄ«, tas Ä£enerē nepareizus objektu failus un pārstartējot tos nepārkompilē. SkriptÄ“Å”ana, izmantojot sistēmas izsaukumus, ļāva droÅ”i reproducēt kļūdu vienā piegājienā, savukārt nejauÅ”a nogalināŔana kļūdu atkārtoja aptuveni divu stundu laikā.

Mēs bibliotēkai pievienojām sistēmas zvanu saskarnes - Elizaveta pievienoja brk, bet Vasilijs pievienoja mmap. Balstoties uz mÅ«su darba rezultātiem, izmantojot bibliotēku, ir iespējams vienkārŔāk un precÄ«zāk izmantot Å”o sistēmas izsaukumu argumentus.

Avots: www.habr.com

Pievieno komentāru