ZuriHac: амалияи барномасозии функсионалӣ

Дар мохи июни соли чорй дар шахри хурди Швейцария Рапперсвиль вокеае ба вукуъ омад ZuriHac. Ин дафъа он беш аз панҷсад дӯстдорони Ҳаскеллро, аз шурӯъкунандагон то асосгузорони забон ҷамъ овард. Ҳарчанд созмондиҳандагон ин чорабиниро ҳакатон меноманд, аммо ба маънои классикӣ ин конфронс ё ҳакатон нест. Формати он аз барномасозони анъанавӣ фарқ мекунад. Мо бо бахти бахти худ дар бораи ZuriHac фахмидем, дар он иштирок кардем ва акнун дар бораи бозьёфти гайриоддй накл карданро вазифаи худ мешуморем!

ZuriHac: амалияи барномасозии функсионалӣ

Дар бораи мо

Ин мақоларо ду донишҷӯи курси 3-юми барномаи «Математикаи амалӣ ва информатика»-и Мактаби олии иқтисодии Донишгоҳи миллии тадқиқотӣ – Санкт-Петербург: Василий Алферов ва Елизавета Василенко омода кардаанд. Шавқу ҳавас ба барномасозии функсионалӣ барои ҳардуи мо аз як силсила лексияҳои Д.Н.Москвин дар соли 2-юми донишгоҳ оғоз ёфт. Василий дар айни замон дар барномаи Google Summer of Code иштирок мекунад, ки дар доираи он бо роҳбарии гурӯҳи лоиҳа графикҳои алгебравиро дар Ҳаскелл амалӣ мекунад. Алга. Елизавета малакаҳои барномасозии функсионалии бадастомадаро дар кори курсие, ки ба татбиқи алгоритми зидди муттаҳидшавӣ бахшида шуда буд, бо истифодаи минбаъда дар назарияи намудҳо истифода бурд.

Формати чорабинӣ

Шунавандагони мақсаднок соҳибони лоиҳаҳои кушодаасос, барномасозоне, ки мехоҳанд дар таҳияи онҳо иштирок кунанд, муҳаққиқони барномасозии функсионалӣ ва одамоне, ки ба Ҳаскелл дилчасп ҳастанд. Имсол, таҳиягарон аз беш аз панҷоҳ лоиҳаи кушодаасоси Ҳаскелл аз тамоми ҷаҳон дар макони баргузорӣ - HSR Hochschule für Technik Rapperswil - ҷамъ омаданд, то дар бораи маҳсулоти худ сӯҳбат кунанд ва одамони навро ба рушди онҳо таваҷҷӯҳ кунанд.

ZuriHac: амалияи барномасозии функсионалӣ

Акс аз Twitter ZuriHac

Нақша хеле содда аст: ба шумо лозим аст, ки пешакӣ дар бораи лоиҳаи худ якчанд пешниҳод нависед ва онҳоро ба созмондиҳандагон фиристед, ки онҳо дар саҳифаи чорабинӣ маълумотро дар бораи лоиҳаи шумо ҷойгир мекунанд. Илова бар ин, дар рӯзи аввал муаллифони лоиҳаҳо сӣ сония доранд, то аз саҳна хеле мухтасар нақл кунанд, ки чӣ кор карда истодаанд ва чӣ бояд кард. Баъд шахсони шавкманд муаллифонро чустучу карда, дар бораи вазифахо муфассал пурсон мешаванд.

Мо то ҳол лоиҳаҳои кушодаи худро надорем, аммо мо воқеан мехоҳем дар лоиҳаҳои мавҷуда саҳм гузорем, аз ин рӯ мо ҳамчун иштирокчиёни доимӣ сабти ном шудем. Дар давоми се рӯз мо бо ду гурӯҳи таҳиягарон кор кардем. Маълум мешавад, ки омӯзиши муштараки код ва муоширати зинда ҳамкории байни муаллифони лоиҳа ва саҳмгузоронро хеле самаранок мегардонад - дар ZuriHac мо тавонистем соҳаҳоеро, ки барои мо нав буданд, бифаҳмем ва тавонистем ба ду дастаи комилан гуногун кӯмак расонем ва дар ҳар як як вазифаро иҷро кунем. аз лоихахо.

