ZuriHac: jipprattika l-ipprogrammar funzjonali

F'Ġunju ta 'din is-sena, fil-belt żgħira Żvizzera ta' Rapperswil, sejjaħ avveniment ZuriHac. Din id-darba ġabar flimkien aktar minn ħames mitt dilettant Haskell, minn dawk li jibdew sal-missirijiet fundaturi tal-lingwa. Għalkemm l-organizzaturi jsejħu dan l-avveniment hackathon, mhuwiex konferenza jew hackathon fis-sens klassiku. Il-format tiegħu huwa differenti mill-programmaturi tradizzjonali. Tgħallimna dwar ZuriHac b'xortih, ħadna sehem fih, u issa nqisu li huwa d-dmir tagħna li ngħidu dwar is-sejba mhux tas-soltu!

ZuriHac: jipprattika l-ipprogrammar funzjonali

dwarna

Dan l-artikolu tħejja minn żewġ studenti tat-3 sena tal-programm "Matematika u Informatika Applikata" fl-Iskola Għolja tal-Ekonomija tal-Università Nazzjonali tar-Riċerka - San Pietruburgu: Vasily Alferov u Elizaveta Vasilenko. Il-passjoni għall-ipprogrammar funzjonali għat-tnejn minna bdiet b'serje ta 'lekċers minn D. N. Moskvin fit-2 sena tal-università. Vasily bħalissa qed jipparteċipa fil-programm Google Summer of Code, li fih qed jimplimenta graffs alġebrin f'Haskell taħt il-gwida tat-tim tal-proġett Alka. Elizaveta applikat il-ħiliet ta 'programmar funzjonali miksuba f'xogħol tal-kors iddedikat għall-implimentazzjoni tal-algoritmu kontra l-unifikazzjoni b'applikazzjoni sussegwenti fit-teorija tat-tip.

Format tal-avveniment

L-udjenza fil-mira hija sidien ta 'proġetti ta' sors miftuħ, programmaturi li jixtiequ jipparteċipaw fl-iżvilupp tagħhom, riċerkaturi tal-ipprogrammar funzjonali, u nies sempliċement passjonati dwar Haskell. Din is-sena, żviluppaturi minn aktar minn ħamsin proġett open source Haskell minn madwar id-dinja kollha nġabru fil-post - l-HSR Hochschule für Technik Rapperswil - biex jitkellmu dwar il-prodotti tagħhom u jġibu nies friski interessati fl-iżvilupp tagħhom.

ZuriHac: jipprattika l-ipprogrammar funzjonali

Ritratt minn Twitter ZuriHac

L-iskema hija sempliċi ħafna: trid tikteb ftit proposti dwar il-proġett tiegħek bil-quddiem u tibgħathom lill-organizzaturi, li jpoġġu informazzjoni dwar il-proġett tiegħek fil-paġna tal-avveniment. Barra minn hekk, fl-ewwel jum, l-awturi tal-proġetti għandhom tletin sekonda biex jgħidu fil-qosor ħafna mill-istadju x’qed jagħmlu u x’hemm bżonn isir. Imbagħad in-nies interessati jfittxu l-awturi u jistaqsu fid-dettall dwar il-kompiti.

Għadna m'għandniex il-proġetti miftuħa tagħna stess, iżda rridu tassew nikkontribwixxu għal dawk eżistenti, għalhekk irreġistrajna bħala parteċipanti regolari. Matul tlett ijiem, ħdimna ma 'żewġ gruppi ta' żviluppaturi. Jirriżulta li l-istudju konġunt tal-kodiċi u l-komunikazzjoni diretta jagħmel l-interazzjoni bejn l-awturi tal-proġetti u l-kontributuri produttiva ħafna - f’ZuriHac stajna nifhmu oqsma li kienu ġodda għalina u stajna ngħinu żewġ timijiet kompletament differenti, billi tlesti kompitu wieħed f’kull wieħed. tal-proġetti.

