ZuriHac: praktik pemrograman fungsional

Ing wulan Juni taun iki, ing kutha cilik Swiss Rapperswil, acara disebut ZuriHac. Wektu iki nggawa luwih saka limang atus penyayang Haskell, saka pemula nganti para pendiri basa kasebut. Sanajan panitia nyebutake acara iki minangka hackathon, nanging dudu konferensi utawa hackathon ing pangertèn klasik. Format kasebut beda karo programer tradisional. Kita sinau babagan ZuriHac kanthi luck, melu, lan saiki kita nganggep tugas kita kanggo nyritakake babagan penemuan sing ora biasa!

ZuriHac: praktik pemrograman fungsional

О нас

Artikel iki disiapake dening rong siswa taun 3 saka program "Matematika Terapan lan Informatika" ing Sekolah Tinggi Ekonomi Universitas Riset Nasional - St. Petersburg: Vasily Alferov lan Elizaveta Vasilenko. Semangat kanggo program fungsional kanggo kita loro diwiwiti kanthi seri ceramah dening D. N. Moskvin ing taun 2nd universitas. Vasily saiki melu program Google Summer of Code, ing ngendi dheweke ngetrapake grafik aljabar ing Haskell kanthi bimbingan tim proyek Ganggang. Elizaveta ngetrapake katrampilan pemrograman fungsional sing dipikolehi ing karya kursus sing dikhususake kanggo implementasi algoritma anti-unifikasi kanthi aplikasi sabanjure ing teori jinis.

Format acara

Target pamirsa yaiku pamilik proyek sumber terbuka, programer sing pengin melu pangembangane, peneliti program fungsional, lan wong sing seneng banget karo Haskell. Taun iki, pangembang saka luwih saka sèket proyèk Haskell open source saka sak ndonya ngumpul ing ajang - HSR Hochschule für Technik Rapperswil - kanggo ngomong babagan produk lan njaluk wong anyar sing kasengsem ing pembangunan.

ZuriHac: praktik pemrograman fungsional

Foto saka Twitter ZuriHac

Skema kasebut gampang banget: sampeyan kudu nulis sawetara proposal babagan proyek sampeyan sadurunge lan dikirim menyang panitia, sing bakal ngirim informasi babagan proyek sampeyan ing kaca acara. Kajaba iku, ing dina pisanan, penulis proyek duwe telung puluh detik kanggo ngandhani kanthi cepet saka panggung apa sing ditindakake lan apa sing kudu ditindakake. Banjur wong sing kasengsem nggoleki penulis lan takon kanthi rinci babagan tugas kasebut.

Kita durung duwe proyek mbukak dhewe, nanging kita pancene pengin nyumbang kanggo sing wis ana, mula kita ndhaptar minangka peserta biasa. Sajrone telung dina, kita kerja bareng karo rong klompok pangembang. Pranyata sinau bareng kode lan komunikasi langsung ndadekake interaksi antarane penulis proyek lan kontributor banget produktif - ing ZuriHac kita bisa ngerti wilayah sing anyar kanggo kita lan bisa nulungi rong tim sing beda-beda, ngrampungake siji tugas ing saben saka proyek.

Saliyane latihan sing migunani, sawetara kuliah lan kelas master uga diwenehake ing ZuriHac. Kita utamané ngelingi loro ceramah. Ing wiwitan, Andrey Mokhov saka Universitas Newcastle ngomong babagan fungsi aplikatif sing selektif - kelas jinis sing kudu dadi penengah antarane fungsi aplikatif lan monad. Ing kuliah liyane, salah sawijining pangadeg Haskell, Simon Peyton Jones, ngomong babagan cara kerja inferensi jinis ing kompiler GHC.

ZuriHac: praktik pemrograman fungsional

Kuliah dening Simon Peyton Jones. Foto saka Twitter ZuriHac

Kelas master sing dianakake sajrone hackathon dipérang dadi telung kategori gumantung saka tingkat latihan para peserta. Tugas sing ditawakake kanggo peserta sing melu pangembangan proyek uga ditandhani kanthi tingkat kangelan. Komunitas programer fungsional sing cilik nanging grapyak kanthi seneng nampani para pendatang anyar ing jajaran. Kanggo mangerteni ceramah Andrei Mokhov lan Simon Peyton Jones, Nanging, kursus pemrograman fungsional sing ditindakake ing universitas kasebut migunani banget.

Registrasi kanggo acara kasebut gratis kanggo peserta reguler lan penulis proyek. Kita ngirim aplikasi kanggo partisipasi ing awal Juni, sawise iku kita cepet ditransfer saka dhaptar tunggu kanggo dhaptar peserta dikonfirmasi.

