Å Ä gada jÅ«nijÄ mazajÄ Å veices pilsÄtiÅÄ RapersvilÄ notika pasÄkums ar nosaukumu
Par mums
Å o rakstu sagatavojuÅ”i divi NacionÄlÄs pÄtniecÄ«bas universitÄtes SanktpÄterburgas Ekonomikas augstskolas programmas āLietiÅ”Ä·Ä matemÄtika un informÄtikaā 3. kursa studenti: Vasilijs Alferovs un Elizaveta Vasiļenko. AizrauÅ”anÄs ar funkcionÄlo programmÄÅ”anu mums abiem sÄkÄs ar D. N. Moskvina lekciju ciklu universitÄtes 2. kursÄ. Å obrÄ«d Vasilijs piedalÄs Google Summer of Code programmÄ, kuras ietvaros projekta komandas vadÄ«bÄ ievieÅ” algebriskos grafikus HaskellÄ.
PasÄkuma formÄts
MÄrÄ·auditorija ir atvÄrtÄ pirmkoda projektu Ä«paÅ”nieki, programmÄtÄji, kuri vÄlas piedalÄ«ties to izstrÄdÄ, funkcionÄlÄs programmÄÅ”anas pÄtnieki un cilvÄki, kas vienkÄrÅ”i aizraujas ar Haskell. Å ogad izstrÄdÄtÄji no vairÄk nekÄ piecdesmit atvÄrtÄ pirmkoda Haskell projektiem no visas pasaules pulcÄjÄs norises vietÄ - HSR Hochschule fĆ¼r Technik Rapperswil -, lai runÄtu par saviem produktiem un ieinteresÄtu jaunus cilvÄkus par to attÄ«stÄ«bu.
Foto no Twitter
ShÄma ir ļoti vienkÄrÅ”a: jums iepriekÅ” jÄuzraksta daži priekÅ”likumi par savu projektu un jÄnosÅ«ta organizatoriem, kuri ievietos informÄciju par jÅ«su projektu pasÄkuma lapÄ. TurklÄt pirmajÄ dienÄ projektu autoriem ir trÄ«sdesmit sekundes, lai ļoti Ä«si no skatuves pastÄstÄ«tu, ko viÅi dara un kas jÄdara. Tad interesenti meklÄ autorus un detalizÄti jautÄ par uzdevumiem.
Mums vÄl nav savu atvÄrto projektu, bet ļoti vÄlamies dot savu ieguldÄ«jumu jau esoÅ”ajos, tÄpÄc reÄ£istrÄjÄmies kÄ pastÄvÄ«gie dalÄ«bnieki. TrÄ«s dienu laikÄ mÄs strÄdÄjÄm ar divÄm izstrÄdÄtÄju grupÄm. IzrÄdÄs, ka kopÄ«ga koda un dzÄ«vÄs komunikÄcijas izpÄte padara mijiedarbÄ«bu starp projekta autoriem un lÄ«dzstrÄdniekiem ļoti produktÄ«vu - ZuriHac mÄs varÄjÄm izprast jomas, kas mums bija jaunas, un varÄjÄm palÄ«dzÄt divÄm pilnÄ«gi atŔķirÄ«gÄm komandÄm, katrÄ izpildot vienu uzdevumu. no projektiem.
Papildus vÄrtÄ«gai praksei ZuriHac notika arÄ« vairÄkas lekcijas un meistarklases. ÄŖpaÅ”i atceramies divas lekcijas. PirmajÄ no tiem Andrejs Mokhovs no Å Å«kÄslas universitÄtes runÄja par selektÄ«viem aplikatÄ«vajiem funkcijÄm - tipu klasi, kam jÄkļūst par starpposmu starp aplikatÄ«vajiem funkcijÄm un monÄdÄm. CitÄ lekcijÄ viens no Haskell dibinÄtÄjiem Saimons Peitons Džounss runÄja par to, kÄ GHC kompilatorÄ darbojas tipa secinÄjumi.
Saimona Peitona Džounsa lekcija. Foto no Twitter
Hakatona laikÄ notikuÅ”Äs meistarklases tika sadalÄ«tas trÄ«s kategorijÄs atkarÄ«bÄ no dalÄ«bnieku sagatavotÄ«bas lÄ«meÅa. Ar grÅ«tÄ«bas pakÄpi tika atzÄ«mÄti arÄ« piedÄvÄtie uzdevumi dalÄ«bniekiem, kuri iesaistÄ«jÄs projektu izstrÄdÄ. MazÄ, bet draudzÄ«gÄ funkcionÄlo programmÄtÄju kopiena ar prieku uzÅem jaunpienÄcÄjus savÄs rindÄs. Lai saprastu Andreja Mokhova un Saimona Peitona Džounsa lekcijas, ļoti noderÄja funkcionÄlÄs programmÄÅ”anas kurss, ko mÄcÄ«jÄmies universitÄtÄ.
ReÄ£istrÄcija pasÄkumam ir bez maksas gan pastÄvÄ«gajiem dalÄ«bniekiem, gan projektu autoriem. Pieteikumus dalÄ«bai iesniedzÄm jÅ«nija sÄkumÄ, pÄc kÄ Ätri tikÄm no gaidÄ«Å”anas saraksta pÄrcelti uz apstiprinÄto dalÄ«bnieku sarakstu.
Un tagad mÄs runÄsim par projektiem, kuru izstrÄdÄ mÄs piedalÄ«jÄmies.
Pandoc
Pandoc atbalstÄ«to dokumentu formÄtu saraksts. VietnÄ ir arÄ« vesels grafiks, taÄu Å”is attÄls neiederas rakstÄ.
Protams, Pandoc nenodroÅ”ina tieÅ”u konvertÄÅ”anu katram formÄtu pÄrim. Lai atbalstÄ«tu tik daudzveidÄ«gas transformÄcijas, tiek izmantots standarta arhitektÅ«ras risinÄjums: vispirms viss dokuments tiek tulkots Ä«paÅ”Ä iekÅ”ÄjÄ starpattÄlÄ un pÄc tam no Ŕī iekÅ”ÄjÄ attÄlojuma tiek Ä£enerÄts dokuments citÄ formÄtÄ. IzstrÄdÄtÄji iekÅ”Äjo attÄlojumu sauc par āASTā, kas apzÄ«mÄ abstrakto sintakses koku vai
$ cat example.html
<h1>Hello, World!</h1>
$ pandoc -f html -t native example.html
[Header 1 ("hello-world",[],[]) [Str "Hello,",Space,Str "World!"]]
LasÄ«tÄji, kuri ir vismaz nedaudz strÄdÄjuÅ”i ar Haskell, jau no Ŕī mazÄ piemÄra var pieÅemt, ka Pandoc ir rakstÄ«ts Haskell: Ŕīs komandas izvade ir Pandoc iekÅ”Äjo struktÅ«ru virknes attÄlojums, kas izveidots lÄ«dzÄ«gi kÄ tas parasti tiek darÄ«ts. Haskell, piemÄram, standarta bibliotÄkÄ.
TÄtad, Å”eit var redzÄt, ka iekÅ”Äjais attÄlojums ir rekursÄ«va struktÅ«ra, kuras katrÄ iekÅ”ÄjÄ mezglÄ ir saraksts. PiemÄram, augÅ”ÄjÄ lÄ«menÄ« ir viena elementa saraksts - pirmÄ lÄ«meÅa galvene ar atribÅ«tiem āhello-worldā,[],[]. Å ajÄ galvenÄ ir paslÄpts virknes āSveikiā saraksts, kam seko atstarpe un virkne āPasaule!ā.
KÄ redzat, iekÅ”Äjais attÄlojums daudz neatŔķiras no HTML. Tas ir koks, kurÄ katrs iekÅ”Äjais mezgls sniedz zinÄmu informÄciju par tÄ pÄcnÄcÄju formatÄjumu, un lapas satur faktisko dokumenta saturu.
Ja mÄs ejam uz ievieÅ”anas lÄ«meni, visa dokumenta datu tips tiek definÄts Å”Ädi:
data Pandoc = Pandoc Meta [Block]
Å eit Bloks ir tieÅ”i iepriekÅ” minÄtÄs iekÅ”ÄjÄs virsotnes, bet Meta ir metainformÄcija par dokumentu, piemÄram, nosaukums, izveides datums, autori - dažÄdiem formÄtiem tas atŔķiras, un Pandoc cenÅ”as, ja iespÄjams, saglabÄt Å”Ädu informÄciju, tulkojot no formÄta uz. formÄtÄ.
GandrÄ«z visi bloka tipa konstruktori - piemÄram, galvene vai rindkopa (rindkopa) - kÄ argumentus izmanto atribÅ«tus un zemÄka lÄ«meÅa virsotÅu sarakstu - kÄ likums. PiemÄram, Space vai Str ir Inline tipa konstruktori, un HTML tags arÄ« pÄrvÄrÅ”as par savu Ä«paÅ”o Inline. MÄs neredzam jÄgu sniegt pilnÄ«gu Å”o veidu definÄ«ciju, taÄu Åemiet vÄrÄ, ka to var atrast Å”eit
Interesanti, ka tips Pandoc ir monoÄ«ds. Tas nozÄ«mÄ, ka ir kaut kÄds tukÅ”s dokuments un ka dokumentus var salikt kopÄ. Tas ir Ärti lietojams, rakstot lasÄ«tÄjus ā varat sadalÄ«t dokumentu daļÄs, izmantojot patvaļīgu loÄ£iku, parsÄt katru atseviŔķi un pÄc tam visu apvienot vienÄ dokumentÄ. Å ajÄ gadÄ«jumÄ metainformÄcija tiks savÄkta no visÄm dokumenta daļÄm vienlaikus.
KonvertÄjot, piemÄram, no LaTeX uz HTML, vispirms Ä«paÅ”s modulis ar nosaukumu LaTeXReader pÄrvÄrÅ” ievades dokumentu par AST, pÄc tam cits modulis ar nosaukumu HTMLWriter pÄrvÄrÅ” AST par HTML. Pateicoties Å”ai arhitektÅ«rai, nav jÄraksta kvadrÄtiskais reklÄmguvumu skaits ā katram jaunam formÄtam pietiek uzrakstÄ«t Reader un Writer, un automÄtiski tiks atbalstÄ«ti visi iespÄjamie reklÄmguvumu pÄri.
Skaidrs, ka Å”Ädai arhitektÅ«rai ir arÄ« savi trÅ«kumi, ko jau sen prognozÄja programmatÅ«ras arhitektÅ«ras jomas eksperti. NozÄ«mÄ«gÄkÄs ir sintakses koka izmaiÅu veikÅ”anas izmaksas. Ja izmaiÅas ir pietiekami nopietnas, jums bÅ«s jÄmaina kods visos lasÄ«tÄjos un rakstÄ«tÄjos. PiemÄram, viens no izaicinÄjumiem, ar ko saskaras Pandoc izstrÄdÄtÄji, ir sarežģītu tabulu formÄtu atbalstÄ«Å”ana. Tagad Pandoc var izveidot tikai ļoti vienkÄrÅ”as tabulas ar galveni, kolonnÄm un vÄrtÄ«bu katrÄ Å”Å«nÄ. PiemÄram, HTML atribÅ«ts colspan tiks vienkÄrÅ”i ignorÄts. Viens no Å”Ädas uzvedÄ«bas iemesliem ir vienotas shÄmas trÅ«kums tabulu attÄloÅ”anai visos vai vismaz daudzos formÄtos - attiecÄ«gi nav skaidrs, kÄdÄ formÄ tabulas jÄuzglabÄ iekÅ”ÄjÄ attÄlojumÄ. Bet pat pÄc konkrÄta skata atlasÄ«Å”anas jums bÅ«s jÄmaina absolÅ«ti visi lasÄ«tÄji un rakstÄ«tÄji, kas atbalsta darbu ar tabulÄm.
Haskell valoda tika izvÄlÄta ne tikai autoru lielÄs mÄ«lestÄ«bas pret funkcionÄlo programmÄÅ”anu dÄļ. Haskell ir pazÄ«stams ar savÄm plaÅ”ajÄm teksta apstrÄdes iespÄjÄm. Viens piemÄrs ir bibliotÄka
ÄŖsumÄ aprakstÄ«ts, monÄdes tiek izmantotas secÄ«gai parsÄÅ”anai, kad vispirms ir viena lieta, bet pÄc tam cita. PiemÄram, Å”ajÄ piemÄrÄ:
whileParser :: Parser Stmt
whileParser = whiteSpace >> statement
Vispirms jÄsaskaita atstarpe un pÄc tam priekÅ”raksts, kuram ir arÄ« Parser Stmt tips.
Ja parsÄÅ”ana neizdodas, atcelÅ”anai tiek izmantoti alternatÄ«vi funkcionÄri. PiemÄram,
statement :: Parser Stmt
statement = parens statement <|> sequenceOfStmt
NozÄ«mÄ, ka jums vai nu jÄmÄÄ£ina izlasÄ«t iekavÄs ievietotais apgalvojums, vai arÄ« jÄmÄÄ£ina lasÄ«t vairÄkus apgalvojumus pÄc kÄrtas.
Lietojumfunkcijas galvenokÄrt tiek izmantotas kÄ Ä«sceļi monÄdÄm. PiemÄram, ļaujiet funkcijai tok nolasÄ«t kÄdu marÄ·ieri (tÄ ir reÄla LaTeXReader funkcija). ApskatÄ«sim Å”o kombinÄciju
const <$> tok <*> tok
Tas nolasÄ«s divus žetonus pÄc kÄrtas un atgriezÄ«s pirmo.
VisÄm Ŕīm klasÄm Haskell ir skaisti simboli operatori, kas padara Reader programmÄÅ”anu lÄ«dzÄ«gu ASCII mÄkslai. VienkÄrÅ”i apbrÄ«nojiet Å”o brÄ«niŔķīgo kodu.
MÅ«su uzdevumi bija saistÄ«ti ar LaTeXReader. Vasilija uzdevums bija atbalstÄ«t mbox un hbox komandas, kas ir noderÄ«gas pakotÅu rakstÄ«Å”anai LaTeX. Elizabete bija atbildÄ«ga par epigrÄfa komandas atbalstÄ«Å”anu, kas ļauj izveidot epigrÄfus LaTeX dokumentos.
Hatrace
UNIX lÄ«dzÄ«gas operÄtÄjsistÄmas bieži Ä«steno ptrace sistÄmas izsaukumu. TÄ ir noderÄ«ga programmu vides atkļūdoÅ”anÄ un simulÄcijÄ, ļaujot izsekot programmas veiktajiem sistÄmas izsaukumiem. PiemÄram, ļoti noderÄ«gÄ utilÄ«ta strace iekÅ”Äji izmanto ptrace.
Hatrace ir bibliotÄka, kas nodroÅ”ina saskarni ptrace programmÄ Haskell. Fakts ir tÄds, ka pats ptrace ir ļoti sarežģīts, un to ir diezgan grÅ«ti izmantot tieÅ”i, it Ä«paÅ”i no funkcionÄlÄm valodÄm.
Hatrace startÄÅ”anas laikÄ darbojas kÄ strace un pieÅem lÄ«dzÄ«gus argumentus. TÄ atŔķiras no strace ar to, ka tÄ ir arÄ« bibliotÄka, kas nodroÅ”ina vienkÄrÅ”Äku saskarni nekÄ tikai ptrace.
Ar hatrace palÄ«dzÄ«bu jau esam noÄ·ÄruÅ”i vienu nepatÄ«kamu kļūdu GHC Haskell kompilatorÄ - tiek nogalinÄts nepareizÄ brÄ«dÄ«, tas Ä£enerÄ nepareizus objektu failus un pÄrstartÄjot tos nepÄrkompilÄ. SkriptÄÅ”ana, izmantojot sistÄmas izsaukumus, ļÄva droÅ”i reproducÄt kļūdu vienÄ piegÄjienÄ, savukÄrt nejauÅ”a nogalinÄÅ”ana kļūdu atkÄrtoja aptuveni divu stundu laikÄ.
MÄs bibliotÄkai pievienojÄm sistÄmas zvanu saskarnes - Elizaveta pievienoja brk, bet Vasilijs pievienoja mmap. Balstoties uz mÅ«su darba rezultÄtiem, izmantojot bibliotÄku, ir iespÄjams vienkÄrÅ”Äk un precÄ«zÄk izmantot Å”o sistÄmas izsaukumu argumentus.
Avots: www.habr.com