{"id":45378,"date":"2023-10-28T09:20:43","date_gmt":"2023-12-12T05:01:34","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/"},"modified":"2024-05-04T06:24:08","modified_gmt":"2024-05-03T22:24:08","slug":"45378-2","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/","title":{"rendered":""},"content":{"rendered":"<p>Elixir \u304b\u3089 Rust \u306e\u95a2\u6570\u3092\u547c\u3076\u3053\u3068\u3067\u3001\u5186\u5468\u7387 $\\pi$ \u306e\u8fd1\u4f3c\u5024\u3092\u6c42\u3081\u308b\u8a08\u7b97\u3092\u9ad8\u901f\u5316\u3059\u308b\u3002Erlang VM \u306e NIF\uff08Native Implemented Functions\uff09\u3068\u3044\u3046\u4ed5\u7d44\u307f\u3067\u5b9f\u73fe\u3059\u308b\u306e\u3067\u3001\u540c\u3058\u65b9\u6cd5\u3067 Erlang \u304b\u3089 Rust \u306e\u95a2\u6570\u3092\u547c\u3076\u3053\u3068\u3082\u3067\u304d\u308b\u3002<\/p>\n<p>Qiita \u3067\u306f\u540c\u3058\u3088\u3046\u306a\u30bf\u30a4\u30c8\u30eb\u306e\u8a18\u4e8b\u304c \u5404\u8a00\u8a9e\u3067\u30b7\u30ea\u30fc\u30ba\u5316(\uff1f) \u3055\u308c\u3066\u3044\u308b\u306e\u3067\u3001\u305d\u308c\u306b\u4fbf\u4e57\u3055\u305b\u3066\u3082\u3089\u3063\u305f\u3002\u305f\u3060\u305d\u308c\u3089\u3067\u306f\u3001\u91cd\u3044\u51e6\u7406\u3068\u3057\u3066\u518d\u5e30\u578b\u306e\u30d5\u30a3\u30dc\u30ca\u30c3\u30c1\u6570\u5217\u95a2\u6570\u304c\u4f7f\u308f\u308c\u3066\u3044\u308b\u306e\u3060\u304c\u3001\u305d\u308c\u3060\u3068\u30de\u30eb\u30c1\u30b3\u30a2\u30d7\u30ed\u30bb\u30c3\u30b5\u3067\u4e26\u884c\u8a08\u7b97\uff08parallel \u8a08\u7b97\uff09\u3055\u305b\u308b\u306e\u304c\u96e3\u3057\u3044\u306e\u3067\u3001\u4eca\u56de\u306f\u7c21\u5358\u306b parallel \u5316\u3067\u304d\u308b\u3001\u5186\u5468\u7387\u306e\u8fd1\u4f3c\u8a08\u7b97\u3092\u884c\u3046\u3053\u3068\u306b\u3057\u305f\u3002<\/p>\n<h2>\u9032\u3081\u304b\u305f<\/h2>\n<p>\u8a08\u7b97\u306b\u304b\u304b\u3063\u305f\u6642\u9593\u3092\u8a08\u308a\u306a\u304c\u3089\u3001\u4ee5\u4e0b\u306e\u6bb5\u53d6\u308a\u3067\u9032\u3081\u3066\u3044\u304f\u3002<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>Elixir\uff1a\u30b7\u30f3\u30b0\u30eb\u30d7\u30ed\u30bb\u30b9\u3067\u8a08\u7b97<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>Elixir\uff1a\u30de\u30eb\u30c1\u30d7\u30ed\u30bb\u30b9\u3067\u8a08\u7b97<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>Elixir\uff1aHiPE \u3067\u30cd\u30a4\u30c6\u30a3\u30d6\u30b3\u30fc\u30c9\u5316<\/ol>\n<\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n<ol>Elixir \u304b\u3089 Rust \u306e\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u547c\u3073\u51fa\u3059<\/ol>\n<h2>Elixir \u3068\u306f\uff1f<\/h2>\n<p>Qiita &#8211; Elixir \u306e\u7279\u5fb4 \u3088\u308a\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Elixir \u306f\u30b9\u30b1\u30fc\u30eb\u3057\u3084\u3059\u304f\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u3057\u3084\u3059\u3044\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u4f5c\u308b\u305f\u3081\u306e\u52d5\u7684\u306a\u95a2\u6570\u578b\u8a00\u8a9e<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Erlang VM \u4e0a\u3067\u5b9f\u884c\u3055\u308c\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Erlang VM \u306f\u4f4e\u30ec\u30a4\u30c6\u30f3\u30b7\u3067\u3001\u5206\u6563\u578b\u304b\u3064\u8010\u969c\u5bb3\u6027\u306e\u3042\u308b\u30b7\u30b9\u30c6\u30e0\u3068\u3057\u3066\u77e5\u3089\u308c\u3066\u304a\u308a\u3001Web \u958b\u767a\u3084\u7d44\u307f\u8fbc\u307f\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u306e\u9818\u57df\u3067\u4f7f\u308f\u308c\u3066\u6210\u529f\u3057\u3066\u3044\u308b<\/ul>\n<p>Elixir \u306e\u6700\u521d\u306e\u5b89\u5b9a\u7248 1.0 \u306f\u30012014\u5e749\u6708\u306b\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u305f\u30022016\u5e741\u6708\u73fe\u5728\u306e\u6700\u65b0\u5b89\u5b9a\u7248\u306f 1.2.0\u3002\u300c\u52d5\u7684\u300d\u578b\u4ed8\u3051\u3001\u5f37\u3044\u578b\u4ed8\u3051\u3092\u884c\u3044\u3001\u52d5\u7684\u578b\u4ed8\u3051\u3092\u6d3b\u304b\u3057\u3066\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5b9f\u884c\u4e2d\u306b\u4efb\u610f\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30b3\u30fc\u30c9\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u308b\u3002Erlang VM \u3068 Erlang\/OTP \u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u304b\u3089\u3001\u5805\u7262\u6027\u3068\u30b9\u30b1\u30fc\u30e9\u30d3\u30ea\u30c6\u30a3\u30fc\u3092\u53d7\u3051\u7d99\u3044\u3067\u304a\u308a\u3001\u9ad8\u8ca0\u8377\u306a\u72b6\u6cc1\u3067\u3082\u5b89\u5b9a\u3057\u305f\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3067\u304d\u308b\u3002<\/p>\n<p>\u3055\u3089\u306b\u30e1\u30bf\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u304c\u53ef\u80fd\u306a\u8a00\u8a9e\u306b\u3057\u305f\u3053\u3068\u3067\u3001\u30a6\u30a7\u30d6\u30b5\u30fc\u30d3\u30b9\u3092\u4e2d\u5fc3\u3068\u3059\u308b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u751f\u7523\u6027\u304c\u6975\u3081\u3066\u9ad8\u3044\u306e\u304c\u7279\u5fb4\u3060\u3002\u30a6\u30a7\u30d6\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30fb\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306e Phoenix \u3068\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30af\u30a8\u30ea\u7528 DSL \u8a00\u8a9e\u306e Ecto \u304c\u3001\u30ad\u30e9\u30fc\u30a2\u30d7\u30ea\u306b\u306a\u3063\u3066\u3044\u308b\u3002<\/p>\n<h2>Rust \u3068\u306f\uff1f<\/h2>\n<p>Rust \u306f\u5b89\u5168\u6027\u3068\u901f\u5ea6\u306b\u30d5\u30a9\u30fc\u30ab\u30b9\u3057\u305f\u30b7\u30b9\u30c6\u30e0\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u5411\u3051\u306e\u8a00\u8a9e\u3067\u3001\u4ee5\u4e0b\u306e\u7279\u5fb4\u3092\u6301\u3064\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30bc\u30ed\u30b3\u30b9\u30c8\u62bd\u8c61\u5316\u306b\u3088\u308b\u9ad8\u901f\u6027\u3002\u30e2\u30c0\u30f3\u306a\u8a00\u8a9e\u306b\u898b\u3089\u308c\u308b\u9ad8\u5ea6\u306a\u62bd\u8c61\u5316\u3092\u30b5\u30dd\u30fc\u30c8\u3059\u308b\u304c\u3001\u89e3\u6790\u3092\u30b3\u30f3\u30d1\u30a4\u30eb\u6642\u306b\u884c\u306a\u3046\u305f\u3081\u3001\u5b9f\u884c\u6642\u306e\u30aa\u30fc\u30d0\u30fc\u30d8\u30c3\u30c9\u304c\u6975\u3081\u3066\u5c0f\u3055\u3044\u3002C++ \u3067\u66f8\u304b\u308c\u305f\u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u8fd1\u3044\u5b9f\u884c\u52b9\u7387\u306b\u3059\u308b\u3053\u3068\u3092\u76ee\u6a19\u306b\u63b2\u3052\u3066\u3044\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30e1\u30e2\u30ea\u30fc\u3078\u306e\u4e0d\u6b63\u306a\u30a2\u30af\u30bb\u30b9\uff08segfaults\uff09\u3092\u9632\u6b62\u3059\u308b\u305f\u3081\u306e\u30c1\u30a7\u30c3\u30af\u3092\u30b3\u30f3\u30d1\u30a4\u30eb\u6642\u306b\u884c\u3046<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306e\u5b89\u5168\u6027\u3092\u4fdd\u8a3c\u3059\u308b\u305f\u3081\u306e\u30c1\u30a7\u30c3\u30af\u3092\u30b3\u30f3\u30d1\u30a4\u30eb\u6642\u306b\u884c\u3046<\/ul>\n<p>Rust \u306e\u6700\u521d\u306e\u5b89\u5b9a\u7248 1.0 \u306f\u30012015\u5e745\u6708\u306b\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u305f\u3070\u304b\u308a\u30022016\u5e741\u6708\u73fe\u5728\u306e\u6700\u65b0\u5b89\u5b9a\u7248\u306f 1.5\u3002GC\uff08\u30ac\u30d9\u30fc\u30b8\u30b3\u30ec\u30af\u30bf\uff09\u3092\u6301\u305f\u306a\u3044\u304c\u3001\u6240\u6709\u6a29\u30b7\u30b9\u30c6\u30e0\u3068\u3044\u3046\u3001\u30b3\u30f3\u30d1\u30a4\u30eb\u6642\u306b\u30b9\u30bf\u30c3\u30af\u3084\u30d2\u30fc\u30d7\u9818\u57df\u306e\u6240\u6709\u6a29\u3068\u305d\u306e\u501f\u7528\u3001\u305d\u3057\u3066\u5bff\u547d\u3092\u89e3\u6790\u3059\u308b\u3057\u304f\u307f\u306b\u3088\u308a\u3001segfaults \u3092\u672a\u7136\u306b\u9632\u3050\u3053\u3068\u304c\u3067\u304d\u308b\u306e\u304c\u6700\u5927\u306e\u7279\u5fb4\u306b\u306a\u3063\u3066\u3044\u308b\u3002<\/p>\n<p>\u307e\u305f\u3001SML\u3001OCaml\u3001Haskell \u306a\u3069\u306e\u95a2\u6570\u578b\u8a00\u8a9e\u304b\u3089\u5f37\u3044\u5f71\u97ff\u3092\u53d7\u3051\u3066\u304a\u308a\u3001\u300c\u9759\u7684\u300d\u578b\u4ed8\u3051\u3001\u5f37\u3044\u578b\u4ed8\u3051\u306f\u3082\u3061\u308d\u3093\u3001\u9ad8\u5ea6\u306a\u578b\u63a8\u8ad6\u3092\u884c\u3046\u3002Elixir \u306e\u30d7\u30ed\u30c8\u30b3\u30eb\u3084 Haskell \u306e\u578b\u30af\u30e9\u30b9\u306b\u4f3c\u305f\u300c\u30c8\u30ec\u30a4\u30c8\u300d\u306b\u3088\u308a\u3001\u53b3\u683c\u306a\u578b\u30b7\u30b9\u30c6\u30e0\u306e\u4e0b\u3067\u3001\u591a\u76f8\u306a\u95a2\u6570\u304c\u66f8\u3051\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u308b\u3002\u3055\u3089\u306b\u3001Erlang \u306e\u30a2\u30af\u30bf\u30fc\u30e2\u30c7\u30eb\u3084\u3001\u8efd\u91cf\u30d7\u30ed\u30bb\u30b9\u306e\u7570\u5e38\u7d42\u4e86\u691c\u77e5\u30e2\u30c7\u30eb\u3082\u53c2\u8003\u306b\u3057\u3066\u3044\u308b\u3002\u3053\u308c\u3089\u306e\u7279\u5fb4\u304b\u3089\u3001\u30c7\u30fc\u30bf\u306e\u578b\u306e\u5b89\u5168\u6027\u306f\u3082\u3061\u308d\u3093\u3001\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u7af6\u5408\u306b\u307e\u3064\u308f\u308b\u5b89\u5168\u6027\u307e\u3067\u3082\u30b3\u30f3\u30d1\u30a4\u30eb\u6642\u306b\u4fdd\u8a3c\u3067\u304d\u308b\u3057\u304f\u307f\u306b\u306a\u3063\u3066\u3044\u308b\u3002\u305d\u306e\u4e00\u65b9\u3067\u3001\u30b7\u30b9\u30c6\u30e0\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u3092\u884c\u3046\u958b\u767a\u8005\u304b\u3089\u656c\u9060\u3055\u308c\u305d\u3046\u306a\u3001\u95a2\u6570\u578b\u8a00\u8a9e\u3063\u307d\u3044\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u30b9\u30bf\u30a4\u30eb\u306f\u6975\u529b\u6392\u9664\u3055\u308c\u3066\u3044\u308b\u3002<\/p>\n<p>Mozilla \u304c\u30b9\u30dd\u30f3\u30b5\u30fc\u3068\u306a\u3063\u3066\u958b\u767a\u304c\u9032\u3081\u3089\u308c\u3066\u304a\u308a\u3001Mozilla Research \u306e\u7814\u7a76\u958b\u767a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u300cServo, Parallel Browser Engine\u300d\u306e\u958b\u767a\u8a00\u8a9e\u306b\u63a1\u7528\u3055\u308c\u3066\u3044\u308b1\u3002<\/p>\n<h2>\u4f7f\u7528\u3057\u305f\u74b0\u5883<\/h2>\n<p>\u4eca\u56de\u4f7f\u7528\u3057\u305f\u74b0\u5883\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Elixir 1.2.0 \uff0b Erlang\/OTP 18.2.1<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Rust 1.5<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">OS<\/ul>\n<\/li>\n<\/ul>\n<p>FreeBSD 10.2-RELEASE<br \/>\nArch Linux<br \/>\n\uff12\u3064\u306e OS \u3067\u540c\u69d8\u306e\u50be\u5411\u304c\u898b\u3089\u308c\u305f\u3002\u672c\u8a18\u4e8b\u306b\u306f FreeBSD \u306e\u7d50\u679c\u3092\u63b2\u8f09<\/p>\n<p>\u30de\u30b7\u30f3<\/p>\n<p>Mac mini\uff08Mid 2012\uff09<br \/>\n2.60GHz\u52d5\u4f5c\u306e\u30af\u30a2\u30c3\u30c9\u30b3\u30a2 Core i7 3720QM<br \/>\nHyper Threading \u306b\u3088\u308a\uff18\u3064\u306e\u8ad6\u7406\u30b3\u30a2\u30d7\u30ed\u30bb\u30c3\u30b5\u3068\u3057\u3066\u52d5\u4f5c\u3059\u308b<br \/>\n16GB RAM<br \/>\n\u4e0a\u8a18\u306e OS \u306f\u76f4\u306b\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u3002\uff08Mac OS X \u306e VMware \u3084 xhyve \u3068\u3044\u3063\u305f\u4eee\u60f3\u30de\u30b7\u30f3\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u306f\u4f7f\u3063\u3066\u3044\u306a\u3044\uff09<\/p>\n<p>Erlang\/OTP \u306f kerl \u3067\u30d3\u30eb\u30c9\u3057\u3001\u305d\u306e\u969b\u3001\u4ee5\u4e0b\u306e configure \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u6307\u5b9a\u3057\u305f\u3002<\/p>\n<pre class=\"post-pre\"><code>--enable-dirty-schedulers\r\n--enable-hipe --enable-native-libs --enable-fp-exceptions\r\n--enable-smp-support --enable-threads --enable-kernel-poll\r\n<\/code><\/pre>\n<p>Elixir \u3068 Rust \u5171\u306b\u3001FreeBSD \u3068 Arch Linux \u3067\u7528\u610f\u3055\u308c\u3066\u3044\u308b\u30d0\u30a4\u30ca\u30ea\u30fc\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u5229\u7528\u3057\u305f\u3002<\/p>\n<p>\u306a\u304a\u3001Rust \u306f x86_68 \u7cfb\u30d7\u30ed\u30bb\u30c3\u30b5\u306e SIMD \u547d\u4ee4\u3092\u7528\u3044\u305f\u6700\u9069\u5316\u304c\u3067\u304d\u308b\u3088\u3046\u3060\u304c\u3001\u4eca\u56de\u751f\u6210\u3055\u308c\u305f\u6a5f\u68b0\u8a9e\u547d\u4ee4\u306b\u306f SIMD \u7cfb\u306e\u547d\u4ee4\u306f\u542b\u307e\u308c\u3066\u3044\u306a\u304b\u3063\u305f\u3002SIMD \u306b\u672a\u5bfe\u5fdc\u306e\u30d7\u30ed\u30bb\u30c3\u30b5\u30fc\u3082\u3042\u308b\u306e\u3067\u3001FreeBSD \u3084 Arch Linux \u3067\u7528\u610f\u3055\u308c\u3066\u3044\u308b\u30d0\u30a4\u30ca\u30ea\u30fc\u30d1\u30c3\u30b1\u30fc\u30b8\u3067\u306f\u3001SIMD \u306e\u30b5\u30dd\u30fc\u30c8\u304c\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u308b\u3088\u3046\u30602\u3002<\/p>\n<h2>\u5186\u5468\u7387\u306e\u6c42\u3081\u304b\u305f<\/h2>\n<p>\u3067\u306f\u3001\u5186\u5468\u7387 $\\pi$ \u306e\u8fd1\u4f3c\u5024\u3092\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u6c42\u3081\u3066\u307f\u3088\u3046\u3002$\\pi$ \u306e\u5c0f\u6570\u70b9\u4ee5\u4e0b\u6700\u521d\u306e15\u6841\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u306a\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>\\pi = 3.14159\\ 26535\\ 89793\\ \\dotsb\r\n<\/code><\/pre>\n<p>\u6700\u521d\u306b\u65ad\u3063\u3066\u304a\u304f\u3068\u3001\u4eca\u56de\u306f\u7c21\u5358\u306e\u305f\u3081\u306b64\u30d3\u30c3\u30c8\u6d6e\u52d5\u5c0f\u6570\u70b9\u578b\u306e\u6570\u5024\u3092\u7528\u3044\u308b\u306e\u3067\u3001\u3044\u304f\u3089\u8a08\u7b97\u3092\u7d9a\u3051\u3066\u3082\u5927\u3057\u305f\u7cbe\u5ea6\u306f\u5f97\u3089\u308c\u306a\u3044\u3002\u8a66\u3057\u305f\u7bc4\u56f2\u3067\u306f\u3001\u5c0f\u6570\u70b9\u4ee5\u4e0b\uff18\u6841\u304f\u3089\u3044\u307e\u3067\u304c\u9650\u754c\u306e\u3088\u3046\u3060\u3002<\/p>\n<p>\u8a08\u7b97\u65b9\u6cd5\u306f\u3001\u6570\u5024\u7a4d\u5206\u6cd5\u306e\u9577\u65b9\u5f62\u8fd1\u4f3c\uff08\u5de6\u70b9\u5247\uff09\u3092\u63a1\u7528\u3059\u308b\u3002\u3053\u3046\u66f8\u304f\u3068\u96e3\u3057\u305d\u3046\u306b\u601d\u3048\u308b\u304c\u3001\u610f\u5916\u306b\u7c21\u5358\u3060\u3002<\/p>\n<p>\u307e\u305a\u534a\u5f84 $r = \uff11$ \u306e\u5186\u3092\u8003\u3048\u308b\u3002\u5186\u306e\u9762\u7a4d $S$ \u3092\u6c42\u3081\u308b\u516c\u5f0f\u306b\u4ee3\u5165\u3059\u308b\u3068\u3001\u3053\u306e\u6761\u4ef6\u3067\u306f $S = \\pi$ \u306b\u306a\u308b\u3068\u308f\u304b\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>\\begin{eqnarray}\r\nS &amp;=&amp; \\pi \\cdot r^2 \\\\\r\n&amp;=&amp; \\pi \\cdot 1 \\\\\r\n&amp;=&amp; \\pi\r\n\\end{eqnarray}\r\n<\/code><\/pre>\n<p>\u3053\u306e\u5186\u3092\u4e2d\u5fc3\u304b\u3089\uff14\u3064\u306b\u5206\u5272\u3057\u3001\u305d\u306e\uff11\u7247\uff08\u56db\u5206\u5186\u3001\u3057\u3076\u3093\u3048\u3093\uff09\u306e\u9762\u7a4d\u3092\u6570\u5024\u7a4d\u5206\u6cd5\u3067\u8fd1\u4f3c\u3059\u308b\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\u56db\u5206\u5186\u309215\u7b49\u5206\u3057\u305f\u3068\u3053\u308d\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d5eb437434c4406cf5f1a\/31-0.png\" alt=\"circle_area.png\" \/><\/div>\n<p>\u6570\u5024\u7a4d\u5206\u6cd5\u306e\u9577\u65b9\u5f62\u8fd1\u4f3c\u306f\u3001\u9762\u7a4d\u3092\u6c42\u3081\u305f\u3044\u7bc4\u56f2\uff08\u56f3\u306e\u56db\u5206\u5186\uff09\u3092 $X$ \u8ef8\u65b9\u5411\u306b $N$ \u7b49\u5206\u3057\u3001\u9577\u65b9\u5f62\u3092\u6577\u304d\u8a70\u3081\u3066\u3001\u305d\u308c\u3089\u306e\u9762\u7a4d\u306e\u548c\u3067\u8fd1\u4f3c\u3059\u308b\u65b9\u6cd5\u3002\u5de6\u70b9\u5247\u3067\u306f\u3001\u9577\u65b9\u5f62\u306e\u5de6\u4e0a\u306e\u70b9\u304c\u3001\u5883\u754c\u306b\u63a5\u3059\u308b\u3088\u3046\u306b\u3059\u308b\u3002\u56f3\u3067\u308f\u304b\u308b\u3088\u3046\u306b\u3001\u306f\u307f\u51fa\u3057\u305f\u90e8\u5206\u306f\u8aa4\u5dee\u306b\u306a\u308b\u3002\u5206\u5272\u6570\u3092\u5897\u3084\u3059\u307b\u3069\u8aa4\u5dee\u304c\u5c0f\u3055\u304f\u306a\u308b\u304c\u3001\u305d\u306e\u5206\u3001\u8a08\u7b97\u306b\u6642\u9593\u304c\u304b\u304b\u308b\u3088\u3046\u306b\u306a\u308b\u3002<\/p>\n<p>\u5177\u4f53\u7684\u306a\u5f0f\u306b\u843d\u3068\u3057\u3066\u3044\u3053\u3046\u3002\u5186\u306e\u4e2d\u5fc3\uff08\u56f3\u306e\u5de6\u4e0b\uff09\u304c $ XY$ \u5ea7\u6a19\u306e\u539f\u70b9\u3068\u3059\u308b\u3002$N$ \u500b\u306b\u5206\u5272\u3057\u305f\u56db\u5206\u5186\u306e\u9762\u7a4d\u3092 $S_0$\u3001\u500b\u3005\u306e\u9577\u65b9\u5f62\u306e\u5e45\u3092 $w$\u3001\u5de6\u7aef\u306e\u9577\u65b9\u5f62\u306e\u5de6\u4e0a\u306e\u9802\u70b9\u3092 $(x_0, y_0)$\u3001 \u53f3\u7aef\u306e\u9577\u65b9\u5f62\u306e\u5de6\u4e0a\u306e\u9802\u70b9\u3092 $(x_{n-1}, y_{n-1})$ \u3068\u3059\u308b\u3068\u3001\u5186\u5468\u7387 $\\pi $ \u306f\u3001\u4ee5\u4e0b\u306e\u5f0f\u3067\u6c42\u3081\u3089\u308c\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>\\begin{eqnarray}\r\n\\pi &amp;=&amp; 4 \\cdot S_0 \\\\\r\n&amp;=&amp; 4 \\cdot (w \\cdot y_0 + w \\cdot y_1 + \\dotsb + w \\cdot y_{n-1}) \\\\\r\n&amp;=&amp; 4 \\cdot w \\cdot (y_0 + y_1 + \\dotsb + y_{n-1})\\\\\r\n\\end{eqnarray}\r\n<\/code><\/pre>\n<p>\u3042\u3068\u306f $x$ \u304b\u3089 $y$ \u3092\u5c0e\u304f\u65b9\u6cd5\u304c\u308f\u304b\u308c\u3070\u3044\u3044\u3002$X$ \u8ef8\u3068 $Y$ \u8ef8\u306f\u76f4\u89d2\u306b\u4ea4\u308f\u308b\u306e\u3067\u3001\uff13\u3064\u306e\u5ea7\u6a19 $(0, 0), (x_i, 0), (x_i, y_i)$ \u3092\u7d50\u3076\u3068\u3001\u5404\u8fba\u306e\u9577\u3055\u304c $x_i,\\ y_i,\\ r$ \u306e\u76f4\u89d2\u4e09\u89d2\u5f62\u304c\u3067\u304d\u308b\u3002\u8fba\u306e\u9577\u3055\u306e\u95a2\u4fc2\u306f\u3001\u4e09\u5e73\u65b9\u306e\u5b9a\u7406\u306b\u3088\u308a\u3001$x^2 + y^2 = r^2$ \u3068\u306a\u308b\u3002$r = 1$ \u3068\u3057\u3001\u5f0f\u3092\u5909\u5f62\u3059\u308c\u3070\u3044\u3044\u3002<\/p>\n<pre class=\"post-pre\"><code>\\begin{eqnarray}\r\nx^2 + y^2 &amp;=&amp; r^2 \\\\\r\nx^2 + y^2 &amp;=&amp; 1 \\\\\r\ny^2 &amp;=&amp; 1 - x^2 \\\\\r\ny &amp;=&amp; \\sqrt{1 - x ^ 2}\r\n\\end{eqnarray}\r\n<\/code><\/pre>\n<h2>\u305d\u306e\uff11\u3000Elixir\uff1a\u30b7\u30f3\u30b0\u30eb\u30d7\u30ed\u30bb\u30b9\u3067\u8a08\u7b97<\/h2>\n<p>\u5186\u5468\u7387\u306e\u6c42\u3081\u65b9\u304c\u308f\u304b\u3063\u305f\u3068\u3053\u308d\u3067\u3001\u65e9\u901f\u3001Elixir \u3067\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u3057\u3088\u3046\u3002\u4eca\u56de\u4f7f\u3063\u305f\u30d7\u30ed\u30b0\u30e9\u30e0\u306f\u3001\u3053\u3053\u306b \u7f6e\u3044\u3066\u3042\u308b\u3002<\/p>\n<p>\u30d9\u30fc\u30b9\u3068\u306a\u308b Elixir \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306f\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306b Elixir \u306e Mix \u3067\u4f5c\u6210\u3057\u305f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">mix new elixir_rust_interop_demo\r\n<\/span><\/code><\/pre>\n<p>\u3059\u308b\u3068\u3001\u3053\u3093\u306a\u69cb\u6210\u306b\u306a\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>elixir_rust_interop_demo\r\n\u251c\u2500\u2500 README.md\r\n\u251c\u2500\u2500 config\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 config.exs\r\n\u251c\u2500\u2500 lib\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 elixir_rust_interop_demo.exs &lt;-- pi.ex \u306b\u30ea\u30cd\u30fc\u30e0\u3057\u3066\u3001\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u66f8\u3044\u3066\u3044\u304f\r\n\u251c\u2500\u2500 mix.exs\r\n\u2514\u2500\u2500 test\r\n<\/code><\/pre>\n<p>lib \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u306b Elixir \u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb elixir_rust_interop_demo.ex \u304c\u3042\u308b\u306e\u3067\u3001\u305d\u308c\u3092 pi.ex \u306b\u30ea\u30cd\u30fc\u30e0\u3057\u3001\u4ee5\u4e0b\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u66f8\u304d\u8fbc\u3080\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">defmodule<\/span> <span class=\"no\">Pi<\/span> <span class=\"k\">do<\/span>\r\n\r\n  <span class=\"nv\">@spec<\/span> <span class=\"n\">calc_pi<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span> <span class=\"p\">::<\/span> <span class=\"n\">non_neg_integer<\/span><span class=\"p\">)<\/span> <span class=\"p\">::<\/span> <span class=\"p\">{<\/span><span class=\"ss\">:ok<\/span><span class=\"p\">,<\/span> <span class=\"n\">pi<\/span> <span class=\"p\">::<\/span> <span class=\"n\">float<\/span><span class=\"p\">}<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"n\">calc_pi<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"n\">w<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">1.0<\/span> <span class=\"o\">\/<\/span> <span class=\"n\">n<\/span>\r\n    <span class=\"n\">s0<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">0.0<\/span>\r\n    <span class=\"n\">s1<\/span> <span class=\"o\">=<\/span> <span class=\"no\">Enum<\/span><span class=\"o\">.<\/span><span class=\"n\">reduce<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"o\">..<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"p\">),<\/span> <span class=\"n\">s0<\/span><span class=\"p\">,<\/span> <span class=\"k\">fn<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"n\">s<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span>\r\n      <span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"n\">i<\/span> <span class=\"o\">*<\/span> <span class=\"n\">w<\/span>\r\n      <span class=\"n\">s<\/span> <span class=\"o\">+<\/span> <span class=\"ss\">:math<\/span><span class=\"o\">.<\/span><span class=\"n\">sqrt<\/span><span class=\"p\">(<\/span><span class=\"mf\">1.0<\/span> <span class=\"o\">-<\/span> <span class=\"n\">x<\/span> <span class=\"o\">*<\/span> <span class=\"n\">x<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"k\">end<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"p\">{<\/span><span class=\"ss\">:ok<\/span><span class=\"p\">,<\/span> <span class=\"mf\">4.0<\/span> <span class=\"o\">*<\/span> <span class=\"n\">w<\/span> <span class=\"o\">*<\/span> <span class=\"n\">s1<\/span><span class=\"p\">}<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n<span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<p>\u65e9\u901f\u5b9f\u884c\u3057\u3066\u307f\u3088\u3046\u3002<\/p>\n<pre class=\"post-pre\"><code>% iex -S mix\r\nErlang\/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false]\r\n\r\nCompiled lib\/pi.ex\r\nGenerated elixir_rust_interop_demo app\r\nConsolidated List.Chars\r\n...\r\n\r\nInteractive Elixir (1.2.0) - press Ctrl+C to exit (type h() ENTER for help)\r\niex(1)&gt; l Pi\r\n{:module, Pi}\r\niex(2)&gt; :timer.tc(fn() -&gt; Pi.calc_pi(1_000_000) end)\r\n{112146, {:ok, 3.141594652413976}}\r\niex(3)&gt; :timer.tc(fn() -&gt; Pi.calc_pi(1_000_000_000) end)\r\n{113853091, {:ok, 3.1415926555901215}}\r\n<\/code><\/pre>\n<p>100\u4e07\u500b\u306b\u5206\u5272\u3057\u305f\u5834\u5408\u306f\u3001\u8a08\u7b97\u306b 112,146 \u30de\u30a4\u30af\u30ed\u79d2\uff080.11\u79d2\uff09\u8981\u3057\u3001\u5c0f\u6570\u70b9\u4ee5\u4e0b\uff15\u6841\u7a0b\u5ea6\u306e\u7cbe\u5ea6\u304c\u5f97\u3089\u308c\u305f\u300210\u5104\u500b\u306b\u5206\u5272\u3057\u305f\u5834\u5408\u306f\u3001\u8a08\u7b97\u306b\u7d04\uff11\u520654\u79d2\u8981\u3057\u3001\u5c0f\u6570\u70b9\u4ee5\u4e0b\uff18\u6841\u7a0b\u5ea6\u306e\u7cbe\u5ea6\u304c\u5f97\u3089\u308c\u305f\u3002\u306a\u304a\u3001Elixir \u306e float \u578b\u306f\u300164\u30d3\u30c3\u30c8\u306eIEEE 754\u6d6e\u52d5\u5c0f\u6570\u70b9\u6570\u306a\u306e\u3067\u3001\u4e00\u822c\u7684\u306a\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u8a00\u8a9e\u306e double \u578b\u306b\u76f8\u5f53\u3059\u308b\u3002<\/p>\n<h3>\u30eb\u30fc\u30d7\u3092\u52b9\u7387\u5316\u3059\u308b<\/h3>\n<p>\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306f10\u5104\u56de\u306e\u30eb\u30fc\u30d7\u3092\u56de\u3059\u305f\u3081\u306b Range 0..(n &#8211; 1) \u306b Enum.reduce\/3 \u3092\u9069\u7528\u3057\u305f\u304c\u3001Elixir 1.2 \u306e Range \u306e\u5b9f\u88c5\u3092\u898b\u308b\u3068\u3001\u30eb\u30fc\u30d7\u3092\u3072\u305f\u3059\u3089\u56de\u3059\u3088\u3046\u306a\u7528\u9014\u3067\u306f\u52b9\u7387\u304c\u60aa\u305d\u3046\u3060\u3002\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3001\u3088\u308a\u52b9\u7387\u304c\u3044\u3044\u81ea\u4f5c\u306e\u9ad8\u968e\u95a2\u6570 for_each\/4 \u3067\u7f6e\u304d\u63db\u3048\u3066\u307f\u305f\u3002<\/p>\n<pre class=\"post-pre\"><code>  <span class=\"nv\">@spec<\/span> <span class=\"n\">calc_pi<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span> <span class=\"p\">::<\/span> <span class=\"n\">non_neg_integer<\/span><span class=\"p\">)<\/span> <span class=\"p\">::<\/span> <span class=\"p\">{<\/span><span class=\"ss\">:ok<\/span><span class=\"p\">,<\/span> <span class=\"n\">pi<\/span> <span class=\"p\">::<\/span> <span class=\"n\">float<\/span><span class=\"p\">}<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"n\">calc_pi<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"n\">w<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">1.0<\/span> <span class=\"o\">\/<\/span> <span class=\"n\">n<\/span>\r\n    <span class=\"n\">s0<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">0.0<\/span>\r\n    <span class=\"n\">s1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">for_each<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">,<\/span> <span class=\"n\">n<\/span><span class=\"p\">,<\/span> <span class=\"n\">s0<\/span><span class=\"p\">,<\/span> <span class=\"k\">fn<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"n\">s<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span>    <span class=\"c1\"># &lt;- \u3053\u3053\u3092\u5909\u66f4\u3057\u305f<\/span>\r\n      <span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"n\">i<\/span> <span class=\"o\">*<\/span> <span class=\"n\">w<\/span>\r\n      <span class=\"n\">s<\/span> <span class=\"o\">+<\/span> <span class=\"ss\">:math<\/span><span class=\"o\">.<\/span><span class=\"n\">sqrt<\/span><span class=\"p\">(<\/span><span class=\"mf\">1.0<\/span> <span class=\"o\">-<\/span> <span class=\"n\">x<\/span> <span class=\"o\">*<\/span> <span class=\"n\">x<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"k\">end<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"p\">{<\/span><span class=\"ss\">:ok<\/span><span class=\"p\">,<\/span> <span class=\"mf\">4.0<\/span> <span class=\"o\">*<\/span> <span class=\"n\">w<\/span> <span class=\"o\">*<\/span> <span class=\"n\">s1<\/span><span class=\"p\">}<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"c1\"># \u3053\u306e\u9ad8\u968e\u95a2\u6570\u3092\u8ffd\u52a0\u3057\u305f<\/span>\r\n  <span class=\"nv\">@spec<\/span> <span class=\"n\">for_each<\/span><span class=\"p\">(<\/span><span class=\"n\">index<\/span> <span class=\"p\">::<\/span> <span class=\"n\">integer<\/span><span class=\"p\">,<\/span>\r\n                 <span class=\"n\">max<\/span> <span class=\"p\">::<\/span> <span class=\"n\">integer<\/span><span class=\"p\">,<\/span>\r\n                 <span class=\"n\">init_acc<\/span> <span class=\"p\">::<\/span> <span class=\"n\">term<\/span><span class=\"p\">,<\/span>\r\n                 <span class=\"p\">((<\/span><span class=\"n\">i<\/span> <span class=\"p\">::<\/span> <span class=\"n\">integer<\/span><span class=\"p\">,<\/span> <span class=\"n\">acc0<\/span> <span class=\"p\">::<\/span> <span class=\"n\">term<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"n\">acc1<\/span> <span class=\"p\">::<\/span> <span class=\"n\">term<\/span><span class=\"p\">))<\/span>\r\n                <span class=\"p\">::<\/span> <span class=\"n\">final_acc<\/span> <span class=\"p\">::<\/span> <span class=\"n\">term<\/span>\r\n  <span class=\"k\">defp<\/span> <span class=\"n\">for_each<\/span><span class=\"p\">(<\/span><span class=\"n\">max<\/span><span class=\"p\">,<\/span> <span class=\"n\">max<\/span><span class=\"p\">,<\/span> <span class=\"n\">acc<\/span><span class=\"p\">,<\/span> <span class=\"n\">_fun<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"n\">acc<\/span>\r\n  <span class=\"k\">end<\/span>\r\n  <span class=\"k\">defp<\/span> <span class=\"n\">for_each<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"n\">max<\/span><span class=\"p\">,<\/span> <span class=\"n\">acc<\/span><span class=\"p\">,<\/span> <span class=\"n\">fun<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"n\">for_each<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span> <span class=\"o\">+<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span> <span class=\"n\">max<\/span><span class=\"p\">,<\/span> <span class=\"n\">fun<\/span><span class=\"o\">.<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"n\">acc<\/span><span class=\"p\">),<\/span> <span class=\"n\">fun<\/span><span class=\"p\">)<\/span>\r\n  <span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<p>\u5b9f\u884c\u3057\u3066\u307f\u3088\u3046\u3002<\/p>\n<pre class=\"post-pre\"><code>iex(1)&gt; l Pi\r\n{:module, Pi}\r\niex(2)&gt; :timer.tc(fn() -&gt; Pi.calc_pi(1_000_000_000) end)\r\n{77341972, {:ok, 3.1415926555901215}}\r\n<\/code><\/pre>\n<p>10\u5104\u5206\u5272\u6642\u306e\u8a08\u7b97\u6642\u9593\u306f\u7d0477.3\u79d2\u3068\u306a\u308a\u3001\u5148\u307b\u3069\u3068\u6bd4\u3079\u3066 1.5 \u500d\u307b\u3069\u9ad8\u901f\u5316\u3057\u305f\u3002<\/p>\n<h2>\u305d\u306e\uff12\u3000Elixir\uff1a\u30de\u30eb\u30c1\u30d7\u30ed\u30bb\u30b9\u3067\u8a08\u7b97<\/h2>\n<p>\u305b\u3063\u304b\u304f\u30de\u30b7\u30f3\u304c\uff18\u500b\u306e\u8ad6\u7406\u30b3\u30a2\u3092\u642d\u8f09\u3057\u3066\u3044\u308b\u306e\u3067\u3001\u5168\u90e8\u4f7f\u3063\u3066\u307f\u3088\u3046\u3002\u8907\u6570\u306e\u8efd\u91cf\u30d7\u30ed\u30bb\u30b9\u3092\u8d77\u52d5\u3057\u3066\u3001\u9762\u7a4d\u3092\u5206\u5272\u3057\u3066\u6c42\u3081\u308c\u3070\u3044\u3044\u3002Elixir \u306a\u3089\u76f4\u611f\u7684\u306b\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u3067\u304d\u308b\u3002<\/p>\n<p>\u307e\u305a\u3001calc_pi\/1 \u3092\u5143\u306b\u3001\u56db\u5206\u5186\u306e\u4e00\u90e8\u306e\u7bc4\u56f2\u3060\u3051\u306e\u9762\u7a4d\u3092\u6c42\u3081\u308b\u30d7\u30ed\u30b0\u30e9\u30e0 calc_pi_range\/3 \u3092\u8ffd\u52a0\u3059\u308b\u3002\u3053\u306e\u95a2\u6570\u306f\u3001\u5bfe\u8c61\u9818\u57df\u3092 n \u7b49\u5206\u3057\u3066\u3001offset \u756a\u76ee\u304b\u3089 count \u500b\u5206\u306e\u77ed\u5f62\u306b\u3064\u3044\u3066\u3001\u305d\u306e\u9762\u7a4d\u3092\u7b97\u51fa\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>  <span class=\"nv\">@spec<\/span> <span class=\"n\">calc_pi_range<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span> <span class=\"p\">::<\/span> <span class=\"n\">non_neg_integer<\/span><span class=\"p\">,<\/span>\r\n                      <span class=\"n\">offset<\/span> <span class=\"p\">::<\/span> <span class=\"n\">non_neg_integer<\/span><span class=\"p\">,<\/span>\r\n                      <span class=\"n\">count<\/span> <span class=\"p\">::<\/span> <span class=\"n\">non_neg_integer<\/span><span class=\"p\">)<\/span> <span class=\"p\">::<\/span> <span class=\"n\">pi<\/span> <span class=\"p\">::<\/span> <span class=\"n\">float<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"n\">calc_pi_range<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">,<\/span> <span class=\"n\">offset<\/span><span class=\"p\">,<\/span> <span class=\"n\">count<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"n\">w<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">1.0<\/span> <span class=\"o\">\/<\/span> <span class=\"n\">n<\/span>\r\n    <span class=\"n\">s0<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">0.0<\/span>\r\n    <span class=\"n\">s1<\/span> <span class=\"o\">=<\/span> <span class=\"n\">for_each<\/span><span class=\"p\">(<\/span><span class=\"n\">offset<\/span><span class=\"p\">,<\/span> <span class=\"n\">offset<\/span> <span class=\"o\">+<\/span> <span class=\"n\">count<\/span><span class=\"p\">,<\/span> <span class=\"n\">s0<\/span><span class=\"p\">,<\/span> <span class=\"k\">fn<\/span><span class=\"p\">(<\/span><span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"n\">s<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span>\r\n      <span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"n\">i<\/span> <span class=\"o\">*<\/span> <span class=\"n\">w<\/span>\r\n      <span class=\"n\">s<\/span> <span class=\"o\">+<\/span> <span class=\"ss\">:math<\/span><span class=\"o\">.<\/span><span class=\"n\">sqrt<\/span><span class=\"p\">(<\/span><span class=\"mf\">1.0<\/span> <span class=\"o\">-<\/span> <span class=\"n\">x<\/span> <span class=\"o\">*<\/span> <span class=\"n\">x<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"k\">end<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"mf\">4.0<\/span> <span class=\"o\">*<\/span> <span class=\"n\">w<\/span> <span class=\"o\">*<\/span> <span class=\"n\">s1<\/span>\r\n  <span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<p>\u6b21\u306b calc_pi_range\/3 \u3092\u547c\u3073\u51fa\u3059\u95a2\u6570 calc_pi_parallel\/2 \u3092\u8ffd\u52a0\u3059\u308b\u3002\u3053\u306e\u95a2\u6570\u306f\u3001num_procs \u500b\u306e\u30d7\u30ed\u30bb\u30b9\u3092\u7acb\u3061\u4e0a\u3052\u3001calc_pi_range\/3 \u3092 parallel \u306b\u5b9f\u884c\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>  <span class=\"nv\">@max_procs<\/span>  <span class=\"mi\">1024<\/span>\r\n  <span class=\"nv\">@timeout<\/span>  <span class=\"mi\">60_000<\/span>   <span class=\"c1\"># 1 minute<\/span>\r\n\r\n  <span class=\"nv\">@spec<\/span> <span class=\"n\">calc_pi_parallel<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span> <span class=\"p\">::<\/span> <span class=\"n\">non_neg_integer<\/span><span class=\"p\">,<\/span>\r\n                         <span class=\"n\">num_procs<\/span> <span class=\"p\">::<\/span> <span class=\"n\">non_neg_integer<\/span><span class=\"p\">)<\/span> <span class=\"p\">::<\/span> <span class=\"p\">{<\/span><span class=\"ss\">:ok<\/span><span class=\"p\">,<\/span> <span class=\"n\">pi<\/span> <span class=\"p\">::<\/span> <span class=\"n\">float<\/span><span class=\"p\">}<\/span>\r\n                                                           <span class=\"o\">|<\/span> <span class=\"p\">{<\/span><span class=\"ss\">:error<\/span><span class=\"p\">,<\/span> <span class=\"n\">term<\/span><span class=\"p\">()}<\/span>\r\n  <span class=\"c1\"># num_process \u306e\u5024\u3092\u30c1\u30a7\u30c3\u30af\u3057\u3001\u7bc4\u56f2\u5916\u306a\u3089\u30a8\u30e9\u30fc\u3092\u8fd4\u3059\u3002<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"n\">calc_pi_parallel<\/span><span class=\"p\">(<\/span><span class=\"n\">_n<\/span><span class=\"p\">,<\/span> <span class=\"n\">num_procs<\/span><span class=\"p\">)<\/span> <span class=\"ow\">when<\/span> <span class=\"n\">num_procs<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"mi\">0<\/span> <span class=\"ow\">or<\/span> <span class=\"n\">num_procs<\/span> <span class=\"o\">&gt;<\/span> <span class=\"nv\">@max_procs<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"p\">{<\/span><span class=\"ss\">:error<\/span><span class=\"p\">,<\/span>\r\n     <span class=\"s1\">'Invalid num_procs <\/span><span class=\"si\">#{<\/span><span class=\"n\">num_procs<\/span><span class=\"si\">}<\/span><span class=\"s1\">. It must be &gt; 0 and &lt;= <\/span><span class=\"si\">#{<\/span><span class=\"nv\">@max_procs<\/span><span class=\"si\">}<\/span><span class=\"s1\">'<\/span><span class=\"p\">}<\/span>\r\n  <span class=\"k\">end<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"n\">calc_pi_parallel<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">,<\/span> <span class=\"n\">num_procs<\/span><span class=\"p\">)<\/span> <span class=\"ow\">when<\/span> <span class=\"n\">rem<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">,<\/span> <span class=\"n\">num_procs<\/span><span class=\"p\">)<\/span> <span class=\"o\">!=<\/span> <span class=\"mi\">0<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"p\">{<\/span><span class=\"ss\">:error<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'n <\/span><span class=\"si\">#{<\/span><span class=\"n\">n<\/span><span class=\"si\">}<\/span><span class=\"s1\"> must be a multiple of num_procs <\/span><span class=\"si\">#{<\/span><span class=\"n\">num_procs<\/span><span class=\"si\">}<\/span><span class=\"s1\">'<\/span><span class=\"p\">}<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"c1\"># num_process \u306e\u5024\u304c\u7bc4\u56f2\u5185\u306a\u306e\u3067\u3001calc_pi_range\/3 \u3092 parallel \u306b\u5b9f\u884c\u3059\u308b\u3002<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"n\">calc_pi_parallel<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">,<\/span> <span class=\"n\">num_procs<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"n\">len<\/span> <span class=\"o\">=<\/span> <span class=\"n\">div<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">,<\/span> <span class=\"n\">num_procs<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">pi<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"o\">..<\/span><span class=\"p\">(<\/span><span class=\"n\">num_procs<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\r\n      <span class=\"o\">|&gt;<\/span> <span class=\"no\">Enum<\/span><span class=\"o\">.<\/span><span class=\"n\">map<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"p\">(<\/span><span class=\"no\">Task<\/span><span class=\"o\">.<\/span><span class=\"n\">async<\/span><span class=\"p\">(<\/span><span class=\"k\">fn<\/span><span class=\"p\">()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"no\">Pi<\/span><span class=\"o\">.<\/span><span class=\"n\">calc_pi_range<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">,<\/span> <span class=\"n\">len<\/span> <span class=\"o\">*<\/span> <span class=\"nv\">&amp;1<\/span><span class=\"p\">,<\/span> <span class=\"n\">len<\/span><span class=\"p\">)<\/span> <span class=\"k\">end<\/span><span class=\"p\">)))<\/span>\r\n      <span class=\"o\">|&gt;<\/span> <span class=\"no\">Enum<\/span><span class=\"o\">.<\/span><span class=\"n\">map<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"p\">(<\/span><span class=\"no\">Task<\/span><span class=\"o\">.<\/span><span class=\"n\">await<\/span><span class=\"p\">(<\/span><span class=\"nv\">&amp;1<\/span><span class=\"p\">,<\/span> <span class=\"nv\">@timeout<\/span><span class=\"p\">)))<\/span>\r\n      <span class=\"o\">|&gt;<\/span> <span class=\"no\">Enum<\/span><span class=\"o\">.<\/span><span class=\"n\">sum<\/span>\r\n    <span class=\"p\">{<\/span><span class=\"ss\">:ok<\/span><span class=\"p\">,<\/span> <span class=\"n\">pi<\/span><span class=\"p\">}<\/span>\r\n  <span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<p>\u30d7\u30ed\u30bb\u30b9\u3092\u7acb\u3061\u4e0a\u3052\u3066\u304b\u3089\u3001\u7d50\u679c\u3092\u8fd4\u3059\u307e\u3067\u306e\u30b3\u30fc\u30c9\u3092\u9806\u306b\u898b\u3066\u307f\u3088\u3046\u3002\u307e\u305a Task.async\/1 \u3067\u30d7\u30ed\u30bb\u30b9\u3092\u7acb\u3061\u4e0a\u3052\u3001<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"n\">pi<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"o\">..<\/span><span class=\"p\">(<\/span><span class=\"n\">num_procs<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\r\n      <span class=\"o\">|&gt;<\/span> <span class=\"no\">Enum<\/span><span class=\"o\">.<\/span><span class=\"n\">map<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"p\">(<\/span><span class=\"no\">Task<\/span><span class=\"o\">.<\/span><span class=\"n\">async<\/span><span class=\"p\">(<\/span><span class=\"k\">fn<\/span><span class=\"p\">()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"no\">Pi<\/span><span class=\"o\">.<\/span><span class=\"n\">calc_pi_range<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">,<\/span> <span class=\"n\">len<\/span> <span class=\"o\">*<\/span> <span class=\"nv\">&amp;1<\/span><span class=\"p\">,<\/span> <span class=\"n\">len<\/span><span class=\"p\">)<\/span> <span class=\"k\">end<\/span><span class=\"p\">)))<\/span>\r\n<\/code><\/pre>\n<p>Task.await\/2 \u3067\u7d50\u679c\u3092\u96c6\u3081\u3001<\/p>\n<pre class=\"post-pre\"><code>      <span class=\"o\">|&gt;<\/span> <span class=\"no\">Enum<\/span><span class=\"o\">.<\/span><span class=\"n\">map<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"p\">(<\/span><span class=\"no\">Task<\/span><span class=\"o\">.<\/span><span class=\"n\">await<\/span><span class=\"p\">(<\/span><span class=\"nv\">&amp;1<\/span><span class=\"p\">,<\/span> <span class=\"nv\">@timeout<\/span><span class=\"p\">)))<\/span>\r\n<\/code><\/pre>\n<p>Enum.sum\/1 \u3067\u5408\u8a08\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>      <span class=\"o\">|&gt;<\/span> <span class=\"no\">Enum<\/span><span class=\"o\">.<\/span><span class=\"n\">sum<\/span>\r\n<\/code><\/pre>\n<p>10\u5104\u5206\u5272\u300110\u30d7\u30ed\u30bb\u30b9\u3067\u306e\u5b9f\u884c\u7d50\u679c\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3002<\/p>\n<pre class=\"post-pre\"><code>iex(2)&gt; :timer.tc(fn() -&gt; Pi.calc_pi_parallel(1_000_000_000, 10) end)\r\n{29298379, {:ok, 3.141592655589816}}\r\n<\/code><\/pre>\n<p>\u7d0429.3\u79d2\u3067\u3001\u30b7\u30f3\u30b0\u30eb\u30d7\u30ed\u30bb\u30b9\u6642\u306e\u7d042.6\u500d\u306e\u901f\u5ea6\u3068\u306a\u3063\u305f\u3002\u8ad6\u7406\u30b3\u30a2\u304c\uff18\u500b\u3068\u306f\u3044\u3048\u3001\u5b9f\u30b3\u30a2\u306f\uff14\u500b\u306a\u306e\u3067\u3001\u3053\u306e\u304f\u3089\u3044\u304c\u73fe\u5b9f\u7684\u306a\u306e\u3060\u308d\u3046\u304b\u3002top \u30b3\u30de\u30f3\u30c9\u3067\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u8868\u793a\u3055\u308c\u305f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">  PID USERNAME       THR PRI NICE   SIZE    RES STATE   C   TIME    WCPU COMMAND\r\n 2921 tatsuya         41  20    0   268M 72688K uwait   2   2:14 710.87% beam.smp\r\n<\/span><\/code><\/pre>\n<p>\u305d\u306e\u5f8c\u3001\u30d7\u30ed\u30bb\u30b9\u6570\u309220\u300140\u3068\u5897\u3084\u3057\u3066\u307f\u305f\u304c\u3001\u7d50\u679c\u306f\u540c\u3058\u3060\u3063\u305f\u3002<\/p>\n<h2>\u305d\u306e\uff13\u3000Elixir\uff1aHiPE \u3067\u30cd\u30a4\u30c6\u30a3\u30d6\u30b3\u30fc\u30c9\u5316<\/h2>\n<p>Elixir \u306e\u307e\u307e\u3001\u3082\u3046\u5c11\u3057\u9811\u5f35\u3063\u3066\u307f\u3088\u3046\u3002\u3068\u3044\u3063\u3066\u3082\u9811\u5f35\u308b\u306e\u306f\u30b3\u30f3\u30d1\u30a4\u30e9\u30fc\u3067\u3042\u3063\u3066\u3001\u79c1\u305f\u3061\u3067\u306f\u306a\u3044\u3002\u30b3\u30fc\u30c9\u306e\u5909\u66f4\u306f\u4e0d\u8981\u3060\u3002<\/p>\n<p>HiPE\uff08High Performance Erlang\uff09\u3092\u4f7f\u3063\u3066\u3001beam\u30d5\u30a1\u30a4\u30eb\u5185\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\u6e08\u307f\u30b3\u30fc\u30c9\u3092\u3001\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u30d0\u30a4\u30c8\u30b3\u30fc\u30c9\u304b\u3089\u3001\u30cd\u30a4\u30c6\u30a3\u30d6\u30b3\u30fc\u30c9\u306b\u5909\u63db\u3059\u308b\u3002\u306a\u304a\u3001\u3053\u306e\u6a5f\u80fd\u3092\u4f7f\u3046\u305f\u3081\u306b\u306f\u3001Erlang\/OTP \u306e\u30d3\u30eb\u30c9\u6642\u306b\u3001&#8211;enable-hipe \u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u4e0e\u3048\u3066\u304a\u304b\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u3002\u307e\u305f\u3001&#8211;enable-native-libs \u3082\u6307\u5b9a\u3059\u308b\u3068\u3001Erlang\/OTP \u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u306e\u5927\u534a(\uff1f)\u304c HiPE \u3067\u30b3\u30f3\u30d1\u30a4\u30eb\u3055\u308c\u308b\u3002<\/p>\n<p>\u3067\u306f\u3001iex \u3092\u7acb\u3061\u4e0a\u3052\u305f\u307e\u307e\u3001\u8a72\u5f53\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u307f HiPE \u5316\u3057\u3088\u3046\u3002\u5225\u306e\u30bf\u30fc\u30df\u30ca\u30eb\u304b\u3089\u3001\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">cd elixir_rust_interop_demo\r\nERL_COMPILER_OPTIONS=\"[native, {hipe, [o3]}]\" elixirc -o _build\/dev\/lib\/elixir_rust_interop_demo\/ebin\/ lib\/pi.ex\r\n<\/span><\/code><\/pre>\n<p>iex \u304b\u3089\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u30ea\u30ed\u30fc\u30c9\u3057\u3066\u3001\u518d\u5ea6\u5b9f\u884c\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>iex(3)&gt; l Pi\r\n{:module, Pi}\r\niex(4)&gt; :code.is_module_native(Pi)\r\ntrue\r\niex(5)&gt; :timer.tc(fn() -&gt; Pi.calc_pi_parallel(1_000_000_000, 10) end)\r\n{15226457, {:ok, 3.141592655589816}}\r\n<\/code><\/pre>\n<p>\u5b9f\u884c\u6642\u9593\u306f\u7d0415\u79d2\u3068\u3044\u3046\u3053\u3068\u3067\u3001HiPE \u524d\u3068\u6bd4\u3079\u308b\u3068\u7d041.9\u500d\u306e\u5b9f\u884c\u901f\u5ea6\u306b\u306a\u3063\u305f\u3002\u3053\u306e\u3088\u3046\u306b\u8a08\u7b97\u304c\u91cd\u3044\uff08CPU bound \u306a\uff09\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u306f\u3001HiPE \u306e\u52b9\u679c\u304c\u5927\u304d\u304f\u3067\u308b\u3002<\/p>\n<h2>\u305d\u306e\uff14\u3000Elixir \u304b\u3089 Rust \u306e\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u547c\u3073\u51fa\u3059<\/h2>\n<p>\u3067\u306f\u3044\u3088\u3044\u3088 Rust \u3067\u66f8\u3044\u3066\u307f\u308b\u3002\u307e\u305a\u3001Rust \u95a2\u9023\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u683c\u7d0d\u3059\u308b\u5834\u6240\u3092\u4f5c\u308d\u3046\u3002<\/p>\n<h3>rust_src \u3068 priv \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3092\u8ffd\u52a0\u3059\u308b<\/h3>\n<p>Elixir \u3084 Erlang \u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3067 C\u8a00\u8a9e\u306e\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u683c\u7d0d\u3059\u308b\u6642\u306f\u3001c_src \u3068\u3044\u3046\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3092\u4f7f\u3046\u306e\u304c\u4e00\u822c\u7684\u3060\u3002\u305d\u308c\u306b\u306a\u3089\u3063\u3066\u3001rust_src \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3092\u4f7f\u3046\u3053\u3068\u306b\u3059\u308b\u3002<\/p>\n<p>Rust \u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092 Cargo \u3067\u4f5c\u6210\u3059\u308b\u3002elixir_rust_interop_demo \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u5185\u3067\u3001\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">cargo new --name pi rust_src\r\n<\/span><\/code><\/pre>\n<p>\u3055\u3089\u306b\u3001Rust \u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30d3\u30eb\u30c9\u3067\u4f5c\u6210\u3055\u308c\u308b\u6210\u679c\u7269\uff08\u52d5\u7684\u30ed\u30fc\u30c9\u306e\u5171\u6709\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\uff09\u3092\u683c\u7d0d\u3059\u308b\u305f\u3081\u306b\u3001priv \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u7528\u610f\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"go\">mkdir priv\r\ntouch priv\/.gitsave\r\n<\/span><\/code><\/pre>\n<p>\u3053\u306e\u5f8c\u3001\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u8ffd\u52a0\u3057\u3066\u3044\u304f\u3068\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u69cb\u6210\u306b\u306a\u308b\u306f\u305a\u3060\u3002<\/p>\n<pre class=\"post-pre\"><code>elixir_rust_interop_demo\r\n\u251c\u2500\u2500 README.md\r\n\u251c\u2500\u2500 _build\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ...\r\n\u251c\u2500\u2500 config\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 config.exs\r\n\u251c\u2500\u2500 lib\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 pi.ex         &lt;-- \u3044\u307e\u307e\u3067\u66f8\u3044\u305f Elixir \u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 pi_nif.ex     &lt;-- \u3053\u308c\u304b\u3089\u8ffd\u52a0\u3059\u308b Elixir \u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\r\n\u251c\u2500\u2500 mix.exs\r\n\u251c\u2500\u2500 priv\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 libpi_nif.so  &lt;-- \u30b3\u30f3\u30d1\u30a4\u30eb\u6e08\u307f\u306e Rust \u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u683c\u7d0d\u3055\u308c\u305f\u3001\u5171\u6709\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\r\n\u251c\u2500\u2500 rust_src\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 Cargo.lock\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 Cargo.toml\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 src\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 lib.rs    &lt;-- \u3053\u308c\u304b\u3089\u8ffd\u52a0\u3059\u308b Rust \u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 pi.rs     &lt;-- \u3053\u308c\u304b\u3089\u8ffd\u52a0\u3059\u308b Rust \u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 target\r\n\u2502\u00a0\u00a0     \u2514\u2500\u2500 ...\r\n\u2514\u2500\u2500 test\r\n<\/code><\/pre>\n<h3>\u5186\u5468\u7387\u8fd1\u4f3c\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u79fb\u690d<\/h3>\n<p>\u307e\u305a\u306f\u3001Elixir \u306e\u30de\u30eb\u30c1\u30d7\u30ed\u30bb\u30b9\u7248\u30d7\u30ed\u30b0\u30e9\u30e0\u3092 Rust \u306b\u79fb\u690d\u3059\u308b\u3002rust_src\/src\/pi.rs \u30d5\u30a1\u30a4\u30eb\u306b\u66f8\u3044\u3066\u3044\u304f\u304c\u3001\u3053\u308c\u306f\u7c21\u5358\u306a\u4f5c\u696d\u3060\u3002\u3068\u3044\u3046\u306e\u306f\u3001Rust \u306f Elixir \u3068\u540c\u69d8\u306b\u30e2\u30c0\u30f3\u306a\u8a00\u8a9e\u3067\u3001\u3057\u304b\u3082\u95a2\u6570\u578b\u8a00\u8a9e\u306e\u5f71\u97ff\u3092\u5f37\u304f\u53d7\u3051\u3066\u3044\u308b\u304b\u3089\u3060\u3002\u307b\u3068\u3093\u3069\u540c\u3058\u611f\u899a\u3067\u66f8\u3051\u308b\u3002<\/p>\n<p>calc_pi_range() \u306f Elixir \u3068\u307b\u3068\u3093\u3069\u540c\u3058\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">fn<\/span> <span class=\"nf\">calc_pi_range<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">:<\/span> <span class=\"nb\">u32<\/span><span class=\"p\">,<\/span> <span class=\"n\">offset<\/span><span class=\"p\">:<\/span> <span class=\"nb\">u32<\/span><span class=\"p\">,<\/span> <span class=\"n\">count<\/span><span class=\"p\">:<\/span> <span class=\"nb\">u32<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"nb\">f64<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">let<\/span> <span class=\"n\">w<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">1.0<\/span> <span class=\"o\">\/<\/span> <span class=\"p\">(<\/span><span class=\"n\">n<\/span> <span class=\"k\">as<\/span> <span class=\"nb\">f64<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"k\">let<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">s<\/span> <span class=\"o\">=<\/span> <span class=\"mf\">0.0<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">for<\/span> <span class=\"n\">i<\/span> <span class=\"n\">in<\/span> <span class=\"n\">offset<\/span><span class=\"o\">..<\/span><span class=\"p\">(<\/span><span class=\"n\">offset<\/span> <span class=\"o\">+<\/span> <span class=\"n\">count<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">let<\/span> <span class=\"n\">x<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">i<\/span> <span class=\"k\">as<\/span> <span class=\"nb\">f64<\/span><span class=\"p\">)<\/span> <span class=\"o\">*<\/span> <span class=\"n\">w<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"n\">s<\/span> <span class=\"o\">+=<\/span> <span class=\"p\">(<\/span><span class=\"mf\">1.0<\/span> <span class=\"o\">-<\/span> <span class=\"n\">x<\/span> <span class=\"o\">*<\/span> <span class=\"n\">x<\/span><span class=\"p\">)<\/span><span class=\"nf\">.sqrt<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"mf\">4.0<\/span> <span class=\"o\">*<\/span> <span class=\"n\">w<\/span> <span class=\"o\">*<\/span> <span class=\"n\">s<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u3082\u3046\u4e00\u65b9\u306e calc_pi_parallel() \u3082\u3001\u304b\u306a\u308a\u4f3c\u3066\u3044\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">use<\/span> <span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"n\">thread<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">const<\/span> <span class=\"n\">MAX_THREADS<\/span><span class=\"p\">:<\/span> <span class=\"nb\">u32<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">64<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"nd\">#[allow(dead_code)]<\/span>\r\n<span class=\"k\">pub<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">calc_pi_parallel<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">:<\/span> <span class=\"nb\">u32<\/span><span class=\"p\">,<\/span> <span class=\"n\">num_threads<\/span><span class=\"p\">:<\/span> <span class=\"nb\">u32<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">Result<\/span><span class=\"o\">&lt;<\/span><span class=\"nb\">f64<\/span><span class=\"p\">,<\/span> <span class=\"nb\">String<\/span><span class=\"o\">&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"n\">num_threads<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">||<\/span> <span class=\"n\">num_threads<\/span> <span class=\"o\">&gt;<\/span> <span class=\"n\">MAX_THREADS<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nf\">Err<\/span><span class=\"p\">(<\/span><span class=\"nd\">format!<\/span><span class=\"p\">(<\/span><span class=\"s\">\"Invalid num_threads {}. It must be &gt; 0 and &lt;= {}\"<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">num_threads<\/span><span class=\"p\">,<\/span> <span class=\"n\">MAX_THREADS<\/span><span class=\"p\">))<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"k\">if<\/span> <span class=\"n\">n<\/span> <span class=\"o\">%<\/span> <span class=\"n\">num_threads<\/span> <span class=\"o\">!=<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nf\">Err<\/span><span class=\"p\">(<\/span><span class=\"nd\">format!<\/span><span class=\"p\">(<\/span><span class=\"s\">\"n {} must be a multiple of num_threads {}\"<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">n<\/span><span class=\"p\">,<\/span> <span class=\"n\">num_threads<\/span><span class=\"p\">))<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"k\">else<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">let<\/span> <span class=\"n\">len<\/span> <span class=\"o\">=<\/span> <span class=\"n\">n<\/span> <span class=\"o\">\/<\/span> <span class=\"n\">num_threads<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"k\">let<\/span> <span class=\"n\">handles<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"mi\">_<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"o\">..<\/span><span class=\"n\">num_threads<\/span><span class=\"p\">)<\/span><span class=\"nf\">.map<\/span><span class=\"p\">(|<\/span><span class=\"n\">i<\/span><span class=\"p\">|<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nn\">thread<\/span><span class=\"p\">::<\/span><span class=\"nf\">spawn<\/span><span class=\"p\">(<\/span><span class=\"k\">move<\/span> <span class=\"p\">||<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"nf\">calc_pi_range<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">,<\/span> <span class=\"n\">len<\/span> <span class=\"o\">*<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"n\">len<\/span><span class=\"p\">)<\/span>\r\n            <span class=\"p\">})<\/span>\r\n        <span class=\"p\">})<\/span><span class=\"nf\">.collect<\/span><span class=\"p\">();<\/span>\r\n\r\n        <span class=\"k\">let<\/span> <span class=\"n\">results<\/span> <span class=\"o\">=<\/span> <span class=\"n\">handles<\/span><span class=\"nf\">.into_iter<\/span><span class=\"p\">()<\/span><span class=\"nf\">.map<\/span><span class=\"p\">(|<\/span><span class=\"n\">h<\/span><span class=\"p\">|<\/span> <span class=\"p\">{<\/span> <span class=\"n\">h<\/span><span class=\"nf\">.join<\/span><span class=\"p\">()<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">()<\/span> <span class=\"p\">});<\/span>\r\n        <span class=\"c\">\/\/ std::iter::Iterator \u306e sum() \u306f Rust 1.5 \u3067\u306f unstable \u306b<\/span>\r\n        <span class=\"c\">\/\/ \u6307\u5b9a\u3055\u308c\u3066\u304a\u308a\u4f7f\u3048\u306a\u3044\u3002\u4ee3\u308f\u308a\u306b fold() \u3092\u4f7f\u3046\u3002<\/span>\r\n        <span class=\"k\">let<\/span> <span class=\"n\">pi<\/span><span class=\"p\">:<\/span> <span class=\"nb\">f64<\/span> <span class=\"o\">=<\/span> <span class=\"n\">results<\/span><span class=\"nf\">.into_iter<\/span><span class=\"p\">()<\/span><span class=\"nf\">.fold<\/span><span class=\"p\">(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"p\">|<\/span><span class=\"n\">acc<\/span><span class=\"p\">,<\/span> <span class=\"n\">p<\/span><span class=\"p\">|<\/span> <span class=\"p\">{<\/span> <span class=\"n\">acc<\/span> <span class=\"o\">+<\/span> <span class=\"n\">p<\/span> <span class=\"p\">});<\/span>\r\n        <span class=\"nf\">Ok<\/span><span class=\"p\">(<\/span><span class=\"n\">pi<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u306e\u5b9f\u884c\u904e\u7a0b\u306b\u3064\u3044\u3066\u3001Eixir \u3068\u5bfe\u6bd4\u3055\u305b\u3066\u307f\u3088\u3046\u3002<\/p>\n<p>\u307e\u305a\u3001num_threads \u500b\u306e\u30d7\u30ed\u30bb\u30b9\u3092\u7acb\u3061\u4e0a\u3052\u3001calc_pi_range\/3 \u3092 parallel \u306b\u5b9f\u884c\u3059\u308b\u90e8\u5206\u3002\u3069\u3061\u3089\u3082\u30b7\u30fc\u30b1\u30f3\u30b9\u578b\u306b map \u3092\u9069\u7528\u3057\u3001Task.async\/1 \u307e\u305f\u306f thread::spawn() \u3067\u30b9\u30ec\u30c3\u30c9\u3092\u8d77\u52d5\u3057\u3066\u3044\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"n\">pi<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span><span class=\"o\">..<\/span><span class=\"p\">(<\/span><span class=\"n\">num_procs<\/span> <span class=\"o\">-<\/span> <span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\r\n      <span class=\"o\">|&gt;<\/span> <span class=\"no\">Enum<\/span><span class=\"o\">.<\/span><span class=\"n\">map<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"p\">(<\/span><span class=\"no\">Task<\/span><span class=\"o\">.<\/span><span class=\"n\">async<\/span><span class=\"p\">(<\/span><span class=\"k\">fn<\/span><span class=\"p\">()<\/span> <span class=\"o\">-&gt;<\/span> <span class=\"no\">Pi<\/span><span class=\"o\">.<\/span><span class=\"n\">calc_pi_range<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">,<\/span> <span class=\"n\">len<\/span> <span class=\"o\">*<\/span> <span class=\"nv\">&amp;1<\/span><span class=\"p\">,<\/span> <span class=\"n\">len<\/span><span class=\"p\">)<\/span> <span class=\"k\">end<\/span><span class=\"p\">)))<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>        <span class=\"k\">let<\/span> <span class=\"n\">handles<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Vec<\/span><span class=\"o\">&lt;<\/span><span class=\"mi\">_<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"o\">..<\/span><span class=\"n\">num_threads<\/span><span class=\"p\">)<\/span><span class=\"nf\">.map<\/span><span class=\"p\">(|<\/span><span class=\"n\">i<\/span><span class=\"p\">|<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nn\">thread<\/span><span class=\"p\">::<\/span><span class=\"nf\">spawn<\/span><span class=\"p\">(<\/span><span class=\"k\">move<\/span> <span class=\"p\">||<\/span> <span class=\"p\">{<\/span>\r\n                <span class=\"nf\">calc_pi_range<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span><span class=\"p\">,<\/span> <span class=\"n\">len<\/span> <span class=\"o\">*<\/span> <span class=\"n\">i<\/span><span class=\"p\">,<\/span> <span class=\"n\">len<\/span><span class=\"p\">)<\/span>\r\n            <span class=\"p\">})<\/span>\r\n        <span class=\"p\">})<\/span><span class=\"nf\">.collect<\/span><span class=\"p\">();<\/span>\r\n<\/code><\/pre>\n<p>\u306a\u304a\u3001Rust \u3067\u306f\u8efd\u91cf\u30d7\u30ed\u30bb\u30b9\uff08\u30b0\u30ea\u30fc\u30f3\u30fb\u30b9\u30ec\u30c3\u30c9\uff09\u3067\u306f\u306a\u304f\u3001OS\u304c\u63d0\u4f9b\u3059\u308b\u30cd\u30a4\u30c6\u30a3\u30d6\u30fb\u30b9\u30ec\u30c3\u30c9\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u306e\u3067\u3001Elixir \u306e\u3088\u3046\u306b\u6570\u767e\u4e07\u500b\u306e\u30d7\u30ed\u30bb\u30b9\u3092\u7a3c\u50cd\u3055\u305b\u308b\u3068\u3044\u3063\u305f\u82b8\u5f53\u306f\u3067\u304d\u306a\u3044\u3002\u4eca\u56de\u306f\u91cd\u3044\u8a08\u7b97\u51e6\u7406\u306a\u306e\u3067\u3001\u8ad6\u7406\u30b3\u30a2\u6570\u3092\u5c11\u3057\u8d85\u3048\u308b\u304f\u3089\u3044\u306e\u30b9\u30ec\u30c3\u30c9\u3092\u8d70\u3089\u305b\u308c\u3070\u5341\u5206\u306a\u306e\u3067\u3001\u3053\u308c\u3067\u554f\u984c\u306a\u3044\u3002<\/p>\n<p>\u3061\u306a\u307f\u306b\u3001Rust \u306e\u7121\u540d\u95a2\u6570\u30d6\u30ed\u30c3\u30af\u306f\u3001Ruby \u306e\u6587\u6cd5\u3092\u53c2\u8003\u306b\u3057\u305f\u305d\u3046\u3060\u3002<\/p>\n<p>\u7d50\u679c\u3092\u96c6\u3081\u308b\u90e8\u5206\u3002\u3069\u3061\u3089\u3082\u30b9\u30ec\u30c3\u30c9\u306e\u30cf\u30f3\u30c9\u30eb\u306b map \u3092\u9069\u7528\u3002Task.await\/2 \u3068 join() \u304c\u5bfe\u5fdc\u3057\u3066\u3044\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>      <span class=\"o\">|&gt;<\/span> <span class=\"no\">Enum<\/span><span class=\"o\">.<\/span><span class=\"n\">map<\/span><span class=\"p\">(<\/span><span class=\"o\">&amp;<\/span><span class=\"p\">(<\/span><span class=\"no\">Task<\/span><span class=\"o\">.<\/span><span class=\"n\">await<\/span><span class=\"p\">(<\/span><span class=\"nv\">&amp;1<\/span><span class=\"p\">,<\/span> <span class=\"nv\">@timeout<\/span><span class=\"p\">)))<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>        <span class=\"k\">let<\/span> <span class=\"n\">results<\/span> <span class=\"o\">=<\/span> <span class=\"n\">handles<\/span><span class=\"nf\">.into_iter<\/span><span class=\"p\">()<\/span><span class=\"nf\">.map<\/span><span class=\"p\">(|<\/span><span class=\"n\">h<\/span><span class=\"p\">|<\/span> <span class=\"p\">{<\/span> <span class=\"n\">h<\/span><span class=\"nf\">.join<\/span><span class=\"p\">()<\/span><span class=\"nf\">.unwrap<\/span><span class=\"p\">()<\/span> <span class=\"p\">});<\/span>\r\n<\/code><\/pre>\n<p>\u5408\u8a08\u3059\u308b\u90e8\u5206\u3002<\/p>\n<pre class=\"post-pre\"><code>      <span class=\"o\">|&gt;<\/span> <span class=\"no\">Enum<\/span><span class=\"o\">.<\/span><span class=\"n\">sum<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>        <span class=\"c\">\/\/ std::iter::Iterator \u306e sum() \u306f Rust 1.5 \u3067\u306f unstable \u306b<\/span>\r\n        <span class=\"c\">\/\/ \u6307\u5b9a\u3055\u308c\u3066\u304a\u308a\u4f7f\u3048\u306a\u3044\u3002\u4ee3\u308f\u308a\u306b fold() \u3092\u4f7f\u3046\u3002<\/span>\r\n        <span class=\"k\">let<\/span> <span class=\"n\">pi<\/span><span class=\"p\">:<\/span> <span class=\"nb\">f64<\/span> <span class=\"o\">=<\/span> <span class=\"n\">results<\/span><span class=\"nf\">.into_iter<\/span><span class=\"p\">()<\/span><span class=\"nf\">.fold<\/span><span class=\"p\">(<\/span><span class=\"mf\">0.0<\/span><span class=\"p\">,<\/span> <span class=\"p\">|<\/span><span class=\"n\">acc<\/span><span class=\"p\">,<\/span> <span class=\"n\">p<\/span><span class=\"p\">|<\/span> <span class=\"p\">{<\/span> <span class=\"n\">acc<\/span> <span class=\"o\">+<\/span> <span class=\"n\">p<\/span> <span class=\"p\">});<\/span>\r\n<\/code><\/pre>\n<p>Rust 1.5 \u3067\u306f\u3001\u6a19\u6e96\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u4ed5\u69d8\u3068\u5b9f\u88c5\u306e\u5b89\u5b9a\u5316\u306e\u771f\u3063\u6700\u4e2d\u3067\u3001\u975e\u5b89\u5b9a\uff08unstable\uff09\u306b\u6307\u5b9a\u3055\u308c\u305f sum() \u306f\u3001\u5b89\u5b9a\u7248\u306e Rust \u3067\u306f\u4f7f\u7528\u3067\u304d\u306a\u3044\u3002\u4eca\u56de\u306f Elixir \u306e reduce\/3 \u306b\u76f8\u5f53\u3059\u308b fold() \u3092\u4f7f\u3063\u305f\u304c\u3001\u5b89\u5b9a\u5316\u304c\u9032\u3081\u3070\u3001\u3053\u3053\u306f sum() \u3067\u7f6e\u304d\u63db\u3048\u3089\u308c\u308b\u3088\u3046\u306b\u306a\u308b\u3002<\/p>\n<p>calc_pi_parallel() \u306f\u7d50\u679c\u3092 Result&lt;f64, String&gt; \u578b\u3067\u8fd4\u3059\u3002\u3053\u306e\u578b\u306f\u5931\u6557\u3059\u308b\u304b\u3082\u3057\u308c\u306a\u3044\u51e6\u7406\u3092\u6697\u793a\u3057\u3066\u304a\u308a\u3001\u6210\u529f\u6642\u306f Ok \u304c\u3001\u5931\u6557\u6642\u306f Err(String) \u304c\u8fd4\u308b\u3002Haskell \u3084 Scala \u306e Either \u578b\u3068\u540c\u3058\u30b3\u30f3\u30bb\u30d7\u30c8\u3060\u3002<\/p>\n<h3>Rust \u306a\u3069\u306e\u30cd\u30a4\u30c6\u30a3\u30d6\u95a2\u6570\u3092 Elixir \u304b\u3089\u547c\u3073\u51fa\u3059\uff13\u3064\u306e\u65b9\u6cd5<\/h3>\n<p>Elixir \u3084 Erlang \u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u3089\u3001Rust \u3084 C \u8a00\u8a9e\u306a\u3069\u3067\u66f8\u304b\u308c\u305f\u30cd\u30a4\u30c6\u30a3\u30d6\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u547c\u3073\u51fa\u306b\u306f\u3001\uff13\u3064\u306e\u65b9\u6cd5\u304b\u3042\u308b\u3002<\/p>\n<p>Port Driver\uff1a \u6307\u5b9a\u3057\u305f\u30d7\u30ed\u30b0\u30e9\u30e0\u3092 Erlang VM \u3068\u306f\u5225\u306e\u30d7\u30ed\u30bb\u30b9\u3068\u3057\u3066\u7acb\u3061\u4e0a\u3052\u3001\u6a19\u6e96\u5165\u529b\u3068\u6a19\u6e96\u51fa\u529b\u3092\u4ecb\u3057\u3066\u60c5\u5831\u3092\u3084\u308a\u53d6\u308a\u3059\u308b\u65b9\u6cd5\u3002\u305f\u3068\u3048\u3070\u3001\u30d3\u30eb\u30c9\u30c4\u30fc\u30eb\u306e Mix \u3084 Rebar \u304c\u5916\u90e8\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u3068\u304d\u306b\u306f\u3053\u306e\u65b9\u6cd5\u3092\u4f7f\u3063\u3066\u3044\u308b\u3002<\/p>\n<p>Port Linked-In Driver: \u5171\u6709\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u3092 Erlang VM \u306b\u8aad\u307f\u8fbc\u3093\u3067\u5b9f\u884c\u3059\u308b\u65b9\u6cd5\u306e\u3072\u3068\u3064\u3002\u53e4\u304f\u304b\u3089\u3042\u308a\u5341\u5206\u5b89\u5b9a\u3057\u3066\u3044\u308b\u3002OTP\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3084\u30d5\u30a1\u30a4\u30ebIO\u306e\u30c9\u30e9\u30a4\u30d0\u30fc\u304c\u3053\u306e\u65b9\u5f0f\u3067\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b\u3002API\u304c\u82e5\u5e72\u8907\u96d1\u3060\u304c\u3001\u975e\u540c\u671f\u6027\u304c\u9ad8\u3044\u64cd\u4f5c\u3092\u5b9f\u88c5\u3057\u3084\u3059\u3044\u3002<\/p>\n<p>NIF (Native Implemented Function): \u5171\u6709\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u3092 Erlang VM \u306b\u8aad\u307f\u8fbc\u3093\u3067\u3001\u5b9f\u884c\u3059\u308b\u3082\u3046\u3072\u3068\u3064\u306e\u65b9\u6cd5\u3002API\u304c\u6bd4\u8f03\u7684\u5358\u7d14\u3067\u3001\u30cd\u30a4\u30c6\u30a3\u30d6\u95a2\u6570\u3092\u540c\u671f\u5f0f\u306b\u547c\u3073\u51fa\u3059\u6642\u306b\u4fbf\u5229\u3002<\/p>\n<p>Port Driver \u306f\u901a\u4fe1\u3092\u4ecb\u3059\u306e\u3067\u6027\u80fd\u9762\u3067\u306f\u4e0d\u5229\u3060\u304c\u3001\u5916\u90e8\u30b3\u30de\u30f3\u30c9\u304c\u30af\u30e9\u30c3\u30b7\u30e5\u3057\u3066\u3082 Erlang VM \u306b\u5f71\u97ff\u304c\u306a\u3044\u306e\u304c\u5229\u70b9\u3060\u3002<\/p>\n<p>\u4ed6\u306e\uff12\u3064\u306e\u65b9\u6cd5\u306f\u52b9\u7387\u304c\u3044\u3044\u53cd\u9762\u3001\u30cd\u30a4\u30c6\u30a3\u30d6\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u30af\u30e9\u30c3\u30b7\u30e5\u3059\u308b\u3068\u3001Erlang VM \u307e\u3067\u30af\u30e9\u30c3\u30b7\u30e5\u3057\u3066\u3057\u307e\u3046\u306e\u3067\u3001\u5b9f\u88c5\u306b\u7d30\u5fc3\u306e\u6ce8\u610f\u3092\u6255\u3046\u5fc5\u8981\u304c\u3042\u308b\u3002\u307e\u305f\u3069\u3061\u3089\u3082\u3001\u30cd\u30a4\u30c6\u30a3\u30d6\u95a2\u6570\u304c\u547c\u3073\u3060\u3055\u308c\u3066\u304b\u3089 1ms \u4ee5\u5185\u306b Erlang VM \u306b\u5236\u5fa1\u3092\u623b\u3055\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u3068\u3044\u3046\u5236\u7d04\u304c\u3042\u308b\u3002\u3053\u308c\u306b\u3064\u3044\u3066\u306f\u3001\u3044\u304f\u3064\u304b\u306e\u5bfe\u5fdc\u6cd5\u304c\u3042\u308b\u306e\u3060\u304c\u3001\u305d\u308c\u306f\u5f8c\u65e5\u3001\u5225\u306e\u8a18\u4e8b\u306b\u307e\u3068\u3081\u3088\u3046\u3068\u601d\u30463\u3002<\/p>\n<p>\u4eca\u56de\u306f NIF \u3092\u4f7f\u3063\u3066\u5b9f\u88c5\u3059\u308b\u30021ms \u4ee5\u5185\u306b\u8fd4\u7b54\u5236\u7d04\u306e\u5bfe\u7b56\u3068\u3057\u3066\u3001Erlang\/OTP 17.0 \u304b\u3089\u5b9f\u9a13\u7684\u306b\u5c0e\u5165\u3055\u308c\u305f\u300cdirty scheduler\u300d\u306e\u6a5f\u80fd\u3092\u4f7f\u3046\u3002\u3053\u306e\u65b9\u6cd5\u3060\u3068\u30011ms \u306e\u5236\u7d04\u3092\u7121\u8996\u3057\u3066\u3082\u3001\u4e00\u5fdc\u3001\u554f\u984c\u306a\u304f\u52d5\u304f\u3082\u306e\u304c\u3067\u304d\u308b\u3002dirty scheduler \u3092\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u3001Erlang\/OTP \u306e\u30d3\u30eb\u30c9\u6642\u306b &#8211;enable-dirty-schedulers \u3092\u6307\u5b9a\u3059\u308b\u3002<\/p>\n<h3>Elixir \u5074\u3067 NIF \u3092\u547c\u3073\u51fa\u3059\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9a\u7fa9\u3059\u308b<\/h3>\n<p>\u307e\u305a\u3001Elixir \u5074\u3067\u3044\u307e\u307e\u3067 Pi \u3068\u3044\u3046\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u4f7f\u3063\u3066\u3044\u305f\u306e\u3060\u304c\u3001NIF \u7528\u306b\u65b0\u3057\u3044\u30e2\u30b8\u30e5\u30fc\u30eb PiNif \u3092\u7528\u610f\u3059\u308b\u3002\u3068\u3044\u3046\u306e\u306f\u3001HiPE \u3068 NIF \u306e\u76f8\u6027\u304c\u60aa\u304f\u3001HiPE \u3067\u30b3\u30f3\u30d1\u30a4\u30eb\u3057\u305f\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u3001NIF \u306e\u5171\u6709\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u3092\u30ed\u30fc\u30c9\u3057\u3088\u3046\u3068\u3059\u308b\u3068\u3001\u30a8\u30e9\u30fc\u306b\u306a\u3063\u3066\u3057\u307e\u3046\u304b\u3089\u30604\u3002HiPE \u7528\u3068\u3001NIF \u7528\u306b Elixir \u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5206\u3051\u308b\u5fc5\u8981\u304c\u3042\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">defmodule<\/span> <span class=\"no\">PiNif<\/span> <span class=\"k\">do<\/span>\r\n\r\n  <span class=\"nv\">@on_load<\/span>   <span class=\"ss\">:init<\/span>\r\n\r\n  <span class=\"nv\">@mod<\/span>       <span class=\"no\">PiNif<\/span>\r\n  <span class=\"nv\">@lib_name<\/span>  <span class=\"s1\">'pi_nif'<\/span>  <span class=\"c1\"># char list<\/span>\r\n\r\n  <span class=\"nv\">@spec<\/span> <span class=\"n\">calc_pi_parallel<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span> <span class=\"p\">::<\/span> <span class=\"n\">non_neg_integer<\/span><span class=\"p\">,<\/span>\r\n                         <span class=\"n\">num_threads<\/span> <span class=\"p\">::<\/span> <span class=\"n\">non_neg_integer<\/span><span class=\"p\">)<\/span>\r\n                        <span class=\"p\">::<\/span> <span class=\"p\">{<\/span><span class=\"ss\">:ok<\/span><span class=\"p\">,<\/span> <span class=\"n\">pi<\/span> <span class=\"p\">::<\/span> <span class=\"n\">float<\/span><span class=\"p\">}<\/span> <span class=\"o\">|<\/span> <span class=\"p\">{<\/span><span class=\"ss\">:error<\/span><span class=\"p\">,<\/span> <span class=\"n\">term<\/span><span class=\"p\">()}<\/span> <span class=\"o\">|<\/span> <span class=\"n\">no_return<\/span>\r\n  <span class=\"k\">def<\/span> <span class=\"n\">calc_pi_parallel<\/span><span class=\"p\">(<\/span><span class=\"n\">_n<\/span><span class=\"p\">,<\/span> <span class=\"n\">_num_threads<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"ss\">:erlang<\/span><span class=\"o\">.<\/span><span class=\"n\">nif_error<\/span><span class=\"p\">({<\/span><span class=\"ss\">:nif_not_loaded<\/span><span class=\"p\">,<\/span> <span class=\"nv\">@mod<\/span><span class=\"p\">})<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"n\">init<\/span><span class=\"p\">()<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"n\">priv_dir<\/span> <span class=\"o\">=<\/span> <span class=\"k\">case<\/span> <span class=\"ss\">:code<\/span><span class=\"o\">.<\/span><span class=\"n\">priv_dir<\/span><span class=\"p\">(<\/span><span class=\"nv\">@app<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n                 <span class=\"n\">dir<\/span> <span class=\"ow\">when<\/span> <span class=\"n\">is_list<\/span><span class=\"p\">(<\/span><span class=\"n\">dir<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span>\r\n                   <span class=\"n\">dir<\/span>\r\n                 <span class=\"p\">{<\/span><span class=\"ss\">:error<\/span><span class=\"p\">,<\/span> <span class=\"ss\">:bad_name<\/span><span class=\"p\">}<\/span> <span class=\"o\">-&gt;<\/span>\r\n                   <span class=\"k\">case<\/span> <span class=\"ss\">:code<\/span><span class=\"o\">.<\/span><span class=\"n\">which<\/span><span class=\"p\">(<\/span><span class=\"nv\">@mod<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n                     <span class=\"ss\">:bad_name<\/span> <span class=\"o\">-&gt;<\/span>\r\n                       <span class=\"s1\">'.\/priv'<\/span>\r\n                     <span class=\"ss\">:non_existing<\/span> <span class=\"o\">-&gt;<\/span>\r\n                       <span class=\"s1\">'.\/priv'<\/span>\r\n                     <span class=\"n\">dir<\/span> <span class=\"ow\">when<\/span> <span class=\"n\">is_list<\/span><span class=\"p\">(<\/span><span class=\"n\">dir<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span>\r\n                       <span class=\"ss\">:filename<\/span><span class=\"o\">.<\/span><span class=\"n\">join<\/span><span class=\"p\">([<\/span><span class=\"ss\">:filename<\/span><span class=\"o\">.<\/span><span class=\"n\">dirname<\/span><span class=\"p\">(<\/span><span class=\"n\">dir<\/span><span class=\"p\">),<\/span> <span class=\"s1\">'..\/priv'<\/span><span class=\"p\">])<\/span>\r\n                   <span class=\"k\">end<\/span>\r\n               <span class=\"k\">end<\/span>\r\n    <span class=\"n\">so_name<\/span> <span class=\"o\">=<\/span> <span class=\"ss\">:filename<\/span><span class=\"o\">.<\/span><span class=\"n\">join<\/span><span class=\"p\">(<\/span><span class=\"n\">priv_dir<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'lib'<\/span> <span class=\"o\">++<\/span> <span class=\"nv\">@lib_name<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"ss\">:erlang<\/span><span class=\"o\">.<\/span><span class=\"n\">load_nif<\/span><span class=\"p\">(<\/span><span class=\"n\">so_name<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">)<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n<span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<p>\u307e\u305a\u3001@on_load \u3067\u3001\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30ed\u30fc\u30c9\u6642\u306b\u5b9f\u884c\u3055\u308c\u308b\u95a2\u6570\u3092\u6307\u5b9a\u3059\u308b\u3002\u3053\u3053\u3067\u306f\u3001\u3054\u304f\u4e00\u822c\u7684\u306a\u540d\u524d init\/0 \u3068\u3057\u305f\u3002init\/0 \u306f :erlang.load_nif\/2 \u3092\u4f7f\u3063\u3066\u3001Rust \u3067\u66f8\u304b\u308c\u305f libpi_nif.so \u3068\u3044\u3046\u5171\u6709\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u3092\u30ed\u30fc\u30c9\u3059\u308b\u3002<\/p>\n<p>calc_pi_parallel\/2 \u306f\u3001\u3053\u306e\u5f8c Rust \u5074\u3067\u3001\u3053\u308c\u306b\u5bfe\u5fdc\u3059\u308b\u95a2\u6570\u3092\u66f8\u304f\u306e\u3067\u3001\u5171\u6709\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u304c\u30ed\u30fc\u30c9\u3055\u308c\u308b\u3068\u3001\u3053\u306e\u95a2\u6570\u306e\u5185\u5bb9\u304c\u5171\u6709\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u306e\u305d\u308c\u3067\u7f6e\u304d\u63db\u3048\u3089\u308c\u308b\u3002\u3082\u3057\u3046\u307e\u304f\u30ed\u30fc\u30c9\u3067\u304d\u306a\u304b\u3063\u305f\u6642\u306f\u30a8\u30e9\u30fc\u3092\u8fd4\u3057\u305f\u3044\u306e\u3067\u3001\u4e0a\u8a18\u306e\u3088\u3046\u306b :erlang.nif_error\/1 \u3092\u547c\u3076\u3088\u3046\u306b\u3057\u305f\u3002<\/p>\n<h3>NIF \u306e Glue \u95a2\u6570\u3092\u5b9f\u88c5\u3059\u308b<\/h3>\n<p>glue \u95a2\u6570\uff08\u7cca\u4ed8\u3051\u95a2\u6570\uff09\u3068\u3044\u3046\u306e\u306f\u3001\u3044\u307e\u982d\u306b\u6d6e\u304b\u3093\u3060\u8a00\u8449\u306a\u306e\u3067\u3001\u4e00\u822c\u306b\u901a\u7528\u3059\u308b\u8a00\u8449\u304b\u3069\u3046\u304b\u306f\u308f\u304b\u3089\u306a\u3044\u3002\u304c\u3001\u3053\u3053\u3067\u306f\u3001Elixir \u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306b\u66f8\u3044\u305f\u95a2\u6570\u3068\u3001Rust \u306e\u95a2\u6570\u3092\u304f\u3063\u3064\u3051\u308b\u305f\u3081\u306e\u95a2\u6570\u3092\u30a4\u30e1\u30fc\u30b8\u3057\u3066\u3044\u308b\u3002\u3053\u308c\u306f Rust \u3067\u66f8\u304f\u3002NIF \u306e\u5834\u5408\u3067\u3082\u3001Port Linked-In Driver \u306e\u5834\u5408\u3067\u3082\u3001\u305d\u308c\u305e\u308c\u306e\u30eb\u30fc\u30eb\u306b\u6cbf\u3063\u305f glue \u95a2\u6570\u3092\u66f8\u304b\u306a\u3051\u308c\u3070\u52d5\u304b\u306a\u3044\u3002<\/p>\n<p>\u3053\u3053\u306f\u4e00\u901a\u308a\u66f8\u304d\u65b9\u304c\u308f\u304b\u308b\u307e\u3067\u3001\u9762\u5012\u306a\u90e8\u5206\u3060\u3002NIF \u306e API\uff08C\u8a00\u8a9e\u306e\u95a2\u6570\uff09\u3084\u3001Rust \u3067 C\u8a00\u8a9e\u306e\u95a2\u6570\u3092\u547c\u3073\u51fa\u3059\u6642\u306e\u4f5c\u6cd5\u3092\u3088\u304f\u7406\u89e3\u3057\u3066\u3044\u306a\u3044\u3046\u3061\u306f\u3001\u30b3\u30f3\u30d1\u30a4\u30eb\u30a8\u30e9\u30fc\u304c\u591a\u767a\u3059\u308b\u3002\u9006\u306b\u3001\u3044\u3063\u305f\u3093\u30b3\u30f3\u30d1\u30a4\u30eb\u3092\u901a\u3057\u3066\u3057\u307e\u3048\u3070\u3001\u5b9f\u884c\u6642\u306b\u30a8\u30e9\u30fc\u304c\u51fa\u308b\u3053\u3068\u306f\u307e\u305a\u306a\u3044\u306e\u304c Rust \u306e\u3044\u3044\u3068\u3053\u308d\u3060\u3002<\/p>\n<p>\u307e\u305a\u3001Cargo.toml \u306b\u4ee5\u4e0b\u306e\u5185\u5bb9\u3092\u8ffd\u52a0\u3059\u308b\u3002\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u3001Mix \u306e mix.exs \u306b\u76f8\u5f53\u3059\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3060\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nn\">[lib]<\/span>\r\n<span class=\"py\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"pi_nif\"<\/span>\r\n<span class=\"py\">crate-type<\/span> <span class=\"p\">=<\/span> <span class=\"nn\">[\"dylib\"]<\/span>\r\n\r\n<span class=\"nn\">[dependencies]<\/span>\r\n<span class=\"nn\">ruster_unsafe<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"py\">git<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"https:\/\/github.com\/tatsuya6502\/ruster_unsafe\/\"<\/span><span class=\"p\">,<\/span> <span class=\"py\">rev<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"nif-2.9-unmerged\"<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"py\">libc<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\"&gt;=0.2.4\"<\/span>\r\n<\/code><\/pre>\n<p>lib \u30bb\u30af\u30b7\u30e7\u30f3\u306b\u306f\u3001pi_nif \u3068\u3044\u3046\u540d\u524d\u306e\u52d5\u7684\u30ed\u30fc\u30c9\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc(dylib)\u3092\u751f\u6210\u3059\u308b\u3053\u3068\u3092\u6307\u5b9a\u3057\u305f\u3002<\/p>\n<p>dependencies \u30bb\u30af\u30b7\u30e7\u30f3\u3067\u306f\u3001ruster_unsafe \u3068\u3044\u3046\u30af\u30ec\u30fc\u30c8\uff08Rust \u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u3053\u3068\uff09\u3068\u3001libc \u30af\u30ec\u30fc\u30c8\u3092\u4f7f\u3046\u3053\u3068\u3092\u6307\u5b9a\u3057\u305f\u3002ruster_unsafe \u306f &#8220;rust&#8221;-&#8220;er&#8221;\uff08Rust \uff0b Erlang \u306e\u610f\u5473\uff09\u3068\u3044\u3046\u540d\u524d\u306e\u901a\u308a\u3001Rust \u304b\u3089 Erlang \u306e NIF API \u304c\u4f7f\u3048\u308b\u3088\u3046\u306b\u3059\u308b\u305f\u3081\u306e\u3082\u306e\u3060\u3002\u672c\u5bb6\u306b\u307e\u3060\u53d6\u308a\u8fbc\u307e\u308c\u3066\u3044\u306a\u3044\u4fee\u6b63\u304c\u3042\u308b\u306e\u3067\u3001\u4eca\u306f\u79c1\u306e\u30d5\u30a9\u30fc\u30af\u3092\u6307\u5b9a\u3057\u3066\u304a\u304f\u3002libc \u306f Rust \u306e\u95a2\u6570\u3068 C\u8a00\u8a9e\u306e\u95a2\u6570\u306e\u76f8\u4e92\u547c\u3073\u51fa\u3057\u306b\u5fc5\u8981\u3060\u3002<\/p>\n<p>\u6b21\u306b\u3001rust_src\/src\/lib.rs \u30d5\u30a1\u30a4\u30eb\u306b glue \u95a2\u6570\u3092\u66f8\u3044\u3066\u3044\u304f\u3002\u307e\u305a\u59cb\u3081\u306b ruster_unsafe \u304c\u7528\u610f\u3057\u305f NIF \u306e\u521d\u671f\u5316\u30de\u30af\u30ed\u3092\u4f7f\u3046\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nd\">#[macro_use]<\/span>\r\n<span class=\"k\">extern<\/span> <span class=\"n\">crate<\/span> <span class=\"n\">ruster_unsafe<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">use<\/span> <span class=\"nn\">ruster_unsafe<\/span><span class=\"p\">::<\/span><span class=\"o\">*<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"nd\">nif_init!<\/span><span class=\"p\">(<\/span><span class=\"n\">b<\/span><span class=\"s\">\"Elixir.PiNif<\/span><span class=\"se\">\\0<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span>\r\n          <span class=\"nf\">Some<\/span><span class=\"p\">(<\/span><span class=\"n\">load<\/span><span class=\"p\">),<\/span>    <span class=\"c\">\/\/ on load    \uff08\u5fc5\u9808\uff09<\/span>\r\n          <span class=\"nb\">None<\/span><span class=\"p\">,<\/span>          <span class=\"c\">\/\/ on reload<\/span>\r\n          <span class=\"nf\">Some<\/span><span class=\"p\">(<\/span><span class=\"n\">upgrade<\/span><span class=\"p\">),<\/span> <span class=\"c\">\/\/ on upgrade \uff08\u5fc5\u9808\uff09<\/span>\r\n          <span class=\"nb\">None<\/span><span class=\"p\">,<\/span>          <span class=\"c\">\/\/ on unload<\/span>\r\n          <span class=\"nd\">nif!<\/span><span class=\"p\">(<\/span><span class=\"n\">b<\/span><span class=\"s\">\"calc_pi_parallel<\/span><span class=\"se\">\\0<\/span><span class=\"s\">\"<\/span><span class=\"p\">,<\/span>\r\n               <span class=\"mi\">2<\/span><span class=\"p\">,<\/span>\r\n               <span class=\"n\">calc_pi_parallel<\/span><span class=\"p\">,<\/span>\r\n               <span class=\"n\">ERL_NIF_DIRTY_JOB_CPU_BOUND<\/span><span class=\"p\">)<\/span>\r\n         <span class=\"p\">);<\/span>\r\n<\/code><\/pre>\n<p>b&#8221;Elixir.PiNif\\0&#8243; \u304c\u3001NIF \u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u540d\u3002\u3053\u306e\u540d\u524d\u3068\u3001\u547c\u3073\u51fa\u3057\u5074\u306e Elixir \u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u540d\u306f\u540c\u3058\u3067\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u3002Elixir \u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u540d\u306f\u3001defmodule \u3067\u6307\u5b9a\u3057\u305f\u540d\u524d\u306e\u524d\u306b Elixir. \u304c\u4ed8\u304f\u306e\u3067\u3001\u3053\u306e\u540d\u524d\u306b\u306a\u3063\u3066\u3044\u308b\u3002C\u8a00\u8a9e\u306e\u6587\u5b57\u5217\u306a\u306e\u3067 null\u6587\u5b57 \\0 \u3092\u6700\u5f8c\u306b\u3064\u3051\u308b\u3002<\/p>\n<p>\u7b2c\uff12\u5f15\u6570\u304b\u3089\u7b2c\uff15\u5f15\u6570\u306b\u6307\u5b9a\u3057\u305f\u95a2\u6570\u306f\u3001\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30ed\u30fc\u30c9\u6642\u306a\u3069\u306b\u547c\u3070\u308c\u308b \u306e\u3067\u3001\u521d\u671f\u5316\u3084\u3001\u5f8c\u7247\u4ed8\u3051\u304c\u5fc5\u8981\u306a\u6642\u306f\u5b9f\u88c5\u3059\u308b \u3002\u4eca\u56de\u306f\u30ed\u30fc\u30c9\u6642\u306b load() \u95a2\u6570\u3092\u547c\u3076\u3088\u3046\u306b\u3057\u3066\u3001\u4ed6\u306f None \u3068\u3059\u308b\u3053\u3068\u3067\u3001\u306a\u306b\u3082\u547c\u3070\u308c\u306a\u3044\u3088\u3046\u306b\u3057\u305f\u3002\u30002015\u5e741\u670818\u65e5\u4fee\u6b63\uff1a\u3055\u3089\u306b\u3001\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u6642\u306f upgrade() \u95a2\u6570\u3092\u547c\u3076\u3088\u3046\u306b\u3057\u305f\u3002\u4ed6\u306f None \u3068\u3059\u308b\u3053\u3068\u3067\u3001\u306a\u306b\u3082\u547c\u3070\u308c\u306a\u3044\u3088\u3046\u306b\u3057\u305f\u3002\uff08\u7b2c\uff12\u5f15\u6570 on load \u3068\u7b2c\uff14\u5f15\u6570 on upgrade \u306f Option \u578b\u306b\u3082\u304b\u304b\u308f\u3089\u305a\u3001\u5fc5\u9808 \u3067\u3057\u305f\uff09<\/p>\n<p>\u305d\u306e\u6b21\u306e nif!(b&#8221;calc_pi_parallel\\0&#8243; \u304c\u3001Elixir \u306e calc_pi_parallel\/2 \u306b\u5bfe\u5fdc\u3059\u308b Rust \u95a2\u6570\u306e\u60c5\u5831\u306b\u306a\u308b\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Elixir \u5074\u306e\u95a2\u6570\u540d\u304c &#8220;calc_pi_parallel\\0&#8243;\uff08C\u8a00\u8a9e\u306e\u6587\u5b57\u5217\u3067\u8868\u73fe\uff09\u3067\u3001arity \u304c 2<\/ul>\n<\/li>\n<\/ul>\n<p>\u5bfe\u5fdc\u3059\u308b Rust \u95a2\u6570\u304c calc_pi_parallel<\/p>\n<p>CPU bound \u7528\u306e dirty scheduler \u3067\u5b9f\u884c\u3059\u308b\uff08ERL_NIF_DIRTY_JOB_CPU_BOUND\uff09<\/p>\n<p>\u3082\u3057\u3001\u4ed6\u306b\u3082\u95a2\u6570\u304c\u3042\u308b\u306e\u306a\u3089 nif!(&#8230;) \u3092\u7d9a\u3051\u3066\u66f8\u3044\u3066\u3044\u3051\u3070\u3044\u3044\u3002<\/p>\n<p>\u6b21\u306b\u3001load() \u306e\u5b9f\u88c5\u3002calc_pi_parallel() \u304c\u623b\u308a\u5024\u3092\u8fd4\u3059\u6642\u306b\u4f7f\u3046 :ok \u30a2\u30c8\u30e0\u3068 :error \u30a2\u30c8\u30e0\u3092\u521d\u671f\u5316\u3059\u308b\u3002\u306a\u304a\u3001NIF API \u306e\u95a2\u6570\u306f\u3001\u540d\u524d\u304c enif_ \u3067\u59cb\u307e\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">extern<\/span> <span class=\"n\">crate<\/span> <span class=\"n\">libc<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">use<\/span> <span class=\"nn\">libc<\/span><span class=\"p\">::<\/span><span class=\"nb\">c_double<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">static<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">ok_atom<\/span><span class=\"p\">:<\/span>    <span class=\"n\">ERL_NIF_TERM<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span> <span class=\"k\">as<\/span> <span class=\"n\">ERL_NIF_TERM<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">static<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">error_atom<\/span><span class=\"p\">:<\/span> <span class=\"n\">ERL_NIF_TERM<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span> <span class=\"k\">as<\/span> <span class=\"n\">ERL_NIF_TERM<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"c\">\/\/\/ static \u306a\u5909\u6570\u306b\u30a2\u30c8\u30e0\u3092\u8a2d\u5b9a\u3059\u308b\u3002<\/span>\r\n<span class=\"k\">extern<\/span> <span class=\"s\">\"C\"<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">load<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">:<\/span> <span class=\"o\">*<\/span><span class=\"k\">mut<\/span> <span class=\"n\">ErlNifEnv<\/span><span class=\"p\">,<\/span>\r\n                   <span class=\"mi\">_<\/span><span class=\"n\">priv_data<\/span><span class=\"p\">:<\/span> <span class=\"o\">*<\/span><span class=\"k\">mut<\/span> <span class=\"o\">*<\/span><span class=\"k\">mut<\/span> <span class=\"nb\">c_void<\/span><span class=\"p\">,<\/span>\r\n                   <span class=\"mi\">_<\/span><span class=\"n\">load_info<\/span><span class=\"p\">:<\/span> <span class=\"n\">ERL_NIF_TERM<\/span><span class=\"p\">)<\/span><span class=\"k\">-&gt;<\/span> <span class=\"nb\">c_int<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"n\">ok_atom<\/span>    <span class=\"o\">=<\/span> <span class=\"nf\">enif_make_atom<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"s\">\"ok<\/span><span class=\"se\">\\0<\/span><span class=\"s\">\"<\/span>    <span class=\"k\">as<\/span> <span class=\"o\">*<\/span><span class=\"k\">const<\/span> <span class=\"nb\">u8<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"n\">error_atom<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">enif_make_atom<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">,<\/span> <span class=\"n\">b<\/span><span class=\"s\">\"error<\/span><span class=\"se\">\\0<\/span><span class=\"s\">\"<\/span> <span class=\"k\">as<\/span> <span class=\"o\">*<\/span><span class=\"k\">const<\/span> <span class=\"nb\">u8<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"p\">}<\/span>\r\n    <span class=\"mi\">0<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>upgrade() \u306f\u4f55\u3082\u305b\u305a\u3001\u5358\u306b\u6210\u529f\u3092\u8868\u3059 0 \u3092\u8fd4\u3059\u3088\u3046\u306b\u3057\u305f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">extern<\/span> <span class=\"s\">\"C\"<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">upgrade<\/span><span class=\"p\">(<\/span><span class=\"mi\">_<\/span><span class=\"n\">env<\/span><span class=\"p\">:<\/span> <span class=\"o\">*<\/span><span class=\"k\">mut<\/span> <span class=\"n\">ErlNifEnv<\/span><span class=\"p\">,<\/span>\r\n                      <span class=\"mi\">_<\/span><span class=\"n\">priv_data<\/span><span class=\"p\">:<\/span> <span class=\"o\">*<\/span><span class=\"k\">mut<\/span> <span class=\"o\">*<\/span><span class=\"k\">mut<\/span> <span class=\"nb\">c_void<\/span><span class=\"p\">,<\/span>\r\n                      <span class=\"mi\">_<\/span><span class=\"n\">old_priv_data<\/span><span class=\"p\">:<\/span> <span class=\"o\">*<\/span><span class=\"k\">mut<\/span> <span class=\"o\">*<\/span><span class=\"k\">mut<\/span> <span class=\"nb\">c_void<\/span><span class=\"p\">,<\/span>\r\n                      <span class=\"mi\">_<\/span><span class=\"n\">load_info<\/span><span class=\"p\">:<\/span> <span class=\"n\">ERL_NIF_TERM<\/span><span class=\"p\">)<\/span><span class=\"k\">-&gt;<\/span> <span class=\"nb\">c_int<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"mi\">0<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u7d9a\u3044\u3066 calc_pi_parallel() \u306e\u5b9f\u88c5\u3002\u307e\u305a\u3001mod pi; \u3067\u3001pi \u30e2\u30b8\u30e5\u30fc\u30eb\uff08rust_src\/src\/pi.rs\uff09\u306b\u66f8\u3044\u305f\u5186\u5468\u7387\u8a08\u7b97\u306e public \u95a2\u6570\u3092\u4f7f\u3048\u308b\u3088\u3046\u306b\u3059\u308b\u3002<\/p>\n<p>glue \u95a2\u6570\u306b\u306f calc_pi_parallel() \u306e\u3088\u3046\u306b\u3001\uff13\u3064\u306e\u5f15\u6570\u304c\u6e21\u3055\u308c\u308b\u3002env \u304c Erlang \u306e VM \u74b0\u5883\uff08\u30e9\u30f3\u30bf\u30a4\u30e0\uff09\u3092\u8868\u3059\u69cb\u9020\u4f53\u3001argc \u304c\u5f15\u6570\u306e\u6570\u3001args \u304c\u5f15\u6570\u306e\u5165\u3063\u305f\u69cb\u9020\u4f53\u3060\u3002\u623b\u308a\u5024\u306f Erlang \u306e\u30c7\u30fc\u30bf\u3092\u8868\u3059 C\u8a00\u8a9e\u306e\u69cb\u9020\u4f53\u3067\u3001calc_pi_parallel() \u3067\u306f\u3001\u5f15\u6570\u306e\u5024\u306b\u3088\u3063\u3066\u4ee5\u4e0b\u306e\u3069\u308c\u304b\u306b\u306a\u308b\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">{:ok, pi\u306e\u8fd1\u4f3c\u5024\uff08float \u578b\uff09}<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">{:error, \u30a8\u30e9\u30fc\u306e\u5185\u5bb9\u3092\u793a\u3059\u6587\u5b57\u5217}<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">BadArgumentError<\/ul>\n<pre class=\"post-pre\"><code>\r\n<span class=\"k\">use<\/span> <span class=\"nn\">std<\/span><span class=\"p\">::<\/span><span class=\"nn\">mem<\/span><span class=\"p\">::<\/span><span class=\"n\">uninitialized<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"k\">mod<\/span> <span class=\"n\">pi<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"c\">\/\/\/ Elixir: @spec calc_pi_parallel(n :: non_neg_integer,<\/span>\r\n<span class=\"c\">\/\/\/                                num_threads :: non_neg_integer)<\/span>\r\n<span class=\"c\">\/\/\/                               :: {:ok, pi :: float} | {:error, term()} | no_return<\/span>\r\n<span class=\"k\">extern<\/span> <span class=\"s\">\"C\"<\/span> <span class=\"k\">fn<\/span> <span class=\"nf\">calc_pi_parallel<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">:<\/span> <span class=\"o\">*<\/span><span class=\"k\">mut<\/span> <span class=\"n\">ErlNifEnv<\/span><span class=\"p\">,<\/span>\r\n                               <span class=\"n\">argc<\/span><span class=\"p\">:<\/span> <span class=\"nb\">c_int<\/span><span class=\"p\">,<\/span>\r\n                               <span class=\"n\">args<\/span><span class=\"p\">:<\/span> <span class=\"o\">*<\/span><span class=\"k\">const<\/span> <span class=\"n\">ERL_NIF_TERM<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">ERL_NIF_TERM<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">let<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">n<\/span><span class=\"p\">:<\/span> <span class=\"nb\">c_int<\/span> <span class=\"o\">=<\/span> <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"nf\">uninitialized<\/span><span class=\"p\">()<\/span> <span class=\"p\">};<\/span>\r\n    <span class=\"k\">let<\/span> <span class=\"k\">mut<\/span> <span class=\"n\">num_threads<\/span><span class=\"p\">:<\/span> <span class=\"nb\">c_int<\/span> <span class=\"o\">=<\/span> <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"nf\">uninitialized<\/span><span class=\"p\">()<\/span> <span class=\"p\">};<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"n\">argc<\/span> <span class=\"o\">!=<\/span> <span class=\"mi\">2<\/span>\r\n        <span class=\"p\">||<\/span> <span class=\"mi\">0<\/span> <span class=\"o\">==<\/span> <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"nf\">enif_get_int<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">,<\/span> <span class=\"o\">*<\/span><span class=\"n\">args<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"k\">mut<\/span> <span class=\"n\">n<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span>\r\n        <span class=\"p\">||<\/span> <span class=\"mi\">0<\/span> <span class=\"o\">==<\/span> <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"nf\">enif_get_int<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">,<\/span> <span class=\"o\">*<\/span><span class=\"n\">args<\/span><span class=\"nf\">.offset<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">),<\/span> <span class=\"o\">&amp;<\/span><span class=\"k\">mut<\/span> <span class=\"n\">num_threads<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span>\r\n        <span class=\"p\">||<\/span> <span class=\"n\">n<\/span> <span class=\"o\">&lt;=<\/span> <span class=\"mi\">0<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"nf\">enif_make_badarg<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">)<\/span> <span class=\"p\">};<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"k\">match<\/span> <span class=\"nn\">pi<\/span><span class=\"p\">::<\/span><span class=\"nf\">calc_pi_parallel<\/span><span class=\"p\">(<\/span><span class=\"n\">n<\/span> <span class=\"k\">as<\/span> <span class=\"nb\">u32<\/span><span class=\"p\">,<\/span> <span class=\"n\">num_threads<\/span> <span class=\"k\">as<\/span> <span class=\"nb\">u32<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nf\">Ok<\/span><span class=\"p\">(<\/span><span class=\"n\">pi<\/span><span class=\"p\">)<\/span> <span class=\"k\">=&gt;<\/span>\r\n            <span class=\"nf\">make_ok_result<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">,<\/span> <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"o\">&amp;<\/span><span class=\"nf\">enif_make_double<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">,<\/span> <span class=\"n\">pi<\/span> <span class=\"k\">as<\/span> <span class=\"nb\">c_double<\/span><span class=\"p\">)<\/span> <span class=\"p\">}),<\/span>\r\n        <span class=\"nf\">Err<\/span><span class=\"p\">(<\/span><span class=\"n\">reason<\/span><span class=\"p\">)<\/span> <span class=\"k\">=&gt;<\/span>\r\n            <span class=\"nf\">make_error_result<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">,<\/span> <span class=\"o\">&amp;<\/span><span class=\"n\">reason<\/span><span class=\"p\">),<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u6700\u521d\u306e if \u5f0f\u307e\u3067\u3067\u5f15\u6570\u3092\u53d7\u3051\u53d6\u308a\u3001\u5f15\u6570\u306e\u578b\u306a\u3069\u304c\u59a5\u5f53\u304b\u30c1\u30a7\u30c3\u30af\u3092\u3057\u3066\u3044\u308b\u3002<\/p>\n<p>NIF \u306e C API \u3068\u3084\u308a\u3068\u308a\u3092\u3059\u308b\u305f\u3081\u3001unsafe { &#8230; } \u30d6\u30ed\u30c3\u30af\u304c\u4f55\u5ea6\u3082\u4f7f\u308f\u308c\u3066\u3044\u308b\u3002Rust \u306e\u30b3\u30f3\u30d1\u30a4\u30e9\u30fc\u304c\u5b89\u5168\u6027\u3092\u691c\u8a3c\u3067\u304d\u308b\u306e\u306f\u3001Rust \u3067\u66f8\u304b\u308c\u305f\u90e8\u5206\u306e\u307f\u306a\u306e\u3067\u3001\u5916\u90e8\u306e\u95a2\u6570\u306e\u547c\u3073\u51fa\u3057\u3084\u3001C\u8a00\u8a9e\u306e\u751f\u30dd\u30a4\u30f3\u30bf\u30fc\u304c\u793a\u3059\u756a\u5730\u3078\u306e\u30a2\u30af\u30bb\u30b9\u306a\u3069\u306f\u3001\u5bfe\u8c61\u5916\u3068\u306a\u308b\u3002\u3082\u3057 unsafe \u3067\u56f2\u307e\u306a\u3044\u3068\u3001\u5b89\u5168\u6027\u304c\u78ba\u8a8d\u3067\u304d\u306a\u3044\u305f\u3081\u3001\u30b3\u30f3\u30d1\u30a4\u30eb\u30a8\u30e9\u30fc\u3068\u306a\u3063\u3066\u3057\u307e\u3046\u3002<\/p>\n<p>unsafe \u3067\u56f2\u3080\u3068\u30b3\u30f3\u30d1\u30a4\u30eb\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308b\u304c\u3001\u56f2\u3093\u3060\u90e8\u5206\u306e\u30b3\u30fc\u30c9\u306e\u5b89\u5168\u6027\u306b\u3064\u3044\u3066\u306f\u3001\u958b\u767a\u8005\u81ea\u8eab\u304c\u78ba\u8a8d\u3057\u306a\u3051\u308c\u3070\u306a\u3089\u306a\u3044\u3002<\/p>\n<p>\u6700\u5f8c\u306e match \u5f0f\u3067\u306f\u3001pi\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u65b9\u306e calc_pi_parallel() \u3092\u547c\u3073\u51fa\u3057\u3001\u7d50\u679c\u3092\u30d1\u30bf\u30fc\u30f3\u30de\u30c3\u30c1\u3067\u53d6\u308a\u51fa\u3057\u3066\u3044\u308b\u3002\u3082\u3057 Ok(pi) \u306a\u3089\u3001make_ok_result() \u3092\u547c\u3093\u3067\u3001{:ok, pi} \u306e\u30bf\u30d7\u30eb\u3092\u4f5c\u3063\u3066\u8fd4\u3059\u3002\u3082\u3057 Err(reason) \u306a\u3089 make_error_result() \u3092\u547c\u3093\u3067\u3001{:error, result} \u306e\u30bf\u30d7\u30eb\u3092\u4f5c\u3063\u3066\u8fd4\u3059\u3002<\/p>\n<p>make_ok_result() \u3068 make_error_result() \u306e\u5b9f\u88c5\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3002\u96f0\u56f2\u6c17\u306f\u3064\u304b\u3081\u308b\u3060\u308d\u3046\u304b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">fn<\/span> <span class=\"nf\">make_ok_result<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">:<\/span> <span class=\"o\">*<\/span><span class=\"k\">mut<\/span> <span class=\"n\">ErlNifEnv<\/span><span class=\"p\">,<\/span> <span class=\"n\">result<\/span><span class=\"p\">:<\/span> <span class=\"o\">*<\/span><span class=\"k\">const<\/span> <span class=\"n\">ERL_NIF_TERM<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">ERL_NIF_TERM<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">let<\/span> <span class=\"n\">tuple_elements<\/span> <span class=\"o\">=<\/span> <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"p\">[<\/span><span class=\"n\">ok_atom<\/span><span class=\"p\">,<\/span> <span class=\"o\">*<\/span><span class=\"n\">result<\/span><span class=\"p\">]<\/span> <span class=\"p\">};<\/span>\r\n    <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"nf\">enif_make_tuple_from_array<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">,<\/span> <span class=\"n\">tuple_elements<\/span><span class=\"nf\">.as_ptr<\/span><span class=\"p\">(),<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">fn<\/span> <span class=\"nf\">make_error_result<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">:<\/span> <span class=\"o\">*<\/span><span class=\"k\">mut<\/span> <span class=\"n\">ErlNifEnv<\/span><span class=\"p\">,<\/span> <span class=\"n\">reason<\/span><span class=\"p\">:<\/span> <span class=\"o\">&amp;<\/span><span class=\"nb\">str<\/span><span class=\"p\">)<\/span> <span class=\"k\">-&gt;<\/span> <span class=\"n\">ERL_NIF_TERM<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">let<\/span> <span class=\"n\">reason_str<\/span> <span class=\"o\">=<\/span> <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"nf\">enif_make_string_len<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">,<\/span> <span class=\"n\">reason<\/span><span class=\"nf\">.as_ptr<\/span><span class=\"p\">(),<\/span> <span class=\"n\">reason<\/span><span class=\"nf\">.len<\/span><span class=\"p\">(),<\/span>\r\n                                                   <span class=\"nn\">ErlNifCharEncoding<\/span><span class=\"p\">::<\/span><span class=\"n\">ERL_NIF_LATIN1<\/span><span class=\"p\">)<\/span> <span class=\"p\">};<\/span>\r\n    <span class=\"k\">let<\/span> <span class=\"n\">tuple_elements<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"n\">error_atom<\/span> <span class=\"p\">},<\/span> <span class=\"n\">reason_str<\/span><span class=\"p\">];<\/span>\r\n    <span class=\"k\">unsafe<\/span> <span class=\"p\">{<\/span> <span class=\"nf\">enif_make_tuple_from_array<\/span><span class=\"p\">(<\/span><span class=\"n\">env<\/span><span class=\"p\">,<\/span> <span class=\"n\">tuple_elements<\/span><span class=\"nf\">.as_ptr<\/span><span class=\"p\">(),<\/span> <span class=\"mi\">2<\/span><span class=\"p\">)<\/span> <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>mix compile \u3067 cargo build &#8211;release \u3092\u547c\u3073\u51fa\u3059<\/h3>\n<p>\u3067\u306f\u3001Rust \u306b\u3088\u308b\u5171\u6709\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u3092\u30d3\u30eb\u30c9\u3057\u3088\u3046\u3002rust_src \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3067\u3001cargo build &#8211;release \u3068\u3057\u3066\u3082\u3044\u3044\u304c\u3001\u3053\u3053\u3067\u306f\u3001Mix \u304b\u3089\u3001Rust \u30b3\u30fc\u30c9\u3068 Elixir \u30b3\u30fc\u30c9\u3092\u4e00\u62ec\u3057\u3066\u30d3\u30eb\u30c9\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b\u3002<\/p>\n<p>mix.exs \u3092\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u5909\u66f4\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">defmodule<\/span> <span class=\"no\">Pi<\/span><span class=\"o\">.<\/span><span class=\"no\">Mixfile<\/span> <span class=\"k\">do<\/span>\r\n  <span class=\"kn\">use<\/span> <span class=\"no\">Mix<\/span><span class=\"o\">.<\/span><span class=\"no\">Project<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"n\">project<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"p\">[<\/span><span class=\"ss\">app:<\/span> <span class=\"ss\">:elixir_rust_interop_demo<\/span><span class=\"p\">,<\/span>\r\n     <span class=\"ss\">version:<\/span> <span class=\"s2\">\"0.0.1\"<\/span><span class=\"p\">,<\/span>\r\n     <span class=\"ss\">elixir:<\/span> <span class=\"s2\">\"~&gt; 1.2\"<\/span><span class=\"p\">,<\/span>\r\n     <span class=\"ss\">compilers:<\/span> <span class=\"p\">[<\/span><span class=\"ss\">:cargo<\/span><span class=\"p\">,<\/span> <span class=\"ss\">:elixir<\/span><span class=\"p\">,<\/span> <span class=\"ss\">:app<\/span><span class=\"p\">],<\/span>    <span class=\"c1\"># &lt;-- \u3053\u306e\u884c\u3092\u8ffd\u52a0\u3057\u305f\u3002<\/span>\r\n     <span class=\"ss\">build_embedded:<\/span> <span class=\"no\">Mix<\/span><span class=\"o\">.<\/span><span class=\"n\">env<\/span> <span class=\"o\">==<\/span> <span class=\"ss\">:prod<\/span><span class=\"p\">,<\/span>\r\n     <span class=\"ss\">start_permanent:<\/span> <span class=\"no\">Mix<\/span><span class=\"o\">.<\/span><span class=\"n\">env<\/span> <span class=\"o\">==<\/span> <span class=\"ss\">:prod<\/span><span class=\"p\">,<\/span>\r\n     <span class=\"ss\">deps:<\/span> <span class=\"n\">deps<\/span><span class=\"p\">]<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"n\">application<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"p\">[<\/span><span class=\"ss\">applications:<\/span> <span class=\"p\">[<\/span><span class=\"ss\">:logger<\/span><span class=\"p\">]]<\/span>\r\n  <span class=\"k\">end<\/span>\r\n\r\n  <span class=\"k\">defp<\/span> <span class=\"n\">deps<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"p\">[]<\/span>\r\n  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span>\r\n\r\n\r\n<span class=\"c1\">####################<\/span>\r\n<span class=\"c1\"># Rust Cargo Tasks #<\/span>\r\n<span class=\"c1\">####################<\/span>\r\n\r\n<span class=\"k\">defmodule<\/span> <span class=\"no\">Mix<\/span><span class=\"o\">.<\/span><span class=\"no\">Tasks<\/span><span class=\"o\">.<\/span><span class=\"no\">Compile<\/span><span class=\"o\">.<\/span><span class=\"no\">Cargo<\/span> <span class=\"k\">do<\/span>        <span class=\"c1\"># &lt;-- \u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u8ffd\u52a0\u3057\u305f\u3002<\/span>\r\n  <span class=\"nv\">@shortdoc<\/span> <span class=\"s2\">\"Compiles helper in rust_src\"<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"n\">run<\/span><span class=\"p\">(<\/span><span class=\"n\">_<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"k\">case<\/span> <span class=\"no\">System<\/span><span class=\"o\">.<\/span><span class=\"n\">cmd<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"cargo\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"build\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"--release\"<\/span><span class=\"p\">],<\/span>\r\n                    <span class=\"ss\">cd:<\/span> <span class=\"s2\">\"rust_src\"<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"ss\">stderr_to_stdout:<\/span> <span class=\"no\">true<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n      <span class=\"p\">{<\/span><span class=\"n\">result<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">}<\/span> <span class=\"o\">-&gt;<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"n\">result<\/span> <span class=\"o\">!=<\/span> <span class=\"s2\">\"\"<\/span> <span class=\"k\">do<\/span>\r\n          <span class=\"no\">Mix<\/span><span class=\"o\">.<\/span><span class=\"n\">shell<\/span><span class=\"o\">.<\/span><span class=\"n\">info<\/span> <span class=\"n\">result<\/span>\r\n        <span class=\"k\">end<\/span>\r\n        <span class=\"c1\"># @TODO: Skip coping the file if it is up-to-date.<\/span>\r\n        <span class=\"k\">case<\/span> <span class=\"no\">System<\/span><span class=\"o\">.<\/span><span class=\"n\">cmd<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"cp\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"-p\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"rust_src\/target\/release\/libpi_nif.so\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"priv\"<\/span><span class=\"p\">],<\/span>\r\n                        <span class=\"ss\">stderr_to_stdout:<\/span> <span class=\"no\">true<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n          <span class=\"p\">{<\/span><span class=\"s2\">\"\"<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">}<\/span> <span class=\"o\">-&gt;<\/span>\r\n            <span class=\"ss\">:ok<\/span>\r\n          <span class=\"p\">{<\/span><span class=\"n\">result<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">}<\/span> <span class=\"o\">-&gt;<\/span>\r\n            <span class=\"no\">Mix<\/span><span class=\"o\">.<\/span><span class=\"n\">shell<\/span><span class=\"o\">.<\/span><span class=\"n\">info<\/span> <span class=\"n\">result<\/span>\r\n            <span class=\"ss\">:ok<\/span>\r\n          <span class=\"p\">{<\/span><span class=\"n\">result<\/span><span class=\"p\">,<\/span> <span class=\"n\">_error_code<\/span><span class=\"p\">}<\/span> <span class=\"o\">-&gt;<\/span>\r\n            <span class=\"no\">Mix<\/span><span class=\"o\">.<\/span><span class=\"n\">shell<\/span><span class=\"o\">.<\/span><span class=\"n\">error<\/span> <span class=\"n\">result<\/span>\r\n            <span class=\"k\">raise<\/span> <span class=\"s2\">\"copying libpi_nif.so failed\"<\/span>\r\n        <span class=\"k\">end<\/span>\r\n      <span class=\"p\">{<\/span><span class=\"n\">result<\/span><span class=\"p\">,<\/span> <span class=\"n\">_error_code<\/span><span class=\"p\">}<\/span> <span class=\"o\">-&gt;<\/span>\r\n        <span class=\"no\">Mix<\/span><span class=\"o\">.<\/span><span class=\"n\">shell<\/span><span class=\"o\">.<\/span><span class=\"n\">error<\/span> <span class=\"n\">result<\/span>\r\n        <span class=\"k\">raise<\/span> <span class=\"s2\">\"cargo build --release failed.\"<\/span>\r\n    <span class=\"k\">end<\/span>\r\n  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span>\r\n\r\n<span class=\"k\">defmodule<\/span> <span class=\"no\">Mix<\/span><span class=\"o\">.<\/span><span class=\"no\">Tasks<\/span><span class=\"o\">.<\/span><span class=\"no\">Clean<\/span><span class=\"o\">.<\/span><span class=\"no\">Cargo<\/span> <span class=\"k\">do<\/span>          <span class=\"c1\"># &lt;-- \u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u8ffd\u52a0\u3057\u305f\u3002<\/span>\r\n  <span class=\"nv\">@shortdoc<\/span> <span class=\"s2\">\"Cleans helper in rust_src\"<\/span>\r\n\r\n  <span class=\"k\">def<\/span> <span class=\"n\">run<\/span><span class=\"p\">(<\/span><span class=\"n\">_<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n    <span class=\"k\">case<\/span> <span class=\"no\">System<\/span><span class=\"o\">.<\/span><span class=\"n\">cmd<\/span><span class=\"p\">(<\/span><span class=\"s2\">\"cargo\"<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"clean\"<\/span><span class=\"p\">],<\/span>\r\n                    <span class=\"ss\">cd:<\/span> <span class=\"s2\">\"rust_src\"<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"ss\">stderr_to_stdout:<\/span> <span class=\"no\">true<\/span><span class=\"p\">)<\/span> <span class=\"k\">do<\/span>\r\n      <span class=\"p\">{<\/span><span class=\"n\">result<\/span><span class=\"p\">,<\/span> <span class=\"mi\">0<\/span><span class=\"p\">}<\/span> <span class=\"o\">-&gt;<\/span>\r\n        <span class=\"no\">Mix<\/span><span class=\"o\">.<\/span><span class=\"n\">shell<\/span><span class=\"o\">.<\/span><span class=\"n\">info<\/span> <span class=\"n\">result<\/span>\r\n        <span class=\"ss\">:ok<\/span>\r\n      <span class=\"p\">{<\/span><span class=\"n\">result<\/span><span class=\"p\">,<\/span> <span class=\"n\">_error_code<\/span><span class=\"p\">}<\/span> <span class=\"o\">-&gt;<\/span>\r\n        <span class=\"no\">Mix<\/span><span class=\"o\">.<\/span><span class=\"n\">shell<\/span><span class=\"o\">.<\/span><span class=\"n\">error<\/span> <span class=\"n\">result<\/span>\r\n        <span class=\"ss\">:ok<\/span>\r\n    <span class=\"k\">end<\/span>\r\n  <span class=\"k\">end<\/span>\r\n<span class=\"k\">end<\/span>\r\n<\/code><\/pre>\n<p>\u3053\u308c\u3067\u3001mix compile \u307e\u305f\u306f iex -S mix \u3068\u3057\u305f\u6642\u306b\u3001Rust \u5074\u3082 cargo build &#8211;release \u3067\u30d3\u30eb\u30c9\u3055\u308c\u308b\u3002\u3067\u304d\u3042\u304c\u3063\u305f\u5171\u6709\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc libpi_nif.so \u306f\u3001priv \u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3078\u30b3\u30d4\u30fc\u3055\u308c\u308b\u3002<\/p>\n<p>\u8a66\u3057\u306b\u30d3\u30eb\u30c9\u3057\u3066\u307f\u3088\u3046\u3002<\/p>\n<pre class=\"post-pre\"><code>mix compile\r\n   Compiling ruster_unsafe v0.2.0 (https:\/\/github.com\/tatsuya6502\/ruster_unsafe\/?rev=nif-2.9-unmerged#250957b5)\r\n   Compiling libc v0.2.4\r\n   Compiling pi v0.1.0 (file:\/\/\/usr\/home\/tatsuya\/workhub\/dev\/elixir_rust_interop_demo\/rust_src)\r\n\r\nCompiled lib\/pi_nif.ex\r\nCompiled lib\/pi.ex\r\nGenerated elixir_rust_interop_demo app\r\nConsolidated List.Chars\r\n...\r\n<\/code><\/pre>\n<h3>\u5b9f\u884c\u3059\u308b<\/h3>\n<p>\u5b9f\u306f\u79c1\u306f Rust \u306e\u8d85\u521d\u5fc3\u8005\u306a\u306e\u30675\u3001C\u95a2\u6570\u3068\u306e\u3084\u308a\u53d6\u308a\u306e\u4f5c\u6cd5\u304c\u3088\u304f\u308f\u304b\u3089\u305a\u3001glue \u95a2\u6570\u306e\u30b3\u30f3\u30d1\u30a4\u30eb\u3092\u901a\u3059\u306e\u306b\u3001\u305a\u3044\u3076\u3093\u82e6\u52b4\u3057\u3066\u3057\u307e\u3063\u305f\u3002\u3044\u3084\u30fc\u3001\u9577\u304b\u3063\u305f\u3002\u3067\u3082\u3001\u3053\u306e\u82e6\u52b4\u306f\u7121\u99c4\u306b\u306a\u3089\u306a\u3044\u3060\u308d\u3046\u3002<\/p>\n<p>\u3067\u306f\u5b9f\u884c\u3057\u3066\u307f\u3088\u3046\u3002iex \u3092\u7acb\u3061\u4e0a\u3052\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>% iex -S mix\r\nErlang\/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false]\r\n\r\nInteractive Elixir (1.2.0) - press Ctrl+C to exit (type h() ENTER for help)\r\n<\/code><\/pre>\n<p>\u307e\u305a\u3001dirty scheduler \u304c\u6709\u52b9\u306b\u306a\u3063\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3059\u308b\u3002iex \u306e\u7acb\u3061\u4e0a\u3052\u6642\u306b [ds:8:8:10] \u306e\u3088\u3046\u306b\u8868\u793a\u3055\u308c\u308c\u3070 OK \u3060\u3002\u3053\u308c\u306f\u3001\u5de6\u304b\u3089\u9806\u306b\u3001dirty CPU scheduler \u306e\u6700\u5927\u672c\u6570\u3001\u30aa\u30f3\u30e9\u30a4\u30f3\u4e2d\u306edirty CPU scheduler\u306e\u672c\u6570\u3001dirty IO scheduler \u306e\u672c\u6570\u3092\u8868\u3057\u3066\u3044\u308b\u3002<\/p>\n<p>\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u30ed\u30fc\u30c9\u3057\u3066\u5b9f\u884c\u3057\u3088\u3046\u3002<\/p>\n<pre class=\"post-pre\"><code>iex(1)&gt; l PiNif\r\n{:module, PiNif}\r\niex(2)&gt; :timer.tc(fn() -&gt; PiNif.calc_pi_parallel(1_000_000_000, 10) end)\r\n{1262147, {:ok, 3.141592655589816}}\r\n<\/code><\/pre>\n<p>\u304a\u3049\u3001\u901f\u3044\u3063\uff01 \u7d041.3\u79d2\u3067\u7d42\u4e86\u3002Elixir \u3067 HiPE \u3092\u4f7f\u7528\u3057\u305f\u6642\u3068\u6bd4\u3079\u308b\u3068\u3001\u7d0412.1\u500d\u306e\u901f\u5ea6\u3068\u306a\u3063\u305f\u3002\u5c0f\u6570\u70b9\u4ee5\u4e0b\u306e\u516815\u6841\u304c Elixir \u306e\u8a08\u7b97\u7d50\u679c\u3068\u4e00\u81f4\u3057\u3066\u3044\u308b\u306e\u3067\u3001\u3061\u3083\u3093\u3068\u8a08\u7b97\u3057\u3066\u3044\u308b\u3088\u3046\u3060<\/p>\n<p>\u3061\u306a\u307f\u306b\u3001\u30b3\u30fc\u30c9\u306e\u63b2\u8f09\u306f\u7701\u7565\u3057\u305f\u304c\u3001\u30b7\u30f3\u30b0\u30eb\u30b9\u30ec\u30c3\u30c9\u7248\u3082\u3042\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>iex(3)&gt; :timer.tc(fn() -&gt; PiNif.calc_pi(1_000_000_000) end)\r\n{4134014, {:ok, 3.1415926555901215}}\r\n<\/code><\/pre>\n<p>\u3053\u308c\u306b\u3088\u308a\u3001\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u7248\u306f\u30b7\u30f3\u30b0\u30eb\u30b9\u30ec\u30c3\u30c9\u7248\u3088\u308a\u3082\u3001\u7d043.28\u500d\u901f\u3044\u3053\u3068\u304c\u308f\u304b\u3063\u305f\u3002<\/p>\n<h2>SIMD \u547d\u4ee4\u306b\u3055\u3089\u306b\u671f\u5f85<\/h2>\n<p>\u524d\u306b\u3082\u66f8\u3044\u305f\u3088\u3046\u306b\u3001\u73fe\u72b6\u306f Rust \u306e\u95a2\u6570\u3092 SIMD \u547d\u4ee4\u3078\u306e\u6700\u9069\u5316\u304c\u3055\u308c\u3066\u306a\u3044\u72b6\u614b\u3067\u5b9f\u884c\u3057\u3066\u3044\u308b\u3002\u4eee\u306b\u6700\u9069\u5316\u304c\u3055\u308c\u305f\u306a\u3089\u3001\u3053\u306e\u30de\u30b7\u30f3\u306e\u30d7\u30ed\u30bb\u30c3\u30b5\u30fc\uff08AVX \u547d\u4ee4\u306b\u5bfe\u5fdc\uff09\u306a\u3089\u3001\uff14\u7d44\u306e64\u30d3\u30c3\u30c8\u6d6e\u52d5\u5c0f\u6570\u70b9\u304c\u3001\uff11\u5ea6\u306b\u8a08\u7b97\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308b6\u3002\u3053\u306e\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u5834\u5408\u3001sqrt \u8a08\u7b97\u3092\u7e70\u308a\u8fd4\u3059\u306e\u3067\u3001SIMD \u306e\u52b9\u679c\u304c\u5927\u304d\u305d\u3046\u3060\u3002\u5f8c\u65e5\u3001\u6311\u6226\u3057\u3066\u307f\u305f\u3044\u3002<\/p>\n<h2>\u6e2c\u5b9a\u7d50\u679c<\/h2>\n<p>\u305d\u306e\u5f8c\u3001FreeBSD \u3067\u518d\u5ea6\u6e2c\u5b9a\u3057\u305f\u3002\u305d\u308c\u305e\u308c\u306e\u95a2\u6570\u3092\uff13\u56de\u305a\u3064\u5b9f\u884c\u3057\u3001\u305d\u306e\u4e2d\u592e\u5024\uff08\uff12\u756a\u76ee\u306b\u901f\u304b\u3063\u305f\u5024\uff09\u3092\u63a1\u7528\u3057\u305f\u3002<\/p>\n<pre class=\"post-pre\"><code>\\pi = 3.14159\\ 26535\\ 89793\\ \\dotsb\r\n<\/code><\/pre>\n<div>\n<div class=\"post-table\">#\u8a00\u8a9eproc\/thr\u6570\u30d7\u30ed\u30b0\u30e9\u30e0\u8a08\u7b97\u7d50\u679c\u6240\u8981\u6642\u9593\uff08\u30de\u30a4\u30af\u30ed\u79d2\uff09\u76f8\u5bfe\u901f\u5ea6\u76f8\u5bfe\u901f\u5ea61Elixir1Enum.reduce\/33.1415926555901215113,853,0910.680.132<br \/>\n1(HiPE)3.1415926555901215111,940,9650.700.143<br \/>\n1for_each\/43.141592655590121577,914,595<strong>1.00<\/strong>0.204<br \/>\n1(HiPE)3.141592655590121545,786,4411.700.335<br \/>\n10parallel3.141592655589816029,319,3872.660.526<br \/>\n10(HiPE)3.141592655589816015,226,4575.12<strong>1.00<\/strong>7Rust1NIF3.14159265559012154,134,01418.853.688<br \/>\n10parallel NIF3.14159265558981601,209,16064.4412.60<\/div>\n<\/div>\n<h2>\u307e\u3068\u3081<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Elixir \u306f\u5805\u7262\u3067\u30b9\u30b1\u30fc\u30e9\u30d6\u30eb\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u751f\u7523\u6027\u3092\u9ad8\u3081\u308b\u52d5\u7684\u578b\u4ed8\u3051\u8a00\u8a9e<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Rust \u306f\u5b89\u5168\u6027\u3068\u30b9\u30d4\u30fc\u30c9\u306b\u30d5\u30a9\u30fc\u30ab\u30b9\u3057\u305f\u3001\u30b7\u30b9\u30c6\u30e0\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u5411\u3051\u306e\u9759\u7684\u578b\u4ed8\u3051\u8a00\u8a9e<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u3069\u3061\u3089\u306e\u8a00\u8a9e\u3082\u30e2\u30c0\u30f3\u306a\u8a00\u8a9e\u306e\u7279\u5fb4\u3092\u53d6\u308a\u8fbc\u3093\u3067\u304a\u308a\u3001\u3088\u304f\u4f3c\u305f\u30b9\u30bf\u30a4\u30eb\u3067\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u66f8\u3051\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u3069\u3061\u3089\u306e\u8a00\u8a9e\u3082\u30de\u30eb\u30c1\u30b3\u30a2\u30d7\u30ed\u30bb\u30c3\u30b5\u306b\u9069\u3057\u305f\u30d7\u30ed\u30b0\u30e9\u30e0\u304c\u7c21\u5358\u306b\u66f8\u3051\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\uff12\u3064\u306e\u8a00\u8a9e\u306e\u4f7f\u3044\u3069\u3053\u308d\u3092\u898b\u6975\u3081\u3001\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u5e78\u305b\u306b\u306a\u308c\u305d\u3046<\/ul>\n<hr \/>\n<div>\n<p>Rust\u306eFAQ\u306b\u3088\u308b\u3068\u3001Servo\u306e\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u884c\u6570\u306f\u73fe\u6642\u70b9\u3067\uff13\u4e07\u884c\u5f37\u3068\u306e\u3053\u3068\u3002\u3061\u306a\u307f\u306bRust\u306e\u30b3\u30f3\u30d1\u30a4\u30e9\u30fc\u306fRust\u81ea\u8eab\u3067\u66f8\u304b\u308c\u3066\u304a\u308a\u3001\u305d\u306e\u884c\u6570\u306f\u73fe\u6642\u70b9\u3067\uff16\u4e07\u884c\u5f37\u3002\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u3068\u3057\u3066LLVM\u3092\u4f7f\u7528\u3057\u3066\u3044\u308b\u00a0\u21a9<\/p>\n<p>\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u3001\u300ccompiler target triple\u300d\u3068\u3044\u3046\u30b3\u30f3\u30d1\u30a4\u30e9\u30fc\u306e\u30d3\u30eb\u30c9\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u5909\u66f4\u3057\u3001Rust\u30b3\u30f3\u30d1\u30a4\u30e9\u30fc\u3068\u30e9\u30a4\u30d6\u30e9\u30ea\u4e00\u5f0f\u3092\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u304b\u3089\u30d3\u30eb\u30c9\u3059\u308c\u3070\u3044\u3044\u3088\u3046\u3060\u3002SIMD \u306e\u30b5\u30dd\u30fc\u30c8\u3068\u306f\u7121\u95a2\u4fc2\u3060\u304c\u3001\u30d3\u30eb\u30c9\u30aa\u30d7\u30b7\u30e7\u30f3\u306e\u5909\u66f4\u306b\u3064\u3044\u3066\u306f \u3053\u3061\u3089\u306e\u8a18\u4e8b \u3067\u8a73\u3057\u304f\u89e3\u8aac\u3055\u308c\u3066\u3044\u308b\u3002\u5f8c\u65e5\u3001\u6311\u6226\u3057\u3066\u307f\u305f\u3044\u00a0\u21a9<\/p>\n<p>\u5225\u8a18\u4e8b\u306f\uff11\u30f6\u6708\u304f\u3089\u3044\u304b\u304b\u308b\u304b\u3082\u3002\u5f85\u3066\u306a\u3044\u4eba\u306f\u3001\u3053\u3061\u3089 \u306e\u30b3\u30fc\u30c9\u3068\u30d7\u30ec\u30bc\u30f3\uff08PDF\uff09\u3092\u8aad\u3080\u306e\u304c\u304a\u3059\u3059\u3081\u3002\u00a0\u21a9<\/p>\n<p>HiPE \u306e\u958b\u767a\u7d42\u4e86\u5f8c\u3057\u3070\u3089\u304f\u3057\u3066\u304b\u3089NIF\u304c\u5c0e\u5165\u3055\u308c\u305f\u305f\u3081\u3001HiPE\u306ebeam\u30ed\u30fc\u30c0\u30fc\u304cNIF\u306b\u5bfe\u5fdc\u3057\u3066\u306a\u3044\u306e\u304c\u539f\u56e0\u306e\u3088\u3046\u3060\u3002HiPE\u306e\u958b\u767a\u306b\u643a\u308f\u3063\u305f\u30c1\u30fc\u30e0\u306e\u30e1\u30f3\u30d0\u30fc\u306f\u307f\u306aEricsson\u793e\u3092\u9000\u793e\u3057\u3066\u3044\u308b\u305f\u3081\u3001VM\u30c1\u30fc\u30e0\u306bHiPE\u306b\u8a73\u3057\u3044\u4eba\u304c\u3044\u306a\u3044\u3089\u3057\u3044\u3002\u305f\u3060\u3001HiPE\u306e\u8a2d\u8a08\u8005\u306f\u3001erang-user\u30e1\u30fc\u30ea\u30f3\u30b0\u30ea\u30b9\u30c8\u3067\u3001\u3044\u3064\u3082\u8cea\u554f\u306b\u56de\u7b54\u3055\u308c\u3066\u3044\u308b\u3088\u3046\u3060\u3002\u00a0\u21a9<\/p>\n<p>\u79c1\u304c Rust \u3092\u77e5\u3063\u305f\u306e\u306f\u3001@voluntas \u3055\u3093\u306e\u3001\u300c\u79c1\u7684\u306a 2015 \u5e74\u6280\u8853\u7684\u306a\u632f\u308a\u8fd4\u308a\u300d\u3067 \u7d39\u4ecb\u3055\u308c\u3066\u3044\u305f\u306e\u304c\u304d\u3063\u304b\u3051\u3060\u3063\u305f\u3002\u3042\u308a\u304c\u3068\u3046\u3054\u3056\u3044\u307e\u3059\u3002Erlang \u3068\u4e00\u7dd2\u306b\u4f7f\u3048\u308b\u3001\u3053\u3093\u306a\u8a00\u8a9e\u304c\u6b32\u3057\u304b\u3063\u305f\u306e\u3067\u3059\u00a0\u21a9<\/p>\n<p>Rust 1.5.0 \u3067\u306e SIMD \u5bfe\u5fdc\u72b6\u6cc1\u306f\u306f\u3063\u304d\u308a\u308f\u304b\u3089\u306a\u3044\u306e\u3060\u304c\u3001\u4eca\u306e\u3068\u3053\u308d\u81ea\u52d5\u6700\u9069\u5316\u306f SSE \u307e\u3067\u306a\u306e\u304b\u3082\u3057\u308c\u306a\u3044\u3002simd \u30af\u30ec\u30fc\u30c8\u306e\u65b9\u306f\u3001\u30d5\u30a9\u30fc\u30af\u3057\u3066 AVX \u547d\u4ee4\u306b\u5bfe\u5fdc\u3055\u305b\u305f\u4eba\u3082\u3044\u308b\u306e\u3067\u3001\u3053\u3061\u3089\u3082\u8a66\u3057\u3066\u307f\u305f\u3044\u3002\u00a0\u21a9<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Elixir \u304b\u3089 Rust \u306e\u95a2\u6570\u3092\u547c\u3076\u3053\u3068\u3067\u3001\u5186\u5468\u7387 $\\pi$ \u306e\u8fd1\u4f3c\u5024\u3092\u6c42\u3081\u308b\u8a08\u7b97\u3092\u9ad8\u901f\u5316\u3059\u308b\u3002Erl [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-45378","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>- Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:description\" content=\"Elixir \u304b\u3089 Rust \u306e\u95a2\u6570\u3092\u547c\u3076\u3053\u3068\u3067\u3001\u5186\u5468\u7387 $pi$ \u306e\u8fd1\u4f3c\u5024\u3092\u6c42\u3081\u308b\u8a08\u7b97\u3092\u9ad8\u901f\u5316\u3059\u308b\u3002Erl [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-12T05:01:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-03T22:24:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d5eb437434c4406cf5f1a\/31-0.png\" \/>\n<meta name=\"author\" content=\"\u9038, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u9038, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/\",\"name\":\"- Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-12-12T05:01:34+00:00\",\"dateModified\":\"2024-05-03T22:24:08+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/\"]}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\",\"name\":\"\u9038, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"caption\":\"\u9038, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"- Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/","og_locale":"zh_CN","og_type":"article","og_description":"Elixir \u304b\u3089 Rust \u306e\u95a2\u6570\u3092\u547c\u3076\u3053\u3068\u3067\u3001\u5186\u5468\u7387 $pi$ \u306e\u8fd1\u4f3c\u5024\u3092\u6c42\u3081\u308b\u8a08\u7b97\u3092\u9ad8\u901f\u5316\u3059\u308b\u3002Erl [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-12-12T05:01:34+00:00","article_modified_time":"2024-05-03T22:24:08+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d5eb437434c4406cf5f1a\/31-0.png"}],"author":"\u9038, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u9038, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"12 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/","name":"- Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-12-12T05:01:34+00:00","dateModified":"2024-05-03T22:24:08+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/"]}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487","name":"\u9038, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","caption":"\u9038, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/45378-2\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/45378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=45378"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/45378\/revisions"}],"predecessor-version":[{"id":96650,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/45378\/revisions\/96650"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=45378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=45378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=45378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}