Дар ZuriHac гайр аз тачрибаи пуркимат, инчунин якчанд лекция ва дарсхои устодон хонда шуданд. Мо махсусан ду лекцияро дар хотир дорем. Дар нахуст аз онҳо Андрей Мохов аз Донишгоҳи Нюкасл дар бораи функторҳои интихобӣ-апликативӣ - як синфи намудҳо, ки бояд байни функторҳои аппликативӣ ва монадаҳо миёнарав шаванд, сухан гуфт. Дар лексияи дигар, яке аз асосгузорони Ҳаскелл Саймон Пейтон Ҷонс дар бораи чӣ гуна кор кардани хулосаи тип дар компилятори GHC нақл кард.

ZuriHac: амалияи барномасозии функсионалӣ

Лексияи Саймон Пейтон Ҷонс. Акс аз Twitter ZuriHac

Дарсҳои маҳорат дар ҳакатон вобаста ба сатҳи омодагии ширкаткунандагон ба се категория тақсим карда шуданд. Вазифаҳое, ки ба иштирокчиёне, ки ба таҳияи лоиҳаҳо ҳамроҳ шудаанд, низ бо дараҷаи душворӣ қайд карда шуданд. Ҷамъияти хурд, вале дӯстонаи барномасозони функсионалӣ навкоронро дар сафҳои худ бо хушҳолӣ истиқбол мекунад. Барои фаҳмидани лексияҳои Андрей Мохов ва Саймон Пейтон Ҷонс, аммо курси барномасозии функсионалии мо дар донишгоҳ хеле муфид буд.

Бақайдгирӣ дар чорабинӣ ҳам барои иштирокчиёни доимӣ ва ҳам барои муаллифони лоиҳа ройгон аст. Мо барои иштирок дар аввали моҳи июн дархост пешниҳод кардем, ки пас аз он моро зуд аз рӯйхати интизорӣ ба рӯйхати иштирокчиёни тасдиқшуда интиқол доданд.

Ва ҳоло мо дар бораи лоиҳаҳое сӯҳбат хоҳем кард, ки дар таҳияи онҳо иштирок кардем.

Пандок

Пандок табдилдиҳандаи универсалии ҳуҷҷатҳои матнӣ аст, дар асл, аз ҳама гуна формат ба ҳама. Масалан, аз docx ба pdf ё аз Markdown то MediaWiki. Муаллифи он Ҷон МакФарлейн профессори фалсафаи Донишгоҳи Калифорния, Беркли мебошад. Умуман, Pandoc хеле машҳур аст ва баъзе дӯстони мо вақте фаҳмиданд, ки Пандок дар Ҳаскелл навишта шудааст, ҳайрон шуданд.

ZuriHac: амалияи барномасозии функсионалӣ

Рӯйхати форматҳои ҳуҷҷатҳое, ки аз ҷониби 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 кӯшиш мекунад, ки агар имконпазир бошад, ин маълумотро ҳангоми тарҷума аз формат ба формат нигоҳ дорад. формат.

Қариб ҳамаи конструкторҳои навъи Блок - масалан, Сарлавҳа ё Параграф (параграф) - атрибутҳо ва рӯйхати қуллаҳои сатҳи поёниро ҳамчун аргумент мегиранд - Inline, чун қоида. Масалан, Space ё Str конструкторҳои навъи Inline мебошанд ва теги HTML низ ба Inline махсуси худ табдил меёбад. Мо пешниҳоди таърифи пурраи ин намудҳоро ҳеҷ маъно намебинем, аммо қайд кунед, ки онро дар ин ҷо пайдо кардан мумкин аст дар ин ҷо.

Ҷолиб он аст, ки навъи Pandoc як моноид аст. Ин маънои онро дорад, ки як намуди ҳуҷҷати холӣ вуҷуд дорад ва ҳуҷҷатҳоро якҷоя ҷамъ кардан мумкин аст. Ин барои истифода ҳангоми навиштани Readers қулай аст - шумо метавонед ҳуҷҷатро бо истифода аз мантиқи ихтиёрӣ ба қисмҳо тақсим кунед, ҳар яки онро алоҳида таҳлил кунед ва сипас ҳама чизро дар як ҳуҷҷат ҷамъ кунед. Дар ин ҳолат, метаинформатсия аз тамоми қисмҳои ҳуҷҷат якбора ҷамъ карда мешавад.

Ҳангоми табдил додан, масалан, аз LaTeX ба HTML, аввал модули махсус бо номи LaTeXReader ҳуҷҷати воридшударо ба AST табдил медиҳад, баъд модули дигар бо номи HTMLWriter AST-ро ба HTML табдил медиҳад. Ба шарофати ин меъморӣ зарурати навиштани шумораи квадратии табдилҳо вуҷуд надорад - барои ҳар як формати нав навиштани Reader ва Writer кифоя аст ва ҳамаи ҷуфтҳои имконпазири табдилҳо ба таври худкор дастгирӣ карда мешаванд.

