{"id":207764,"date":"2013-12-28T23:09:03","date_gmt":"2013-12-28T19:09:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=207764"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=207764","title":{"rendered":"<span class=\"post_title\">Melange \u2014 DSL \u0434\u043b\u044f \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" align=\"right\" src=\"http:\/\/habr.habrastorage.org\/post_images\/694\/788\/f84\/694788f8487decb436713dfcf14518da.png\"\/>\u0412\u0441\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u041d\u0438 \u0434\u043b\u044f \u043a\u043e\u0433\u043e \u043d\u0435 \u0441\u0435\u043a\u0440\u0435\u0442, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 Java \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e &gt;9000, \u0430 \u0432 C++ \u043e\u043d\u0438 \u0432\u0440\u043e\u0434\u0435 \u0438 \u0435\u0441\u0442\u044c, \u0430 \u0432\u0440\u043e\u0434\u0435 \u0438\u0445 \u0438 \u043d\u0435\u0442. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f Google Protobuf, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0451\u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u0432\u043e\u0435\u0432\u0430\u043b \u0432\u0441\u0435\u043d\u0430\u0440\u043e\u0434\u043d\u0443\u044e \u043b\u044e\u0431\u043e\u0432\u044c. \u042d\u0442\u043e \u0431\u044b\u043b\u0430 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0432\u0430\u044f, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430\u044f \u0448\u0438\u0440\u043e\u043a\u0438\u043c \u043c\u0430\u0441\u0441\u0430\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0433\u043e\u043d\u044f\u0442\u044c \u043f\u043e \u0441\u0435\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044f\u0441\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441 \u0447\u0435\u043c-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 XML. \u041d\u0430 \u0434\u0432\u043e\u0440\u0435 \u0431\u044b\u043b 2008 \u0433\u043e\u0434.<\/p>\n<p>  \u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0430\u0437\u0430\u0434. \u0412 2006 \u0433\u043e\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 (\u043a\u0430\u043a \u0431\u044b \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u043d\u0438 \u0437\u0432\u0443\u0447\u0430\u043b\u043e!) \u0410\u043d\u0438\u043b \u041c\u0430\u0434\u0445\u0430\u0432\u0430\u043f\u0435\u0434\u0434\u0438, \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 \u043c\u0438\u0440\u0435 OCaml-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0430\u0432\u0442\u043e\u0440 \u0441\u0432\u0435\u0436\u0435\u0432\u044b\u0448\u0435\u0434\u0448\u0435\u0439 \u043a\u043d\u0438\u0433\u0438 <a href=\"http:\/\/realworldocaml.org\/\">Real World OCaml<\/a>, \u0437\u0430\u0449\u0438\u0449\u0430\u043b \u0432 \u041a\u0435\u043c\u0431\u0440\u0438\u0434\u0436\u0435 <a href=\"http:\/\/www.cl.cam.ac.uk\/techreports\/UCAM-CL-TR-775.pdf\">\u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0441\u043a\u0443\u044e \u0434\u0438\u0441\u0441\u0435\u0440\u0442\u0430\u0446\u0438\u044e<\/a>. \u0418\u043c\u0435\u043d\u043d\u043e \u043e \u043d\u0435\u0439 \u044f \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0432\u0430\u043c \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443.<\/p>\n<p>  \u0410\u043d\u0438\u043b \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0448\u0451\u043b \u0434\u0430\u043b\u044c\u0448\u0435, \u0447\u0435\u043c Google. \u041e\u043d \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043b\u044e\u0434\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u044e\u0442 \u043f\u043e \u0441\u0435\u0442\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445? \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u0410 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b? \u042d\u0442\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e <a href=\"http:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82\">\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442<\/a>. \u0410 \u0433\u0434\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430? \u0414\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0441\u0435\u0442\u0435\u0432\u043e\u043c \u0441\u0442\u0435\u043a\u0435! \u0418\u0442\u0430\u043a, \u0431\u044b\u043b\u0438 \u0432\u0437\u044f\u0442\u044b \u043d\u0430\u0431\u043e\u0440 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432: Ethernet frame, IPv4, ICMP, TCP, UDP, SSH, DNS \u0438 DHCP \u0438 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438: \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e SSH \u0438 DNS) \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u0440\u0443\u043a\u0430\u043c\u0438\u00bb, \u0430 \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0434\u043b\u044f C \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440\u0430, \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u043b\u0438\u0441\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u044d\u0442\u043e \u0432\u0441\u0451 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0435\u0440\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438 \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0431\u044b\u0441\u0442\u0440\u043e, \u0430 \u043d\u0435 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e.<\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0438\u0441\u0441\u0435\u0440\u0442\u0430\u0446\u0438\u044e, \u0441\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443: \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c. \u041f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 DNS \u0438 SSH-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 BIND \u0438 OpenSSH. OCaml-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u0432\u0430\u043b\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e, \u0434\u043e \u043f\u043e\u0447\u0442\u0438 \u0434\u0432\u0443\u0445\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u0431\u044b\u043b\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 RFC \u043d\u0430 SSH (\u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0431\u044b\u043b\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0430 \u0438 RFC \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d). \u041e \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e, \u0438 \u043a\u0430\u043a \u0441 \u044d\u0442\u0438\u043c \u0436\u0438\u0442\u044c, \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c. <a name=\"habracut\"><\/a><\/p>\n<h5>MPL<\/h5>\n<p>  \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0434\u0432\u0430 \u044f\u0437\u044b\u043a\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u0438 \u0438\u0445 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0442\u043e\u0440\u044b \u043d\u0430 OCaml. \u041f\u0435\u0440\u0432\u044b\u0439 \u044f\u0437\u044b\u043a&nbsp;\u2014 \u044d\u0442\u043e Meta Packet Language \u0438\u043b\u0438 MPL, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0430\u043a\u0435\u0442\u0430. \u0412 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u043c protobuf, \u043d\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, MPL \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u043e\u0432\u0435\u0440\u0445\u0435\u0434\u0430 \u043a \u0432\u0430\u0448\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435. \u0412\u043e\u043e\u0431\u0449\u0435. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u0438\u0442\u043e\u0432, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0435\u0449\u0451 \u0447\u0442\u043e-\u0442\u043e. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u044d\u0442\u043e \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442, \u043a\u0430\u043a \u0432 protobuf, \u043b\u0435\u0433\u043a\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044f \u043a \u043d\u0435\u0439 \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439&nbsp;\u2014 \u0432\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e protobuf TCP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, MPL \u0441\u0440\u0430\u0437\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0432\u0441\u044e \u0442\u0443 \u043b\u043e\u0433\u0438\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0432 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445&nbsp;\u2014 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0443 \u0438\u043b\u0438 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438, \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0439 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439, \u0437\u0430\u0432\u0438\u0441\u044f\u0449\u0438\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a IPv4:  <\/p>\n<pre><code>packet ipv4 {     version: bit[4] const(4);     ihl: bit[4] min(5) value(offset(options) \/ 4);     tos_precedence: bit[3] variant {         |0 =&gt; Routine |1 -&gt; Priority         |2 -&gt; Immediate |3 -&gt; Flash         |4 -&gt; Flash_override |5 -&gt; ECP         |6 -&gt; Internetwork_control |7 -&gt; Network_control     };     tos_delay: bit[1] variant {|0 =&gt; Normal |1 -&gt; Low};     tos_throughput: bit[1] variant {|0 =&gt; Normal |1 -&gt; Low};     tos_reliability: bit[1] variant {|0 =&gt; Normal |1 -&gt; Low};     tos_reserved: bit[2] const(0);     length: uint16 value(offset(data));     id: uint16;     reserved: bit[1] const(0);     dont_fragment: bit[1] default(0);     can_fragment: bit[1] default(0);     frag_offset: bit[13] default(0);     ttl: byte;     protocol: byte variant {|1-&gt;ICMP |2-&gt;IGMP |6-&gt;TCP |17-&gt;UDP};     checksum: uint16 default(0);     src: uint32;     dest: uint32;     options: byte[(ihl * 4) - offset(dest)] align(32);     header_end: label;     data: byte[length-(ihl*4)]; }<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442\u043e\u0432 data (\u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b), \u043d\u043e \u043d\u0430 \u0435\u0433\u043e \u043c\u0435\u0441\u0442\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0433\u043b\u0430 \u0431\u044b \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c:  <\/p>\n<pre><code>classify (protocol) {      |1: &quot;ICMP&quot;-&gt; data: packet icmp();      |2: &quot;TCP&quot; -&gt; data: packet tcp();      |3: &quot;UDP&quot; -&gt; data: packet udp();  }; <\/code><\/pre>\n<p>  \u0418 \u0442\u043e\u0433\u0434\u0430 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 IPv4-\u043f\u0430\u043a\u0435\u0442\u0430 \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438 \u0431\u044b \u0438 \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 (\u0434\u0435)\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0435\u0435 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043c\u044b\u0441\u043b\u0435\u0439 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0447\u0442\u043e \u0433\u0434\u0435 \u043d\u0430\u0434\u043e \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c. \u0422\u0430\u043a, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430 <a href=\"http:\/\/en.wikipedia.org\/wiki\/MessagePack\">MessagePack<\/a> \u0437\u0430\u043d\u044f\u043b\u0430 \u0443 \u043c\u0435\u043d\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e 40 \u0441\u0442\u0440\u043e\u043a.<\/p>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0438 \u0443 \u044d\u0442\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438. \u042f \u043d\u0430\u0441\u0447\u0438\u0442\u0430\u043b \u0438\u0445 \u0440\u043e\u0432\u043d\u043e \u0434\u0432\u0430. \u041f\u0435\u0440\u0432\u044b\u0439: \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b. \u042d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0441\u0442\u0430\u043b\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 MessagePack&nbsp;\u2014 MPL \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0438\u043b\u0438 \u043c\u0430\u043f\u0435 \u043c\u043e\u0433\u0443\u0442 \u043b\u0435\u0436\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043a\u0438 \u0438\u043b\u0438 \u043c\u0430\u043f\u044b, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u0430\u043a \u043f\u0430\u0447\u043a\u0443 \u0431\u0430\u0439\u0442\u043e\u0432, \u0430 \u043f\u043e\u0442\u043e\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0438\u043c \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0430\u043a\u0435\u0442\u0430 \u0431\u044b\u043b\u043e \u0441\u0442\u0440\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c, \u043d\u043e \u043d\u0430\u043c \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043b\u0435\u0433\u0447\u0435. \u0412\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445. \u0410\u043d\u0438\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u0435\u0442\u0438 \u0442\u0438\u043f\u044b, \u0442\u0430\u043a\u0438\u0435, \u043a\u0430\u043a \u0431\u0430\u0439\u0442\u044b, \u0431\u0438\u0442\u044b, \u0447\u0438\u0441\u043b\u0430, \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 mpint, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 SSH, \u043d\u043e \u044d\u0442\u043e\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d. \u0415\u0441\u043b\u0438 \u0432\u044b \u0432\u0434\u0440\u0443\u0433 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b ssh-agent, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u0438\u043f mpint1, \u0432\u0430\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442\u043e\u0432 \u0438 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0443 \u0441\u0435\u0431\u044f \u0432 \u043a\u043e\u0434\u0435. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0442\u0438\u043f\u043e\u0432&nbsp;\u2014 \u044d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0430\u0442\u0447\u0435\u0439 \u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443 MPL, \u0447\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u0441\u0430\u043c\u043e\u0439 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439.<\/p>\n<h5>SPL<\/h5>\n<p>  \u0412\u0442\u043e\u0440\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u0441\u0442\u0430\u043b Statecall Policy Language \u0438\u043b\u0438 SPL. \u042d\u0442\u043e \u044f\u0437\u044b\u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c, \u0441\u0435\u0440\u0434\u0446\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. \u0421\u0442\u0440\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432 \u043f\u043e\u0434 \u0432\u0441\u0435 \u044f\u0437\u044b\u043a\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u0447\u043d\u043e. \u041e\u0442\u043b\u0438\u0447\u0438\u0439 \u0443 SPL \u043e\u0442 \u043d\u0438\u0445 (\u043d\u0435 \u0441\u0447\u0438\u0442\u0430\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430) \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 SPL \u0443\u043c\u0435\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 PROMELA \u0434\u043b\u044f <a href=\"http:\/\/ru.wikipedia.org\/wiki\/SPIN_%28%D0%B2%D0%B5%D1%80%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%29\">\u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 SPIN<\/a>. \u0411\u0443\u0434\u0443 \u0447\u0435\u0441\u0442\u0435\u043d, \u044f \u043d\u0435 \u0441\u043c\u043e\u0433 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u043e SPIN, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0431\u044b\u043b \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0443 \u043d\u0430 \u0441\u043b\u043e\u0432\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u0440\u0443\u0442\u043e. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u043c\u0435\u043d\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 <b>Receive_NAME<\/b> \u0438 <b>Transmit_NAME<\/b> (\u0433\u0434\u0435 <b>NAME<\/b>&nbsp;\u2014 \u044d\u0442\u043e \u0442\u0438\u043f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 MPL), \u043c\u043e\u0436\u043d\u043e \u0442\u0435\u0441\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 MPL. \u041e\u0431 \u044d\u0442\u043e\u043c \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u043e\u0437\u0436\u0435, \u0430 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 SSH:  <\/p>\n<pre><code>automaton auth (bool success, bool failed) {     Receive_Transport_ServiceAccept_UserAuth;     Transmit_Auth_Req_None;     Receive_Auth_Failure;     do {         either {             always_allow (Receive_Auth_Banner) {                 either {                     Transmit_Auth_Req_Password_Request;                     auth_decision (success);                 } or {                     Transmit_Auth_Req_PublicKey_Request;                     auth_decision (success);                 } or {                     Transmit_Auth_Req_PublicKey_Check;                     either {                         Receive_Auth_PublicKeyOK;                     } or {                         Receive_Auth_Failure;                     }                 }             }         } or {             Notify_Auth_Permanent_Failure;             failed = true;         }     } until (success || failed); }<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u0432 SPL \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0442\u0432\u043b\u0451\u043d\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (<i>auth_decision<\/i>), \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 SPL \u0438 \u0434\u0430\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438.<\/p>\n<h5>\u041a\u0430\u043a \u0441 \u044d\u0442\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c?<\/h5>\n<p>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u0440\u043e\u0435\u043a\u0442 (\u0432\u0435\u0441\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043e\u043d \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/avsm\/melange\">Melange<\/a>) \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u0433\u0430\u0442 \u043d\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u0435\u0451 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0430 \u0434\u0438\u0441\u0441\u0435\u0440\u0442\u0430\u0446\u0438\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 Proof of concept, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0442\u0430\u043a\u0438\u043c Quick Start guide. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0414\u043b\u044f \u0440\u043e\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0441\u0442\u0430\u0440\u0443\u044e \u0434\u043e\u0431\u0440\u0443\u044e \u0438\u0433\u0440\u0443&nbsp;\u2014 \u043c\u043e\u0440\u0441\u043a\u043e\u0439 \u0431\u043e\u0439. \u0412\u043e\u0442 \u0442\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043d\u0430\u0448\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f:  <\/p>\n<pre><code>packet message {      message_type: byte;      message_id: uint16;      classify (message_type) {          | 0:&quot;Shot&quot; -&gt;              row: bit[4];              column: bit[4];          | 1:&quot;ShotResult&quot; -&gt;              result: byte variant { |0 -&gt; Missed |1 -&gt; Damaged |2 -&gt; Killed };          | 2:&quot;Disconnect&quot; -&gt; ();      };  } <\/code><\/pre>\n<p>  \u0423 \u043d\u0430\u0441 \u0431\u044b\u0432\u0430\u0435\u0442 \u0442\u0440\u0438 \u0442\u0438\u043f\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f: \u0432\u044b\u0441\u0442\u0440\u0435\u043b, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0430 \u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u043e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c\u0441\u044f. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b:  <\/p>\n<pre><code>automaton seawar () {      Initialize;      during {          multiple(1..) {              Ready;              either {                  Transmit_Message_Shot;                  Receive_Message_ShotResult;              } or {                  Receive_Message_Shot;                  Transmit_Message_ShotResult;              }          }      } handle {          either {              Transmit_Message_Disconnect;              exit;          } or {              Receive_Message_Disconnect;              exit;          }      }  }<\/code><\/pre>\n<p>  \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043c\u044b \u0441 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430), \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u043b\u0438\u0431\u043e \u043c\u044b \u0441\u0442\u0440\u0435\u043b\u044f\u0435\u043c, \u043b\u0438\u0431\u043e \u0432 \u043d\u0430\u0441. \u0412\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0435\u0441\u043b\u0438 \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0430 Disconnect, \u0442\u043e \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0433\u0440\u0430 \u043e\u043a\u043e\u043d\u0447\u0435\u043d\u0430 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442 \u043d\u0430\u0434\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u043a\u043e\u0434\u0430. \u0414\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 MPL, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u2014 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0438\u0445 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u0437 \u0441\u0435\u0442\u0438.  <\/p>\n<pre><code class=\"haskell\">val mutable env_ = Mpl_stdlib.new_env (String.make 4 '\\000');  val mutable tick_ = Protocol.init ();  method tick state = tick_ &lt;- Protocol.tick tick_ state;  method send_message msg = (      Mpl_stdlib.reset env_;      self#tick (msg#xmit_statecall :&gt; Protocol.s);      if not (Thread.wait_timed_write sock_ 10.) then self#disconnect ~exc_text:&quot;Timeout&quot;;      Mpl_stdlib.flush env_ sock_  );  method receive_message = (       Mpl_stdlib.reset env_;      if not (Thread.wait_timed_read sock_ 300.) then self#disconnect ~exc_text:&quot;Timeout&quot;;      Mpl_stdlib.fill env_ sock_;      let msg = Message.unmarshal env_ in        let state = Message.recv_statecall msg in      self#tick state;      msg  ); <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u043c\u043e\u0435, \u0442\u0430\u043a \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0435, \u0432 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0432 \u043d\u043e\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0417\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0432\u044b\u0437\u043e\u0432\u044b <em>msg#xmit_statecall<\/em> \u0438 <em>Message.recv_statecall msg<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (\u0442\u0438\u043f\u0430 ShotResult) \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0438\u043c\u0435\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 (<b>Transmit_Message_ShotResult<\/b> \u0438 <b>Receive_Message_ShotResult<\/b>). \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443, \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 Bad_statecall. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 AI \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e&nbsp;\u2014 \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a, \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0438 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u0442\u0430\u043c \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0431\u044b\u0442\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442, \u0442\u043e \u0432 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 \u0432\u0441\u0451 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"http:\/\/habr.habrastorage.org\/post_images\/694\/065\/187\/694065187f651f624f0f9255d5b0622e.png\"\/><br \/>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u0432\u0441\u0451 \u043b\u0435\u0433\u043a\u043e \u043c\u043e\u0436\u0435\u0442 \u00ab\u0432\u0437\u043e\u0440\u0432\u0430\u0442\u044c\u0441\u044f\u00bb. \u0414\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u044f \u0432\u0437\u044f\u043b \u0441\u0432\u0435\u0436\u0435\u0432\u044b\u0448\u0435\u0434\u0448\u0438\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a Qt 5.2, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0448 \u0441\u043e\u043e\u0442\u0435\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0438\u043a \u0414\u043c\u0438\u0442\u0440\u0438\u0439 \u041a\u043e\u0441\u0430\u0440\u0435\u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043b <a href=\"https:\/\/github.com\/Kakadu\/lablqt\/tree\/qml-dev\">\u0431\u0438\u043d\u0434\u0438\u043d\u0433\u0438 \u043a OCaml<\/a> (\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435, \u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0435, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0441\u0442\u043e\u043c). \u041f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043f\u043e \u043a\u043b\u0435\u0442\u043a\u0435 \u0432\u0440\u0430\u0436\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0442\u0440\u0435\u0434\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u043e\u0434:  <\/p>\n<pre><code class=\"haskell\">let send_shot col row =    ignore(game#send_message (Message.Shot.t ~row:row ~column:col));    let result, state = game#receive_message in    (match result with        | `ShotResult x -&gt; Board.mark opp_board row col x#result;                next_turn state x#result        | `Disconnect x -&gt; game#disconnect ~send:false        | _ -&gt; game#disconnect ~exc_text:&quot;Unexpected_Message_Type&quot; ~raise_exc:true ~send:true)<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0432\u044b\u0441\u0442\u0440\u0435\u043b, \u0442\u043e \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u043d \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u2014 \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u044b \u043b\u0438\u0431\u043e \u0434\u0432\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u043e\u043c \u043f\u043e\u0434\u0440\u044f\u0434, \u043b\u0438\u0431\u043e \u0432\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u043f\u0440\u043e\u043c\u0430\u0445\u0435.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0433\u0440\u043e\u043c\u043e\u0436\u0434\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u043e\u043b\u043d\u044b\u043c \u043e\u0431\u0437\u043e\u0440\u043e\u043c \u043a\u043e\u0434\u0430, \u044f \u043b\u0443\u0447\u0448\u0435 \u0434\u0430\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 <a href=\"https:\/\/github.com\/torkve\/melange-seawar\">\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/p>\n<h5>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h5>\n<p>  \u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435-\u0442\u043e, \u0441\u043f\u0440\u043e\u0441\u0438\u0442 \u043c\u0435\u043d\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c. \u041d\u0443, \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u0430\u0440\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439, \u0443\u0436\u0435 4 \u0433\u043e\u0434\u0430 \u043d\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0432\u0448\u0438\u0439\u0441\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043d\u0430 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435. \u0417\u0430\u0447\u0435\u043c \u043c\u043d\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e, \u0435\u0441\u043b\u0438 \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c Node.js, MongoDB \u0438 \u043a\u043b\u0443\u0431\u043d\u0438\u0447\u043d\u044b\u0439 \u0441\u043c\u0443\u0437\u0438?<\/p>\n<p>  \u0427\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u0430\u0432. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0443\u0441\u0442\u0430\u0440\u0435\u043b, \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b. \u041d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u043d \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0432 \u043a\u0430\u043a\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u0430\u0434\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f. \u0422\u0430\u043a, \u0432\u0435\u0441\u044c \u043a\u043e\u0434 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0441\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u0442\u0443\u043f\u043e\u0439 AI, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 850 \u0441\u0442\u0440\u043e\u043a. \u042d\u0442\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0435 \u00ab30 \u0441\u0442\u0440\u043e\u043a \u043d\u0430 javascript\u00bb\u2122, \u043d\u043e \u0442\u043e\u0436\u0435 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e.<\/p>\n<p>  \u0412\u043e\u0442 \u0443\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 8 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u0431\u044b\u043b\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e, \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438 \u043f\u043e\u0447\u0442\u0438 6 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 Google \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u0438\u0437\u043e\u0432\u0430\u043b\u0430 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u0435\u0433\u043e \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443. \u041d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0440\u043e\u043a\u0435\u0442\u0441\u0430\u0439\u0435\u043d\u0441\u0430 \u0432 \u0438\u0434\u0435\u0435 \u043d\u0435\u0442, \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0434\u0430, \u0438 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0434\u0430\u0432\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b. \u0423 \u0442\u0435\u0431\u044f, %USERNAME%, \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0438\u0434\u0435\u044e \u0432 \u043d\u0430\u0441\u0442\u0443\u043f\u0430\u044e\u0449\u0435\u043c \u041d\u043e\u0432\u043e\u043c \u0433\u043e\u0434\u0443, \u0441\u0442\u0430\u0442\u044c \u0432\u0441\u0435\u043c\u0438\u0440\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u0438 \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0438\u0442\u044c \u043c\u0438\u0440. \u041d\u0443 \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0440\u043e\u0434\u0435.    \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/207764\/\"> http:\/\/habrahabr.ru\/post\/207764\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t<img decoding=\"async\" align=\"right\" src=\"http:\/\/habr.habrastorage.org\/post_images\/694\/788\/f84\/694788f8487decb436713dfcf14518da.png\"\/>\u0412\u0441\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435. \u041d\u0438 \u0434\u043b\u044f \u043a\u043e\u0433\u043e \u043d\u0435 \u0441\u0435\u043a\u0440\u0435\u0442, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 Java \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e &gt;9000, \u0430 \u0432 C++ \u043e\u043d\u0438 \u0432\u0440\u043e\u0434\u0435 \u0438 \u0435\u0441\u0442\u044c, \u0430 \u0432\u0440\u043e\u0434\u0435 \u0438\u0445 \u0438 \u043d\u0435\u0442. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f Google Protobuf, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0451\u0441 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u0432\u043e\u0435\u0432\u0430\u043b \u0432\u0441\u0435\u043d\u0430\u0440\u043e\u0434\u043d\u0443\u044e \u043b\u044e\u0431\u043e\u0432\u044c. \u042d\u0442\u043e \u0431\u044b\u043b\u0430 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0432\u0430\u044f, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430\u044f \u0448\u0438\u0440\u043e\u043a\u0438\u043c \u043c\u0430\u0441\u0441\u0430\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0430\u044f \u0433\u043e\u043d\u044f\u0442\u044c \u043f\u043e \u0441\u0435\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043d\u0435 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044f\u0441\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441 \u0447\u0435\u043c-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 XML. \u041d\u0430 \u0434\u0432\u043e\u0440\u0435 \u0431\u044b\u043b 2008 \u0433\u043e\u0434.<\/p>\n<p>  \u0412\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0430\u0437\u0430\u0434. \u0412 2006 \u0433\u043e\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 (\u043a\u0430\u043a \u0431\u044b \u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u043d\u0438 \u0437\u0432\u0443\u0447\u0430\u043b\u043e!) \u0410\u043d\u0438\u043b \u041c\u0430\u0434\u0445\u0430\u0432\u0430\u043f\u0435\u0434\u0434\u0438, \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0441\u0435\u0439\u0447\u0430\u0441 \u0432 \u043c\u0438\u0440\u0435 OCaml-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0430\u0432\u0442\u043e\u0440 \u0441\u0432\u0435\u0436\u0435\u0432\u044b\u0448\u0435\u0434\u0448\u0435\u0439 \u043a\u043d\u0438\u0433\u0438 <a href=\"http:\/\/realworldocaml.org\/\">Real World OCaml<\/a>, \u0437\u0430\u0449\u0438\u0449\u0430\u043b \u0432 \u041a\u0435\u043c\u0431\u0440\u0438\u0434\u0436\u0435 <a href=\"http:\/\/www.cl.cam.ac.uk\/techreports\/UCAM-CL-TR-775.pdf\">\u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0441\u043a\u0443\u044e \u0434\u0438\u0441\u0441\u0435\u0440\u0442\u0430\u0446\u0438\u044e<\/a>. \u0418\u043c\u0435\u043d\u043d\u043e \u043e \u043d\u0435\u0439 \u044f \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0432\u0430\u043c \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443.<\/p>\n<p>  \u0410\u043d\u0438\u043b \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0448\u0451\u043b \u0434\u0430\u043b\u044c\u0448\u0435, \u0447\u0435\u043c Google. \u041e\u043d \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043b\u044e\u0434\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u044e\u0442 \u043f\u043e \u0441\u0435\u0442\u0438 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445? \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b. \u0410 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b? \u042d\u0442\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e <a href=\"http:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82\">\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442<\/a>. \u0410 \u0433\u0434\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0437\u044f\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e, \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430? \u0414\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0441\u0435\u0442\u0435\u0432\u043e\u043c \u0441\u0442\u0435\u043a\u0435! \u0418\u0442\u0430\u043a, \u0431\u044b\u043b\u0438 \u0432\u0437\u044f\u0442\u044b \u043d\u0430\u0431\u043e\u0440 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432: Ethernet frame, IPv4, ICMP, TCP, UDP, SSH, DNS \u0438 DHCP \u0438 \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438: \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u0438\u0445 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e SSH \u0438 DNS) \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u0440\u0443\u043a\u0430\u043c\u0438\u00bb, \u0430 \u0445\u043e\u0447\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0434\u043b\u044f C \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0439 \u0431\u0443\u0444\u0435\u0440\u0430, \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u043b\u0438\u0441\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u044d\u0442\u043e \u0432\u0441\u0451 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0435\u0440\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0438 \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0431\u044b\u0441\u0442\u0440\u043e, \u0430 \u043d\u0435 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e.<\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0438\u0441\u0441\u0435\u0440\u0442\u0430\u0446\u0438\u044e, \u0441\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443: \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0443\u0434\u0430\u043b\u043e\u0441\u044c. \u041f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u044b\u043b\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441\u043d\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 DNS \u0438 SSH-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 BIND \u0438 OpenSSH. OCaml-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0430\u0432\u0430\u043b\u0438 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u0442 \u043d\u0435\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e, \u0434\u043e \u043f\u043e\u0447\u0442\u0438 \u0434\u0432\u0443\u0445\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u0431\u044b\u043b\u0430 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 RFC \u043d\u0430 SSH (\u0440\u0430\u0431\u043e\u0447\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0431\u044b\u043b\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0430 \u0438 RFC \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d). \u041e \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e, \u0438 \u043a\u0430\u043a \u0441 \u044d\u0442\u0438\u043c \u0436\u0438\u0442\u044c, \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-207764","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/207764","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=207764"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/207764\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=207764"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=207764"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=207764"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}