ZuriHac: praticà a prugrammazione funziunale

In u ghjugnu di questu annu, in a piccula cità svizzera di Rapperswil, un avvenimentu chjamatu ZuriHac. Sta volta hà riunitu più di cinque centu amanti Haskell, da i principianti à i babbi fundatori di a lingua. Ancu l'urganizatori chjamanu questu avvenimentu un hackathon, ùn hè micca una cunferenza o un hackathon in u sensu classicu. U so formatu hè sfarente da i programatori tradiziunali. Avemu amparatu à ZuriHac per furtuna, hà participatu à questu, è avà avemu cunsideratu u nostru duvere di parlà di a scuperta inusual!

ZuriHac: praticà a prugrammazione funziunale

Quelli di noi

Stu articulu hè statu preparatu da dui studienti di 3rd anni di u prugramma "Matematica Applicata è Informatica" in a National Research University Higher School of Economics - San Petersburg: Vasily Alferov è Elizaveta Vasilenko. A passione per a prugrammazione funziunale per noi dui principia cù una seria di cunferenze da D. N. Moskvin in u 2u annu di l'università. Vasily hè attualmente participatu à u prugramma Google Summer of Code, in u quale implementa grafici algebrichi in Haskell sottu a guida di u gruppu di prughjettu. Alga. Elizaveta applicà e cumpetenze di prugrammazione funziunale acquistate in u travagliu di u cursu dedicatu à l'implementazione di l'algoritmu anti-unificazione cù l'applicazione successiva in a teoria di u tipu.

Formatu di l'avvenimentu

U publicu di destinazione hè i pruprietarii di prughjetti open source, i programatori chì volenu participà à u so sviluppu, i ricercatori di prugrammazione funziunale, è e persone simpricimenti appassiunate di Haskell. Quist'annu, i sviluppatori di più di cinquanta prughjetti di Haskell open source da u mondu sanu si sò riuniti in u locu - l'HSR Hochschule für Technik Rapperswil - per parlà di i so prudutti è per interessà e persone fresche à u so sviluppu.

ZuriHac: praticà a prugrammazione funziunale

Foto da Twitter ZuriHac

U schema hè assai simplice: avete bisognu di scrive uni pochi di pruposte nantu à u vostru prughjettu in anticipu è di mandà à l'urganizatori, chì pubblicà infurmazioni nantu à u vostru prughjettu nantu à a pagina di l'avvenimentu. Inoltre, u primu ghjornu, l'autori di i prughjetti anu trenta seconde per dì assai brevemente da u palcuscenicu ciò chì facenu è ciò chì deve esse fattu. Allora e persone interessate cercanu l'autori è dumandanu in dettagliu nantu à i travaglii.

Ùn avemu micca i nostri prughjetti aperti ancu, ma vulemu veramente cuntribuisce à quelli esistenti, cusì avemu registratu cum'è participanti regulare. In u cursu di trè ghjorni, avemu travagliatu cù dui gruppi di sviluppatori. Risulta chì u studiu cumunu di u codice è a cumunicazione in diretta rende l'interazzione trà l'autori di u prugettu è i cuntributori assai pruduttivi - in ZuriHac avemu statu capace di capiscenu zoni chì eranu novi per noi è sò stati capaci di aiutà duie squadre completamente diverse, cumpiendu un compitu in ognunu. di i prughjetti.

In più di una pratica preziosa, parechji lezioni è master classi sò stati ancu datu in ZuriHac. Ricordemu soprattuttu duie lezioni. À u primu di elli, Andrey Mokhov da l'Università di Newcastle hà parlatu di funtori applicativi selettivi - una classa di tipi chì devenu esse intermediate trà funturi applicativi è monadi. In una altra lezione, unu di i fundatori di Haskell, Simon Peyton Jones, hà parlatu di cumu funziona l'inferenza di tipu in u compilatore GHC.

ZuriHac: praticà a prugrammazione funziunale

Conferenza di Simon Peyton Jones. Foto da Twitter ZuriHac

I classi maestri tenuti durante l'hackathon sò stati divisi in trè categurie secondu u livellu di furmazione di i participanti. I travaglii pruposti à i participanti chì anu unitu à u sviluppu di i prughjetti eranu ancu marcati cù un livellu di difficultà. A piccula ma amichevule cumunità di programatori funzionali accoglie felice i novi vinuti in i so ranchi. Per capiscenu e lezioni di Andrei Mokhov è Simon Peyton Jones, però, u cursu di prugrammazione funziunale chì avemu pigliatu à l'università era assai utile.