Minbarra prattika siewja, ingħataw ukoll diversi lekċers u master classes fi ZuriHac. Niftakru b’mod speċjali żewġ lekċers. Fl-ewwel wieħed minnhom, Andrey Mokhov mill-Università ta 'Newcastle tkellem dwar funtors applikattivi selettivi - klassi ta' tipi li għandhom isiru intermedji bejn functors applikattivi u monadi. F'taħdita oħra, wieħed mill-fundaturi ta' Haskell, Simon Peyton Jones, tkellem dwar kif taħdem l-inferenza tat-tip fil-kompilatur tal-GHC.

ZuriHac: jipprattika l-ipprogrammar funzjonali

Lecture minn Simon Peyton Jones. Ritratt minn Twitter ZuriHac

Il-master classes li saru waqt l-hackathon kienu maqsuma fi tliet kategoriji skont il-livell ta’ taħriġ tal-parteċipanti. Il-kompiti offruti lill-parteċipanti li ssieħbu fl-iżvilupp ta 'proġetti kienu wkoll immarkati b'livell ta' diffikultà. Il-komunità żgħira iżda ta 'ħbiberija ta' programmaturi funzjonali tilqa 'ferħ lil dawk ġodda fil-gradi tagħha. Biex nifhmu l-lectures ta 'Andrei Mokhov u Simon Peyton Jones, madankollu, il-kors ta' programmazzjoni funzjonali li ħadna fl-università kien utli ħafna.

Ir-reġistrazzjoni għall-avveniment hija b'xejn kemm għall-parteċipanti regolari kif ukoll għall-awturi tal-proġett. Aħna ssottomettejna applikazzjonijiet għall-parteċipazzjoni fil-bidu ta 'Ġunju, u wara ġejna trasferiti malajr mil-lista ta' stennija għal-lista ta 'parteċipanti kkonfermati.

U issa se nitkellmu dwar il-proġetti li fl-iżvilupp tagħhom ħadna sehem.

pandoc

pandoc huwa konvertitur universali ta 'dokumenti ta' test, fil-fatt, minn kwalunkwe format għal kwalunkwe. Pereżempju, minn docx għal pdf, jew minn Markdown għal MediaWiki. L-awtur tiegħu, John MacFarlane, huwa professur tal-filosofija fl-Università ta’ California, Berkeley. B'mod ġenerali, Pandoc huwa pjuttost famuż, u xi wħud mill-ħbieb tagħna kienu sorpriżi meta saru jafu li Pandoc kien miktub f'Haskell.

ZuriHac: jipprattika l-ipprogrammar funzjonali

Lista ta' formati ta' dokumenti appoġġjati minn Pandoc. Hemm ukoll graff sħiħ fuq is-sit, iżda din l-istampa ma tidħolx fl-artiklu.

Naturalment, Pandoc ma jipprovdix konverżjoni diretta għal kull par ta 'formati. Biex tappoġġja tali varjetà wiesgħa ta 'trasformazzjonijiet, tintuża soluzzjoni arkitettonika standard: l-ewwel, id-dokument kollu jiġi tradott f'rappreżentazzjoni intermedja interna speċjali, u mbagħad jiġi ġġenerat dokument f'format differenti minn din ir-rappreżentazzjoni interna. L-iżviluppaturi jsejħu r-rappreżentazzjoni interna "AST", li tirrappreżenta Siġra tas-Sintassi Astratta, jew siġra tas-sintassi astratta. Tista' tħares lejn ir-rappreżentazzjoni intermedja b'mod sempliċi ħafna: kull ma trid tagħmel hu li tissettja l-format tal-output għal "nattiv"

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

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

Qarrejja li ħadmu ma 'Haskell mill-inqas ftit jistgħu diġà jassumu minn dan l-eżempju żgħir li Pandoc huwa miktub f'Haskell: l-output ta' dan il-kmand huwa rappreżentazzjoni ta 'string tal-istrutturi interni ta' Pandoc, maħluqa fix-xebh ta 'kif normalment isir. f'Haskell, pereżempju, fil-librerija standard.

Allura, hawn tista 'tara li r-rappreżentazzjoni interna hija struttura rikorsisiva, f'kull nodu intern li fih hemm lista. Per eżempju, fl-ogħla livell hemm lista ta 'element wieħed - l-ewwel livell header bl-attributi "hello-world",[],[]. Moħbija ġewwa din l-intestatura hemm lista tas-sekwenza "Hello", segwita minn spazju u s-sekwenza "Dinja!".

