Үстүбүздөгү жылдын июнь айында Швейцариянын кичинекей Рапперсвил шаарында окуя болгон . Бул жолу ал беш жүздөн ашык Хаскелл сүйүүчүлөрүн, башталгычтардан баштап тилдин негиздөөчүлөрүнө чейин чогултту. Уюштуруучулар бул иш-чараны хакатон деп аташканы менен, ал классикалык мааниде конференция же хакатон эмес. Анын форматы салттуу программисттерден айырмаланат. Биз ZuriHac жөнүндө бактыбыздан билдик, ага катыштык, эми адаттан тыш табылга тууралуу айтып берүүнү өзүбүздүн милдетибиз деп эсептейбиз!

Биз жөнүндө
Бул макаланы Санкт-Петербургдагы Улуттук изилдөө университетинин Жогорку Экономика мектебинин “Колдонмо математика жана информатика” программасынын 3-курсунун эки студенти: Василий Алферов жана Елизавета Василенко даярдашкан. Экөөбүздүн тең функционалдык программалоого болгон кызыгуубуз университеттин 2-курсунда Д.Н.Москвиндин бир катар лекцияларынан башталган. Василий учурда Google Summer of Code программасына катышууда, анын алкагында долбоордун командасынын жетекчилиги астында Хаскеллде алгебралык графиктерди ишке ашырууда. . Елизавета алган функционалдык программалоо көндүмдөрүн антиунификациялоо алгоритмин ишке ашырууга арналган курстук иште, кийин типтер теориясында колдонуу менен колдонгон.
Окуя форматы
Максаттуу аудитория - ачык булак долбоорлорунун ээлери, аларды иштеп чыгууга катышууну каалаган программисттер, функционалдык программалоо боюнча изилдөөчүлөр жана жөн гана Хаскеллге күйгөн адамдар. Бул жылы HSR Hochschule für Technik Rapperswil жеринде дүйнө жүзүндөгү элүүдөн ашык ачык булактуу Haskell долбоорлорунун иштеп чыгуучулары өздөрүнүн өнүмдөрү жөнүндө сүйлөшүү жана алардын өнүгүшүнө жаңы адамдарды кызыктыруу үчүн чогулушту.

Сүрөт Twitter'ден
Схема абдан жөнөкөй: сиз өз долбооруңуз тууралуу бир нече сунуштарды алдын ала жазып, уюштуруучуларга жөнөтүшүңүз керек, алар иш-чара бетине сиздин долбооруңуз тууралуу маалыматты жайгаштырышат. Кошумчалай кетсек, биринчи күнү долбоорлордун авторлору сахнадан эмне кылып жатканын жана эмне кылуу керектигин кыскача айтып берүү үчүн отуз секунда алышат. Андан кийин кызыккандар авторлорду издеп, тапшырмалар тууралуу кеңири сурашат.
Азырынча өзүбүздүн ачык долбоорлорубуз жок, бирок биз чындап эле иштеп жаткан долбоорлорго салым кошууну каалайбыз, ошондуктан биз туруктуу катышуучулар катары катталганбыз. Үч күндүн ичинде биз иштеп чыгуучулардын эки тобу менен иштештик. Кодду биргелешип изилдөө жана жандуу баарлашуу долбоордун авторлору менен салым кошуучулардын ортосундагы өз ара аракеттенүүнү абдан жемиштүү кылат экен - ZuriHacта биз биз үчүн жаңы болгон аймактарды түшүнө алдык жана ар биринде бир тапшырманы аткарып, эки таптакыр башка командага жардам бере алдык. долбоорлордун.
ZuriHacда баалуу практикадан тышкары бир нече лекциялар жана мастер-класстар да окулду. Айрыкча эки лекция эсибизде. Алардын биринчисинде Ньюкасл университетинен Андрей Мохов тандалып алынган аппликативдик функторлор жөнүндө айтып берди – бул типтердин классы, алар прикладдык функторлор менен монадалардын ортосунда ортолук болууга тийиш. Дагы бир лекцияда Хаскеллдин негиздөөчүлөрүнүн бири Саймон Пейтон Джонс GHC компиляторунда типтүү корутундунун кантип иштээри жөнүндө айтып берди.

