ZuriHac: pratike pwogramasyon fonksyonèl

Nan mwa jen ane sa a, nan ti vil Swis Rapperswil, yon evènman rele ZuriHac. Fwa sa a, li te rasanble plis pase senksan (XNUMX) rayisab Haskell, soti nan débutan rive nan zansèt fondatè lang lan. Malgre ke òganizatè yo rele evènman sa a yon hackathon, se pa yon konferans oswa yon hackathon nan sans klasik la. Fòma li diferan de pwogramasyon tradisyonèl yo. Nou te aprann sou ZuriHac pa chans, te patisipe nan li, epi kounye a nou konsidere li devwa nou pale sou jwenn nan etranj!

ZuriHac: pratike pwogramasyon fonksyonèl

sou nou

Atik sa a te prepare pa de elèv 3yèm ane nan pwogram "Matematik aplike ak enfòmatik" nan National Research University Higher School of Economics - Saint Petersburg: Vasily Alferov ak Elizaveta Vasilenko. Pasyon pou pwogramasyon fonksyonèl pou nou tou de te kòmanse ak yon seri konferans D. N. Moskvin nan 2yèm ane inivèsite a. Vasily ap patisipe kounye a nan pwogram Google Summer of Code, nan ki li ap aplike graf aljebrik nan Haskell anba gidans ekip pwojè a. Alg. Elizaveta te aplike ladrès pwogramasyon fonksyonèl akeri nan travay kou konsakre nan aplikasyon an nan algorithm nan anti-inifikasyon ak aplikasyon ki vin apre nan teyori kalite.

Fòma evènman an

Odyans sib la se pwopriyetè pwojè sous louvri, pwogramasyon ki vle patisipe nan devlopman yo, chèchè pwogram fonksyonèl, ak moun ki tou senpleman pasyone sou Haskell. Ane sa a, devlopè ki soti nan plis pase senkant pwojè Haskell sous louvri ki soti nan tout mond lan te rasanble nan pidevan a - HSR Hochschule für Technik Rapperswil - pou pale sou pwodwi yo epi fè moun fre enterese nan devlopman yo.

ZuriHac: pratike pwogramasyon fonksyonèl

Foto soti nan Twitter ZuriHac

Konplo a trè senp: ou bezwen ekri kèk pwopozisyon sou pwojè ou an davans epi voye yo bay òganizatè yo, ki pral poste enfòmasyon sou pwojè ou a sou paj evènman an. Anplis de sa, nan premye jou a, otè yo nan pwojè yo gen trant segonn trè kout di soti nan etap la sa yo ap fè ak sa ki bezwen fè. Lè sa a, moun ki enterese gade pou otè yo epi mande an detay sou travay yo.

Nou poko gen pwòp pwojè ouvè nou yo, men nou reyèlman vle kontribye nan pwojè ki deja egziste yo, kidonk nou te anrejistre kòm patisipan regilye. Pandan twa jou, nou te travay ak de gwoup devlopè. Li sanble ke etid ansanm nan kòd ak kominikasyon viv fè entèraksyon ki genyen ant otè pwojè ak kontribitè trè pwodiktif - nan ZuriHac nou te kapab konprann zòn ki te nouvo pou nou epi yo te kapab ede de ekip konplètman diferan, ranpli yon travay nan chak. nan pwojè yo.

Anplis pratik ki gen anpil valè, yo te bay plizyè konferans ak kou mèt tou nan ZuriHac. Nou espesyalman sonje de konferans. Nan premye a nan yo, Andrey Mokhov nan University of Newcastle te pale sou fonksyonè aplikatif selektif - yon klas kalite ki ta dwe vin entèmedyè ant fonktè aplikatif ak monad. Nan yon lòt konferans, youn nan fondatè Haskell, Simon Peyton Jones, te pale sou fason enferans kalite travay nan konpilatè GHC la.

ZuriHac: pratike pwogramasyon fonksyonèl

Konferans Simon Peyton Jones. Foto soti nan Twitter ZuriHac

Klas metriz ki te fèt pandan Hackathon an te divize an twa kategori depann sou nivo fòmasyon patisipan yo. Travay yo ofri patisipan yo ki te rantre nan devlopman pwojè yo te make tou ak yon nivo difikilte. Ti men zanmitay kominote pwogramasyon fonksyonèl yo ak kè kontan akeyi fèk vini nan ran li yo. Pou konprann konferans Andrei Mokhov ak Simon Peyton Jones, sepandan, kou pwogramasyon fonksyonèl nou te pran nan inivèsite a te trè itil.

Enskripsyon pou evènman an gratis pou patisipan regilye yo ak otè pwojè yo. Nou te soumèt aplikasyon pou patisipasyon nan kòmansman mwa jen, apre sa nou te byen vit transfere soti nan lis datant la nan lis patisipan yo konfime.

