ماشین مجازی چیست؟ چرا در دنیای blockchain اینقدر مهم است؟ آزمایشگاه هشگارد، موسسه تحقیقاتی هشگارد، و موسسه تحقیقاتی" BKFUND " به طور مشترک تجزیه و تحلیل عمیق ماشین های مجازی را انجام داده و گزارش تحقیقاتی در مورد آن نوشتند. . قرارداد هوشمند به بیان ساده، قرارداد هوشمند یک توافقنامه یا برنامه تجارت رایانه ای است که خود به اعتبار واسطه ای نیاز ندارد و می تواند به طور خودکار شرایط قرارداد را اجرا کند. قراردادهای هوشمند موجود در blockchains می توانند نقل و انتقالات را تسهیل کرده و قوانین بازی را توصیف کنند. قرارداد هوشمند، با یک حس محدود، یک برنامه کامپیوتری است که بر روی یک دفتر توزیع‌شده با قوانین، حالت و واکنش مشروط کار می‌کند، که می‌تواند به ریزکپسوله سازی، تایید، و اجرای رفتارهای پیچیده گره توزیع‌شده، تبادل اطلاعات کامل، انتقال ارزش و مدیریت دارایی باشد. در مفهوم وسیع‌تر، قرارداد هوشمند یک توافقنامه تجاری رایانه‌ای است که به واسطه‌گری نیاز ندارد و می‌تواند به طور خودکار شرایط قرارداد را اجرا کند. با توجه به هدف طراحی آن، می توان به موارد زیر تقسیم کرد: قرارداد حقوقی هوشمندانه که به عنوان گزینه ای جایگزین و مکمل قانون باشد قرارداد نرم افزار هوشمند به عنوان یک نرم افزار کاربردی طراحی شده است قراردادهای جایگزین هوشمند برای معرفی روابط جدید قراردادی (مانند قراردادهای هوشمند که شیوه های تجاری ماشین به ماشین را در اینترنت اشیاء تصریح می کند) طراحی شده اند. . مسیر فنی: قراردادهای هوشمند Blockchain باید الزامات طراحی و ایده های اجرای را برآورده سازد. قراردادهای هوشمند باید قطعی باشند و الگوریتم های تعیین کننده و منابع داده را هنگام طراحی اتخاذ کنند. قراردادهای هوشمند می توانند خاتمه یافته و از طریق دستورات محدود، حالت گاز ( Gas ) ، کنترل منابع و محدودیت دسترسی قابل اجرا باشند. در حال حاضر، سه روش فنی برای تحقق قراردادهای هوشمند blockchain وجود دارد: حالت اسکریپت، حالت کانتینر شده و حالت ماشین مجازی. . حالت اسکریپت این روش یک روش سنتی برای اجرای منطق قابل برنامه ریزی است که ابتدا در سیستم BTC به کار گرفته شد. مدل UTXO BTC برای تایید مشروعیت این تراکنش از یک سیستم اسکریپت نویسی امضا مانند استفاده می‌کند. تراکنش‌ها به طور کلی شامل یک اسکریپت ورودی و یک اسکریپت خروجی، که برای باز کردن خروجی تراکنش قبلی و تنظیم شرایط قفل کردن مقدار تراکنش استفاده می‌شود. اسکریپت BTC از نماد معکوس لهستانی در قالب یک ساختار پشته استفاده می کند. کاربر برای تهیه قفل تراکنش باید امضای متناسب، کلید عمومی اسکریپت را به عنوان ورودی اجرا کند. بنابراین یکی دیگر از ویژگی های حالت اسکریپت این است که با حالت UTXO خوب کار می کند. اما کاستی های این حالت نیز مشهود است، عمدتا در مقیاس پذیری عملکرد. از این رو از نظر کامل بودن و قابلیت توسعه برنامه نویسی، بسیاری از افراد فکر می کنند که وظایف برنامه نویسی که حالت اسکریپت بیت کوین می تواند به آن برسد بسیار محدود است. بنابراین، از دیدگاه باریک، در نظر گرفته می شود که حالت اسکریپت فقط می تواند از ویژگی های ساده قابل برنامه ریزی برخوردار باشد، نه سیستم قرارداد هوشمند به معنای معمول. اما کاستی‌های این حالت همچنین مشهود است، عمدتا در مقیاس پذیری عملکرد. بنابراین، از نظر تکمیل بودن کاربردی و توسعه پذیری برنامه‌نویسی، بسیاری از مردم فکر می‌کنند که برنامه‌های برنامه‌نویسی که مد کدنوشته Bitcoin می‌تواند به آن دست یابد بسیار محدود است. بنابراین، از دیدگاه محدود، در نظر گرفته می‌شود که حالت اسکریپت تنها می‌تواند ویژگی‌های قابل‌برنامه‌ریزی ساده را درک کند، نه سیستم قراردادی هوشمند. ) BTC و چنگال های مرتبط و نشانه رقابت نشانه های که از حالت اسکریپت استفاده می کند، بیت کوین و برخی از نشانه های اولیه مدل UTXO از جمله Token forked BTC ، توکن رقابتی ( competitive Token ) مانند Litecoin ، Bitcoin Cash و غیره است. ) نشانه های ناشناس توکن هایی که دارای ناشناس بودن و محافظت از حریم خصوصی هستند نیز از سیستم اسکریپت استفاده می کند. به دلیل ماهیت پنهان محافظت از حریم خصوصی و ردیابی تراکنش ها، بسیاری از این نشانه ها از یک سیستم اسکریپت نویسی انتزاعی و ساده استفاده می کنند، از جمله Monero ، Dash و غیره. ) بلاک چین DAG سیستم‌های blockchain دیگری نیز وجود دارند که از یک روش نوشته شده برای اجرای قرارداد مبتنی بر ساختارهای ( Directed Acyclic Graph structures ( DAGs استفاده می‌کنند. با توجه به ویژگی‌های ذاتی سیستم DAG ، از جمله مدت زمان معامله غیرقابل کنترل و فقدان مکانیزم طبقه‌بندی جهانی، پیاده‌سازی یک سیستم قرارداد هوشمند کامل با ماشین در دفتر توزیع DAG دشوار است. بنابراین، برای بهبود TPS و ساده‌سازی پردازش تراکنش، برخی از سیستم‌های دفتر کل توزیع‌شده مبتنی بر DAG نیز از حالت اسکریپت نویسی برای ساخت سیستم‌های قابل‌برنامه‌ریزی خود استفاده خواهند کرد. . کانتینر Containerization کانتینر ( Containerization ) نوع جدیدی از تکنولوژی مجازی سازی است که در سال‌های اخیر پدیدار شده است و با ماشین‌های مجازی متفاوت است. در مقایسه با لایه اضافه‌شده از محیط‌های میانی در برنامه کاربر و محیط زیرین، فن‌آوری کانتینر تنها باید وابستگی‌های لازم مورد نیاز برنامه را بسته و بدون نیاز به یک محیط سیستم‌عامل مجازی دیگر بسته شود. رویکرد کانتینر شده، در مقایسه با رویکرد ماشین مجازی، نسبتا مستقل تر و انعطاف پذیر است و می تواند منابع بیشتری را مستقر کند. اگرچه فن آوری کانتینر از منظر معماری کلی سیستم آسانتر و انعطاف پذیرتر است، اما اگر به فکر یک برنامه واحد باشید، باید فاکتورهای سیستم"سنگین" تری در نظر گرفته شوند، زیرا فایل ها و سیستم ها در محیط کانتینر قابل دسترسی هستند. این امر تقاضای بیشتری را بر محیط عملیاتی blockchain ایجاد می کند، بنابراین blockchain که این روش را اتخاذ می کند نسبتا نادر است. یک پروژه blockchain معمولی که با استفاده از کانتینری Hyperledger Fabric است. قرارداد هوشمند آن با استفاده از زنجیره ای از کد بر روی گره کار می کند و همه گره های مربوطه فرایند کد زنجیره ای را شروع می کنند که به طور مستقل در ظرف Docker اجرا می شود. کد زنجیره تعامل با گره را از طریق رابط gRPC خارجی در ظرف تکمیل می کند. در حال حاضر، Fabric هنوز کد زنجیره ای را به صورت دستی و پایه ای مدیریت و نگهداری می کند. از آنجا که در محیط زنجیره اتحاد قرار دارد، تمام گره هایی که مجاز به پیوستن به شبکه هستند می توانند از منابع سیستم، یعنی روش محدودیت دسترسی استفاده کنند. این امر در حفظ چرخه حیات کد زنجیره تامین واضح‌تر است: در نسخه استاندارد Fabric . , تنها چهار فرمان, بسته, نصب و ارتقا ارایه شده‌است. فرمانی برای توقف و شروع کد زنجیره بدون حذف کد زنجیره ممکن است در آینده ارایه شود. . حالت ماشین مجازی متداول ترین روش برای اجرای قراردادهای هوشمند رویکرد دستگاه مجازی است. این برنامه با یک محیط اجرای کاملا شفاف ارایه می دهد. یک کاربرد معمول از این ایده را می‌توان به ماشین مجازی جاوا اشاره کرد. هدف اجرا" یک‌بار نوشتن و اجرا در همه جا" است, به جای اینکه توسعه دهنده نسخه‌های مختلف برنامه را برای هر سرور متفاوت بنویسید. این ویژگی دقیقا همان چیزی است که برای گسترش و بهره‌برداری توزیع‌شده قراردادهای هوشمند مورد نیاز است: تفاوت بین محیط اجرایی گره اجرای بلوک در تمام گره‌ها, برای دستیابی به ویژگی‌های قطعی. . ماشین مجازی نیو ( AVM هسته کامپایلر مبتنی بر . NET CLR MSIL است) ، در حال حاضر از سری زبانهای دات نت پشتیبانی می کند ( C , VB . NET , F ) ، زبانهای سری جاوا (جاوا، کوتلین) و پایتون. . ماشین مجازی وب اسمبلی ( Wasm ) ، در حال حاضر از C / C ++/ RUST / Go پشتیبانی می کند. . ماشین مجازی زبان اسکریپت (موتور V Chrome ، ماشین مجازی Lua و غیره) و js در حال حاضر پشتیبانی می شود. . ماشین مجازی RISC - V (معماری مجموعه دستورالعمل منبع باز) ، در حال حاضر از Solid پشتیبانی می کند. . یک ماشین و زبان مجازی جدید، مشابه EVM ایجاد کنید. EVM و استحکام ( Ethereum ) ، حرکت VM و حرکت ( Libra ) . پشتیبانی از چندین ماشین مجازی و چندین زبان. آنتولوژی ( ontology ) پشتیبانی از ماشین مجازی نیو و ماشین مجازی وب اسمبلی ( Wasm ) و Thunderbolt پشتیبانی می کند، و زنجیره اصلی از ماشین مجازی نیو و EVM اتریوم پشتیبانی می کند. کانتینر ( Containerization ) در برابر ماشین مجازی . . خلاصه ای از اصول اولیه ماشین مجازی هسته دستگاه مجازی: مدیریت حافظه، بارگیری مونتاژ، امنیت، کنترل استثناء، و هماهنگ سازی موضوع. دستگاه مجازی عمدتا بر اساس Stack و Register به دو نوع ماشین مجازی تقسیم می شود. ( ) مترجم شفاهی زبان منبع اجرای را تفسیر کنید ( php ، postcretp ، javascript و غیره) مترجم شروع به حرکت می‌کند و با سرعت بیشتری اجرا می‌کند، و لازم نیست قبل از اجرای این کد، کل فرآیند گردآوری را تکمیل کنید. ترجمه از خط اول و شما می‌توانید به اجرا در سفارش خود ادامه دهید. به نظر می‌رسد مفسر برای جاوا اسکریپت مناسب‌تر است. برای یک توسعه دهنده وب، مهم است که بتوانید به سرعت کد را اجرا کنید و نتایج را ببینید. به همین دلیل است که مرورگرهای اصلی از مترجم جاوا اسکریپت استفاده می‌کنند. اما، هنگام اجرای همان کد بیش از یک بار، مضرات مترجم آشکار می شود. به عنوان مثال، اگر یک حلقه را اجرا کنید، مترجم مجبور است آن را دوباره و دوباره ترجمه کند. این عملکرد ناکارآمد است. ( ) کامپایلر کد مبدا به طور کلی در کد هدف جمع‌آوری می‌شود و کامپایلر ملزم به اجرای آن نیست، و به طور مستقیم بر روی سکویی که از کد هدف پشتیبانی می‌کند و اجرا می‌شود، به طوری که کارایی اجرایی بسیار سریع‌تر از اجرای تفسیر است. مشکل کامپایلر متضاد با مترجم شفاهی است. کامپایلر نیاز دارد تا زمانی برای کامپایلر تمام کد منبع صرف کند و سپس فایل را برای اجرا روی ماشین تولید کند. برای کدها با حلقه‌ها, خیلی سریع اجرا می‌شود چون نیازی به تکرار هر حلقه نیست. تفاوت دیگر این است که کامپایلر قادر است از زمان بیشتری برای بهینه‌سازی کد استفاده کند تا کد را سریع‌تر اجرا کند. مترجم شفاهی این مرحله را در زمان اجرا انجام می‌دهد که مشخص می‌کند که بهینه‌سازی زمان زیادی در طول ترجمه ممکن نیست. ( ) GCC مفهوم GNU ( Gnu ' s Un Unix ) Compiler Collection ( GCC ) ، مجموعه ای از کامپایلرهای زبان برنامه نویسی، یک نرم افزار رایگان منتشر شده تحت مجوزهای GPL و LGPL ، همچنین بخش مهمی از پروژه GNU و بخش اصلی ابزارهای GNU است. این اولین انتخاب کامپایلر برای نرم افزار cross - platform است. GCC از همان برنامه جلویی مشابه در تمامی سیستم عامل ها استفاده می کند و همان کد میانجیگری را تولید می کند، بنابراین این کد میانجیگری با GCC در سیستم عامل های مختلف دیگر تهیه می شود و شانس بسیار خوبی برای گرفتن برنامه صحیح خروجی وجود دارد. زبانهای پشتیبانی شده: C ، C ++، Fortran ، Pascal ، Objective - C ، Java ، Ada ، Go ، و غیره. ساختارهای پردازشگر اصلی پشتیبانی شده: ARM ، x - ، MIPS ، PowerPC و غیره. ( ) Clang این یک نقطه جلو compiler برای C , C + +, Objective - C , و زبان‌های برنامه‌نویسی C + + است. آن از ماشین مجازی زیربنایی ( llvm ) به عنوان انتهای عقبی آن استفاده می‌کند. هدف آن فراهم کردن جایگزینی برای مجموعه Compiler ( GCC ) گنو ( GCC ) است. ( ) JIT JIT (کامپایلر فقط در زمان) : ترکیب مزایای مترجم شفاهی و کامپایلر. به منظور حل ناکارآمدی مترجم شفاهی، مرورگرها کامپایلر را معرفی کردند و آنرا به صورت ترکیبی تبدیل کردند. مرورگرهای مختلف این عملکرد را متفاوت اجرا می‌کنند, اما ایده اصلی همان است. یک مانیتور (همچنین یک آنالیزگر) را به موتور جاوا اسکریپت اضافه کنید. ناظر اطلاعاتی مانند عملکرد کد را پایش می‌کند, فرکانس کد را ثبت کرده و چگونه اجرا می‌شود. JIT وسیله ای است برای اجرای سریع JavaScript ، با بهینه سازی کد داغ (کدی که می توان چندین بار اجرا کرد) با نظارت بر وضعیت در حال اجرا کد. به این ترتیب، عملکرد برنامه های JavaScript می تواند چندین برابر افزایش یابد. زمان بهینه‌سازی و سربار بهینه‌سازی; زمان نظارت بر ثبت اطلاعات; سربار حافظه به حافظه بازیابی اطلاعات در هنگام بروز رسانی; سربار حافظه برای نسخه‌های پایه و بهینه سازی شده; هنوز فضای زیادی برای پیشرفت وجود دارد که از بین بردن سربار است. یکی از کارهایی که WebAssociation باید انجام دهد بهبود بیشتر عملکرد با از بین بردن سربار است. ( ) JVM یک زبان وابسته به JVM (ماشین مجازی جاوا) (جاوا، Scala ، Groovy ، Kotlin و غیره) پس از تلفیقی JIT (دقیقا به موقع) به یک بایت کد، که یک فایل کلاس است، وارد شده است. حل شده توسط JVM های مختلف در سیستم عامل های مختلف، و در نهایت تبدیل به کد دستگاه های سیستم عامل های مختلف و در نهایت اجرا شد. ( ) NET CLR NET CLR (زبان مشترک Runtime ) یک محیط عملیاتی است که می تواند توسط انواع زبان های برنامه نویسی ( C ++/ CLI ، C ، Visual Basic ، F ، Iron Python ، Iron Ruby ، Intermediate ( IL ) و غیره) مورد استفاده قرار گیرد. موتور چارچوب دات نت. ( ) GraalVM پشتیبانی از زبانهای غیر میزبان ( JavaScript ، Ruby ، R ، Python ، LLVM ) و زبانهای میزبان مبتنی بر JVM ( ) LLVM LLVM (ماشین مجازی سطح پایین) یک زنجیره ابزار جمع آوری قابل استفاده مجدد است که یک زبان واسطه بین زبانهای برنامه نویسی سطح بالا و زبانهای دستگاه فراهم می کند. LLVM به خودی خود می تواند به عنوان یک هدف بازگشت برای چندین زبان مورد استفاده قرار گیرد، بهینه سازی مستقل از خود زبان و تولید کد برای چندین پردازنده. ( LLVM توسط UIUC توسعه داده شده است و معنای LLVM (ماشین مجازی سطح پایین) فراتر رفته است. LLVM برای قسمت جلویی زبانهای مختلف، مربوط به کد دستگاه های سیستم عامل های مختلف است. مراحل تلفیقی LLVM به شرح زیر است: کد منبع در پرونده ای با فرمت LLVM واسطه وارد می شود و سپس از LLVM Linker برای پیوند و بهینه سازی استفاده می شود و کد LLVM بدست آمده در نهایت به کد ماشین یک سکوی خاص ترجمه می شود. علاوه بر این، LLVM از JIT پشتیبانی می کند و در مرحله تولید کد قرار خواهد گرفت. برای اجرای اطلاعات تلفن همراه، مانند شناسایی منطقه گرم، برخی دستورالعمل های عملکرد سبک را درج کنید و اطلاعات جمع آوری شده می توانند از بهینه ساز آفلاین پشتیبانی کنند، استراتژی های بهینه سازی نمایه محور را پیاده سازی کرده و کد بومی را برای انطباق با معماری خاص تنظیم کنند. llvm IR (نماینده متوسط) : از بالا می توان دریافت که کامپایلر LLVM ابتدا زبان مبدا را به"زبان واسطه" ترجمه می کند، و زبانهای مختلف دارای IR مختلف هستند و سپس آنها را از طریق برنامه با پسوند به یک زبان کامپایل شده از سکوی هدف ترجمه می کنند. LLVM IR سه فرمت ارایه می دهد: فرمت IR در حافظه، قالب باینری که در دیسک ذخیره می شود و قالب متنی که روی دیسک ذخیره می شود. علاوه بر این، چندین فرمت فایل مربوط به IR وجود دارد که در زیر ذکر شده است: پایان bc ، پرونده LLVM IR و باینری، با دستور lli قابل اجرا است. پایان LL ، پرونده LLVM IR و قالب متن، توسط lli قابل اجرا است پایان پرونده، پرونده مجمع محلی پسوند و پرونده اجرایی محلی. تصویر زیر تبدیل پرونده متمرکز را نشان می دهد: کامپایلر جلویی LLVM می تواند از انواع کامپایلرهای تجزیه کننده استفاده کند، معمولا بیشتر از چنگال است، اما در EOS توسط clang csm جایگزین شده است. JIT بخشی از کامپایلر اصلی را برای تولید کد دستگاه به طور مستقیم در حافظه فعلی می نویسد. از طریق تبدیل نشانگر عملکرد، کد دستگاه مربوطه پیدا و اجرا می شود. این اغلب برای مقابله با مدیریت حافظه، تغییر مسیر نمادها و پردازش نمادهای خارجی استفاده می شود. ( ) Wasm WebAssembly یک فرمت رمزگذاری جدید است، علاوه بر JavaScript ( JS در سال معرفی شد، "جنگ عملکرد" آغاز شد. ) بسیاری از مرورگرها کامپایلر Just - in - time ( JIT ) را معرفی می کنند. بار سریعتر، زبان برنامه نویسی دیگری که می تواند در یک مرورگر اجرا شود. واژه مخفف عبارت". wasm " ، و. wasm یک پسوند، نام فایل است، یک فرمول دودویی امن جدید. انتزاعی می‌تواند به عنوان زبان ماشین یک ماشین مفهومی به طور انتزاعی درک شود، نقشه‌برداری مستقیم به کد ماشین بیش از کد جاوا اسکریپت، و همچنین مفهوم" نحوه اجرای کدها را به طور موثر بر روی سخت‌افزار هدف کلی" نشان می‌دهد. هنگامی که مرورگر WebAssembly را دانلود کرده‌است، می‌تواند به سرعت به کد مونتاژ ماشین تبدیل شود. این قالب به عنوان" قالب ساده، فرمت بارگذاری و مدل اجرا" تعریف می‌شود و به عنوان یک فرمت فایل هدف برنامه‌نویسی چند منظوره طراحی شده‌است. این به این معنی است که عملکرد طرف مرورگر به شدت بهبود خواهد یافت، همچنین ما را قادر می‌سازد تا مجموعه‌ای از بلوک‌های سازنده زیربنایی را پیاده‌سازی کنیم. مرورگرهای WebAssembly ، متن را در قالب دودویی به رسمیت می‌شناسند و دارای توانایی کامپایل بسته‌های دودویی که بسیار کوچک‌تر از متن JS هستند، که خیلی سریع‌تر از JS رمزگشایی می‌شوند. Wasm به کاربران اجازه می دهد تا به زبان آشنای خود بنویسند (در حال حاضر C / C ++/ Rust ) را پشتیبانی می کنند و سپس در موتور ماشین مجازی بر روی مرورگر اجرا می کنند. این پشتیبانی از حالت sandbox است، یعنی نوشتن ماژول wasm به زبان سطح بالا و سپس بارگذاری آن به عنوان یک عملکرد کتابخانه در JS . WebAssembly از یک ماشین مجازی مبتنی بر Stack استفاده می‌کند، اما به این معنی نیست که روی ماشین‌های فیزیکی واقعی کار می‌کند. هنگامی که مرورگر WebAssembly را به کد ماشین ترجمه می‌کند، مرورگر وب از registers استفاده می‌کند و کد WebAssembly مشخص نمی‌کند که کدام registers استفاده می‌شود. این به مزیت دادن حداکثر آزادی به مرورگر اجازه می‌دهد تا به بهترین نحو عمل خود را انجام دهد. wasm به زبان‌ها مانند C / C + + اجازه نوشتن در وب سایت را می‌دهد. wasm یک قالب بایت کد است، که نحو دودویی زیر، دوره زمانی بار و اجرا با سرعت بالا است. این فرمت فایل هدف طراحی‌شده برای برنامه‌نویسی چند زبانی است. WebAssemble دو فرمت فراهم می کند: فرمت متن قابل خواندن و فرمت دودویی، از طریق ابزار wastwasm برای تکمیل تبدیل فرمت از wast به wasm . به طور مشابه، wasmwast تبدیل معکوس را پیاده سازی می کند. بخشی از ماژول WebAssociation بیانیه عملکرد از تابع تعریف شده در ماژول و اعلام عملکرد همه توابع وارداتی. به هر عملکرد در ماژول یک فهرست می دهد. بدنه عملکرد واقعی هر تابع در ماژول. توابع، حافظه، جداول، متغیرهای جهانی و غیره را برای سایر WebAssemble یا JavaScript قابل مشاهده می سازد، و این امکان را می دهد تا ارتباط پویا با اجزای کاملا جداگانه، نسخه WebAssociation از. dll را ایجاد کنید. به شما امکان می دهد توابع، حافظه، جداول یا متغیرهای جهانی مشخص از سایر WebAssemble یا JavaScript را وارد کنید. تابعی که با بارگذاری ماژول WebAssemble (شبیه به عملکرد اصلی) می تواند به صورت خودکار اجرا شود. متغیرهای جهانی ماژول را اعلام می کند. Memory : حافظه مورد استفاده ماژول را تعریف می کند. امکان نقشه برداری از مقادیر خارج از ماژول WebAssemble ، مانند اشیاء نقشه برداری شده در JavaScript را ممکن می سازد. این کار هنگام فراخوانی توابع غیرمستقیم مفید است. داده ها: حافظه داخلی یا محلی را اولیه کنید. یک جدول وارداتی یا محلی را آغاز می کند. Wasm در برابر JS WebAssemble فعلی فقط می تواند از اعداد (عدد صحیح یا شناور) به عنوان آرگومان یا مقادیر بازگشت استفاده کند برای هر نوع پیچیده دیگری، مانند رشته، باید از عملکردهای حافظه WebAssemble استفاده کنید. اگر از JavaScript زیاد استفاده می کنید و با کار مستقیم با حافظه آشنا نیستید، به زبان های C ، C ++ و زنگ که همه حافظه دستکاری شده هستند فکر کنید. عملکردهای حافظه WebAssociation بسیار شبیه به عملکرد حافظه این زبانها است. برای این کار از ساختار داده ای به نام ArrayBuffer در JavaScript استفاده می کند. ArrayBuffer یک آرایه بایت است، بنابراین شاخص آن معادل آدرس حافظه است. اگر می خواهید رشته ای بین جاوا اسکریپت و WebAssemble منتقل کنید، می توانید از ArrayBuffer برای نوشتن آن در حافظه استفاده کنید. در این مرحله، شاخص ArrayBuffer یک عدد صحیح است و می توانید آن را به عملکرد WebAssembly منتقل کنید. در این مرحله می توان از شاخص شخصیت اول به عنوان نشانگر استفاده کرد. Wasm در برابر asm . js Asm . js یک زیرمجموعه دقیق از جاوا اسکریپت است که می‌تواند به عنوان یک زبان برنامه‌نویسی تابعی سطح پایین و کارآمد مورد استفاده قرار گیرد. Asm . js یک پیاده‌سازی انتزاعی مشابه با یک ماشین مجازی C / C + + ارایه می‌دهد، از جمله یک هیپ دودویی بزرگ، عملیات‌های نقطه‌ای صحیح و شناور، تعاریف عملکرد بالا، نشانگرهای تابع، و غیره که می‌توانند به طور موثر بار و انبار شوند. ایده asm . js نوشتن کد جاوا اسکریپت با استفاده از روشهایی است که مشخص می کند، و موتوری که asm . js را پشتیبانی می کند، کد را به یک کد ماشین بسیار کارآمد تبدیل می کند. اگر کد C ++ را در asm . js کامپایل کنید، یک عملکرد عالی از طرف مرورگر به دست می آورید. WebAssemble بسیار رادیکال تر از asm . js . WebAssemble حتی با Js . این نوع کار خیلی کند است، مگر نه؟ آیا می توانم کد مستقیم را به طور مستقیم ارایه دهم؟ (آن را به درخت AST تغییر کرده است) برای مرورگرهایی که از مجمع وب پشتیبانی نمی کنند، یک قطعه Javascript وجود دارد که مجتمع وب را به Javascript مجددا ترجمه می کند. این تکنیک polyfill نامیده می شود، تکنیکی است که معمولا هنگام بیرون آمدن HTML استفاده می شود. دلیل استفاده از AST به این دلیل است که AST فشرده سازی راحت تر از bytecode و ترجمه آن آسان تر است. Javascript ابتدا به AST و سپس به Bytecode وارد می شود. AST یک سطح بالاتر از Bytecode است. در مقایسه با asm . js ، میزان کد را حدود % کاهش می دهد. WebAssemble برابر سریعتر از asm . js بارگیری می کند، عمدتا به این دلیل که موتور JavaScript فرمت دودویی را سریعتر از تجزیه کد asm . js رمزگشایی می کند. خیلی سریعتر. کد ساده، عملکرد بهتر، اشکالات کمتر. مزایای فنی دستگاه خودپرداز عملکرد بالا: WASM از رمزگذاری باینری استفاده می کند و عملکرد بسیار خوبی در حین اجرای برنامه دارد. هزینه کم ذخیره سازی: متن رمزگذاری شده باینری فضای ذخیره سازی کمتری نسبت به قالب متن می گیرد. پشتیبانی چند زبانه: کاربران می توانند قراردادهای هوشمند را به چندین زبان مانند C / C ++/ RUST / Go بنویسند و آنها را در کدهای فرمت شده WASM کامپایل کنند. دلایل عملکرد Wasm سریعتر از JS : در طول مرحله آماده‌سازی فایل، WebAssembly سریع‌تر از جاوا اسکریپت است تا پرونده‌ها را بیاورد. حتی اگر جاوا اسکریپت به هم فشرده باشد فایل WebAssembly کوچک‌تر از جاوا اسکریپت است. در مرحله تجزیه، زمان رمزگشایی WebAssembly کوتاه‌تر از زمان تجزیه جاوا اسکریپت است در مرحله تدوین و بهینه سازی، WebAssociation از مزیت بیشتری برخوردار است زیرا کد WebAssemble به کد دستگاه نزدیکتر است و ابتدا JavaScript از طریق سرور بهینه شده است. در مرحله بهینه سازی مجدد، WebAssemble دوباره بهینه سازی نمی کند. فرضیه بهینه سازی موتور JS ممکن است منجر به پدیده"کد بهینه سازی دوباره بهینه سازی" شود. در مرحله اجرا، WebAssemble سریعتر است زیرا توسعه دهندگان نیازی به مهارت کامپایلر ندارند، که در جاوا اسکریپت لازم است. همچنین کد WebAssemble برای تولید دستورالعملهای کارآمدتر برای اجرای دستگاه مناسب تر است. در مرحله جمع آوری زباله، جمع آوری زباله های WebAssemble به صورت دستی کنترل می شود و از بازیافت اتوماتیک کارآمدتر است. ترکیب با blockchain Web - side DApp زبانهای کامپایل شده توسط وب در دوره JS بیشتر تفسیر کننده هستند. اگرچه درک آنها توسط کاربران آسان است، اما به خصوص JS کارآمد نیستند. Node . js چارچوبی برای نوشتن برنامه های محلی و سمت سرور ارایه می دهد، اما برای محاسبات رمزنگاری و پردازش تصویر بسیار ناکارآمد است. HTML بسیاری از مشکلات مرورگر را در ویژگی ها و استانداردهای عملکرد حل می کند، اما H هنوز JS را به عنوان زبان اصلی استفاده می کند و مشکل اساسی را حل نمی کند. Wasm زمانی به وجود آمد که بسیاری از پیشرفت های وب قادر به متحد کردن زبان های کامپایل خود نبودند. در بسیاری از پروژه های موجود در بستر وب، پشتیبانی از ویژگی های جدید بومی نیاز به یک مرورگر وب یا Runtime برای ارایه API های پیچیده و استاندارد دارد، اما API های جاوا کند هستند. با استفاده از WebAssemble ، این API های استاندارد ساده تر هستند و می توان در پایین آنها را جستجو کرد. به عنوان مثال، برای یک پروژه وب تشخیص چهره، می توانیم جریان داده را با یک API جاوا ساده پیاده سازی کنیم و SDK بومی تشخیص چهره کارهایی را انجام می دهد که توسط WebAssemble انجام می شود. . به توسعه دهندگان اجازه دهید تا به زبانهای دیگر توسعه دهند و سپس آنها را روی JS بارگذاری کنند. . بهبود عملکرد برنامه و امکان توسعه DApps بزرگ blockchain . به همین دلیل ETH ، EOS و سایر پروژه ها می خواهند از فناوری wasm استفاده کنند. از آنجایی که EVM نیاز به پیش نویس دارد و بنزین نیز نیاز به هزینه دارد، هزینه برنامه ریزی برای EVM در واقع بسیار زیاد است. در عین حال، مشکل EVM پف کرده را حل نمی کند. آخر اینکه، Solid سخت تر از bacis C است. Wasm یک ساختار ایمن از حافظه و مستقل از پلتفرم است و می تواند به طور موثر در انواع معماری CPU ترسیم شود. مجموعه دستورالعمل های آن کارآمد بوده و قابلیت حمل و نقل کافی را حفظ می کند. علاوه بر این، مجموعه دستورالعمل Wasm با حذف دستورالعمل های نقطه شناور می تواند به راحتی تعیین کننده باشد، و این باعث می شود آن را برای جایگزینی زبان EVM مناسب کنید. در همان زمان، Wasm می تواند بدون مصرف حافظه بیشتر به برنامه نویسی غیرقابل اعتماد دست یابد. محاسبات دقیق را می توان با تجزیه و تحلیل پشته و اندازه گیری در Wasm انجام داد. در حال حاضر ETH قصد دارد از DApps برای قراردادهای هوشمند مبتنی بر eth - WASM استفاده کند، در حالی که EOS ، Polkadot و Ontology برای ماشینهای مجازی هستند. شبکه های عمومی ما