Lan saiki kita bakal pirembagan bab proyèk ing pembangunan kang kita melu.

pandoc

pandoc minangka konverter universal dokumen teks, nyatane, saka format apa wae menyang format apa wae. Contone, saka docx menyang pdf, utawa saka Markdown menyang MediaWiki. Penulis, John MacFarlane, minangka profesor filsafat ing Universitas California, Berkeley. Umume, Pandoc cukup misuwur, lan sawetara kanca kaget nalika ngerti yen Pandoc ditulis ing Haskell.

ZuriHac: praktik pemrograman fungsional

Dhaptar format dokumen sing didhukung dening Pandoc. Ana uga grafik kabeh ing situs kasebut, nanging gambar iki ora cocog karo artikel kasebut.

Mesthine, Pandoc ora nyedhiyakake konversi langsung kanggo saben pasangan format. Kanggo ndhukung macem-macem transformasi kasebut, solusi arsitektur standar digunakake: pisanan, kabeh dokumen diterjemahake menyang perwakilan perantara internal khusus, banjur dokumen ing format sing beda digawe saka perwakilan internal iki. Pangembang nelpon perwakilan internal "AST", sing tegese Abstract Syntax Tree, utawa wit sintaksis abstrak. Sampeyan bisa ndeleng perwakilan penengah kanthi gampang: sampeyan mung kudu nyetel format output dadi "native"

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

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

Pembaca sing wis kerja sama karo Haskell paling sethithik wis bisa nganggep saka conto cilik iki yen Pandoc ditulis ing Haskell: output saka printah iki minangka perwakilan senar saka struktur internal Pandoc, digawe kanthi cara sing biasane ditindakake. ing Haskell, contone, ing perpustakaan standar.

Dadi, ing kene sampeyan bisa ndeleng manawa perwakilan internal minangka struktur rekursif, ing saben simpul internal sing ana dhaptar. Contone, ing tingkat ndhuwur ana dhaptar siji unsur - header tingkat pisanan kanthi atribut "hello-world",[],[]. Sing didhelikake ing header iki ana dhaptar senar "Halo," disusul spasi lan senar "World!".

Kaya sing sampeyan ngerteni, perwakilan internal ora beda karo HTML. Iki minangka wit ing ngendi saben simpul internal nyedhiyakake sawetara informasi babagan format turunane, lan godhong ngemot isi nyata saka dokumen kasebut.

Yen kita mudhun menyang tingkat implementasine, jinis data kanggo kabeh dokumen ditetepake kaya iki:

data Pandoc = Pandoc Meta [Block]

Ing kene, Blok yaiku simpul internal sing kasebut ing ndhuwur, lan Meta minangka metainformasi babagan dokumen kasebut, kayata judhul, tanggal nggawe, penulis - iki beda kanggo macem-macem format, lan Pandoc nyoba, yen bisa, kanggo njaga informasi kasebut nalika nerjemahake saka format menyang format.

Meh kabeh konstruktor saka jinis Blok - contone, Header utawa Para (paragraf) - njupuk atribut lan dhaptar vertex tingkat ngisor minangka argumen - Inline, minangka aturan. Contone, Space utawa Str minangka konstruktor saka jinis Inline, lan tag HTML uga dadi Inline khusus dhewe. Kita ora weruh gunane nyedhiyakake definisi lengkap babagan jinis kasebut, nanging elinga yen bisa ditemokake ing kene kene.

Sing nggumunake, jinis Pandoc yaiku monoid. Iki tegese ana sawetara jinis dokumen kosong, lan dokumen bisa ditumpuk bebarengan. Iki trep kanggo nggunakake nalika nulis Readers - sampeyan bisa break document menyang bagean nggunakake logika sembarang, parse saben siji, banjur sijine kabeh bebarengan menyang siji document. Ing kasus iki, metainformation bakal diklumpukake saka kabeh bagean dokumen bebarengan.

Nalika ngowahi, ucapake, saka LaTeX menyang HTML, pisanan modul khusus sing diarani LaTeXReader ngowahi dokumen input dadi AST, banjur modul liyane sing diarani HTMLWriter ngowahi AST dadi HTML. Thanks kanggo arsitektur iki, ora perlu nulis jumlah konversi kuadrat - cukup nulis Reader lan Writer kanggo saben format anyar, lan kabeh pasangan konversi bakal didhukung kanthi otomatis.