Kif tistgħu taraw, ir-rappreżentazzjoni interna mhix wisq differenti minn HTML. Hija siġra fejn kull nodu intern jipprovdi xi informazzjoni dwar l-ifformattjar tad-dixxendenti tiegħu, u l-weraq fihom il-kontenut attwali tad-dokument.

Jekk ninżlu għal-livell ta' implimentazzjoni, it-tip ta' dejta għad-dokument kollu huwa definit hekk:

data Pandoc = Pandoc Meta [Block]

Hawnhekk Blokk huwa preċiżament il-vertiċi interni msemmija hawn fuq, u Meta hija metainformazzjoni dwar id-dokument, bħal titolu, data tal-ħolqien, awturi - dan huwa differenti għal formati differenti, u Pandoc jipprova, jekk possibbli, jippreserva tali informazzjoni meta jittraduċi minn format għal format.

Kważi l-kostrutturi kollha tat-tip ta 'Blokk - pereżempju, Header jew Para (paragrafu) - jieħdu attributi u lista ta' vertiċi ta 'livell aktar baxx bħala argumenti - Inline, bħala regola. Pereżempju, Space jew Str huma kostrutturi tat-tip Inline, u t-tikketta HTML tinbidel ukoll f'Inline speċjali tagħha stess. Ma naraw l-ebda skop li nipprovdu definizzjoni sħiħa ta 'dawn it-tipi, iżda innota li tista' tinstab hawn hawn.

Interessanti, it-tip Pandoc huwa monoid. Dan ifisser li hemm xi tip ta 'dokument vojt, u li d-dokumenti jistgħu jiġu f'munzelli flimkien. Dan huwa konvenjenti biex tużah meta tikteb Qarrejja - tista 'tkisser dokument f'partijiet billi tuża loġika arbitrarja, teżamina kull waħda separatament, u mbagħad tpoġġi kollox flimkien f'dokument wieħed. F'dan il-każ, il-metainformazzjoni tinġabar mill-partijiet kollha tad-dokument f'daqqa.

Meta tikkonverti, ngħidu aħna, minn LaTeX għal HTML, l-ewwel modulu speċjali msejjaħ LaTeXReader jikkonverti d-dokument ta 'input f'AST, imbagħad modulu ieħor imsejjaħ HTMLWriter jikkonverti l-AST għal HTML. Grazzi għal din l-arkitettura, m'hemmx bżonn li tikteb numru kwadratiku ta 'konverżjonijiet - huwa biżżejjed li tikteb Reader u Writer għal kull format ġdid, u l-pari ta' konverżjonijiet kollha possibbli jkunu appoġġjati awtomatikament.

Huwa ċar li arkitettura bħal din għandha wkoll l-iżvantaġġi tagħha, mbassra għal żmien twil minn esperti fil-qasam tal-arkitettura tas-softwer. L-aktar sinifikanti hija l-ispiża biex isiru bidliet fis-siġra tas-sintassi. Jekk il-bidla hija serja biżżejjed, ikollok tibdel il-kodiċi fil-Qarrejja u Kittieba kollha. Pereżempju, waħda mill-isfidi li qed jiffaċċjaw l-iżviluppaturi Pandoc hija l-appoġġ ta 'formati ta' tabella kumplessi. Issa Pandoc jista 'biss joħloq tabelli sempliċi ħafna, b'header, kolonni u valur f'kull ċellola. Per eżempju, l-attribut colspan fl-HTML se sempliċement jiġi injorat. Waħda mir-raġunijiet għal din l-imġiba hija n-nuqqas ta 'skema unifikata għar-rappreżentazzjoni tat-tabelli fil-formati kollha jew għall-inqas ħafna - għalhekk, mhuwiex ċar f'liema forma t-tabelli għandhom jinħażnu fir-rappreżentazzjoni interna. Iżda anke wara li tagħżel ħarsa speċifika, ser ikollok bżonn tibdel assolutament il-Qarrejja u l-Kittieba kollha li jappoġġjaw ix-xogħol bit-tabelli.