Epi kounye a nou pral pale sou pwojè yo nan devlopman nan ki nou te patisipe.

pandoc

pandoc se yon konvètisè inivèsèl nan dokiman tèks, an reyalite, soti nan nenpòt fòma nan nenpòt ki. Pou egzanp, soti nan docx nan pdf, oswa soti nan Markdown nan MediaWiki. Otè li a, John MacFarlane, se yon pwofesè nan filozofi nan University of California, Berkeley. An jeneral, Pandoc se byen popilè, ak kèk nan zanmi nou yo te sezi lè yo te aprann ke Pandoc te ekri nan Haskell.

ZuriHac: pratike pwogramasyon fonksyonèl

Lis fòma dokiman ki sipòte pa Pandoc. Genyen tou yon graf antye sou sit la, men foto sa a pa anfòm nan atik la.

Natirèlman, Pandoc pa bay konvèsyon dirèk pou chak pè fòma. Pou sipòte yon gran varyete transfòmasyon, yo itilize yon solisyon achitekti estanda: premye, tout dokiman an tradwi nan yon reprezantasyon espesyal entèmedyè entèn, ak Lè sa a, yon dokiman nan yon fòma diferan pwodwi nan reprezantasyon entèn sa a. Devlopè yo rele reprezantasyon entèn la "AST", ki vle di Abstract Syntax Tree, oswa pyebwa sentaks abstrè. Ou ka gade nan reprezantasyon entèmedyè a trè tou senpleman: tout sa ou bezwen fè se mete fòma pwodiksyon an "natif natal"

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

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

Lektè ki te travay ak Haskell omwen yon ti kras ka deja asime nan ti egzanp sa a ke Pandoc ekri nan Haskell: pwodiksyon an nan lòd sa a se yon reprezantasyon fisèl nan estrikti yo entèn nan Pandoc, ki te kreye nan resanblans ki jan li anjeneral fè. nan Haskell, pou egzanp, nan bibliyotèk estanda a.

Se konsa, isit la ou ka wè ke reprezantasyon entèn la se yon estrikti rekursif, nan chak ne entèn ki gen yon lis. Pou egzanp, nan nivo siperyè a gen yon lis nan yon sèl eleman - header nan premye nivo ak atribi yo "bonjou-mond", [], []. Kache andedan header sa a se yon lis fisèl "Bonjou," ki te swiv pa yon espas ak fisèl "Mond!".

Kòm ou ka wè, reprezantasyon entèn la pa anpil diferan de HTML. Li se yon pye bwa kote chak ne entèn bay kèk enfòmasyon sou fòma desandan li yo, epi fèy yo genyen sa ki reyèl nan dokiman an.

Si nou desann nan nivo aplikasyon an, kalite done pou tout dokiman an defini konsa:

data Pandoc = Pandoc Meta [Block]

Isit la Block se jisteman somè entèn yo mansyone pi wo a, ak Meta se metaenfòmasyon sou dokiman an, tankou tit, dat kreyasyon, otè - sa a diferan pou fòma diferan, ak Pandoc eseye, si sa posib, pou konsève enfòmasyon sa yo lè tradui soti nan fòma a. fòma.

Prèske tout konstrukteur nan kalite Blòk la - pou egzanp, Header oswa Paragraf (paragraf) - pran atribi ak yon lis somè ki pi ba yo kòm agiman - Inline, kòm yon règ. Pou egzanp, Space oswa Str se konstrukteur nan kalite Inline, ak tag HTML la tou vire nan pwòp espesyal Inline li yo. Nou pa wè okenn pwen nan bay yon definisyon konplè sou kalite sa yo, men sonje ke li ka jwenn isit la isit la.

Enteresan, kalite Pandoc la se yon monoid. Sa vle di ke gen yon kalite dokiman vid, e ke dokiman yo ka anpile ansanm. Sa a se pratik pou itilize lè w ap ekri Readers - ou ka kraze yon dokiman an pati lè l sèvi avèk lojik abitrè, analize chak youn separeman, ak Lè sa a, mete tout bagay ansanm nan yon sèl dokiman. Nan ka sa a, metaenfòmasyon yo pral kolekte nan tout pati nan dokiman an nan yon fwa.

Lè konvèti, di, soti nan LaTeX nan HTML, premye yon modil espesyal ki rele LaTeXReader konvèti dokiman an antre nan AST, Lè sa a, yon lòt modil ki rele HTMLWriter konvèti AST a nan HTML. Mèsi a achitekti sa a, pa gen okenn nesesite pou ekri yon nimewo kwadratik nan konvèsyon - li se ase yo ekri Reader ak Writer pou chak nouvo fòma, epi tout pè konvèsyon posib yo pral otomatikman sipòte.