Маълум аст, ки чунин меъморӣ низ камбудиҳои худро дорад, ки онро коршиносони соҳаи меъмории нармафзор кайҳо пешгӯӣ кардаанд. Муҳимтар аз ҳама арзиши ворид кардани тағирот ба дарахти синтаксис мебошад. Агар тағирот ба қадри кофӣ ҷиддӣ бошад, шумо бояд кодро дар ҳама Хонандагон ва Нависандагон иваз кунед. Масалан, яке аз мушкилоте, ки таҳиягарони Pandoc дучор меоянд, дастгирии форматҳои мураккаби ҷадвал мебошад. Ҳоло Pandoc метавонад танҳо ҷадвалҳои хеле соддаро бо сарлавҳа, сутунҳо ва арзиш дар ҳар як чашмак созад. Масалан, атрибути colspan дар HTML танҳо нодида гирифта мешавад. Яке аз сабабҳои ин рафтор мавҷуд набудани схемаи ягонаи муаррифии ҷадвалҳо дар ҳама ё ҳадди аққал бисёр форматҳо мебошад - мувофиқан маълум нест, ки ҷадвалҳо бояд дар тасвири дохилӣ дар кадом шакл нигоҳ дошта шаванд. Аммо ҳатто пас аз интихоби намуди мушаххас, ба шумо лозим меояд, ки комилан ҳама Хонандагон ва Нависандагонеро, ки кор бо ҷадвалҳоро дастгирӣ мекунанд, иваз кунед.

Забони Ҳаскелл на танҳо аз сабаби муҳаббати бузурги муаллифон ба барномасозии функсионалӣ интихоб карда шуд. Ҳаскелл бо қобилиятҳои васеи коркарди матн маълум аст. Як мисол китобхона аст парсек китобхонаест, ки барои навиштани парсерҳои ихтиёрӣ мафҳумҳои барномасозии функсионалӣ - моноидҳо, монадаҳо, функторҳои аппликативӣ ва алтернативӣ - фаъолона истифода мебарад. Қувваи пурраи 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 алоқаманд буданд. Вазифаи Василий дастгирии фармонҳои mbox ва hbox буд, ки барои навиштани бастаҳо дар LaTeX муфид аст. Элизабет барои дастгирии фармони эпиграф масъул буд, ки ба шумо имкон медиҳад эпиграфҳоро дар ҳуҷҷатҳои LaTeX эҷод кунед.

Хатрас

Системаҳои оператсионии ба UNIX монанд аксар вақт занги системаи ptraceро амалӣ мекунанд. Он дар ислоҳ ва тақлид кардани муҳити барнома муфид аст, ки ба шумо имкон медиҳад, ки зангҳои системаро пайгирӣ кунед, ки барнома мекунад. Масалан, утилитаи хеле муфиди strace ptrace-ро дар дохили худ истифода мебарад.

Hatrace китобхонаест, ки интерфейси ptrace дар Haskell мебошад. Гап дар сари он аст, ки худи ptrace хеле мураккаб аст ва истифодаи бевоситаи он, махсусан аз забонҳои функсионалӣ хеле душвор аст.

Hatrace дар оғоз ҳамчун strace кор мекунад ва далелҳои шабеҳро қабул мекунад. Он аз strace бо он фарқ мекунад, ки он инчунин китобхонаест, ки интерфейси соддатарро аз ptrace таъмин мекунад.

Бо ёрии hatrace, мо аллакай як хатои ногуворро дар компилятори GHC Haskell дарёфтем - дар лаҳзаи нодуруст кушта шуда, он файлҳои объекти нодурустро тавлид мекунад ва ҳангоми аз нав оғоз кардан онҳоро дубора тартиб намедиҳад. Скриптҳо аз рӯи зангҳои системавӣ имкон дод, ки хатогиро дар як давидан боэътимод дубора тавлид кунад, дар ҳоле ки куштори тасодуфӣ хатогиро дар тӯли ду соат такрор мекунад.

Мо интерфейсҳои зангҳои системаро ба китобхона илова кардем - Елизавета brk илова кард ва Василий mmap илова кард. Дар асоси натичахои кори мо хангоми истифодабарии китобхона аргументхои ин зангхои системавиро соддатар ва сахехтар истифода бурдан мумкин аст.

Манбаъ: will.com

Илова Эзоҳ