A registrazione per l'avvenimentu hè gratuita sia per i participanti regulari sia per l'autori di u prugettu. Avemu sottumessu l'applicazioni per a participazione à principiu di ghjugnu, dopu chì avemu statu trasferitu rapidamente da a lista d'attesa à a lista di i participanti cunfirmati.

È avà avemu da parlà di i prughjetti in u sviluppu di quale avemu participatu.

pandoc

pandoc hè un cunvertitore universale di documenti di testu, in fattu, da ogni forma à qualsiasi. Per esempiu, da docx à pdf, o da Markdown à MediaWiki. U so autore, John MacFarlane, hè un prufissore di filusufìa à l'Università di California, Berkeley. In generale, Pandoc hè assai famosu, è certi di i nostri amichi sò stati sorpresi quandu anu amparatu chì Pandoc hè statu scrittu in Haskell.

ZuriHac: praticà a prugrammazione funziunale

Lista di formati di documenti supportati da Pandoc. Ci hè ancu un gràficu sanu nantu à u situ, ma sta stampa ùn si mette micca in l'articulu.

Di sicuru, Pandoc ùn furnisce micca cunversione diretta per ogni paru di formati. Per sustene una tale varietà di trasfurmazioni, una suluzione architetturale standard hè aduprata: prima, u documentu tutale hè traduttu in una rapprisintazioni intermedia interna speciale, è dopu un documentu in un formatu sfarente hè generatu da questa rapprisintazioni interna. I sviluppatori chjamanu a rapprisintazioni interna "AST", chì significa Abstract Syntax Tree, o arbre di sintassi astratta. Pudete vede a rapprisintazioni intermediate assai simplicemente: tuttu ciò chì duvete fà hè stabilisce u formatu di output à "nativu"

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

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

I lettori chì anu travagliatu cù Haskell, almenu un pocu, ponu digià assume da stu picculu esempiu chì Pandoc hè scrittu in Haskell: l'output di stu cumandamentu hè una rapprisintazioni di stringa di e strutture internu di Pandoc, creatu in a similitudine di cumu si faci generalmente. in Haskell, per esempiu, in a biblioteca standard.

Allora, quì pudete vede chì a rapprisintazioni interna hè una struttura recursiva, in ogni node internu di quale ci hè una lista. Per esempiu, à u livellu più altu ci hè una lista di un elementu - u primu livellu header cù l'attributi "hello-world",[],[]. Ammucciatu in questu header hè una lista di a stringa "Hello", seguita da un spaziu è a stringa "World!".

Comu pudete vede, a rapprisentazione interna ùn hè micca assai diversa da HTML. Hè un arbre induve ogni nodu internu furnisce una certa infurmazione nantu à u furmatu di i so discendenti, è e foglie cuntenenu u cuntenutu propiu di u documentu.

Se andemu à u livellu di implementazione, u tipu di dati per tuttu u documentu hè definitu cusì:

data Pandoc = Pandoc Meta [Block]

Quì Block hè precisamente i vertici internu mintuatu sopra, è Meta hè metainformazioni nantu à u documentu, cum'è u titulu, a data di creazione, l'autori - questu hè diversu per diversi formati, è Pandoc prova, se pussibule, di priservà tali informazioni quandu traduce da formatu à. furmatu.

Quasi tutti i custruttori di u tipu Block - per esempiu, Header o Para (paragraf) - piglianu attributi è una lista di vertici di livellu più bassu cum'è argumenti - Inline, com'è regula. Per esempiu, Space o Str sò custruttori di u tipu Inline, è a tag HTML si trasforma ancu in u so propiu Inline speciale. Ùn vedemu nunda di furnisce una definizione cumpleta di sti tipi, ma nutate chì si pò truvà quì ccà.

Curiosamente, u tipu Pandoc hè un monoide. Questu significa chì ci hè un tipu di documentu viotu, è chì i ducumenti ponu esse impilati. Questu hè cunvenutu à aduprà quandu scrivite Readers - pudete fraccione un documentu in parti cù una logica arbitraria, analizà ognunu separatamente, è poi mette tuttu in un documentu. In questu casu, a metainformazione serà recullata da tutte e parti di u documentu in una volta.

Quandu cunvertisce, dì, da LaTeX à HTML, prima un modulu speciale chjamatu LaTeXReader cunverte u documentu di input in AST, dopu un altru modulu chjamatu HTMLWriter cunverte l'AST à HTML. Grazie à questa architettura, ùn ci hè bisognu di scrive un numeru quadraticu di cunversione - hè abbastanza à scrive Reader and Writer per ogni novu furmatu, è tutti i pussibuli coppie di cunversione seranu supportati automaticamente.