Li klè ke tankou yon achitekti tou gen dezavantaj li yo, depi lontan prevwa pa ekspè nan jaden an nan achitekti lojisyèl. Pi enpòtan an se pri pou fè chanjman nan pye bwa sentaks la. Si chanjman an ase grav, w ap oblije chanje kòd la nan tout lektè ak ekriven. Pou egzanp, youn nan defi yo fè fas a devlopè Pandoc se sipòte fòma tab konplèks. Koulye a, Pandoc ka sèlman kreye tab trè senp, ak yon header, kolòn ak yon valè nan chak selil. Pou egzanp, atribi colspan nan HTML pral tou senpleman inyore. Youn nan rezon ki fè konpòtman sa a se mank de yon konplo inifye pou reprezante tab nan tout fòma oswa omwen anpil - kòmsadwa, li pa klè nan ki fòm tab yo ta dwe estoke nan reprezantasyon entèn la. Men, menm apre w fin chwazi yon gade espesifik, w ap bezwen chanje absoliman tout lektè ak ekriven ki sipòte travay ak tab.

Lang Haskell te chwazi non sèlman poutèt gwo lanmou otè yo pou pwogram fonksyonèl. Haskell se li te ye pou kapasite vaste pwosesis tèks li yo. Yon egzanp se bibliyotèk la parsec se yon bibliyotèk ki itilize aktivman konsèp pwogramasyon fonksyonèl - monoid, monad, fonktè aplikatif ak altènatif - pou ekri analizeur abitrè. Ka plen pouvwa a nan Parsec ka wè nan egzanp soti nan HaskellWiki, kote yon analiz konplè nan yon senp langaj pwogram enperatif analize. Natirèlman, Parsec se tou aktivman itilize nan Pandoc.

Yon ti tan dekri, monad yo itilize pou analiz sekans, lè yon bagay vini an premye, ak Lè sa a, yon lòt. Pou egzanp, nan egzanp sa a:

whileParser :: Parser Stmt
whileParser = whiteSpace >> statement

Premye ou bezwen konte espas la, ak Lè sa a, deklarasyon an - ki tou gen kalite a Parser Stmt.

Fonktè altènatif yo itilize pou rollback si analiz echwe. Pa egzanp,

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

Sa vle di ke ou swa bezwen eseye li deklarasyon an nan parantèz, oswa eseye li plizyè deklarasyon an sekans.

Fonktè aplikasyon yo itilize prensipalman kòm rakoursi pou monad. Pou egzanp, kite fonksyon tok la li kèk siy (sa a se yon fonksyon reyèl soti nan LaTeXReader). Ann gade nan konbinezon sa a

const <$> tok <*> tok

Li pral li de siy nan yon ranje epi retounen premye a.

Pou tout klas sa yo, Haskell gen bèl operatè senbolik, ki fè pwogram Reader sanble ak atizay ASCII. Jis admire bèl kòd sa a.

Travay nou yo te gen rapò ak LaTeXReader. Travay Vasily a se te sipòte kòmandman mbox ak hbox, ki itil pou ekri pakè nan LaTeX. Elizabeth te responsab pou sipòte kòmandman epigraf la, ki pèmèt ou kreye epigraf nan dokiman LaTeX.

Hatrace

Sistèm operasyon UNIX ki sanble souvan aplike apèl sistèm ptrace la. Li itil nan debogaj ak simulation anviwònman pwogram nan, ki pèmèt ou trase apèl yo sistèm ke pwogram nan fè. Pou egzanp, sèvis piblik la trè itil strace itilize ptrace intern.

Hatrace se yon bibliyotèk ki bay yon koòdone pou ptrace nan Haskell. Reyalite a se ke ptrace tèt li se trè sofistike epi li se byen difisil yo sèvi ak li dirèkteman, espesyalman nan lang fonksyonèl.

Hatrace kouri tankou strace nan demaraj epi li aksepte agiman menm jan an. Li diferan de strace nan ke li se tou yon bibliyotèk ki bay yon koòdone ki pi senp pase jis ptrace.

Avèk èd hatrace, nou te deja kenbe yon ensèk dezagreyab nan konpilateur GHC Haskell la - yo te touye nan move moman an, li jenere fichye objè ki pa kòrèk epi li pa rekonpile yo lè rekòmanse. Scripting pa apèl sistèm yo te fè li posib pou repwodui erè a nan yon sèl kous, pandan y ap touye o aza repwodui erè a nan apeprè de zè de tan.

Nou te ajoute entèfas apèl sistèm nan bibliyotèk la - Elizaveta te ajoute brk, epi Vasily te ajoute mmap. Dapre rezilta travay nou an, li posib pou nou sèvi ak agiman apèl sistèm sa yo pi senp epi avèk presizyon lè w ap itilize bibliyotèk la.

Sous: www.habr.com

Add nouvo kòmantè