Il-lingwa Haskell intgħażlet mhux biss minħabba l-imħabba kbira tal-awturi għall-ipprogrammar funzjonali. Haskell hija magħrufa għall-kapaċitajiet estensivi tagħha għall-ipproċessar tat-test. Eżempju wieħed huwa l-librerija parsec hija librerija li tuża b'mod attiv il-kunċetti tal-ipprogrammar funzjonali - monoids, monadi, functors applikabbli u alternattivi - biex tikteb parsers arbitrarji. Il-qawwa sħiħa ta 'Parsec tista' tidher fi eżempju minn HaskellWiki, fejn parser komplut ta' lingwaġġ ta' programmar imperattiv sempliċi huwa parsed. Naturalment, Parsec jintuża wkoll b'mod attiv f'Pandoc.

Deskritti fil-qosor, monadi jintużaw għall-parsing sekwenzjali, meta ħaġa waħda tiġi l-ewwel, u mbagħad oħra. Per eżempju, f'dan l-eżempju:

whileParser :: Parser Stmt
whileParser = whiteSpace >> statement

L-ewwel trid tgħodd l-ispazju, u mbagħad id-dikjarazzjoni - li għandha wkoll it-tip Parser Stmt.

Functors alternattivi huma wżati biex jirritornaw jekk ifalli l-parsing. Pereżempju,

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

Ifisser li jew trid tipprova taqra l-istqarrija fil-parentesi, jew tipprova taqra diversi dikjarazzjonijiet sekwenzjali.

Functors applikabbli huma użati primarjament bħala shortcuts għal monadi. Pereżempju, ħalli l-funzjoni tok taqra xi token (din hija funzjoni reali minn LaTeXReader). Ejja nħarsu lejn din il-kombinazzjoni

const <$> tok <*> tok

Se jaqra żewġ tokens wara xulxin u jirritorna l-ewwel wieħed.

Għal dawn il-klassijiet kollha, Haskell għandu operaturi simboliċi sbieħ, li jagħmel l-ipprogrammar tal-Qarrej qisu arti ASCII. Ammira biss dan il-kodiċi mill-isbaħ.

Il-kompiti tagħna kienu relatati ma 'LaTeXReader. Il-kompitu ta’ Vasily kien li jappoġġja l-kmandi mbox u hbox, utli għall-kitba ta’ pakketti fil-LaTeX. Elizabeth kienet responsabbli biex tappoġġja l-kmand tal-epigrafi, li jippermettilek toħloq epigrafi fid-dokumenti LaTeX.

Hatrace

Sistemi operattivi bħal UNIX spiss jimplimentaw is-sejħa tas-sistema ptrace. Huwa utli fid-debugging u s-simulazzjoni ta 'ambjenti tal-programm, li jippermettilek li tintraċċa s-sejħiet tas-sistema li jagħmel il-programm. Pereżempju, l-utilità strace utli ħafna tuża ptrace internament.

Hatrace hija librerija li tipprovdi interface biex jittraċċa f'Haskell. Il-fatt hu li ptrace innifsu huwa sofistikat ħafna u huwa pjuttost diffiċli li tużah direttament, speċjalment minn lingwi funzjonali.

Hatrace jimxi bħal strace fl-istartjar u jaċċetta argumenti simili. Hija differenti minn strace peress li hija wkoll librerija li tipprovdi interface aktar sempliċi minn sempliċi ptrace.

Bl-għajnuna ta 'hatrace, diġà qbidna bug wieħed spjaċevoli fil-kompilatur GHC Haskell - jinqatel fil-mument ħażin, jiġġenera fajls ta' oġġetti mhux korretti u ma jerġax jikkompilahom meta jerġa 'jibda. Scripting minn sejħiet tas-sistema għamilha possibbli li l-iżball jiġi riprodott b'mod affidabbli f'ġirja waħda, filwaqt li l-qtil bl-addoċċ irriproduċa l-iżball f'madwar sagħtejn.

Żidna interfaces tas-sejħa tas-sistema mal-librerija - Elizaveta żiedet brk, u Vasily żiedet mmap. Ibbażat fuq ir-riżultati tax-xogħol tagħna, huwa possibbli li tuża l-argumenti ta 'dawn is-sejħiet tas-sistema b'mod aktar sempliċi u preċiż meta tuża l-librerija.

Sors: www.habr.com

Żid kumment