Hè chjaru chì una tale architettura hà ancu i so svantaghji, longu previsti da l'esperti in u campu di l'architettura di u software. U più significativu hè u costu di fà cambiamenti à l'arburu di sintassi. Sè u cambiamentu hè abbastanza seriu, vi tuccherà à cambià u codice in tutti i Lettori è Scrittori. Per esempiu, unu di i sfidi di i sviluppatori di Pandoc hè di sustene formati di tavulinu cumplessi. Avà Pandoc pò creà solu tabelle assai simplici, cù un capu, colonne è un valore in ogni cellula. Per esempiu, l'attributu colspan in HTML serà solu ignoratu. Unu di i mutivi di stu cumpurtamentu hè a mancanza di un schema unificatu per rapprisintà e tavule in tutti o almenu parechji formati - per quessa, ùn hè micca chjaru in quale forma i tavulini deve esse guardatu in a rapprisintazioni interna. Ma ancu dopu avè sceltu una vista specifica, avete bisognu di cambià assolutamente tutti i Lettori è Scrittori chì sustenenu u travagliu cù e tavule.

A lingua Haskell hè stata scelta micca solu per u grande amore di l'autori per a prugrammazione funziunale. Haskell hè cunnisciutu per e so capacità di trasfurmazioni di testu. Un esempiu hè a biblioteca parsec hè una biblioteca chì usa attivamente i cuncetti di prugrammazione funziunale - monoidi, monadi, funtori applicativi è alternativi - per scrive parsers arbitrarie. U pienu putere di Parsec pò esse vistu in esempiu da HaskellWiki, induve un parser cumpletu di una lingua di prugrammazione imperativa simplice hè analizatu. Di sicuru, Parsec hè ancu attivamente utilizatu in Pandoc.

In breve, i monadi sò usati per l'analisi sequenziale, quandu una cosa vene prima, è dopu un altru. Per esempiu, in questu esempiu:

whileParser :: Parser Stmt
whileParser = whiteSpace >> statement

Prima avete bisognu di cuntà u spaziu, è dopu a dichjarazione - chì hà ancu u tipu Parser Stmt.

Funtori alternativi sò usati per rollback se l'analisi falla. Per esempiu,

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

Questu significa chì avete bisognu di pruvà à leghje a dichjarazione in parentesi, o pruvate à leghje parechje dichjarazioni in sequenza.

Funttori applicativi sò usati principalmente cum'è accurtatoghji per i monadi. Per esempiu, lasciate a funzione tok leghje qualchì token (questa hè una funzione vera da LaTeXReader). Fighjemu sta cumminazzioni

const <$> tok <*> tok

Leghjerà dui tokens in una fila è torna u primu.

Per tutte queste classi, Haskell hà belli operatori simbolichi, chì facenu a prugrammazione Reader cum'è l'arti ASCII. Just admire stu codice maravigghiusu.

I nostri compiti eranu ligati à LaTeXReader. U compitu di Vasily era di sustene i cumandamenti mbox è hbox, utili per scrive pacchetti in LaTeX. Elizabeth era rispunsevuli di sustene u cumandamentu di l'epigrafu, chì permette di creà epigrafi in documenti LaTeX.

Hatrace

Sistemi operativi simili à UNIX spessu implementanu a chjama di u sistema ptrace. Hè utile in debugging è simulazione di l'ambienti di u prugramma, chì permette di traccia di e chjama di u sistema chì u prugramma face. Per esempiu, l'utilità strace assai utile usa ptrace internamente.

Hatrace hè una biblioteca chì furnisce una interfaccia per ptrace in Haskell. U fattu hè chì ptrace stessu hè assai sufisticatu è hè abbastanza difficiuli di usà direttamente, soprattuttu da e lingue funziunali.

Hatrace corre cum'è strace à l'iniziu è accetta argumenti simili. Differisce da strace in quantu hè ancu una biblioteca chì furnisce una interfaccia più simplice cà solu ptrace.

Cù l'aiutu di l'hatrace, avemu digià catturatu un bug sgradevule in u compilatore GHC Haskell - esse uccisu in u mumentu sbagliatu, genera schedarii d'ughjettu sbagliati è ùn li ricompile micca quandu si riavvia. U scripting da e chjama di u sistema hà permessu di riproduce in modu affidabile l'errore in una sola corsa, mentre chì i uccisioni aleatorii riproducevanu l'errore in circa duie ore.

Avemu aghjustatu interfacce di chjama di sistema à a biblioteca - Elizaveta hà aghjustatu brk, è Vasily hà aghjuntu mmap. Basatu nantu à i risultati di u nostru travagliu, hè pussibule di utilizà più simpliciamente è accuratamente l'argumenti di sti chjamati di sistema quandu si usa a biblioteca.

Source: www.habr.com

Add a comment