Саймон Пейтон Жонстун лекциясы. Сүрөт Twitter'ден
Хакатон учурунда өткөрүлгөн мастер-класстар катышуучулардын даярдык деңгээлине жараша үч категорияга бөлүндү. Долбоорлорду иштеп чыгууга кошулган катышуучуларга сунушталган тапшырмалар да кыйынчылык даражасы менен белгиленди. Функционалдык программисттердин чакан, бирок достук коомчулугу жаңы келгендерди кубаныч менен тосуп алат. Андрей Мохов менен Саймон Пейтон Жонстун лекцияларын түшүнүү үчүн университетте окуган функционалдык программалоо курсу абдан пайдалуу болду.
Иш-чарага каттоо туруктуу катышуучулар үчүн да, долбоордун авторлору үчүн да бекер. Биз катышуу үчүн арыздарды июнь айынын башында тапшырганбыз, андан кийин күтүү тизмесинен бат эле тастыкталган катышуучулардын тизмесине которулдук.
Эми биз иштеп чыгууга катышкан долбоорлор тууралуу сөз кылабыз.
pandoc
тексттик документтердин универсалдуу конвертору, чындыгында, каалаган форматтан каалаган форматка. Мисалы, docxтен pdfге же Markdownдан MediaWikiге. Анын автору Джон МакФарлейн Берклидеги Калифорния университетинин философия профессору. Жалпысынан алганда, Пандок абдан белгилүү жана биздин кээ бир досторубуз Пандоктун Хаскеллде жазылганын укканда таң калышты.

