ZuriHac: funktionell programméiere üben

Am Juni vun dësem Joer, an der klenger Schwäizer Stad Rapperswil, en Event genannt ZuriHac. Dës Kéier huet et méi wéi fënnefhonnert Haskell-Liebhaber zesummebruecht, vun Ufänger bis zu de Grënner vun der Sprooch. Och wann d'Organisateuren dësen Event en Hackathon nennen, ass et keng Konferenz oder Hackathon am klassesche Sënn. Säin Format ass anescht wéi traditionell Programméierer. Mir hunn iwwer ZuriHac duerch Gléck geléiert, hunn dorun deelgeholl, an elo betruechte mir et als eis Pflicht iwwer déi ongewéinlech Fonnt ze erzielen!

ZuriHac: funktionell programméiere üben

Iwwer eis

Dësen Artikel gouf vun zwee 3rd Joer Studenten vum Programm "Applied Mathematics and Informatics" an der National Research University Higher School of Economics - St. Petersburg virbereet: Vasily Alferov an Elizaveta Vasilenko. D'Passioun fir funktionell Programméierung fir eis zwee huet ugefaang mat enger Serie vu Virträg vum D. N. Moskvin am 2. Joer vun der Uni. De Vasily bedeelegt de Moment um Google Summer of Code Programm, an deem hien algebraesch Grafiken am Haskell implementéiert ënner der Leedung vum Projektteam Gehalt. Elizaveta applizéiert déi erfuerene funktionell Programméierungsfäegkeeten an der Courseaarbecht gewidmet fir d'Ëmsetzung vum Anti-Vereenegung Algorithmus mat spéider Uwendung an der Typtheorie.

Event Format

D'Zilpublikum ass Besëtzer vun Open Source Projeten, Programméierer déi un hirer Entwécklung deelhuelen wëllen, funktionell Programméierungsfuerscher, a Leit déi einfach iwwer Haskell leiden. Dëst Joer hu sech Entwéckler vu méi wéi fofzeg Open Source Haskell Projeten aus der ganzer Welt op der Plaz versammelt - der HSR Hochschule für Technik Rapperswil - fir iwwer hir Produkter ze schwätzen a frësch Leit un hir Entwécklung ze interesséieren.

ZuriHac: funktionell programméiere üben

Foto vun Twitter ZuriHac

De Schema ass ganz einfach: Dir musst am Viraus e puer Virschléi iwwer Äre Projet schreiwen an se un d'Organisateuren schécken, déi Informatioun iwwer Äre Projet op der Event Säit posten. Ausserdeem hunn d'Auteuren vun de Projeten um éischten Dag drësseg Sekonnen Zäit fir ganz kuerz vun der Bühn ze soen, wat se maachen a wat gemaach muss ginn. Da sichen interesséiert Leit no den Auteuren a froen am Detail iwwert d'Aufgaben.

Mir hunn nach keng eege oppe Projeten, mä mir wëllen wierklech un déi bestehend bäidroen, also hu mir eis als regelméisseg Participanten ugemellt. Am Laf vun dräi Deeg hu mir mat zwou Gruppen vun Entwéckler geschafft. Et stellt sech eraus datt d'gemeinsame Studie vu Code a Live-Kommunikatioun d'Interaktioun tëscht Projetautoren a Mataarbechter ganz produktiv mécht - bei ZuriHac konnte mir Beräicher verstoen, déi fir eis nei waren a konnten zwee komplett verschidden Teams hëllefen, eng Aufgab an all eenzel ze maachen. vun de Projeten.

Nieft der wäertvoller Praxis goufen och e puer Virträg a Masterklassen um ZuriHac gehalen. Mir erënnere virun allem un zwee Virträg. Am éischte vun hinnen huet den Andrey Mokhov vun der University of Newcastle iwwer selektiv applikativ Functoren geschwat - eng Klass vun Typen déi Zwëschenzäit tëscht applikativen Functoren a Monade solle ginn. An enger anerer Virliesung huet ee vun de Grënner vum Haskell, Simon Peyton Jones, geschwat wéi d'Typ Inferenz am GHC Compiler funktionnéiert.

