{"id":467467,"date":"2025-07-18T21:40:50","date_gmt":"2025-07-18T21:40:50","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=467467"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=467467","title":{"rendered":"<span>\u0421\u043e\u0437\u0434\u0430\u0451\u043c DSL \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u043c \u043a\u0430\u043a\u00a0\u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c <a href=\"https:\/\/architeezy.com\/\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a>. \u041a <a href=\"https:\/\/habr.com\/ru\/companies\/architeezy\/articles\/899324\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>\u00a0\u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u00a0\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e\u00a0\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435, \u043a\u0430\u043a\u00a0\u043d\u0430\u0441\u0447\u0451\u0442 architecture as code, code first \u0438\u00a0\u0442.\u00a0\u0434. \u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u044d\u0442\u0443 \u0444\u0438\u0447\u0443 \u0432\u00a0\u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0435, \u043d\u043e\u00a0\u043d\u0435\u0442, \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <a href=\"https:\/\/aresekb.github.io\/langium-monaco-demo\/\" rel=\"noopener noreferrer nofollow\">\u0442\u0430\u043a\u0430\u044f \u0434\u0435\u043c\u043a\u0430<\/a> \u0441 <a href=\"https:\/\/github.com\/AresEkb\/langium-monaco-demo\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438<\/a>. \u0418 \u0432\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043a\u0430\u043a\u00a0\u043e\u043d\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430, \u043a\u0430\u043a\u00a0\u0437\u0430\u043f\u0438\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u2011\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a (DSL) \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0434\u043b\u044f\u00a0\u043d\u0435\u0433\u043e.<\/p>\n<p>\u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/microsoft.github.io\/monaco-editor\/\" rel=\"noopener noreferrer nofollow\">Monaco Editor<\/a>\u00a0\u2014 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u00a0VS Code,<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/langium.org\/\" rel=\"noopener noreferrer nofollow\">Langium<\/a>\u00a0\u2014 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c LSP\u2011\u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f\u00a0\u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u2011\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0441\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043f\u043e\u00a0\u043a\u043e\u0434\u0443 \u0438\u00a0\u0442.\u00a0\u0434.,<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/TypeFox\/monaco-languageclient\" rel=\"noopener noreferrer nofollow\">Monaco Language Client<\/a>\u00a0\u2014 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c Monaco Editor \u043a\u00a0LSP\u2011\u0441\u0435\u0440\u0432\u0435\u0440\u0443.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2a1\/799\/8c6\/2a17998c6aecc43a93d3dea9fed3fd5f.jpg\" width=\"780\" height=\"440\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/2a1\/799\/8c6\/2a17998c6aecc43a93d3dea9fed3fd5f.jpg 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2a1\/799\/8c6\/2a17998c6aecc43a93d3dea9fed3fd5f.jpg 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<h2>\u041c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c<\/h2>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u0447\u0442\u043e\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 DSL\u00a0\u2014 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0447\u0442\u043e\u00a0\u043c\u044b \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c: \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u044f, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f, \u0418\u0422 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, API, \u0446\u0435\u043b\u0438, \u0440\u0438\u0441\u043a\u0438, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u0440\u0435\u0446\u0435\u043f\u0442\u044b \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0443\u043f\u0430, <a href=\"https:\/\/habr.com\/ru\/companies\/architeezy\/articles\/899324\/comments\/#comment_28187504\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u0443\u0441\u043b\u0438\u043a\u0430\u043c\u0438<\/a>, &#8230;<\/p>\n<p>\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430\u00a0\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u00a0\u2014 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0425\u043e\u0442\u044f \u0434\u0430\u0436\u0435 \u0434\u043b\u044f\u00a0\u0442\u0430\u043a\u043e\u0439, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0439 \u0432\u0435\u0449\u0438, \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u0438 \u043d\u043e\u0442\u0430\u0446\u0438\u0439: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93relationship_model\" rel=\"noopener noreferrer nofollow\">ER<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/IDEF1X\" rel=\"noopener noreferrer nofollow\">IDEF1X<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Anchor_modeling\" rel=\"noopener noreferrer nofollow\">Anchor<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Object%E2%80%93role_modeling\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u2011\u0440\u043e\u043b\u0435\u0432\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Class_diagram\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/a>, \u0438\u043b\u0438\u00a0\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/www.w3.org\/XML\/Schema\" rel=\"noopener noreferrer nofollow\">XML Schema<\/a>, <a href=\"https:\/\/json-schema.org\/\" rel=\"noopener noreferrer nofollow\">JSON Schema<\/a>, <a href=\"https:\/\/dbml.dbdiagram.io\/\" rel=\"noopener noreferrer nofollow\">DBML<\/a>, \u043a\u0430\u043a\u0438\u0435\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u0442\u0438\u043f\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/ISO\/IEC_11179\" rel=\"noopener noreferrer nofollow\">ISO\/IEC 11179<\/a>, <a href=\"https:\/\/www.iso20022.org\/\" rel=\"noopener noreferrer nofollow\">ISO 20022<\/a>, <a href=\"https:\/\/www.niem.gov\/\" rel=\"noopener noreferrer nofollow\">NIEM<\/a>, <a href=\"https:\/\/unece.org\/trade\/uncefact\/ccts\" rel=\"noopener noreferrer nofollow\">UN\/CEFACT CCTS<\/a>. \u041d\u0435\u00a0\u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u044d\u0442\u0443 \u043a\u0440\u043e\u043b\u0438\u0447\u044c\u044e \u043d\u043e\u0440\u0443, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0438\u0447\u0451\u043c \u0434\u0430\u0436\u0435 \u0431\u0435\u0437\u00a0\u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u0441\u0432\u044f\u0437\u0435\u0439.<\/p>\n<p>\u0427\u0442\u043e\u00a0\u0432\u043e\u043e\u0431\u0449\u0435 \u0442\u0430\u043a\u043e\u0435 \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u043e\u0432? \u0412\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u0433\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0448\u0443 \u0438\u0437\u00a0\u0447\u0435\u0433\u043e \u0442\u0430\u043a\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442. \u041e\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 <strong>\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/strong> \u0432\u00a0\u0432\u0430\u0448\u0435\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438. \u0423\u00a0\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c <strong>\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b<\/strong>, \u0434\u043b\u044f\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (<strong>\u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>). \u041c\u0435\u0436\u0434\u0443 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c <strong>\u0441\u0432\u044f\u0437\u0438<\/strong>, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u043e\u0434\u043d\u043e\u2011 \u0438\u043b\u0438\u00a0\u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438, \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (<strong>\u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u044f<\/strong>, <strong>\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f<\/strong>, <strong>\u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f<\/strong>). \u0414\u043b\u044f\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0438 \u0441\u0432\u044f\u0437\u0435\u0439 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f <strong>\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong> \u0438 <strong>\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>. \u041a\u043b\u0430\u0441\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e, \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u044b <strong>\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/strong>. \u0415\u0441\u043b\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u00a0\u044d\u0442\u0438\u043c \u043c\u043e\u0434\u0435\u043b\u044f\u043c \u043a\u043e\u0434, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c <strong>\u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/strong>, <strong>\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/strong> \u0438 <strong>\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b<\/strong>.<\/p>\n<p>\u0412\u043e\u0442, \u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/architeezy.com\/metamodel\/class-model\/dev\/sample\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/a>:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bd3\/dfe\/2f2\/bd3dfe2f2460b9eae070781235f6bf28.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\" width=\"1406\" height=\"762\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bd3\/dfe\/2f2\/bd3dfe2f2460b9eae070781235f6bf28.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bd3\/dfe\/2f2\/bd3dfe2f2460b9eae070781235f6bf28.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0427\u0443\u0442\u044c \u0432\u044b\u0448\u0435 \u043c\u044b \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f\u00a0\u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u0430\u043a\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0442\u0430\u043a\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c (\u043a\u043b\u0430\u0441\u0441\u044b, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u0441\u0432\u044f\u0437\u0438, \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445),<\/p>\n<\/li>\n<li>\n<p>\u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0430\u043a\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u0432\u044f\u0437\u0435\u0439 \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 (\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441\u00a0\u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0438 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442, \u0438 \u0441\u00a0\u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, &#8230;),<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0443\u00a0\u044d\u0442\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c, &#8230;).<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f\u00a0\u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0438\u043b\u0438\u00a0\u0434\u043b\u044f\u00a0\u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430\u00a0\u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041d\u043e\u00a0\u0434\u043b\u044f\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u00a0\u044f\u0437\u044b\u043a\u0435 <a href=\"https:\/\/www.omg.org\/spec\/MOF\" rel=\"noopener noreferrer nofollow\">OMG Meta Object Facility (MOF)<\/a>. \u042d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043f\u0438\u0441\u0430\u043d\u044b <a href=\"https:\/\/www.omg.org\/spec\/BPMN\/2.0\/\" rel=\"noopener noreferrer nofollow\">BPMN<\/a>, <a href=\"https:\/\/www.omg.org\/spec\/UML\/\" rel=\"noopener noreferrer nofollow\">UML<\/a>, <a href=\"https:\/\/sysml.org\/\" rel=\"noopener noreferrer nofollow\">SysML<\/a>, &#8230;<\/p>\n<p>\u041d\u0430\u0448 <a href=\"https:\/\/architeezy.com\/metamodel\/class-model\/dev\/class-model\" rel=\"noopener noreferrer nofollow\">\u044f\u0437\u044b\u043a \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/a> \u0431\u043e\u043b\u0435\u0435 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/90a\/17b\/a42\/90a17ba427d4f1846cc5bd9523162be8.png\" alt=\"\u041c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432\" title=\"\u041c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432\" width=\"2527\" height=\"1840\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/90a\/17b\/a42\/90a17ba427d4f1846cc5bd9523162be8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/90a\/17b\/a42\/90a17ba427d4f1846cc5bd9523162be8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0435\u00a0\u0437\u043d\u0430\u044e \u043a\u0430\u043a\u00a0\u0432\u044b, \u043d\u043e\u00a0\u043b\u0438\u0447\u043d\u043e \u044f \u0431\u0430\u043b\u0434\u0435\u044e \u0441\u00a0\u044d\u0442\u043e\u0439 <s>\u043f\u0440\u0438\u043a\u043e\u0440\u043c\u043a\u0438<\/s> \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u044b. \u0418\u0437\u00a0\u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e\u00a0\u0443\u0433\u043e\u0434\u043d\u043e: Java\u2011\u043a\u043e\u0434, SQL\u2011\u043a\u043e\u0434 \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u0421\u0423\u0411\u0414, XML\u2011\u0441\u0445\u0435\u043c\u044b, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, &#8230;<\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u0435:<\/p>\n<ul>\n<li>\n<p>\u043c\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c \u0447\u0442\u043e\u00a0\u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u00a0\u044f\u0437\u044b\u043a \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438\u00a0DSL \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c, \u0432\u00a0\u043a\u0430\u043a\u0438\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c,<\/p>\n<\/li>\n<li>\n<p>\u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u00a0\u044d\u0442\u0438\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438,<\/p>\n<\/li>\n<li>\n<p>\u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c, \u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u00a0\u043b\u044e\u0431\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 OMG MOF.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0413\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430<\/h2>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u044b \u0443\u0436\u0435 \u043f\u0438\u0448\u0438\u0442\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a\u00a0\u0441\u0442\u0430\u0442\u044c\u0435: \u00ab\u041c\u043e\u0434\u0435\u043b\u0438, \u043c\u043e\u0434\u0435\u043b\u0438, \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u0438, \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043b\u044f\u00a0\u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u0435\u0439, &#8230; \u0427\u0435\u043b, \u0433\u0434\u0435 \u043e\u0431\u0435\u0449\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u0433\u0434\u0435 DSL? \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u00a0\u044d\u0442\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438? \u0423\u00a0\u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u043b\u044f\u00a0\u0445\u0430\u0431\u0440\u0430, \u043f\u043e\u0447\u0435\u043c\u0443\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u0440\u043e\u00a0\u0437\u0430\u0440\u043f\u043b\u0430\u0442\u044b, \u0432\u044b\u0433\u043e\u0440\u0430\u043d\u0438\u0435 \u0438\u043b\u0438\u00a0\u0445\u043e\u0442\u044f\u00a0\u0431\u044b \u0418\u0418?!\u00bb \u041f\u043e\u043d\u0438\u043c\u0430\u044e \u0432\u0430\u0448\u0435 \u043d\u0435\u0433\u043e\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0438 \u043e\u0434\u043d\u0438\u043c\u0438 \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u044b\u0442 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0448\u044c. \u041e\u043d\u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0445 \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u0443\u044e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e. \u041c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435\u00a0\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 (\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430, \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u0442\u0435\u043a\u0441\u0442, &#8230;).<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u00a0\u043d\u0430\u0448\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u043a\u00a0\u0432\u0441\u0435 \u044d\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u044b, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u0441\u0432\u044f\u0437\u0438, \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u00a0\u0442.\u00a0\u0434. \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432\u00a0\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043e\u043f\u0438\u0448\u0435\u043c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443 \u043d\u0430\u0448\u0435\u0433\u043e DSL. \u0415\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Extended_Backus%E2%80%93Naur_form\" rel=\"noopener noreferrer nofollow\">EBNF<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Parsing_expression_grammar\" rel=\"noopener noreferrer nofollow\">PEG<\/a> \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b <a href=\"https:\/\/www.antlr.org\/\" rel=\"noopener noreferrer nofollow\">ANTLR<\/a>, <a href=\"https:\/\/habr.com\/ru\/companies\/cit\/articles\/271945\/\" rel=\"noopener noreferrer nofollow\">EMFText<\/a>, <a href=\"https:\/\/eclipse.dev\/Xtext\/\" rel=\"noopener noreferrer nofollow\">Xtext<\/a>, <a href=\"https:\/\/chevrotain.io\/\" rel=\"noopener noreferrer nofollow\">Chevrotain<\/a>, <a href=\"https:\/\/langium.org\/\" rel=\"noopener noreferrer nofollow\">Langium<\/a>, \u0432 <a href=\"https:\/\/isabelle.in.tum.de\/\" rel=\"noopener noreferrer nofollow\">Isabelle<\/a> \u043e\u0447\u0435\u043d\u044c \u043a\u043b\u0451\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430.<\/p>\n<p>\u041c\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430\u00a0Langium, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0430\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u00a0\u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0434\u043b\u044f\u00a0\u043d\u0438\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u043d\u043e\u0442\u0430\u0446\u0438\u044e, \u043c\u044b \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 ANTLR \u0438\u043b\u0438\u00a0Xtext \u043e\u0442\u043f\u0430\u0434\u0430\u044e\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043c\u044b \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u043c \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 Java\u2011\u043a\u043e\u0434, \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u00a0\u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0425\u043e\u0442\u044f \u0438 Langium \u0432\u00a0\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0437\u0430\u0442\u043e\u0447\u0435\u043d \u043d\u0430\u00a0\u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e, \u043d\u043e\u00a0\u043e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0445\u043e\u0442\u044f\u00a0\u0431\u044b TypeScript\u2011\u043a\u043e\u0434, \u043f\u043b\u044e\u0441 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0431\u0435\u0437\u00a0\u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u0447\u0435\u043c \u043c\u044b \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0432\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>\u041d\u043e\u00a0\u0442\u0430\u043a \u0441\u0445\u043e\u0434\u0443 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443 \u0434\u043b\u044f\u00a0\u044f\u0437\u044b\u043a\u0430 \u0441\u043b\u043e\u0436\u043d\u043e, \u0434\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u043d\u0430\u00a0\u043d\u0430\u0448\u0435\u043c \u0431\u0443\u0434\u0443\u0449\u0435\u043c DSL (<a href=\"https:\/\/aresekb.github.io\/langium-monaco-demo\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440<\/a>):<\/p>\n<pre><code>@name('ru-RU', '\u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430') classModel OnlineStore  @name('ru-RU', '\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c') @description('ru-RU', '\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043a\u0430\u0437\u044b') class User {      @name('ru-RU', '\u0438\u043c\u044f')     @name('fr-FR', 'pr\u00e9nom')     attribute firstName String[0..1]      attribute lastName String[0..1]      attribute birthDate Date[0..1]      attribute email String  }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>@name('ru-RU', '\u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430') classModel OnlineStore  @name('ru-RU', '\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c') @description('ru-RU', '\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043a\u0430\u0437\u044b') class User {      @name('ru-RU', '\u0438\u043c\u044f')     @name('fr-FR', 'pr\u00e9nom')     attribute firstName String[0..1]      @name('ru-RU', '\u0444\u0430\u043c\u0438\u043b\u0438\u044f')     attribute lastName String[0..1]      @name('ru-RU', '\u0434\u0430\u0442\u0430 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f')     attribute birthDate Date[0..1]      @name('ru-RU', '\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430')     attribute email String  }  @name('ru-RU', '\u0437\u0430\u043a\u0430\u0437') class Order {      @name('ru-RU', '\u0430\u0434\u0440\u0435\u0441\u0441 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438')     attribute deliveryAddress String      @name('ru-RU', '\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c')     reference user User      @name('ru-RU', '\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0437\u0430\u043a\u0430\u0437\u0430')     composition items OrderItem[0..*] opposite order  }  @name('ru-RU', '\u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430\u043a\u0430\u0437\u0430') class OrderItem {      @name('ru-RU', '\u0437\u0430\u043a\u0430\u0437')     reference order Order opposite items      @name('ru-RU', '\u043f\u0440\u043e\u0434\u0443\u043a\u0442')     reference product Product      @name('ru-RU', '\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e')     attribute quantity UnsignedInt      @name('ru-RU', '\u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c')     attribute price Money  }  @name('ru-RU', '\u043f\u0440\u043e\u0434\u0443\u043a\u0442') abstract class Product {      @name('ru-RU', '\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435')     attribute name String  }  @name('ru-RU', '\u043a\u043d\u0438\u0433\u0430') class Book extends Product {      @name('ru-RU', '\u0430\u0432\u0442\u043e\u0440')     attribute author String  }  @name('ru-RU', '\u0440\u0443\u0447\u043a\u0430') class Pen extends Product {      @name('ru-RU', '\u0446\u0432\u0435\u0442')     attribute color Color  }  @name('ru-RU', '\u0441\u0442\u0440\u043e\u043a\u0430') string String { }  @name('ru-RU', '\u0446\u0435\u043b\u043e\u0435 \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e') numeric UnsignedInt {     fractionDigits 0     minInclusive 0 }  @name('ru-RU', '\u0434\u0430\u0442\u0430') time Date {     instantUnits year month day }  @name('ru-RU', '\u0434\u0435\u043d\u0435\u0436\u043d\u044b\u0439 \u0442\u0438\u043f') numeric Money {     totalDigits 19     fractionDigits 4     minInclusive 0 }  @name('ru-RU', '\u0446\u0432\u0435\u0442') enumerated Color {      @name('ru-RU', '\u043a\u0440\u0430\u0441\u043d\u044b\u0439')     Red      @name('ru-RU', '\u0437\u0435\u043b\u0451\u043d\u044b\u0439')     Green      @name('ru-RU', '\u0441\u0438\u043d\u0438\u0439')     Blue      @name('ru-RU', '\u0447\u0451\u0440\u043d\u044b\u0439')     Black  }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422.\u00a0\u0435. \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c DSL, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0443\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0441\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 (OnlineStore\u00a0\u2014 \u043e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u00a0\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0438\u043b\u0438\u00a0\u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445), \u0435\u0441\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 (\u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438\u043b\u0438\u00a0\u0432\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435). \u041c\u043e\u0434\u0435\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0443\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0430\u043a\u00a0\u0436\u0435 \u0435\u0441\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435. \u041a\u043b\u0430\u0441\u0441\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0443\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, firstName\u00a0\u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u0430\u00a0email\u00a0\u2014 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439).<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439, \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f\u00a0\u0431\u044b\u043b\u043e \u0432\u0437\u044f\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 <a href=\"https:\/\/dbml.dbdiagram.io\/\" rel=\"noopener noreferrer nofollow\">DBML<\/a>? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0DBML\u00a0\u2014 \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u044f\u0437\u044b\u043a, \u043e\u043d \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043d\u0435\u00a0\u0432\u00a0\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0441\u0432\u044f\u0437\u0435\u0439 \u0438\u00a0\u0442.\u00a0\u0434., \u0430\u00a0\u0432\u00a0\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u0442\u0430\u0431\u043b\u0438\u0446, \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432, \u043a\u043b\u044e\u0447\u0435\u0439 \u0438\u00a0\u0442.\u00a0\u0434. \u0410\u00a0\u043c\u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0447\u0435\u0433\u043e \u0432\u00a0DBML \u043d\u0435\u0442, \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u00a0\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u00a0\u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u0434\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430 \u0441\u00a0\u0434\u0432\u0443\u043c\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438. \u041a\u0430\u043a\u00a0\u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432\u044b\u0448\u0435, \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0434\u043b\u044f\u00a0\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u043d\u0438\u0445 \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0438\u043b\u0438\u00a0\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f\u00a0\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041c\u044b \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445, \u043d\u043e\u00a0\u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u043c\u0435\u0448\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0430 \u044f\u0437\u044b\u043a\u0430 (\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0438 DBML) \u0438 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u00a0\u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<p>\u0422\u0430\u00a0\u0436\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0441 <a href=\"https:\/\/plantuml.com\/\" rel=\"noopener noreferrer nofollow\">PlantUML<\/a>, \u0434\u0430, \u0432\u00a0\u043d\u0451\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043d\u0435 \u043d\u0435\u00a0\u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u044b \u043d\u0435\u00a0\u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438\u00a0DSL \u043a\u0430\u043a\u00a0\u0434\u0430\u043d\u043d\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u0430\u0448\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u043c\u0435\u0448\u0430\u0435\u0442 \u0432\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u044f\u0437\u044b\u043a. \u0410\u00a0\u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u00a0\u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043d\u0430\u00a0\u0434\u0440\u0443\u0433\u043e\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0443\u0434\u0435\u043b\u044f\u044e \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044f\u043c. \u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u2011\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0438\u043b\u0438\u00a0\u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u0432\u0430\u043c \u0431\u043e\u043b\u044c \u0438 \u0441\u0442\u0440\u0430\u0434\u0430\u043d\u0438\u0435, \u0442\u043e \u0432\u044b \u0432\u043e\u043b\u044c\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u044f\u0437\u044b\u043a\u0438. \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430\u00a0\u043d\u0430\u0448 \u043c\u043e\u0442\u0438\u0432\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u043a\u0430\u043d\u0430\u043b \u0438 \u043a\u043e\u0448\u0435\u043b\u0435\u043a \u0434\u043b\u044f\u00a0\u0434\u043e\u043d\u0430\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u00a0\u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0442\u043e\u00a0\u0437\u0430\u00a0DSL \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, \u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0435\u0433\u043e \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438. \u041f\u043e <a href=\"https:\/\/github.com\/AresEkb\/langium-monaco-demo\/blob\/main\/src\/classmodel\/grammar.ts\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043f\u043e\u043b\u043d\u0430\u044f \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430:<\/p>\n<details class=\"spoiler\">\n<summary>\u0413\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>grammar ClassModel  entry ClassModel:     Localization*     'classModel' name=ID     (classes+=Class | dataTypes+=DataType)*;  Class:     Localization*     kind=ClassKind name=ID ('extends' generals+=[Class:ID] (',' generals+=[Class:ID])*)? ('{'         properties+=Property*     '}')?;  ClassKind:     {infer ClassKind__Regular} 'class' |     {infer ClassKind__Abstract} 'abstract' 'class' |     {infer ClassKind__Interface} 'interface';  Property:     Attribute | Reference;  Attribute:     Localization*     'attribute' name=ID dataType=[DataType:ID] Multiplicity?;  Reference:     Localization*     kind=ReferenceKind name=ID target=[Class:ID] Multiplicity? ('opposite' opposite=[Reference:ID])?;  ReferenceKind:     {infer ReferenceKind__Association} 'reference' |     {infer ReferenceKind__Composition} 'composition' |     {infer ReferenceKind__Aggregation} 'aggregation';  fragment Multiplicity:     '[' lower=Natural ('..' upper=UnlimitedNatural)? ']';  DataType:     StringType | NumericType | BooleanType | TimeType | UuidType | EnumeratedType;  StringType:     Localization*     'string' name=ID ('{'         ('length' length=Natural)?         ('minLength' minLength=Natural)?         ('maxLength' maxLength=Natural)?         ('pattern' pattern=STRING)?     '}')?;  NumericType:     Localization*     'numeric' name=ID ('{'         ('size' size=Natural)?         ('totalDigits' totalDigits=Natural)?         ('fractionDigits' fractionDigits=Natural)?         ('minInclusive' minInclusive=Numeric)?         ('minExclusive' minExclusive=Numeric)?         ('maxInclusive' maxInclusive=Numeric)?         ('maxExclusive' maxExclusive=Numeric)?         ('measurementUnit' pattern=STRING)?     '}')?;  BooleanType:     Localization*     'boolean' name=ID ('{' '}')?;  TimeType:     Localization*     'time' name=ID ('{'         ('instantUnits' instantUnits+=TimeUnit+)?         ('instantFractionDigits' instantFractionDigits=Natural)?         ('durationUnits' durationUnits+=TimeUnit+)?         ('durationFractionDigits' durationFractionDigits=Natural)?         ('recurrence' recurrence=TimeUnit)?     '}')?;  TimeUnit:     {infer TimeUnit__Year} 'year' |     {infer TimeUnit__Quarter} 'quarter' |     {infer TimeUnit__Month} 'month' |     {infer TimeUnit__Week} 'week' |     {infer TimeUnit__Day} 'day' |     {infer TimeUnit__Hour} 'hour' |     {infer TimeUnit__Minute} 'minute' |     {infer TimeUnit__Second} 'second';  UuidType:     Localization*     'uuid' name=ID ('{' '}')?;  EnumeratedType:     Localization*     'enumerated' name=ID ('{'         literals+=EnumeratedTypeLiteral*     '}')?;  EnumeratedTypeLiteral:     Localization*     name=ID;  fragment Localization:     '@name' '(' localizedName+=Ecore_EStringToStringMapEntry ')' |     '@description' '(' localizedDescription+=Ecore_EStringToStringMapEntry ')';  Ecore_EStringToStringMapEntry:     key=STRING ',' value=STRING;  Numeric returns number:     '-'? (INT | DECIMAL);  Natural returns number:     INT;  UnlimitedNatural returns number:     INT | '*';  terminal ID: \/[_a-zA-Z][\\w_]*\/; terminal STRING: \/'(\\\\.|[^'])*'\/; terminal INT returns number: \/\\d+\/; terminal DECIMAL returns number: \/(\\d*\\.\\d+|\\d+\\.\\d*)\/;  hidden terminal WS: \/\\s+\/; hidden terminal SL_COMMENT: \/\\\/\\\/[^\\n\\r]*\/; hidden terminal ML_COMMENT: \/\\\/\\*[\\s\\S]*?\\*\\\/\/;<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0410\u00a0\u0437\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0448\u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b:<\/p>\n<pre><code>grammar ClassModel  entry ClassModel:     Localization*     'classModel' name=ID     (classes+=Class | dataTypes+=DataType)*;  Class:     Localization*     kind=ClassKind name=ID     ('extends' generals+=[Class:ID] (',' generals+=[Class:ID])*)?     ('{'         properties+=Property*     '}')?;  ClassKind:     {infer ClassKind__Regular} 'class' |     {infer ClassKind__Abstract} 'abstract' 'class' |     {infer ClassKind__Interface} 'interface';<\/code><\/pre>\n<p>\u0421\u0442\u0440\u043e\u043a\u0430 1\u00a0\u2014 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438.<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 3\u20136\u00a0\u2014 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u0441\u0435\u0440\u0430. \u041f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u043a\u043e\u0434 \u043d\u0430\u00a0\u043d\u0430\u0448\u0435\u043c DSL \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (\u0441\u0442\u0440\u043e\u043a\u0430 3), \u0432 \u043a\u043e\u0434\u0435 \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u043b\u0438\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445\u00a0\u2014 \u0441\u0442\u0440\u043e\u043a\u0430 4), \u0437\u0430\u0442\u0435\u043c \u0432\u00a0\u043a\u043e\u0434\u0435 \u0434\u043e\u043b\u0436\u043d\u043e\u00a0\u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>classModel<\/code> \u0438 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e\u00a0\u2014 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (\u0441\u0442\u0440\u043e\u043a\u0430 5), \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u0432\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043b\u0430\u0441\u0441\u044b \u0438 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 (\u0441\u0442\u0440\u043e\u043a\u0430 6).<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 8\u201314\u00a0\u2014 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0434\u043b\u044f\u00a0\u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u0421\u043d\u0430\u0447\u0430\u043b\u0430, \u0442\u0430\u043a\u00a0\u0436\u0435 \u043a\u0430\u043a\u00a0\u0438 \u0434\u043b\u044f\u00a0\u0432\u0441\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u0434\u043b\u044f\u00a0\u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f (\u0441\u0442\u0440\u043e\u043a\u0430 9). \u0417\u0430\u0442\u0435\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u0438\u043f \u043a\u043b\u0430\u0441\u0441\u0430 (\u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438\u043b\u0438\u00a0\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441) \u0438 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 10). \u0417\u0430\u0442\u0435\u043c \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>extends<\/code> \u0438 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u044f\u0442\u0443\u044e\u00a0\u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (\u0441\u0442\u0440\u043e\u043a\u0430 11). \u041d\u0430\u043a\u043e\u043d\u0435\u0446 \u0432\u00a0\u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0445 \u0441\u043a\u043e\u0431\u043a\u0430\u0445 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 (\u0441\u0442\u0440\u043e\u043a\u0438 12\u201314).<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 16\u201319\u00a0\u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0442\u0438\u043f\u0430 \u043a\u043b\u0430\u0441\u0441\u0430, \u043e\u043d\u043e \u043c\u043e\u0433\u043b\u043e\u00a0\u0431\u044b\u00a0\u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0449\u0435, \u0435\u0441\u043b\u0438\u00a0\u0431\u044b Langium \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Xtext \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f, \u043d\u043e\u00a0\u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0430\u0433\u0438\u0435\u0439 \u0441 <code>infer<\/code>. \u0412\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0432\u00a0\u043c\u043e\u0434\u0435\u043b\u0438, \u0438 \u0442\u0430\u043a\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442 \u043d\u0430\u043c \u044d\u0442\u0443 \u0437\u0430\u0434\u0430\u0447\u0443.<\/p>\n<pre><code>Property:     Attribute | Reference;  Attribute:     Localization*     'attribute' name=ID dataType=[DataType:ID] Multiplicity?;  Reference:     Localization*     kind=ReferenceKind name=ID target=[Class:ID] Multiplicity?     ('opposite' opposite=[Reference:ID])?;  ReferenceKind:     {infer ReferenceKind__Association} 'reference' |     {infer ReferenceKind__Composition} 'composition' |     {infer ReferenceKind__Aggregation} 'aggregation';  fragment Multiplicity:     '[' lower=Natural ('..' upper=UnlimitedNatural)? ']';<\/code><\/pre>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 1\u20132\u00a0\u2014 \u0443\u00a0\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u0441\u0432\u043e\u0439\u0441\u0442\u0432: \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430\u00a0\u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u044b.<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 4\u20136\u00a0\u2014 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0434\u043b\u044f\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432. \u0414\u043b\u044f\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0432\u00a0\u0432\u0438\u0434\u0435 <code>[N..M]<\/code>, \u0447\u0442\u043e\u00a0\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u043d\u0435\u00a0\u043c\u0435\u043d\u0435\u0435 <code>N<\/code> \u0438 \u043d\u0435\u00a0\u0431\u043e\u043b\u0435\u0435 <code>M<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>[0..1]<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 (\u043c\u043e\u0436\u0435\u0442 \u043d\u0435\u00a0\u0438\u043c\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u043b\u0438\u00a0\u0438\u043c\u0435\u0442\u044c \u043e\u0434\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435), <code>[1]<\/code> \u0438\u043b\u0438 <code>[1..1]<\/code>\u00a0\u2014 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435, <code>[0..*]<\/code>\u00a0\u2014 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, <code>[1..*]<\/code>\u00a0\u2014 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u043e\u00a0\u043d\u0435\u00a0\u043c\u0435\u043d\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u00a0\u0442.\u00a0\u0434.<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 8\u201311\u00a0\u2014 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0434\u043b\u044f\u00a0\u0441\u0441\u044b\u043b\u043e\u043a. \u0421\u0441\u044b\u043b\u043a\u0438 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u0442\u0440\u0435\u0445 \u0442\u0438\u043f\u043e\u0432: \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u044f, \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f, \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f. \u0414\u043b\u044f\u00a0\u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e <code>opposite<\/code>.<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 13\u201316\u00a0\u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f\u00a0\u0442\u0438\u043f\u043e\u0432 \u0441\u0441\u044b\u043b\u043e\u043a.<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 18\u201319\u00a0\u2014 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f\u00a0\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0438 \u0441\u0441\u044b\u043b\u043e\u043a. \u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u0442\u0435\u043c, \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 \u0434\u043b\u044f\u00a0\u043d\u0438\u0445 \u043d\u0435\u00a0\u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u0437\u0435\u043b \u0432\u00a0\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435.<\/p>\n<p>\u0415\u0449\u0451 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b \u0434\u043b\u044f\u00a0\u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code>DataType:     StringType | NumericType | BooleanType |     TimeType | UuidType | EnumeratedType;  StringType:     Localization*     'string' name=ID ('{'         ('length' length=Natural)?         ('minLength' minLength=Natural)?         ('maxLength' maxLength=Natural)?         ('pattern' pattern=STRING)?     '}')?;<\/code><\/pre>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 1\u20133\u00a0\u2014 \u0432\u00a0\u043d\u0430\u0448\u0435\u043c DSL \u0431\u0443\u0434\u0435\u0442 6\u00a0\u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0441\u0442\u0440\u043e\u043a\u0430, \u0447\u0438\u0441\u043b\u043e, \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, UUID \u0438 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043c\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445).<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 5\u201312\u00a0\u2014 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f\u00a0\u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f\u00a0\u0441\u0442\u0440\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0443\u044e \u0434\u043b\u0438\u043d\u0443, \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0443\u044e \u0434\u043b\u0438\u043d\u0443, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u0443\u044e \u0434\u043b\u0438\u043d\u0443, \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u00a0\u0441\u043c\u044b\u0441\u043b\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f\u00a0\u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0418 \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u0432\u0438\u043b:<\/p>\n<pre><code>fragment Localization:     '@name' '(' localizedName+=Ecore_EStringToStringMapEntry ')' |     '@description' '(' localizedDescription+=Ecore_EStringToStringMapEntry ')';  Ecore_EStringToStringMapEntry:     key=STRING ',' value=STRING;  Numeric returns number:     '-'? (INT | DECIMAL);  UnlimitedNatural returns number:     INT | '*';  terminal ID: \/[_a-zA-Z][\\w_]*\/; terminal STRING: \/'(\\\\.|[^'])*'\/; terminal INT returns number: \/\\d+\/; terminal DECIMAL returns number: \/(\\d*\\.\\d+|\\d+\\.\\d*)\/;  hidden terminal WS: \/\\s+\/; hidden terminal SL_COMMENT: \/\\\/\\\/[^\\n\\r]*\/; hidden terminal ML_COMMENT: \/\\\/\\*[\\s\\S]*?\\*\\\/\/;<\/code><\/pre>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 1\u20136\u00a0\u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f\u00a0\u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0439 \u043c\u043e\u0434\u0435\u043b\u0438, \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0441\u0432\u044f\u0437\u0435\u0439.<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 8\u20139\u00a0\u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0447\u0438\u0441\u0435\u043b. \u042d\u0442\u043e DataType\u2011\u043f\u0440\u0430\u0432\u0438\u043b\u043e\u00a0\u2014 \u0447\u0442\u043e\u2011\u0442\u043e \u0441\u0440\u0435\u0434\u043d\u0435\u0435 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 (\u043e\u043d\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0435) \u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0434\u043b\u044f\u00a0\u043d\u0435\u0433\u043e \u043d\u0435\u00a0\u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u0437\u0435\u043b \u0432\u00a0\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435). \u0417\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u043d\u044b DataType\u2011\u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b? \u0422\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043d\u0435\u00a0\u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439, \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043d\u0430\u00a0\u044d\u0442\u0430\u043f\u0435 <a href=\"https:\/\/habr.com\/ru\/companies\/cit\/articles\/270483\/\" rel=\"noopener noreferrer nofollow\">\u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430<\/a>. \u041b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c Numeric \u0438 UnlimitedNatural, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0438\u0441\u043b\u043e <code>42<\/code> \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0438 \u0442\u0435\u043c, \u0438 \u0442\u0435\u043c.<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 11\u201312\u00a0\u2014 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 (\u043b\u0438\u0431\u043e \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e,\u00a0\u043b\u0438\u0431\u043e \u043d\u0435\u00a0\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043e).<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 14\u201317\u00a0\u2014 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0438\u00a0\u043b\u0435\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0435 \u043a\u043e\u0434\u0430. \u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u00a0\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f <code>INT<\/code> \u0438 <code>DECIMAL<\/code> \u043d\u0435\u00a0\u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0432\u00a0\u0447\u0438\u0441\u043b\u0435 \u0435\u0441\u0442\u044c \u0442\u043e\u0447\u043a\u0430, \u0442\u043e \u044d\u0442\u043e <code>DECIMAL<\/code>, \u0430\u00a0\u0435\u0441\u043b\u0438 \u043d\u0435\u0442\u00a0\u2014 <code>INT<\/code>.<\/p>\n<p>\u0421\u0442\u0440\u043e\u043a\u0438 19\u201321\u00a0\u2014 \u0441\u043a\u0440\u044b\u0442\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430, \u0434\u043b\u044f\u00a0\u043d\u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043d\u0435\u00a0\u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432\u00a0\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043d\u0438 \u0432\u00a0\u0432\u0438\u0434\u0435 \u0443\u0437\u043b\u043e\u0432, \u043d\u0438 \u0432\u00a0\u0432\u0438\u0434\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0443\u0437\u043b\u043e\u0432. \u042d\u0442\u043e \u043f\u0440\u043e\u0431\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438. \u041f\u0440\u0430\u0432\u0434\u0430 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u2011\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 (Python) \u0438\u043b\u0438\u00a0\u0438\u043d\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0432\u00a0\u043a\u043e\u0434\u0435, \u043d\u043e\u00a0\u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0435\u043c\u0430.<\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u043b\u0438 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430\u00a0\u0442\u043e, \u0447\u0442\u043e\u00a0\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432\u00a0\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 \u0441\u00a0\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432\u00a0\u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u0438. \u042d\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u043f\u043e\u00a0\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c. \u0412\u00a0\u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0432\u00a0\u043d\u0430\u0448\u0435\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0438 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438, \u0430\u00a0\u0432\u00a0\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0435 \u0434\u043b\u044f\u00a0\u044d\u0442\u0438\u0445\u00a0\u0436\u0435 \u0441\u0430\u043c\u044b\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432 \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u043d\u043e\u0442\u0430\u0446\u0438\u044e.<\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430<\/h2>\n<p>\u0412\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/microsoft.github.io\/monaco-editor\/\" rel=\"noopener noreferrer nofollow\">Monaco Editor<\/a>, \u043e\u043d \u043b\u0435\u0436\u0438\u0442 \u0432\u00a0\u043e\u0441\u043d\u043e\u0432\u0435 VS Code \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439. \u041a\u0430\u043a\u00a0\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u00a0\u043d\u0435\u0433\u043e \u043d\u0430\u0448\u0443 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443? Langium \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 <a href=\"https:\/\/microsoft.github.io\/language-server-protocol\/\" rel=\"noopener noreferrer nofollow\">Language Server Protocol (LSP)<\/a>, \u0430 <a href=\"https:\/\/github.com\/TypeFox\/monaco-languageclient\" rel=\"noopener noreferrer nofollow\">Monaco Language Client<\/a> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c Monaco Editor \u043a\u00a0LSP\u2011\u0441\u0435\u0440\u0432\u0435\u0440\u0443.<\/p>\n<p>\u0414\u043b\u044f\u00a0Monaco Language Client \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u043e\u043d\u043d\u044b \u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432. \u042f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0432\u043e\u00a0\u0432\u0441\u0451\u043c \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u0435\u043d\u044f \u043f\u043e\u0440\u0430\u0436\u0430\u0435\u0442 \u0432\u00a0\u0447\u0451\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438 \u043d\u0435\u00a0\u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043b\u044e\u0434\u044f\u043c \u043c\u043e\u0437\u0433. \u041a\u043e\u0440\u043e\u0447\u0435 \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043e\u0442\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043a\u00a0\u0441\u043b\u043e\u0436\u043d\u043e\u043c\u0443: <a href=\"https:\/\/aresekb.github.io\/langium-monaco-demo\/\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043c\u043e<\/a> \u0438 <a href=\"https:\/\/github.com\/AresEkb\/langium-monaco-demo\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/a>.<\/p>\n<p><a href=\"https:\/\/github.com\/AresEkb\/langium-monaco-demo\/blob\/main\/src\/pages\/EditorPage.tsx\" rel=\"noopener noreferrer nofollow\">\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440<\/a> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"typescript\">import { classModelGrammar } from '..\/classmodel\/grammar'; import { classModelGrammarExtension } from '..\/classmodel\/grammarExtension'; import { classModelText } from '..\/classmodel\/text'; import { DslEditor } from '..\/dsl-editor\/DslEditor';  export function EditorPage() {   return (     &lt;main&gt;       &lt;DslEditor         uri=\"file:\/\/\/code\"         language=\"classmodel\"         grammar={classModelGrammar}         grammarExtension={classModelGrammarExtension}         value={classModelText}       \/&gt;     &lt;\/main&gt;   ); }<\/code><\/pre>\n<p><code>DslEditor<\/code>\u00a0\u2014 \u044d\u0442\u043e \u043d\u0430\u0448\u0430 \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 <a href=\"https:\/\/www.npmjs.com\/package\/@typefox\/monaco-editor-react\" rel=\"noopener noreferrer nofollow\">MonacoEditorReactComp<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 <a href=\"https:\/\/www.npmjs.com\/package\/monaco-editor-wrapper\" rel=\"noopener noreferrer nofollow\">MonacoEditorLanguageClientWrapper<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 Monaco Editor. \u0423\u00a0\u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u0441\u0432\u043e\u0438 \u0431\u0435\u0437\u0443\u043c\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438, \u0430\u00a0\u0443\u00a0\u043c\u0435\u043d\u044f \u0444\u043b\u044d\u0448\u0431\u044d\u043a\u0438 \u043a\u0430\u043a\u00a0\u044f \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0432\u00a0\u044d\u0442\u043e\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b <code>DslEditor<\/code>:<\/p>\n<ul>\n<li>\n<p>uri\u00a0\u2014 \u0432\u00a0Monaco Editor \u0443\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430 \u0434\u043e\u043b\u0436\u0435\u043d\u00a0\u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441,<\/p>\n<\/li>\n<li>\n<p>language\u00a0\u2014 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 DSL,<\/p>\n<\/li>\n<li>\n<p>grammar\u00a0\u2014 Langium\u2011\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u0432\u044b\u0448\u0435,<\/p>\n<\/li>\n<li>\n<p>grammarExtension\u00a0\u2014 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u043d\u0430\u00a0JavaScript (\u0441\u043c. \u0434\u0430\u043b\u0435\u0435),<\/p>\n<\/li>\n<li>\n<p>value\u00a0\u2014 \u043a\u043e\u0434, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0432\u00a0\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435.<\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/github.com\/AresEkb\/langium-monaco-demo\/blob\/main\/src\/dsl-editor\/DslEditor.tsx\" rel=\"noopener noreferrer nofollow\">DslEditor<\/a> \u0441\u043e\u0437\u0434\u0430\u0451\u0442 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Web_Workers_API\" rel=\"noopener noreferrer nofollow\">Web Worker<\/a> \u0441\u00a0LSP\u2011\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043d\u0444\u0438\u0433 \u0434\u043b\u044f\u00a0Monaco Editor Wrapper.<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u043a\u0430\u043a\u043e\u0435\u2011\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043d\u0430\u00a0JavaScript? \u0414\u043b\u044f\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u0430\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>*<\/code>, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>[0..*]<\/code>. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u00a0\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u043b\u0436\u0435\u043d\u00a0\u0431\u044b\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043c\u043e\u0433 \u0445\u0440\u0430\u043d\u0438\u0442\u044c <code>*<\/code>. \u041d\u043e\u00a0\u043e\u0431\u044b\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u043c \u0438 \u0432\u043c\u0435\u0441\u0442\u043e <code>*<\/code> \u0445\u0440\u0430\u043d\u0438\u0442\u044c <code>-1<\/code>. \u0412\u00a0Langium \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u0430\u044f, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0435\u0451 \u043d\u0430\u00a0JavaScript.<\/p>\n<p>\u0418\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u0430\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c <code>[1]<\/code> \u0432\u00a0\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u0432\u00a0\u043f\u043e\u043b\u043d\u0443\u044e \u0444\u043e\u0440\u043c\u0443 <code>[1..1]<\/code>. \u0418\u043b\u0438\u00a0\u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 (opposite) \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0443\u044e \u0441\u0432\u044f\u0437\u044c. \u0412\u00a0Langium \u0438\u0437\u00a0\u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0432\u0441\u0451 \u044d\u0442\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c: \u0434\u043b\u044f\u00a0\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c. \u041d\u043e\u00a0\u044f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0439\u0442\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0443\u0442\u0451\u043c\u00a0\u2014 \u043d\u0435\u00a0\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f\u00a0\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438 \u043a\u043e\u0434, \u0430\u00a0\u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0451 JavaScript\u2011\u043a\u043e\u0434\u043e\u043c.<\/p>\n<p>\u0412\u043e\u0442, \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 <a href=\"https:\/\/github.com\/AresEkb\/langium-monaco-demo\/blob\/main\/src\/classmodel\/grammarExtension.ts\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438<\/a> \u043d\u0430\u00a0JavaScript:<\/p>\n<pre><code class=\"javascript\">{   Reference: {     lower: {       normalize(node) {         return node.lower ?? 1;       },       denormalize(node) {         return node.lower !== node.upper ? node.lower : node.lower !== 1 ? node.lower : undefined;       },     },     upper: {       normalize(node) {         return node.upper ?? node.lower ?? 1;       },       denormalize(node) {         return node.lower !== node.upper ? node.upper : undefined;       },     },     opposite: {       scopes(node) {         return node.target.ref.properties           .filter((prop) =&gt; prop.$type === 'Reference' &amp;&amp;                             prop.target.ref === node.$container);       },     },   },   UnlimitedNatural: {     value: {       parse(value) {         return value === '*' ? -1 : parseInt(value);       },       print(value) {         return value === -1 ? '*' : value.toString();       },     },   }, }<\/code><\/pre>\n<p>\u0412\u00a0\u044d\u0442\u043e\u043c JSON \u043d\u0430\u00a0\u043f\u0435\u0440\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u043c\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u0438\u0437\u00a0\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438. \u041d\u0430\u00a0\u0432\u0442\u043e\u0440\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u043b\u044f\u00a0\u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0437\u043b\u043e\u0432 \u0432\u00a0AST (Abstract Syntax Tree, \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e), \u0430\u00a0\u0434\u043b\u044f\u00a0DataType\u2011\u043f\u0440\u0430\u0432\u0438\u043b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 value. \u041d\u0430\u00a0\u0442\u0440\u0435\u0442\u044c\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0437\u0430\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u0430\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>parse\u00a0\u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u00a0\u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u0440\u0438\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 \u043a\u043e\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 <code>*<\/code> \u0432 <code>-1<\/code>,<\/p>\n<\/li>\n<li>\n<p>print\u00a0\u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u00a0\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 AST \u043f\u0440\u0438\u00a0\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 <code>-1<\/code> \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 <code>*<\/code> (\u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435),<\/p>\n<\/li>\n<li>\n<p>normalize\u00a0\u2014 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0443\u0437\u0435\u043b AST \u0432\u00a0\u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f\u00a0\u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0432\u0438\u0434, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <code>[1]<\/code> \u0432 <code>[1..1]<\/code> (\u044d\u0442\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f AST \u0432\u00a0\u043c\u043e\u0434\u0435\u043b\u044c, \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435),<\/p>\n<\/li>\n<li>\n<p>denormalize\u00a0\u2014 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0443\u0437\u0435\u043b AST \u0432\u00a0\u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f\u00a0\u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u0438\u0434, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 <code>[2..2]<\/code> \u0432 <code>[2]<\/code> (\u044d\u0442\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f\u00a0\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u00a0AST \u0438 \u0437\u0430\u0442\u0435\u043c \u0432\u00a0\u043a\u043e\u0434, \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435),<\/p>\n<\/li>\n<li>\n<p>scopes\u00a0\u2014 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f. \u0412\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438\u0437\u00a0\u043a\u043e\u0440\u043e\u0431\u043a\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0438 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u043e\u00a0\u0442\u0438\u043f\u0430\u043c \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0432\u00a0\u043a\u043e\u0434\u0435, \u0430\u00a0\u0435\u0441\u043b\u0438 \u0432\u044b \u0443\u043a\u0430\u0436\u0435\u0442\u0435 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430, \u0442\u043e Monaco Editor \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u0438\u0442 \u043e\u0448\u0438\u0431\u043a\u0443. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0438\u0437\u00a0\u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430\u00a0\u043a\u043b\u0430\u0441\u0441\u044b. \u041d\u043e\u00a0\u0432\u043e\u00a0\u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435 \u043d\u0430\u00a0\u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435. \u0410\u00a0\u043f\u0440\u0438\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0432\u044f\u0437\u0435\u0439 \u0432\u044b \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0435\u0441\u044c \u043d\u0430\u00a0\u0434\u0440\u0443\u0433\u0443\u044e \u0441\u0432\u044f\u0437\u044c, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0443\u044e \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u0438 Langium \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438. \u0417\u0430\u0442\u043e \u044d\u0442\u043e \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u043e\u0436\u0435\u0442\u0435 <a href=\"https:\/\/aresekb.github.io\/langium-monaco-demo\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c<\/a> \u0432\u0441\u0435 \u044d\u0442\u0438 \u0448\u0442\u0443\u043a\u0438 \u0441\u00a0\u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0435\u0439 \u0441\u0441\u044b\u043b\u043e\u043a. \u0415\u0449\u0451 \u043f\u043e <code>F2<\/code> \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c. \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 LSP\u2011\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u0435 <a href=\"https:\/\/github.com\/AresEkb\/langium-monaco-demo\/blob\/main\/src\/dsl-editor\/AbstractDslServer.ts\" rel=\"noopener noreferrer nofollow\">AbstractDslServer<\/a>. \u0421\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>createServicesForGrammar()<\/code> \u0438\u0437\u00a0Langium \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 LSP\u2011\u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0434\u043b\u044f\u00a0\u043d\u0435\u0433\u043e ValueConverter, ScopeProvider, CompletionProvider. \u041e\u0431\u044b\u0447\u043d\u043e \u0432\u00a0Langium \u043f\u043e\u0434\u00a0\u043a\u0430\u0436\u0434\u044b\u0439 DSL \u0432\u00a0\u043a\u043e\u0434\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u044b \u0438 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u044b. \u0410\u00a0\u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d\u0438 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437\u00a0\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438.<\/p>\n<h2>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e<\/h2>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 \u0443\u00a0\u043d\u0430\u0441 \u0435\u0441\u0442\u044c. \u041d\u043e\u00a0\u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u00a0\u044d\u0442\u0438\u043c \u043a\u043e\u0434\u043e\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435: \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u00a0\u043d\u0435\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u0434 (SQL, Java, &#8230;), \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437\u00a0\u043d\u0435\u0433\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b, \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u00a0\u0432\u0438\u0434\u0435 \u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u044b. \u0412\u043e\u00a0\u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u00a0\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u043c \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0434\u0435\u0440\u0435\u0432\u043e\u043c (Abstract Syntax Tree, AST), \u0430\u00a0\u043d\u0435\u00a0\u0441\u00a0\u0442\u0435\u043a\u0441\u0442\u043e\u043c. \u0411\u043b\u0430\u0433\u043e Langium \u0438\u0437\u00a0\u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 AST \u0434\u043b\u044f\u00a0\u043a\u043e\u0434\u0430, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/aresekb.github.io\/langium-monaco-demo\/#\/ast\" rel=\"noopener noreferrer nofollow\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442:<\/p>\n<pre><code class=\"json\">{   \"$type\": \"ClassModel\",   \"localizedName\": [     {       \"$type\": \"Ecore_EStringToStringMapEntry\",       \"key\": \"ru-RU\",       \"value\": \"\u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\"     }   ],   \"name\": \"OnlineStore\",   \"classes\": [     {       \"$type\": \"Class\",       \"localizedName\": [         {           \"$type\": \"Ecore_EStringToStringMapEntry\",           \"key\": \"ru-RU\",           \"value\": \"\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\"         }       ],       \"kind\": {         \"$type\": \"ClassKind__Regular\"       },       \"name\": \"User\",       \"properties\": [         {           \"$type\": \"Attribute\",           \"name\": \"firstName\",           \"dataType\": {             \"$ref\": \"#\/dataTypes@0\",             \"$refText\": \"String\"           },           \"lower\": 0,           \"upper\": 1,         }       ]     }   ] }<\/code><\/pre>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u044d\u0442\u043e\u0433\u043e JSON \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u0430\u0432\u0438\u043b, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0432\u044b\u0448\u0435 \u0432\u00a0\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0435. \u0414\u043b\u044f\u00a0\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u043f\u0440\u0430\u0432\u0438\u043b \u0432\u00a0JSON \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0443\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u00a0\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435 <code>$type<\/code> \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u0437\u00a0\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438, \u0430\u00a0\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0438\u0437\u00a0\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438.<\/p>\n<p>\u0422\u0430\u043a\u043e\u0439 JSON \u0443\u0436\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0435\u043d \u0434\u043b\u044f\u00a0\u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043a\u043e\u0434\u0430. \u0418 \u0432\u00a0\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043f\u043e\u00a0\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043e\u043d \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430\u00a0\u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0415\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438\u00a0\u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0435 \u043a\u043e\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u043e\u0432\u043e\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e. \u0410\u00a0\u0432\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u043e \u043f\u0440\u0438\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0435\u00a0\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0441\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u0430\u00a0\u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u044b\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u0436\u043c\u043e\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c\u0438. \u041c\u044b \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043d\u043e, \u0437\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0451\u0434, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0435 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0434\u043e\u00a0\u0438 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430, \u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e\u00a0\u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u0436\u0435 \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u043c\u044b \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u043b\u0438 <a href=\"https:\/\/jsondiffpatch.com\/\" rel=\"noopener noreferrer nofollow\">JsonDiffPatch<\/a>. <a href=\"https:\/\/aresekb.github.io\/langium-monaco-demo\/#\/ast\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435<\/a> \u0447\u0442\u043e\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u00a0\u043a\u043e\u0434\u0435 \u0438 \u0441\u043f\u0440\u0430\u0432\u0430 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0435\u043d\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8c0\/dd3\/148\/8c0dd3148bd16b47c68e2f26a2c87f6e.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0445 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0445 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432\" width=\"1471\" height=\"518\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/8c0\/dd3\/148\/8c0dd3148bd16b47c68e2f26a2c87f6e.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8c0\/dd3\/148\/8c0dd3148bd16b47c68e2f26a2c87f6e.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0445 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432<\/figcaption><\/div>\n<\/figure>\n<h2>\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438<\/h2>\n<p>\u041f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u00a0\u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u044b \u0441\u0430\u043c\u0438 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443 \u0434\u043b\u044f\u00a0\u0432\u0430\u0448\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0433\u043e <a href=\"https:\/\/aresekb.github.io\/langium-monaco-demo\/#\/grammar\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438<\/a>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044f \u0438\u0437\u043c\u0435\u043d\u0438\u043b \u0441\u043b\u0435\u0432\u0430 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0434\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441 <code>classModel<\/code> \u043d\u0430 <code>cm<\/code>, \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u0438\u043b\u0430\u0441\u044c \u0434\u043b\u044f\u00a0\u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043a\u043e\u0434\u0430 \u0441\u043f\u0440\u0430\u0432\u0430 \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0434\u0430\u0451\u0442\u0441\u044f \u0442\u0430\u043a\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cdc\/5dd\/c37\/cdc5ddc376eb095272c3d75f74423c2d.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438\" width=\"1477\" height=\"528\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cdc\/5dd\/c37\/cdc5ddc376eb095272c3d75f74423c2d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cdc\/5dd\/c37\/cdc5ddc376eb095272c3d75f74423c2d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0438<\/figcaption><\/div>\n<\/figure>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412\u00a0\u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043a\u0430\u043a\u00a0\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 DSL (\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043b\u044f\u00a0\u043d\u0435\u0433\u043e \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0430\u00a0\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c (\u0440\u0443\u0441\u0441\u043a\u0438\u0439) \u0438\u043b\u0438\u00a0\u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c (<a href=\"https:\/\/www.omg.org\/spec\/MOF\" rel=\"noopener noreferrer nofollow\">OMG MOF<\/a>) \u044f\u0437\u044b\u043a\u0435, \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443), \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"https:\/\/microsoft.github.io\/monaco-editor\/\" rel=\"noopener noreferrer nofollow\">Monaco Editor<\/a>, <a href=\"https:\/\/langium.org\/\" rel=\"noopener noreferrer nofollow\">Langium<\/a> \u0438 <a href=\"https:\/\/github.com\/TypeFox\/monaco-languageclient\" rel=\"noopener noreferrer nofollow\">Monaco Language Client<\/a> \u0434\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u043a\u043e\u0434\u0430. \u0415\u0441\u0442\u044c <a href=\"https:\/\/aresekb.github.io\/langium-monaco-demo\/\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043c\u043e<\/a> \u0438 <a href=\"https:\/\/github.com\/AresEkb\/langium-monaco-demo\/\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/a>. \u0412\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u043e\u00a0\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0445 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432\u00a0\u043a\u043e\u0434. \u0422\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u043e\u00a0\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 AST \u0432\u00a0\u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e. \u0418\u043d\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u043b\u043d\u0443\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443: \u043c\u043e\u0434\u0435\u043b\u044c \u2192 AST \u2192 \u043a\u043e\u0434 \u2192 AST \u2192 \u043c\u043e\u0434\u0435\u043b\u044c.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/923586\/\"> https:\/\/habr.com\/ru\/articles\/923586\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u043c \u043a\u0430\u043a\u00a0\u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c <a href=\"https:\/\/architeezy.com\/\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0448 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/a>. \u041a <a href=\"https:\/\/habr.com\/ru\/companies\/architeezy\/articles\/899324\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>\u00a0\u0431\u044b\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u00a0\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e\u00a0\u043b\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435, \u043a\u0430\u043a\u00a0\u043d\u0430\u0441\u0447\u0451\u0442 architecture as code, code first \u0438\u00a0\u0442.\u00a0\u0434. \u041c\u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u044d\u0442\u0443 \u0444\u0438\u0447\u0443 \u0432\u00a0\u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0440\u0435\u043b\u0438\u0437\u0435, \u043d\u043e\u00a0\u043d\u0435\u0442, \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <a href=\"https:\/\/aresekb.github.io\/langium-monaco-demo\/\" rel=\"noopener noreferrer nofollow\">\u0442\u0430\u043a\u0430\u044f \u0434\u0435\u043c\u043a\u0430<\/a> \u0441 <a href=\"https:\/\/github.com\/AresEkb\/langium-monaco-demo\" rel=\"noopener noreferrer nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438<\/a>. \u0418 \u0432\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043a\u0430\u043a\u00a0\u043e\u043d\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u0430, \u043a\u0430\u043a\u00a0\u0437\u0430\u043f\u0438\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u2011\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u044f\u0437\u044b\u043a (DSL) \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0434\u043b\u044f\u00a0\u043d\u0435\u0433\u043e.<\/p>\n<p>\u0411\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/microsoft.github.io\/monaco-editor\/\" rel=\"noopener noreferrer nofollow\">Monaco Editor<\/a>\u00a0\u2014 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u00a0VS Code,<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/langium.org\/\" rel=\"noopener noreferrer nofollow\">Langium<\/a>\u00a0\u2014 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c LSP\u2011\u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f\u00a0\u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u2011\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0441\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0430\u0432\u0442\u043e\u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043f\u043e\u00a0\u043a\u043e\u0434\u0443 \u0438\u00a0\u0442.\u00a0\u0434.,<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/github.com\/TypeFox\/monaco-languageclient\" rel=\"noopener noreferrer nofollow\">Monaco Language Client<\/a>\u00a0\u2014 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c Monaco Editor \u043a\u00a0LSP\u2011\u0441\u0435\u0440\u0432\u0435\u0440\u0443.<\/p>\n<\/li>\n<\/ul>\n<figure class=\"full-width\"><\/figure>\n<h2>\u041c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c<\/h2>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u0447\u0442\u043e\u00a0\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 DSL\u00a0\u2014 \u044d\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0447\u0442\u043e\u00a0\u043c\u044b \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0435\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c: \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u044f\u0442\u0438\u044f, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f, \u0418\u0422 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, API, \u0446\u0435\u043b\u0438, \u0440\u0438\u0441\u043a\u0438, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u0440\u0435\u0446\u0435\u043f\u0442\u044b \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0443\u043f\u0430, <a href=\"https:\/\/habr.com\/ru\/companies\/architeezy\/articles\/899324\/comments\/#comment_28187504\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u0443\u0441\u043b\u0438\u043a\u0430\u043c\u0438<\/a>, &#8230;<\/p>\n<p>\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430\u00a0\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u00a0\u2014 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u0425\u043e\u0442\u044f \u0434\u0430\u0436\u0435 \u0434\u043b\u044f\u00a0\u0442\u0430\u043a\u043e\u0439, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c\u00a0\u0431\u044b \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0439 \u0432\u0435\u0449\u0438, \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u0438 \u043d\u043e\u0442\u0430\u0446\u0438\u0439: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Entity%E2%80%93relationship_model\" rel=\"noopener noreferrer nofollow\">ER<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/IDEF1X\" rel=\"noopener noreferrer nofollow\">IDEF1X<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Anchor_modeling\" rel=\"noopener noreferrer nofollow\">Anchor<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Object%E2%80%93role_modeling\" rel=\"noopener noreferrer nofollow\">\u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u2011\u0440\u043e\u043b\u0435\u0432\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Class_diagram\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/a>, \u0438\u043b\u0438\u00a0\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/www.w3.org\/XML\/Schema\" rel=\"noopener noreferrer nofollow\">XML Schema<\/a>, <a href=\"https:\/\/json-schema.org\/\" rel=\"noopener noreferrer nofollow\">JSON Schema<\/a>, <a href=\"https:\/\/dbml.dbdiagram.io\/\" rel=\"noopener noreferrer nofollow\">DBML<\/a>, \u043a\u0430\u043a\u0438\u0435\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0431\u043e\u043b\u0435\u0435 \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044b \u0442\u0438\u043f\u0430 <a href=\"https:\/\/en.wikipedia.org\/wiki\/ISO\/IEC_11179\" rel=\"noopener noreferrer nofollow\">ISO\/IEC 11179<\/a>, <a href=\"https:\/\/www.iso20022.org\/\" rel=\"noopener noreferrer nofollow\">ISO 20022<\/a>, <a href=\"https:\/\/www.niem.gov\/\" rel=\"noopener noreferrer nofollow\">NIEM<\/a>, <a href=\"https:\/\/unece.org\/trade\/uncefact\/ccts\" rel=\"noopener noreferrer nofollow\">UN\/CEFACT CCTS<\/a>. \u041d\u0435\u00a0\u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u044d\u0442\u0443 \u043a\u0440\u043e\u043b\u0438\u0447\u044c\u044e \u043d\u043e\u0440\u0443, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0438\u0447\u0451\u043c \u0434\u0430\u0436\u0435 \u0431\u0435\u0437\u00a0\u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0432\u0438\u0434\u043e\u0432 \u0441\u0432\u044f\u0437\u0435\u0439.<\/p>\n<p>\u0427\u0442\u043e\u00a0\u0432\u043e\u043e\u0431\u0449\u0435 \u0442\u0430\u043a\u043e\u0435 \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u043e\u0432? \u0412\u043c\u0435\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u0433\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043f\u0438\u0448\u0443 \u0438\u0437\u00a0\u0447\u0435\u0433\u043e \u0442\u0430\u043a\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u0438\u0442. \u041e\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 <strong>\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/strong> \u0432\u00a0\u0432\u0430\u0448\u0435\u0439 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438. \u0423\u00a0\u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c <strong>\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b<\/strong>, \u0434\u043b\u044f\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (<strong>\u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>). \u041c\u0435\u0436\u0434\u0443 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c <strong>\u0441\u0432\u044f\u0437\u0438<\/strong>, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u043e\u0434\u043d\u043e\u2011 \u0438\u043b\u0438\u00a0\u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438, \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (<strong>\u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u044f<\/strong>, <strong>\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u044f<\/strong>, <strong>\u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f<\/strong>). \u0414\u043b\u044f\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0438 \u0441\u0432\u044f\u0437\u0435\u0439 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f <strong>\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/strong> \u0438 <strong>\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/strong>. \u041a\u043b\u0430\u0441\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e, \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u044b <strong>\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435\u043c \u043e\u0431\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/strong>. \u0415\u0441\u043b\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u00a0\u044d\u0442\u0438\u043c \u043c\u043e\u0434\u0435\u043b\u044f\u043c \u043a\u043e\u0434, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c <strong>\u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/strong>, <strong>\u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b<\/strong> \u0438 <strong>\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b<\/strong>.<\/p>\n<p>\u0412\u043e\u0442, \u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/architeezy.com\/metamodel\/class-model\/dev\/sample\" rel=\"noopener noreferrer nofollow\">\u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/a>:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0427\u0443\u0442\u044c \u0432\u044b\u0448\u0435 \u043c\u044b \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f\u00a0\u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043a\u0430\u043a\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0442\u0430\u043a\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c (\u043a\u043b\u0430\u0441\u0441\u044b, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u0441\u0432\u044f\u0437\u0438, \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445),<\/p>\n<\/li>\n<li>\n<p>\u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0430\u043a\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 \u0441\u0432\u044f\u0437\u0435\u0439 \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 (\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441\u00a0\u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0438 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0442, \u0438 \u0441\u00a0\u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, &#8230;),<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0443\u00a0\u044d\u0442\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0438 \u0441\u0432\u044f\u0437\u0435\u0439 \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c (\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c, &#8230;).<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f\u00a0\u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0438\u043b\u0438\u00a0\u0434\u043b\u044f\u00a0\u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043d\u0430\u00a0\u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041d\u043e\u00a0\u0434\u043b\u044f\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u00a0\u044f\u0437\u044b\u043a\u0435 <a href=\"https:\/\/www.omg.org\/spec\/MOF\" rel=\"noopener noreferrer nofollow\">OMG Meta Object Facility (MOF)<\/a>. \u042d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u044f\u0437\u044b\u043a \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u043f\u0438\u0441\u0430\u043d\u044b <a href=\"https:\/\/www.omg.org\/spec\/BPMN\/2.0\/\" rel=\"noopener noreferrer nofollow\">BPMN<\/a>, <a href=\"https:\/\/www.omg.org\/spec\/UML\/\" rel=\"noopener noreferrer nofollow\">UML<\/a>, <a href=\"https:\/\/sysml.org\/\" rel=\"noopener noreferrer nofollow\">SysML<\/a>, &#8230;<\/p>\n<p>\u041d\u0430\u0448 <a href=\"https:\/\/architeezy.com\/metamodel\/class-model\/dev\/class-model\" rel=\"noopener noreferrer nofollow\">\u044f\u0437\u044b\u043a \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/a> \u0431\u043e\u043b\u0435\u0435 \u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0435\u00a0\u0437\u043d\u0430\u044e \u043a\u0430\u043a\u00a0\u0432\u044b, \u043d\u043e\u00a0\u043b\u0438\u0447\u043d\u043e \u044f \u0431\u0430\u043b\u0434\u0435\u044e \u0441\u00a0\u044d\u0442\u043e\u0439 <s>\u043f\u0440\u0438\u043a\u043e\u0440\u043c\u043a\u0438<\/s> \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u2011\u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0438\u043f\u044b. \u0418\u0437\u00a0\u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0442\u043e\u00a0\u0443\u0433\u043e\u0434\u043d\u043e: Java\u2011\u043a\u043e\u0434, SQL\u2011\u043a\u043e\u0434 \u0434\u043b\u044f\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u0421\u0423\u0411\u0414, XML\u2011\u0441\u0445\u0435\u043c\u044b, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, &#8230;<\/p>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u0435:<\/p>\n<ul>\n<li>\n<p>\u043c\u044b \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c \u0447\u0442\u043e\u00a0\u0432\u043e\u043e\u0431\u0449\u0435 \u0437\u0430\u00a0\u044f\u0437\u044b\u043a \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438\u00a0DSL \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0451\u043c, \u0432\u00a0\u043a\u0430\u043a\u0438\u0445 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c,<\/p>\n<\/li>\n<li>\n<p>\u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u00a0\u044d\u0442\u0438\u043c\u0438 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438,<\/p>\n<\/li>\n<li>\n<p>\u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c, \u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u00a0\u043b\u044e\u0431\u044b\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442 OMG MOF.<\/p>\n<\/li>\n<\/ul>\n<h2>\u0413\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430<\/h2>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u044b \u0443\u0436\u0435 \u043f\u0438\u0448\u0438\u0442\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043a\u00a0\u0441\u0442\u0430\u0442\u044c\u0435: \u00ab\u041c\u043e\u0434\u0435\u043b\u0438, \u043c\u043e\u0434\u0435\u043b\u0438, \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u0438, \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u043b\u044f\u00a0\u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u0435\u0439, &#8230; \u0427\u0435\u043b, \u0433\u0434\u0435 \u043e\u0431\u0435\u0449\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434, \u0433\u0434\u0435 DSL? \u0421\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u00a0\u044d\u0442\u0438 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438? \u0423\u00a0\u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0434\u043b\u044f\u00a0\u0445\u0430\u0431\u0440\u0430, \u043f\u043e\u0447\u0435\u043c\u0443\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u0440\u043e\u00a0\u0437\u0430\u0440\u043f\u043b\u0430\u0442\u044b, \u0432\u044b\u0433\u043e\u0440\u0430\u043d\u0438\u0435 \u0438\u043b\u0438\u00a0\u0445\u043e\u0442\u044f\u00a0\u0431\u044b \u0418\u0418?!\u00bb \u041f\u043e\u043d\u0438\u043c\u0430\u044e \u0432\u0430\u0448\u0435 \u043d\u0435\u0433\u043e\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0438 \u043e\u0434\u043d\u0438\u043c\u0438 \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u044b\u0442 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0448\u044c. \u041e\u043d\u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0445 \u0441\u043c\u044b\u0441\u043b\u043e\u0432\u0443\u044e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e. \u041c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044c \u043d\u0435\u00a0\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439 (\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430, \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u0442\u0435\u043a\u0441\u0442, &#8230;).<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0443\u00a0\u043d\u0430\u0448\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u043a\u00a0\u0432\u0441\u0435 \u044d\u0442\u0438 \u043a\u043b\u0430\u0441\u0441\u044b, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b, \u0441\u0432\u044f\u0437\u0438, \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u00a0\u0442.\u00a0\u0434. \u043c\u043e\u0433\u0443\u0442\u00a0\u0431\u044b\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432\u00a0\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043e\u043f\u0438\u0448\u0435\u043c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443 \u043d\u0430\u0448\u0435\u0433\u043e DSL. \u0415\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Extended_Backus%E2%80%93Naur_form\" rel=\"noopener noreferrer nofollow\">EBNF<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Parsing_expression_grammar\" rel=\"noopener noreferrer nofollow\">PEG<\/a> \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b <a href=\"https:\/\/www.antlr.org\/\" rel=\"noopener noreferrer nofollow\">ANTLR<\/a>, <a href=\"https:\/\/habr.com\/ru\/companies\/cit\/articles\/271945\/\" rel=\"noopener noreferrer nofollow\">EMFText<\/a>, <a href=\"https:\/\/eclipse.dev\/Xtext\/\" rel=\"noopener noreferrer nofollow\">Xtext<\/a>, <a href=\"https:\/\/chevrotain.io\/\" rel=\"noopener noreferrer nofollow\">Chevrotain<\/a>, <a href=\"https:\/\/langium.org\/\" rel=\"noopener noreferrer nofollow\">Langium<\/a>, \u0432 <a href=\"https:\/\/isabelle.in.tum.de\/\" rel=\"noopener noreferrer nofollow\">Isabelle<\/a> \u043e\u0447\u0435\u043d\u044c \u043a\u043b\u0451\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430.<\/p>\n<p>\u041c\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430\u00a0Langium, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0430\u043c\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u044f\u0437\u044b\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u00a0\u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0434\u043b\u044f\u00a0\u043d\u0438\u0445 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u043d\u043e\u0442\u0430\u0446\u0438\u044e, \u043c\u044b \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 ANTLR \u0438\u043b\u0438\u00a0Xtext \u043e\u0442\u043f\u0430\u0434\u0430\u044e\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u043c\u044b \u043d\u0435\u00a0\u043c\u043e\u0436\u0435\u043c \u0434\u043b\u044f\u00a0\u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 Java\u2011\u043a\u043e\u0434, \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u00a0\u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u0425\u043e\u0442\u044f \u0438 Langium \u0432\u00a0\u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0437\u0430\u0442\u043e\u0447\u0435\u043d \u043d\u0430\u00a0\u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e, \u043d\u043e\u00a0\u043e\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0445\u043e\u0442\u044f\u00a0\u0431\u044b TypeScript\u2011\u043a\u043e\u0434, \u043f\u043b\u044e\u0441 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0431\u0435\u0437\u00a0\u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u0447\u0435\u043c \u043c\u044b \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0432\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435.<\/p>\n<p>\u041d\u043e\u00a0\u0442\u0430\u043a \u0441\u0445\u043e\u0434\u0443 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0443 \u0434\u043b\u044f\u00a0\u044f\u0437\u044b\u043a\u0430 \u0441\u043b\u043e\u0436\u043d\u043e, \u0434\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u043d\u0430\u00a0\u043d\u0430\u0448\u0435\u043c \u0431\u0443\u0434\u0443\u0449\u0435\u043c DSL (<a href=\"https:\/\/aresekb.github.io\/langium-monaco-demo\/\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440<\/a>):<\/p>\n<pre><code>@name('ru-RU', '\u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430') classModel OnlineStore  @name('ru-RU', '\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c') @description('ru-RU', '\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043a\u0430\u0437\u044b') class User {      @name('ru-RU', '\u0438\u043c\u044f')     @name('fr-FR', 'pr\u00e9nom')     attribute firstName String[0..1]      attribute lastName String[0..1]      attribute birthDate Date[0..1]      attribute email String  }<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>@name('ru-RU', '\u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430') classModel OnlineStore  @name('ru-RU', '\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c') @description('ru-RU', '\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0437\u0430\u043a\u0430\u0437\u044b') class User {      @name('ru-RU', '\u0438\u043c\u044f')     @name('fr-FR', 'pr\u00e9nom')     attribute firstName String[0..1]      @name('ru-RU', '\u0444\u0430\u043c\u0438\u043b\u0438\u044f')     attribute lastName String[0..1]      @name('ru-RU', '\u0434\u0430\u0442\u0430 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f')     attribute birthDate Date[0..1]      @name('ru-RU', '\u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0430')     attribute email String  }  @name('ru-RU', '\u0437\u0430\u043a\u0430\u0437') class Order {      @name('ru-RU', '\u0430\u0434\u0440\u0435\u0441\u0441 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438')     attribute deliveryAddress String      @name('ru-RU', '\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c')     reference user User      @name('ru-RU', '\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0437\u0430\u043a\u0430\u0437\u0430')     composition items OrderItem[0..*] opposite order  }  @name('ru-RU', '\u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430\u043a\u0430\u0437\u0430') class OrderItem {      @name('ru-RU', '\u0437\u0430\u043a\u0430\u0437')     reference order Order opposite items      @name('ru-RU', '\u043f\u0440\u043e\u0434\u0443\u043a\u0442')     reference product Product      @name('ru-RU', '\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e')     attribute quantity UnsignedInt      @name('ru-RU', '\u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c')     attribute price Money  }  @name('ru-RU', '\u043f\u0440\u043e\u0434\u0443\u043a\u0442') abstract class Product {      @name('ru-RU', '\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435')     attribute name String  }  @name('ru-RU', '\u043a\u043d\u0438\u0433\u0430') class Book extends Product {      @name('ru-RU', '\u0430\u0432\u0442\u043e\u0440')     attribute author String  }  @name('ru-RU', '\u0440\u0443\u0447\u043a\u0430') class Pen extends Product {      @name('ru-RU', '\u0446\u0432\u0435\u0442')     attribute color Color  }  @name('ru-RU', '\u0441\u0442\u0440\u043e\u043a\u0430') string String { }  @name('ru-RU', '\u0446\u0435\u043b\u043e\u0435 \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e') numeric UnsignedInt {     fractionDigits 0     minInclusive 0 }  @name('ru-RU', '\u0434\u0430\u0442\u0430') time Date {     instantUnits year month day }  @name('ru-RU', '\u0434\u0435\u043d\u0435\u0436\u043d\u044b\u0439 \u0442\u0438\u043f') numeric Money {     totalDigits 19     fractionDigits 4     minInclusive 0 }  @name('ru-RU', '\u0446\u0432\u0435\u0442') enumerated Color {      @name('ru-RU', '\u043a\u0440\u0430\u0441\u043d\u044b\u0439')     Red      @name('ru-RU', '\u0437\u0435\u043b\u0451\u043d\u044b\u0439')     Green      @name('ru-RU', '\u0441\u0438\u043d\u0438\u0439')     Blue      @name('ru-RU', '\u0447\u0451\u0440\u043d\u044b\u0439')     Black  }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0422.\u00a0\u0435. \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c DSL, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0443\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0441\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 (OnlineStore\u00a0\u2014 \u043e\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u00a0\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430 \u0438\u043b\u0438\u00a0\u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445), \u0435\u0441\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 (\u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438\u043b\u0438\u00a0\u0432\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435). \u041c\u043e\u0434\u0435\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u00a0\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0443\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0442\u0430\u043a\u00a0\u0436\u0435 \u0435\u0441\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435. \u041a\u043b\u0430\u0441\u0441\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0443\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0435\u0441\u0442\u044c \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, firstName\u00a0\u2014 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u0430\u00a0email\u00a0\u2014 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439).<\/p>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439, \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f\u00a0\u0431\u044b\u043b\u043e \u0432\u0437\u044f\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 <a href=\"https:\/\/dbml.dbdiagram.io\/\" rel=\"noopener noreferrer nofollow\">DBML<\/a>? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0DBML\u00a0\u2014 \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u044f\u0437\u044b\u043a, \u043e\u043d \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043d\u0435\u00a0\u0432\u00a0\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432, \u0441\u0432\u044f\u0437\u0435\u0439 \u0438\u00a0\u0442.\u00a0\u0434., \u0430\u00a0\u0432\u00a0\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0445 \u0442\u0430\u0431\u043b\u0438\u0446, \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432, \u043a\u043b\u044e\u0447\u0435\u0439 \u0438\u00a0\u0442.\u00a0\u0434. \u0410\u00a0\u043c\u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e, \u0447\u0435\u0433\u043e \u0432\u00a0DBML \u043d\u0435\u0442, \u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u00a0\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u00a0\u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u043a\u043b\u044e\u0447\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u0434\u0435\u0442\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430 \u0441\u00a0\u0434\u0432\u0443\u043c\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438. \u041a\u0430\u043a\u00a0\u044f \u0443\u0436\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b \u0432\u044b\u0448\u0435, \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u0434\u043b\u044f\u00a0\u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u043d\u0438\u0445 \u043d\u0435\u00a0\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0438\u043b\u0438\u00a0\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u043c, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f\u00a0\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041c\u044b \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a\u00a0\u044d\u0442\u043e\u043c\u0443 \u0432\u00a0\u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445, \u043d\u043e\u00a0\u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u043c\u0435\u0448\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0430 \u044f\u0437\u044b\u043a\u0430 (\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u0438 DBML) \u0438 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u00a0\u0434\u0440\u0443\u0433\u0438\u0435.<\/p>\n<p>\u0422\u0430\u00a0\u0436\u0435 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0441 <a href=\"https:\/\/plantuml.com\/\" rel=\"noopener noreferrer nofollow\">PlantUML<\/a>, \u0434\u0430, \u0432\u00a0\u043d\u0451\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043d\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043d\u0435 \u043d\u0435\u00a0\u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0412\u044b \u043d\u0435\u00a0\u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u044f\u0437\u044b\u043a\u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u043b\u0438\u00a0DSL \u043a\u0430\u043a\u00a0\u0434\u0430\u043d\u043d\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u043d\u0435\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432\u0430\u0448\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c, \u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u043c\u0435\u0448\u0430\u0435\u0442 \u0432\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u044f\u0437\u044b\u043a. \u0410\u00a0\u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u00a0\u043e\u0434\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043d\u0430\u00a0\u0434\u0440\u0443\u0433\u043e\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0443\u0434\u0435\u043b\u044f\u044e \u043c\u0435\u0442\u0430\u043c\u043e\u0434\u0435\u043b\u044f\u043c. \u0415\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043c\u043e\u0434\u0435\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043d\u043e\u2011\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0438\u043b\u0438\u00a0\u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u0432\u0430\u043c \u0431\u043e\u043b\u044c \u0438 \u0441\u0442\u0440\u0430\u0434\u0430\u043d\u0438\u0435, \u0442\u043e \u0432\u044b \u0432\u043e\u043b\u044c\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u044f\u0437\u044b\u043a\u0438. \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430\u00a0\u043d\u0430\u0448 \u043c\u043e\u0442\u0438\u0432\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u0442\u0435\u043b\u0435\u0433\u0440\u0430\u043c \u043a\u0430\u043d\u0430\u043b \u0438 \u043a\u043e\u0448\u0435\u043b\u0435\u043a \u0434\u043b\u044f\u00a0\u0434\u043e\u043d\u0430\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0432\u00a0\u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0447\u0442\u043e\u00a0\u0437\u0430\u00a0DSL \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c, <\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-467467","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467467","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=467467"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/467467\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=467467"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=467467"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=467467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}