Pandoc тарабынан колдоого алынган документ форматтарынын тизмеси. Ошондой эле сайтта толук график бар, бирок бул сүрөт макалага туура келбейт.
Албетте, Pandoc форматтардын ар бир жуп үчүн түз өзгөртүүнү камсыз кылбайт. Мындай ар түрдүү трансформацияларды колдоо үчүн стандарттуу архитектуралык чечим колдонулат: биринчиден, бүт документ атайын ички ортоңку өкүлчүлүккө которулат, андан кийин бул ички өкүлчүлүктөн башка форматтагы документ түзүлөт. Иштеп чыгуучулар ички өкүлчүлүктү "AST" деп аташат, ал абстракттуу синтаксис дарагын, же . Сиз ортодогу өкүлчүлүктү карап көрсөңүз болот: сиз эмне кылышыңыз керек болсо, чыгаруу форматын "түпкүлүктүү" кылып коюу
$ cat example.html
<h1>Hello, World!</h1>
$ pandoc -f html -t native example.html
[Header 1 ("hello-world",[],[]) [Str "Hello,",Space,Str "World!"]]
Хаскелл менен бир аз иштешкен окурмандар бул кичинекей мисалдан Pandoc Хаскеллде жазылган деп болжолдой алышат: бул буйруктун натыйжасы Pandocтун ички структураларынын саптуу чагылдырылышы болуп саналат, ал адатта кандайча аткарылат мисалы, Хаскеллде, стандарттуу китепканада.
Ошентип, бул жерде сиз ички өкүлчүлүк рекурсивдүү структура экенин көрө аласыз, анын ар бир ички түйүндө тизмеси бар. Мисалы, жогорку деңгээлде бир элементтин тизмеси бар - биринчи деңгээлдеги баш аты "салам дүйнө",[],[] атрибуттары менен. Бул аталыштын ичинде "Салам" саптарынын тизмеси, андан кийин боштук жана "Дүйнө!" саптары катылган.
Көрүнүп тургандай, ички өкүлчүлүк HTMLден көп деле айырмаланбайт. Бул дарак, анда ар бир ички түйүн өзүнүн тукумдарынын форматы жөнүндө кээ бир маалыматтарды берет, ал эми жалбырактары документтин чыныгы мазмунун камтыйт.
Эгерде биз ишке ашыруу деңгээлине түшө турган болсок, бүт документтин маалымат түрү төмөнкүдөй аныкталат:
data Pandoc = Pandoc Meta [Block]Бул жерде Блок так жогоруда айтылган ички чокулар, ал эми Мета документ жөнүндө метаинформация, мисалы аталышы, түзүлгөн күнү, авторлору - бул ар кандай форматтар үчүн ар кандай жана Pandoc, мүмкүн болсо, форматтан которууда мындай маалыматты сактоого аракет кылат. формат.
Блок түрүндөгү дээрлик бардык конструкторлор - мисалы, Header же Para (абзац) - атрибуттарды жана төмөнкү деңгээлдеги чокулардын тизмесин аргумент катары алышат - Inline, эреже катары. Мисалы, Space же Str Inline тибиндеги конструкторлор жана HTML теги дагы өзүнүн өзгөчө Inlineга айланат. Биз бул түрлөрдүн толук аныктамасын берүүнүн эч кандай мааниси жок экенин көрөбүз, бирок аны бул жерден тапса болот .
Кызыктуусу, Pandoc түрү моноид болуп саналат. Бул кандайдыр бир бош документтин бар экенин жана документтерди бириктирүүгө болот дегенди билдирет. Бул Readers жазууда колдонууга ыңгайлуу – сиз каалаган логиканы колдонуу менен документти бөлүктөргө бөлүп, ар бирин өзүнчө талдап, анан баарын бир документке чогулта аласыз. Бул учурда, метаинформация документтин бардык бөлүктөрүнөн бир эле учурда чогултулат.
Мисалы, LaTeXтен HTMLге конвертациялоодо, адегенде LaTeXReader деп аталган атайын модул киргизилген документти ASTге, андан кийин HTMLWriter деп аталган башка модуль ASTти HTMLге айлантат. Бул архитектуранын аркасында конверсиялардын квадраттык санын жазуунун кажети жок – ар бир жаңы формат үчүн Reader жана Writer жазуу жетиштүү жана бардык мүмкүн болгон конверсия жуптары автоматтык түрдө колдоого алынат.
Мындай архитектуранын дагы программалык камсыздоо архитектурасынын адистери көптөн бери алдын ала айткан кемчиликтери бар экени түшүнүктүү. Эң маанилүүсү - синтаксис дарагына өзгөртүүлөрдү киргизүүнүн баасы. Эгерде өзгөртүү жетиштүү олуттуу болсо, сиз бардык Окурмандар менен Жазуучулардагы кодду өзгөртүүгө туура келет. Мисалы, Pandoc иштеп чыгуучулардын алдында турган көйгөйлөрдүн бири татаал таблица форматтарын колдоо болуп саналат. Эми Pandoc ар бир уячада аталышы, мамычалары жана мааниси бар өтө жөнөкөй таблицаларды гана түзө алат. Мисалы, HTMLдеги colspan атрибуту жөн гана этибарга алынбайт. Мындай жүрүм-турумдун себептеринин бири таблицаларды бардык же жок эле дегенде көп форматтарда көрсөтүүнүн бирдиктүү схемасынын жоктугу болуп саналат - ошого жараша таблицалар ички өкүлчүлүктө кандай формада сакталышы керектиги түшүнүксүз. Бирок, белгилүү бир көрүнүштү тандагандан кийин да, таблицалар менен иштөөнү колдогон бардык Окурмандар менен Жазуучуларды таптакыр өзгөртүшүңүз керек болот.
Хаскелл тили авторлордун функционалдык программалоого болгон зор сүйүүсү үчүн гана тандалып алынган эмес. Хаскелл текстти иштетүү боюнча кеңири мүмкүнчүлүктөрү менен белгилүү. Бир эле мисал китепкана ыктыярдуу анализдөөчүлөрдү жазуу үчүн функционалдык программалоонун түшүнүктөрүн - моноиддерди, монадаларды, аппликациялык жана альтернативдик функцияларды - активдүү колдонгон китепкана болуп саналат. Parsecтин толук күчүн көрүүгө болот HaskellWikiден, мында жөнөкөй императивдик программалоо тилинин толук талдоочусу талданат. Албетте, Parsec да Pandocто активдүү колдонулат.
Кыскача сүрөттөлгөндөй, монадалар ырааттуу талдоо үчүн колдонулат, биринчи кезекте бир нерсе, анан экинчиси келгенде. Мисалы, бул мисалда:
whileParser :: Parser Stmt
whileParser = whiteSpace >> statementАдегенде мейкиндикти, андан кийин билдирүүнү санашыңыз керек - анда Parser Stmt түрү да бар.
Альтернативдик функциялар талдоо ишке ашпай калса, артка кайтаруу үчүн колдонулат. Мисалы,
statement :: Parser Stmt
statement = parens statement <|> sequenceOfStmtСиз же кашаадагы билдирүүнү окууга аракет кылышыңыз керек, же бир нече билдирүүлөрдү ырааттуу окууга аракет кылуу керек дегенди билдирет.
Колдонмо функторлор биринчи кезекте монадалардын жарлыктары катары колдонулат. Мисалы, tok функциясы кандайдыр бир белгини окусун (бул LaTeXReaderдин реалдуу функциясы). Келгиле, бул комбинацияны карап көрөлү
const <$> tok <*> tokАл эки токенди катары менен окуп, биринчисин кайтарат.
Бул класстардын бардыгы үчүн Хаскеллде кооз символдук операторлор бар, бул Reader программалоосун ASCII искусствосуна окшош кылат. Бул кереметтүү кодду суктаныңыз.
Биздин тапшырмалар LaTeXReader менен байланышкан. Василийдин милдети LaTeXте пакеттерди жазуу үчүн пайдалуу mbox жана hbox буйруктарын колдоо болгон. Элизабет LaTeX документтеринде эпиграфтарды түзүүгө мүмкүндүк берген эпиграф буйругун колдоого жооптуу болгон.
Hatrace
UNIX сыяктуу операциялык системалар көбүнчө ptrace тутумунун чакырыгын ишке ашырышат. Бул программалык чөйрөлөрдү мүчүлүштүктөрдү оңдоодо жана симуляциялоодо пайдалуу, бул программа жасаган системалык чалууларды көзөмөлдөөгө мүмкүндүк берет. Мисалы, абдан пайдалуу strace утилитасы ptraceди ичтен колдонот.
Hatrace бул Хаскеллде ptrace интерфейсин камсыз кылган китепкана. Чындыгында, ptrace өзү абдан татаал жана аны түздөн-түз колдонуу, айрыкча функционалдык тилдерден бир топ кыйын.
Hatrace ишке киргизүүдө strace сыяктуу иштейт жана окшош аргументтерди кабыл алат. Ал straceден айырмаланып турат, ал ошондой эле ptraceге караганда жөнөкөй интерфейсти камсыз кылган китепкана.
Hatrace жардамы менен биз GHC Haskell компиляторунда бир жагымсыз мүчүлүштүктөрдү таптык - туура эмес учурда өлтүрүлүп, ал туура эмес объект файлдарын жаратат жана кайра иштетилгенде аларды кайра компиляция кылбайт. Системалык чалуулар аркылуу скрипт түзүү катаны бир иштетүүдө ишенимдүү кайра чыгарууга мүмкүнчүлүк түздү, ал эми кокус өлтүрүүлөр катаны эки сааттын ичинде кайра чыгарды.
Биз китепканага системалык чалуу интерфейстерин коштук - Елизавета brk, ал эми Василий mmap кошту. Биздин ишибиздин жыйынтыгы боюнча китепкананы колдонууда бул системалык чакыруулардын аргументтерин жөнөкөй жана так колдонууга болот.
Source: www.habr.com