ZuriHac: funktionell programméiere üben

Virtrag vum Simon Peyton Jones. Foto vun Twitter ZuriHac

D'Meeschterklassen, déi während dem Hackathon ofgehale goufen, goufen an dräi Kategorien opgedeelt ofhängeg vum Trainingsniveau vun de Participanten. D'Aufgaben, déi d'Participanten ugebueden hunn, déi d'Entwécklung vu Projeten ugeschloss hunn, waren och mat Schwieregkeetsgrad markéiert. Déi kleng awer frëndlech Gemeinschaft vu funktionnelle Programméierer begréisst glécklech Newcomer a seng Reien. Fir d'Virliesunge vum Andrei Mokhov a Simon Peyton Jones ze verstoen, war awer de funktionnelle Programméierungscours, dee mir op der Uni gemaach hunn, ganz nëtzlech.

Aschreiwung fir d'Evenement ass gratis fir souwuel regelméisseg Participanten wéi och Projet Autoren. Mir hunn Ugangs Juni d'Demande fir d'Participatioun agereecht, duerno si mir séier vun der Waardelëscht op d'Lëscht vun de bestätegte Participanten iwwerginn.

An elo wäerte mir iwwer d'Projete schwätzen an der Entwécklung vun deenen mir deelgeholl hunn.

pandoc

pandoc ass en universellen Konverter vun Textdokumenter, tatsächlech, vun all Format zu all. Zum Beispill vun docx op pdf, oder vu Markdown op MediaWiki. Säin Auteur, John MacFarlane, ass Professer fir Philosophie op der University of California, Berkeley. Am Allgemengen ass Pandoc zimlech berühmt, an e puer vun eise Frënn waren iwwerrascht wéi se geléiert hunn datt Pandoc an Haskell geschriwwe gouf.

ZuriHac: funktionell programméiere üben

Lëscht vun Dokumentformater ënnerstëtzt vu Pandoc. Et gëtt och eng ganz Grafik um Site, awer dëst Bild passt net an den Artikel.

Natierlech bitt Pandoc keng direkt Konversioun fir all Pair vu Formater. Fir esou eng grouss Varietéit vun Transformatiounen z'ënnerstëtzen, gëtt eng Standardarchitektonesch Léisung benotzt: als éischt gëtt de ganze Dokument an eng speziell intern Zwëschenvertriedung iwwersat, an dann gëtt en Dokument an engem anere Format aus dëser interner Representatioun generéiert. D'Entwéckler nennen déi intern Representatioun "AST", wat fir Abstrakt Syntax Tree steet, oder abstrakte Syntaxbaum. Dir kënnt d'Zwëschenvertriedung ganz einfach kucken: alles wat Dir maache musst ass d'Ausgabformat op "native" setzen

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

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

Lieser, déi op d'mannst e bësse mam Haskell geschafft hunn, kënne scho vun dësem klenge Beispill unhuelen datt Pandoc an Haskell geschriwwen ass: d'Ausgab vun dësem Kommando ass eng Stringrepresentatioun vun den internen Strukture vu Pandoc, erstallt wéi et normalerweis gemaach gëtt. zu Haskell, zum Beispill, an der Standardbibliothéik.

Also, hei kënnt Dir gesinn datt déi intern Representatioun eng rekursiv Struktur ass, an all internen Node vun deem et eng Lëscht ass. Zum Beispill, um Topniveau gëtt et eng Lëscht vun engem Element - den éischte Level Header mat den Attributer "Hallo-Welt",[],[]. Verstoppt an dësem Header ass eng Lëscht vun der String "Hallo", gefollegt vun engem Raum an der String "World!".

