{"id":259808,"date":"2015-06-22T10:37:02","date_gmt":"2015-06-22T06:37:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=259808"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=259808","title":{"rendered":"\u041f\u0438\u0448\u0435\u043c \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0434\u043b\u044f FUSE \u043d\u0430 Java Native Runtime"},"content":{"rendered":"<p>     \t\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432 \u044e\u0437\u0435\u0440\u0441\u043f\u0435\u0439\u0441\u0435 \u043d\u0430 Java, \u0431\u0435\u0437 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u044f\u0434\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0441\u0432\u044f\u0437\u0430\u0442\u044c Java \u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0435\u0437 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043d\u0430 C, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/3b2\/a74\/094\/3b2a740945d74108a2c70a82d7c97a28.png\"\/><\/p>\n<p>  \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e? \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442!<br \/>  <a name=\"habracut\"><\/a><br \/>  \u041f\u0440\u0435\u0436\u0434\u0435 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u0435\u0440\u0442\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043a\u043e\u0435 FUSE. <br \/>  FUSE (Filesystem in Userspace) \u2014 \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435, \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0431\u0435\u0437 \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u044f\u0434\u0440\u0430. \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0437\u0430 \u0441\u0447\u0451\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u0434\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u043c\u043e\u0434\u0443\u043b\u044c FUSE \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0441\u0442 \u0434\u043b\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u044f\u0434\u0440\u0430. FUSE \u0431\u044b\u043b\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u043a\u043e\u0434\u0430 Linux \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 2.6.14.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/43c\/83d\/6ba\/43c83d6ba20e4a10adc239e565d6d77c.png\"\/><\/p>\n<p>  \u0422.\u0435. \u0432\u044b \u043f\u043e \u0441\u0443\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u043e\u0436\u0435\u0442\u0435 \u043b\u0435\u0433\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 (<a href=\"http:\/\/fuse.sourceforge.net\/helloworld.html\">\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0439 \u0424\u0421<\/a>). \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u044d\u0442\u043e\u043c\u0443 \u043c\u0438\u043b\u043b\u0438\u043e\u043d, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0424\u0421, \u0431\u044d\u043a\u044d\u043d\u0434\u043e\u043c \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 Dropbox \u0438\u043b\u0438 GitHub. <br \/>  \u0418\u043b\u0438 \u0436\u0435, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0430\u043a\u043e\u0439 \u043a\u0435\u0439\u0441, \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0433\u0434\u0435 \u0432\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \u0444\u0430\u0439\u043b\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0411\u0414, \u043d\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0443, \u0432\u0434\u0440\u0443\u0433, \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0433\u0434\u0435 \u043b\u0435\u0436\u0430\u0442 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0432 \u0411\u0414 \u0438 \u0424\u0421 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0430\u043c\u043e\u0435 \u043b\u0443\u0447\u0448\u0435\u0435 \u0438 \u0442\u0443\u0442 \u043a\u0430\u043a \u0440\u0430\u0437 \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u0412\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0448\u0435\u0442\u0435 \u0441\u0432\u043e\u044e FUSE \u043e\u0431\u0435\u0440\u0442\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043d\u0438\u043c\u0438 \u0432 \u0411\u0414.<\/p>\n<h2>Java \u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434<\/h2>\n<p>  \u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f FUSE \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u201c\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b &lt;fuse.h&gt;\u201d, \u0430 \u0432\u0430\u0448\u0435 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 Java. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a\u0438\u043c-\u043b\u0438\u0431\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c. <\/p>\n<h4>JNI<\/h4>\n<p>  \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f JNI, \u043d\u043e \u043e\u043d \u0432\u043d\u043e\u0441\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 FUSE \u043d\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u043e\u043b\u0431\u044d\u043a\u0438 \u0438\u0437 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 Java \u043a\u043b\u0430\u0441\u0441\u044b. \u0414\u0430 \u0438 \u201cwrite once\u201d \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0441\u0442\u0440\u0430\u0434\u0430\u0435\u0442, \u0445\u043e\u0442\u044f \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 FUSE \u043d\u0430\u043c \u044d\u0442\u043e \u043c\u0435\u043d\u0435\u0435 \u0432\u0430\u0436\u043d\u043e. <br \/>  \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u0434\u043b\u044f FUSE \u043d\u0430 JNI, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043e\u0434\u043d\u0430\u043a\u043e, \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043a\u0440\u0438\u0432\u043e\u0439 API.<\/p>\n<h4>JNA<\/h4>\n<p>  \u0414\u0440\u0443\u0433\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, <a href=\"https:\/\/github.com\/twall\/jna\">\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 JNA<\/a>. JNA (Java Native Access) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f JNI, \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0448\u0438\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c java-\u043a\u043e\u0434\u0430. \u0412\u0441\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u043c\u0443 \u043a\u043e\u0434\u0443, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0435\u0433\u043e \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0447\u0435\u0440\u0435\u0437 \u201cNative.loadLibrary\u201d \u0438 \u0432\u0441\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043b\u044e\u0441 JNA \u2014 \u044d\u0442\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0439\u0448\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f. \u041f\u0440\u043e\u0435\u043a\u0442 \u0436\u0438\u0432 \u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0434\u043b\u044f FUSE \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u043d\u0430 JNA. <br \/>  \u041e\u0434\u043d\u0430\u043a\u043e, \u0443 JNA \u0435\u0441\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. JNA \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u0440\u0435\u0444\u043b\u0435\u043a\u0448\u0435\u043d\u0435, \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0438\u0437 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0441 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0435\u0439 \u0432\u0441\u0435\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0432 java \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u0440\u043e\u0433. \u042d\u0442\u043e \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0434\u043a\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u043b\u0443\u0447\u0430\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c fuse-jna \u044d\u0442\u043e \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0447\u0438\u0442\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043a\u0443\u0441\u043a\u0430\u043c\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u043c\u0443 \u043a\u043e\u0434\u0443, \u0438\u043b\u0438 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u2013 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b\u043e\u0432.<br \/>  \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0441\u043e\u0432\u043c\u0435\u0449\u0430\u044e\u0449\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c JNI \u0438 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e JNA.<\/p>\n<h4>JNR<\/h4>\n<p>  \u0412\u043e\u0442 \u0442\u0443\u0442 \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 JNR (Java Native Runtime). JNR, \u043a\u0430\u043a \u0438 JNA \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 libffi, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0435\u0444\u043b\u0435\u043a\u0448\u0435\u043d\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0430\u0439\u0442\u043a\u043e\u0434\u0430, \u0437\u0430 \u0441\u0447\u0435\u0442 \u0447\u0435\u0433\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. <br \/>  \u041a\u0430\u043a\u043e\u0439-\u043b\u0438\u0431\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u0440\u043e JNR \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u0430\u043b\u043e, \u0441\u0430\u043c\u043e\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u044d\u0442\u043e <a href=\"http:\/\/medianetwork.oracle.com\/video\/player\/2630340184001\">\u0432\u044b\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 Charles Nutter \u043d\u0430 JVMLS 2013<\/a> (<a href=\"http:\/\/www.oracle.com\/technetwork\/java\/jvmls2013nutter-2013526.pdf\">\u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f<\/a>). \u041e\u0434\u043d\u0430\u043a\u043e JNR \u0443\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u0440\u0443\u043f\u043d\u0443\u044e \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f JRuby. \u041c\u043d\u043e\u0433\u0438\u0435 \u0435\u0435 \u0447\u0430\u0441\u0442\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, unix-\u0441\u043e\u043a\u0435\u0442\u044b, posix-api \u0442\u0430\u043a\u0436\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/904\/a13\/49c\/904a1349c43649679cff1308067fe6b3.png\"\/><\/p>\n<p>  \u0418\u043c\u0435\u043d\u043d\u043e JNR \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043e\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <a href=\"http:\/\/openjdk.java.net\/jeps\/191\">JEP 191<\/a> \u2014 Foreign Function Interface, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u0440\u0433\u0435\u0442\u0438\u0442\u0441\u044f \u043d\u0430 java 10.<br \/>  \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 JNA \u0443 JNR \u043d\u0435\u0442 \u043a\u0430\u043a\u043e\u0439 \u043b\u0438\u0431\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0432\u0441\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u0441\u043a\u0430\u0442\u044c \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435, \u044d\u0442\u043e \u0438 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u043b\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u043e\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0433\u0430\u0439\u0434\u0430. <\/p>\n<h2>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0434\u043b\u044f Java Native Runtime<\/h2>\n<p>  <\/p>\n<h3>\u0411\u0438\u043d\u0434\u0438\u043d\u0433 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/h3>\n<p>  \u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0431\u0438\u043d\u0434\u0438\u043d\u0433 \u043a libc \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"java\">import jnr.ffi.*; import jnr.ffi.types.pid_t;  \/**  * Gets the process ID of the current process, and that of its parent.  *\/ public class Getpid {     public interface LibC  {         public @pid_t long getpid();         public @pid_t long getppid();     }      public static void main(String[] args) {         LibC libc = LibraryLoader.create(LibC.class).load(&quot;c&quot;);          System.out.println(&quot;pid=&quot; + libc.getpid() + &quot; parent pid=&quot; + libc.getppid());     } } <\/code><\/pre>\n<p>  \u0427\u0435\u0440\u0435\u0437 LibraryLoader \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443.<\/p>\n<p>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 FUSE \u043d\u0443\u0436\u0435\u043d \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u043c\u0435\u0442\u043e\u0434\u043e\u043c fuse_main_real, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 FuseOperations, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u043a\u043e\u043b\u0431\u044d\u043a\u0438.  <\/p>\n<pre><code class=\"java\">public interface LibFuse {       int fuse_main_real(int argc, String argv[], FuseOperations op, int op_size, Pointer user_data); } <\/code><\/pre>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f struct<\/h3>\n<p>  \u0427\u0430\u0441\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c\u0438 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439 fuse_bufvec:  <\/p>\n<pre><code>struct fuse_bufvec { \tsize_t count; \tsize_t idx; \tsize_t off; \tstruct fuse_buf buf[1]; }; <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 JNR \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 jnr.ffi.Struct.  <\/p>\n<pre><code class=\"java\">import jnr.ffi.*;  public class FuseBufvec extends Struct {     public FuseBufvec(jnr.ffi.Runtime runtime) {         super(runtime);     }     public final size_t count = new size_t();     public final size_t idx = new size_t();     public final size_t off = new size_t();     public final FuseBuf buf = inner(new FuseBuf(getRuntime())); } <\/code><\/pre>\n<p>  \u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f pointer, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0411\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c API \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0432, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u043d\u0430 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b Struct.<br \/>  size_t \u044d\u0442\u043e inner \u043a\u043b\u0430\u0441\u0441 Struct \u0438 \u043f\u0440\u0438 \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0441\u044f offset \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044d\u0442\u043e \u043f\u043e\u043b\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0437\u0430 \u0441\u0447\u0435\u0442 \u0447\u0435\u0433\u043e \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435 \u0437\u043d\u0430\u0435\u0442 \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u043e\u0444\u0444\u0441\u0435\u0442\u0443 \u043e\u043d\u043e \u043b\u0435\u0436\u0438\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0422\u0430\u043a\u0438\u0445 inner \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0443\u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043c\u043d\u043e\u0433\u043e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Signed64, Unsigned32, time_t \u0438 \u0442.\u0434.), \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438.<\/p>\n<h3>\u041a\u043e\u043b\u0431\u044d\u043a\u0438<\/h3>\n<p>  <\/p>\n<pre><code>struct fuse_operations { \tint (*getattr) (const char *, struct stat *); } <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043b\u0431\u044d\u043a\u0430\u043c\u0438 \u0432 JNR \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f<\/p>\n<pre>@Delegate<\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">public interface GetAttrCallback {     @Delegate     int getattr(String path, Pointer stbuf); }  public class FuseOperations extends Struct {     public FuseOperations(Runtime runtime) {         super(runtime);     }      public final Func&lt;GetAttrCallback&gt; getattr = func(GetAttrCallback.class); } <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u043f\u043e\u043b\u0435 getattr \u043d\u0443\u0436\u043d\u0443\u044e \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043a\u043e\u043b\u0431\u044d\u043a\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440.<\/p>\n<pre><code class=\"java\">fuseOperations.getattr.set((path, stbuf) -&gt; 0); <\/code><\/pre>\n<h3>Enum<\/h3>\n<p>  \u0418\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439 \u0442\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u043d\u0430\u0434 enum, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0432\u043e\u0439 enum \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043e\u0442 jnr.ffi.util.EnumMapper.IntegerEnum \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 intValue  <\/p>\n<pre><code>enum fuse_buf_flags { \tFUSE_BUF_IS_FD\t= (1 &lt;&lt; 1), \tFUSE_BUF_FD_SEEK\t= (1 &lt;&lt; 2), \tFUSE_BUF_FD_RETRY\t= (1 &lt;&lt; 3), }; <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"java\">public enum FuseBufFlags implements EnumMapper.IntegerEnum {     FUSE_BUF_IS_FD(1 &lt;&lt; 1),     FUSE_BUF_FD_SEEK(1 &lt;&lt; 2),     FUSE_BUF_FD_RETRY(1 &lt;&lt; 3);      private final int value;      FuseBufFlags(int value) {         this.value = value;     }      @Override     public int intValue() {         return value;     } } <\/code><\/pre>\n<h3>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e<\/h3>\n<p>  <\/p>\n<ul>\n<li>\u0414\u043b\u044f \u043f\u0440\u044f\u043c\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u0435\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 \u0441\u044b\u0440\u044b\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c jnr.ffi.Pointer<\/li>\n<li>\u0410\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e jnr.ffi.Memory<\/li>\n<li>\u041e\u0442\u043f\u0440\u0430\u0432\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u043e\u0439 \u043f\u043e API JNR \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c jnr.ffi.Runtime<\/li>\n<\/ul>\n<p>  \u042d\u0442\u0438\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 \u0445\u0432\u0430\u0442\u0438\u0442, \u0447\u0442\u043e\u0431\u044b \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u0443\u044e \u043e\u0431\u0435\u0440\u0442\u043a\u0443 \u043d\u0430\u0434 \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439. <\/p>\n<h1>jnr-fuse<\/h1>\n<p>  \u0427\u0442\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u044f \u0438 \u0441\u0434\u0435\u043b\u0430\u043b \u0441 FUSE \u0432 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 <a href=\"https:\/\/github.com\/SerCeMan\/jnr-fuse\">jnr-fuse<\/a>. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 fuse-jna, \u043e\u0434\u043d\u0430\u043a\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u043e\u0442\u0442\u043b\u043d\u0435\u043a\u043e\u043c \u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0424\u0421. \u041f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 API \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 fuse-jna, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 (&lt;fuse.h&gt;).<\/p>\n<p>  \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0432\u043e\u0435\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 \u044e\u0437\u0435\u0440\u0441\u043f\u0435\u0439\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 ru.serce.jnrfuse.FuseStubFS \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b. Fuse_operations \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <a href=\"http:\/\/fuse.sourceforge.net\/doxygen\/structfuse__operations.html\">\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432<\/a>, \u043e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0424\u0421 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445.<br \/>  \u042d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0432\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <a href=\"https:\/\/github.com\/SerCeMan\/jnr-fuse\/tree\/master\/src\/main\/java\/ru\/serce\/jnrfuse\/examples\">\u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0424\u0421<\/a>.<\/p>\n<p>  \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f Linux (x86 \u0438 x64).<\/p>\n<p>  \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043b\u0435\u0436\u0438\u0442 \u0432 jcenter, \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0437\u0435\u0440\u043a\u0430\u043b\u043e \u0432 maven central.<\/p>\n<h5>Gradle<\/h5>\n<p>  <\/p>\n<pre><code>repositories {     jcenter() }  dependencies {     compile 'com.github.serceman:jnr-fuse:0.1' } <\/code><\/pre>\n<p>  <\/p>\n<h5>Maven<\/h5>\n<p>  <\/p>\n<pre><code class=\"xml\">    &lt;repositories&gt;         &lt;repository&gt;             &lt;id&gt;central&lt;\/id&gt;             &lt;name&gt;bintray&lt;\/name&gt;             &lt;url&gt;http:\/\/jcenter.bintray.com&lt;\/url&gt;         &lt;\/repository&gt;     &lt;\/repositories&gt;      &lt;dependencies&gt;         &lt;dependency&gt;             &lt;groupId&gt;com.github.serceman&lt;\/groupId&gt;             &lt;artifactId&gt;jnr-fuse&lt;\/artifactId&gt;             &lt;version&gt;0.1&lt;\/version&gt;         &lt;\/dependency&gt;     &lt;\/dependencies&gt; <\/code><\/pre>\n<h2>\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c fuse-jna \u0438 jnr-fuse<\/h2>\n<p>  \u0412 \u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, FS \u0431\u044b\u043b\u0430 read-only \u0438 \u043c\u0435\u043d\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b \u043a\u043e\u043d\u043a\u0442\u0440\u0435\u0442\u043d\u043e throughput. \u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0432\u0430\u0448\u0435\u0439 \u0424\u0421, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0432\u044b \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0442\u0435 fuse-jna, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043b\u0435\u0433\u043a\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c jnr-fuse, \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0443. (\u042d\u0442\u043e\u0442 \u0442\u0435\u0441\u0442 \u0432\u0430\u043c \u0432 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f, \u043c\u044b \u0436\u0435 \u0432\u0441\u0435 \u043b\u044e\u0431\u0438\u043c \u043f\u043e\u0433\u043e\u043d\u044f\u0442\u044c\u0441\u044f \u0437\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e, \u043f\u0440\u0430\u0432\u0434\u0430?)<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0440\u0430\u0437\u043d\u0438\u0446\u044b \u044f \u043f\u0435\u0440\u0435\u043d\u0435\u0441 \u0438\u043c\u043f\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e MemoryFS \u0438\u0437 fuse-jna \u0432 fuse-jnr \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b fio \u0442\u0435\u0441\u0442 \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435. \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a <a href=\"http:\/\/freecode.com\/projects\/fio\">fio<\/a>, \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e \u0431\u044b\u043b\u0430 \u0445\u043e\u0440\u043e\u0448\u0430\u044f <a href=\"http:\/\/habrahabr.ru\/post\/154235\/\">\u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0445\u0430\u0431\u0440\u0435<\/a>.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">[readtest]<br \/>  blocksize=4k<br \/>  directory=\/tmp\/mnt\/<br \/>  rw=randread<br \/>  direct=1<br \/>  buffered=0<br \/>  ioengine=libaio<br \/>  time_based=60<br \/>  size=16M<br \/>  runtime=60  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 fuse-jna<\/b><\/p>\n<div class=\"spoiler_text\">serce@SerCe-FastLinux:~\/git\/jnr-fuse\/bench$ fio read.ini <br \/>  readtest: (g=0): rw=randread, bs=4K-4K\/4K-4K\/4K-4K, ioengine=libaio, iodepth=1<br \/>  fio-2.1.3<br \/>  Starting 1 process<br \/>  readtest: Laying out IO file(s) (1 file(s) \/ 16MB)<br \/>  Jobs: 1 (f=1): [r] [100.0% done] [24492KB\/0KB\/0KB \/s] [6123\/0\/0 iops] [eta 00m:00s]<br \/>  readtest: (groupid=0, jobs=1): err= 0: pid=10442: Sun Jun 21 14:49:13 2015<br \/>   read: io=1580.2MB, bw=26967KB\/s, iops=6741, runt= 60000msec<br \/>   slat (usec): min=46, max=29997, avg=146.55, stdev=327.68<br \/>   clat (usec): min=0, max=69, avg= 0.47, stdev= 0.66<br \/>   lat (usec): min=47, max=30002, avg=147.26, stdev=327.88<br \/>   clat percentiles (usec):<br \/>   | 1.00th=[ 0], 5.00th=[ 0], 10.00th=[ 0], 20.00th=[ 0],<br \/>   | 30.00th=[ 0], 40.00th=[ 0], 50.00th=[ 0], 60.00th=[ 1],<br \/>   | 70.00th=[ 1], 80.00th=[ 1], 90.00th=[ 1], 95.00th=[ 1],<br \/>   | 99.00th=[ 2], 99.50th=[ 2], 99.90th=[ 3], 99.95th=[ 12],<br \/>   | 99.99th=[ 14]<br \/>   bw (KB \/s): min=17680, max=32606, per=96.09%, avg=25913.26, stdev=3156.20<br \/>   lat (usec): 2=97.95%, 4=1.96%, 10=0.02%, 20=0.06%, 50=0.01%<br \/>   lat (usec): 100=0.01%<br \/>   cpu: usr=1.98%, sys=5.94%, ctx=405302, majf=0, minf=28<br \/>   IO depths: 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, &gt;=64=0.0%<br \/>   submit: 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, &gt;=64=0.0%<br \/>   complete: 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, &gt;=64=0.0%<br \/>   issued: total=r=404511\/w=0\/d=0, short=r=0\/w=0\/d=0<\/p>\n<p>  Run status group 0 (all jobs):<br \/>   READ: io=1580.2MB, aggrb=26967KB\/s, minb=26967KB\/s, maxb=26967KB\/s, mint=60000msec, maxt=60000msec  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 jnr-fuse<\/b><\/p>\n<div class=\"spoiler_text\">serce@SerCe-FastLinux:~\/git\/jnr-fuse\/bench$ fio read.ini <br \/>  readtest: (g=0): rw=randread, bs=4K-4K\/4K-4K\/4K-4K, ioengine=libaio, iodepth=1<br \/>  fio-2.1.3<br \/>  Starting 1 process<br \/>  readtest: Laying out IO file(s) (1 file(s) \/ 16MB)<br \/>  Jobs: 1 (f=1): [r] [100.0% done] [208.5MB\/0KB\/0KB \/s] [53.4K\/0\/0 iops] [eta 00m:00s]<br \/>  readtest: (groupid=0, jobs=1): err= 0: pid=10153: Sun Jun 21 14:45:17 2015<br \/>   read: io=13826MB, bw=235955KB\/s, iops=58988, runt= 60002msec<br \/>   slat (usec): min=6, max=23671, avg=15.80, stdev=19.97<br \/>   clat (usec): min=0, max=1028, avg= 0.37, stdev= 0.78<br \/>   lat (usec): min=7, max=23688, avg=16.29, stdev=20.03<br \/>   clat percentiles (usec):<br \/>   | 1.00th=[ 0], 5.00th=[ 0], 10.00th=[ 0], 20.00th=[ 0],<br \/>   | 30.00th=[ 0], 40.00th=[ 0], 50.00th=[ 0], 60.00th=[ 0],<br \/>   | 70.00th=[ 1], 80.00th=[ 1], 90.00th=[ 1], 95.00th=[ 1],<br \/>   | 99.00th=[ 1], 99.50th=[ 1], 99.90th=[ 2], 99.95th=[ 2],<br \/>   | 99.99th=[ 10]<br \/>   lat (usec): 2=99.88%, 4=0.10%, 10=0.01%, 20=0.01%, 50=0.01%<br \/>   lat (usec): 100=0.01%, 250=0.01%<br \/>   lat (msec): 2=0.01%<br \/>   cpu: usr=9.33%, sys=34.01%, ctx=3543137, majf=0, minf=28<br \/>   IO depths: 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, &gt;=64=0.0%<br \/>   submit: 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, &gt;=64=0.0%<br \/>   complete: 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, &gt;=64=0.0%<br \/>   issued: total=r=3539449\/w=0\/d=0, short=r=0\/w=0\/d=0<\/p>\n<p>  Run status group 0 (all jobs):<br \/>   READ: io=13826MB, aggrb=235955KB\/s, minb=235955KB\/s, maxb=235955KB\/s, mint=60002msec, maxt=60002msec  <\/div>\n<\/div>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/570\/301\/385\/570301385160406ea268c39c94a23ebf.png\"\/><br \/>  \u0422\u0435\u0441\u0442 \u043b\u0438\u0448\u044c \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u0432 fuse-jna \u0438 fuse-jnr, \u043e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0440\u0430\u0437\u043d\u0438\u0446\u0435 \u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b JNA \u0438 JNR. \u0416\u0435\u043b\u0430\u044e\u0449\u0438\u0435 \u0436\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"http:\/\/openjdk.java.net\/projects\/code-tools\/jmh\/\">JMH<\/a> \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u0432\u0441\u0435\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439, \u043c\u043d\u0435 \u0441\u0430\u043c\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u0431\u044b \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u044d\u0442\u0438 \u0442\u0435\u0441\u0442\u044b.<\/p>\n<p>  \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0438 \u0432 throughput, \u0438 \u0432 latency \u0432 JNR \u0438 JNA \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e, \u043a\u0430\u043a \u0438 \u0432 \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043e\u0442 Charles Nutter, \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 ~10 \u0440\u0430\u0437.<\/p>\n<h2>\u0421\u0441\u044b\u043b\u043a\u0438<\/h2>\n<p>  <\/p>\n<ul>\n<li><a href=\"http:\/\/fuse.sourceforge.net\/\">Fuse \u043d\u0430 sourceforge<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/jnr\">JNR \u043d\u0430 github<\/a><\/li>\n<li><a href=\"http:\/\/www.oracle.com\/technetwork\/java\/jvmls2013nutter-2013526.pdf\">\u041f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043e\u0442 Charles Nutter \u043f\u0440\u043e JNR<\/a><\/li>\n<li><a href=\"http:\/\/openjdk.java.net\/jeps\/191\">JEP 191<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/SerCeMan\/jnr-fuse\/blob\/master\/src\/main\/java\/ru\/serce\/jnrfuse\/examples\/HelloFuse.java\">hello-fuse \u043d\u0430 java<\/a> \/ <a href=\"http:\/\/fuse.sourceforge.net\/helloworld.html\">hello-fuse \u043d\u0430 \u0421<\/a><\/li>\n<\/ul>\n<p>  \u041f\u0440\u043e\u0435\u043a\u0442 jnr-fuse <a href=\"https:\/\/github.com\/SerCeMan\/jnr-fuse\">\u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d \u043d\u0430 GitHub<\/a>. \u0411\u0443\u0434\u0443 \u0440\u0430\u0437 \u0437\u0432\u0435\u0437\u0434\u043e\u0447\u043a\u0430\u043c, \u043f\u0443\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0430\u043c, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c \u043f\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <br \/>  \u0410 \u0442\u0430\u043a\u0436\u0435 \u0441 \u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0432\u0435\u0447\u0443 \u043d\u0430 \u0432\u0441\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043f\u0440\u043e JNR \u0438 jnr-fuse.     \t<\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/260801\/\"> http:\/\/habrahabr.ru\/post\/260801\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>     \t\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432 \u044e\u0437\u0435\u0440\u0441\u043f\u0435\u0439\u0441\u0435 \u043d\u0430 Java, \u0431\u0435\u0437 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u044f\u0434\u0435\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043a\u0430\u0436\u0443 \u043a\u0430\u043a \u0441\u0432\u044f\u0437\u0430\u0442\u044c Java \u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0435\u0437 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043d\u0430 C, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/3b2\/a74\/094\/3b2a740945d74108a2c70a82d7c97a28.png\"\/><\/p>\n<p>  \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e? \u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442!  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-259808","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/259808","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=259808"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/259808\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=259808"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=259808"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=259808"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}