Cetha yen arsitektur kasebut uga nduweni kekurangan, sing wis suwe diramalake dening para ahli ing bidang arsitektur piranti lunak. Sing paling penting yaiku biaya nggawe owah-owahan ing wit sintaksis. Yen owah-owahan cukup serius, sampeyan kudu ngganti kode ing kabeh Readers lan Writers. Contone, salah sawijining tantangan sing diadhepi pangembang Pandoc yaiku ndhukung format tabel sing rumit. Saiki Pandoc mung bisa nggawe tabel sing prasaja banget, kanthi header, kolom lan nilai ing saben sel. Contone, atribut colspan ing HTML mung bakal diabaikan. Salah sawijining alasan kanggo prilaku iki yaiku kekurangan skema gabungan kanggo makili tabel ing kabeh utawa paling ora akeh format - mula, ora jelas ing bentuk apa tabel kudu disimpen ing perwakilan internal. Nanging sanajan sawise milih tampilan tartamtu, sampeyan kudu ngganti pancen kabeh Readers lan Writers sing ndhukung nggarap tabel.

Basa Haskell dipilih ora mung amarga katresnan gedhe penulis kanggo program fungsional. Haskell dikenal kanthi kemampuan pangolahan teks sing ekstensif. Salah sawijining conto yaiku perpustakaan parsec minangka perpustakaan sing aktif nggunakake konsep pemrograman fungsional - monoid, monad, fungsi aplikatif lan alternatif - kanggo nulis parser sing sewenang-wenang. Kekuwatan lengkap Parsec bisa dideleng ing contone saka HaskellWiki, ing ngendi parser lengkap saka basa pamrograman imperatif prasaja diurai. Mesthine, Parsec uga aktif digunakake ing Pandoc.

Dijelasake kanthi ringkes, monad digunakake kanggo parsing sekuensial, nalika siji perkara luwih dhisik, banjur liyane. Contone, ing conto iki:

whileParser :: Parser Stmt
whileParser = whiteSpace >> statement

Pisanan sampeyan kudu ngetung spasi, banjur statement - sing uga nduweni jinis Parser Stmt.

Fungsi alternatif digunakake kanggo muter maneh yen parsing gagal. Tuladhane,

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

Tegese sampeyan kudu nyoba maca statement ing kurung, utawa nyoba maca sawetara statement kanthi urutan.

Fungsi aplikatif digunakake utamane minangka trabasan kanggo monad. Contone, supaya fungsi tok maca sawetara token (iki minangka fungsi nyata saka LaTeXReader). Ayo katon ing kombinasi iki

const <$> tok <*> tok

Bakal maca rong token saurutan lan bali sing pisanan.

Kanggo kabeh kelas kasebut, Haskell nduweni operator simbolis sing apik, sing ndadekake program Reader katon kaya seni ASCII. Mung ngujo kode apik iki.

Tugas kita ana gandhengane karo LaTeXReader. Tugas Vasily kanggo ndhukung mbox lan hbox printah, migunani kanggo nulis paket ing LaTeX. Elizabeth tanggung jawab kanggo ndhukung perintah epigraph, sing ngidini sampeyan nggawe epigraf ing dokumen LaTeX.

Hatrace

Sistem operasi kaya UNIX asring ngleksanakake panggilan sistem ptrace. Iku migunani kanggo debugging lan simulasi lingkungan program, ngijini sampeyan kanggo nglacak telpon sistem sing program ndadekake. Contone, sarana strace banget migunani nggunakake ptrace internal.

Hatrace punika perpustakaan sing nyedhiyani antarmuka kanggo ptrace ing Haskell. Kasunyatane yaiku ptrace dhewe pancen canggih lan cukup angel digunakake kanthi langsung, utamane saka basa fungsional.

Hatrace mlaku kaya strace nalika wiwitan lan nampa argumen sing padha. Iku bedo saka strace ing iku uga perpustakaan sing nyedhiyani antarmuka prasaja saka mung ptrace.

Kanthi bantuan saka hatrace, kita wis kejiret siji bug karu ing compiler GHC Haskell - matèni ing wayahe salah, iku njedulake file obyek salah lan ora recompile nalika miwiti maneh. Scripting dening sistem telpon ndadekake iku bisa kanggo andal ngasilake kesalahan ing siji roto, nalika matèni acak maleh kesalahan ing bab rong jam.

Kita nambahake antarmuka telpon sistem menyang perpustakaan - Elizaveta nambahake brk, lan Vasily nambah mmap. Adhedhasar asil karya kita, bisa luwih gampang lan akurat nggunakake argumen saka sistem kasebut nalika nggunakake perpustakaan.

Source: www.habr.com

Add a comment