Wéi Dir kënnt gesinn, ass déi intern Representatioun net vill anescht wéi HTML. Et ass e Bam wou all intern Node e puer Informatioun iwwer d'Formatéierung vu sengen Nokommen gëtt, an d'Blieder enthalen den aktuellen Inhalt vum Dokument.

Wa mir op den Implementéierungsniveau erofgoen, gëtt den Datetyp fir dat ganzt Dokument esou definéiert:

data Pandoc = Pandoc Meta [Block]

Hei Block ass genee déi intern Wirbelen uewen ernimmt, a Meta ass Metainformatioun iwwer d'Dokument, sou wéi Titel, Erstellungsdatum, Autoren - dëst ass anescht fir verschidde Formater, a Pandoc probéiert, wa méiglech, sou Informatioun ze bewahren wann Dir vu Format op iwwersetzt. format.

Bal all Konstrukteuren vum Blocktyp - zum Beispill Header oder Para (Paragraph) - huelen Attributer an eng Lëscht vun ënneschten Niveau Wirbelen als Argumenter - Inline, als Regel. Zum Beispill, Space oder Str sinn Konstruktoren vum Inline Typ, an den HTML Tag gëtt och an seng eege speziell Inline. Mir gesi kee Sënn fir eng komplett Definitioun vun dësen Typen ze bidden, awer bemierkt datt et hei ka fonnt ginn hei.

Interessanterweis ass den Typ Pandoc e Monoid. Dëst bedeit datt et eng Aart eidel Dokument gëtt, an datt Dokumenter zesumme gestapelt kënne ginn. Dëst ass bequem ze benotzen wann Dir Lieser schreift - Dir kënnt en Dokument an Deeler mat arbiträrer Logik opbriechen, all eenzel separat parséieren an dann alles an een Dokument zesummesetzen. An dësem Fall gëtt Metainformatioun aus allen Deeler vum Dokument gläichzäiteg gesammelt.

Wann Dir, sot, vu LaTeX op HTML konvertéiert, konvertéiert als éischt e spezielle Modul mam Numm LaTeXReader den Inputdokument an AST, dann konvertéiert en anere Modul mam Numm HTMLWriter den AST an HTML. Dank dëser Architektur ass et net néideg eng quadratesch Unzuel vun Konversiounen ze schreiwen - et ass genuch Lieser a Schrëftsteller fir all neit Format ze schreiwen, an all méiglech Konversiounsparen ginn automatesch ënnerstëtzt.

Et ass kloer datt sou eng Architektur och seng Nodeeler huet, laang virausgesot vun Experten am Beräich vun der Softwarearchitektur. Déi bedeitendst sinn d'Käschte fir Ännerungen am Syntaxbaum ze maachen. Wann d'Ännerung eescht genuch ass, musst Dir de Code an all Lieser a Schrëftsteller änneren. Zum Beispill, eng vun den Erausfuerderunge fir Pandoc Entwéckler ass d'Ënnerstëtzung vun komplexen Dëschformater. Elo kann Pandoc nëmme ganz einfach Dëscher erstellen, mat engem Header, Kolonnen an e Wäert an all Zell. Zum Beispill gëtt de Colspan Attribut an HTML einfach ignoréiert. Ee vun de Grënn fir dëst Verhalen ass de Mangel un engem vereenegt Schema fir Dëscher an all oder op d'mannst vill Formater ze representéieren - deementspriechend ass et onkloer a wéi enger Form d'Dëscher an der interner Representatioun solle gespäichert ginn. Awer och nodeems Dir eng spezifesch Vue gewielt hutt, musst Dir absolut all Lieser a Schrëftsteller änneren, déi mat Dëscher schaffen.

