In u ghjugnu di questu annu, in a piccula cità svizzera di Rapperswil, un avvenimentu chjamatu
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.
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.
Foto da Twitter
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.
Conferenza di Simon Peyton Jones. Foto da Twitter
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
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
$ 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ì
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
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