D'Haskell Sprooch gouf gewielt net nëmme wéinst der grousser Léift vun den Auteuren fir funktionell Programméierung. Haskell ass bekannt fir seng extensiv Textveraarbechtungsfäegkeeten. E Beispill ass d'Bibliothéik Parsec ass eng Bibliothéik déi d'Konzepter vun der funktioneller Programméierung aktiv benotzt - Monoiden, Monaden, applikativ an alternativ Functoren - fir arbiträr Parser ze schreiwen. Déi voll Kraaft vu Parsec kann an gesi ginn Beispill vun HaskellWiki, wou e komplette Parser vun enger einfacher imperativer Programmiersprache parséiert gëtt. Natierlech gëtt Parsec och aktiv am Pandoc benotzt.

Kuerz beschriwwen, Monade gi fir sequentiell Parsing benotzt, wann eng Saach als éischt kënnt, an dann eng aner. Zum Beispill, an dësem Beispill:

whileParser :: Parser Stmt
whileParser = whiteSpace >> statement

Als éischt musst Dir de Raum zielen, an dann d'Ausso - déi och de Parser Stmt Typ huet.

Alternativ Functors gi benotzt fir zréckzerollen wann d'Parsing feelt. Zum Beispill,

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

Heescht datt Dir entweder musst probéieren d'Ausso an de Klammeren ze liesen, oder probéiert e puer Aussoen sequenziell ze liesen.

Applikativ Functore ginn haaptsächlech als Ofkierzunge fir Monade benotzt. Zum Beispill, loosst d'tok-Funktioun e puer Token liesen (dëst ass eng richteg Funktioun vum LaTeXReader). Loosst eis dës Kombinatioun kucken

const <$> tok <*> tok

Et wäert zwee Tokens hannereneen liesen an déi éischt zréckginn.

Fir all dës Klassen huet Haskell schéin symbolesch Opérateuren, déi mécht Reader programméiere kucken wéi ASCII Konscht. Just dës wonnerbar Code bewonneren.

Eis Aufgabe ware mam LaTeXReader verbonnen. Dem Vasily seng Aufgab war d'Mbox an d'Hbox Kommandoen z'ënnerstëtzen, nëtzlech fir Packagen an LaTeX ze schreiwen. D'Elizabeth war responsabel fir den Epigraph Kommando z'ënnerstëtzen, wat Iech erlaabt Epigraphen an LaTeX Dokumenter ze kreéieren.

Hatrace

UNIX-ähnlech Betribssystemer implementéieren dacks de ptrace System Call. Et ass nëtzlech beim Debugging an der Simulatioun vum Programmëmfeld, wat Iech erlaabt d'Systemappellen ze verfolgen déi de Programm mécht. Zum Beispill benotzt déi ganz nëtzlech Strace Utility ptrace intern.

Hatrace ass eng Bibliothéik déi en Interface ubitt fir ptrace zu Haskell. D'Tatsaach ass datt ptrace selwer ganz raffinéiert ass an et ass zimmlech schwéier et direkt ze benotzen, besonnesch vu funktionnelle Sproochen.

Hatrace leeft wéi Strace beim Startup an akzeptéiert ähnlech Argumenter. Et ënnerscheet sech vu Strace an datt et och eng Bibliothéik ass déi e méi einfachen Interface ubitt wéi just ptrace.

Mat der Hëllef vun Hatrace hu mir schonn een onangenehmen Käfer am GHC Haskell Compiler gefaangen - am falsche Moment ëmbruecht, et generéiert falsch Objektdateien a kompiléiert se net wann se nei gestart ginn. Scripting duerch System Appellen huet et méiglech gemaach de Feeler an engem Laf zouverlässeg ze reproduzéieren, während zoufälleg Killer de Feeler an ongeféier zwou Stonnen reproduzéiert hunn.

Mir hunn System Uruff Interfaces an d'Bibliothéik bäigefüügt - Elizaveta huet brk bäigefüügt, a Vasily bäigefüügt mmap. Baséierend op d'Resultater vun eiser Aarbecht ass et méiglech méi einfach a präzis d'Argumenter vun dëse Systemruffen ze benotzen wann Dir d'Bibliothéik benotzt.

Source: will.com

Setzt e Commentaire