انتشار جعبه ابزار Emscripten 4.0 منتشر شده است که به شما امکان می دهد کد را به زبان C/C++ و سایر زبان هایی که پیشوندهای مبتنی بر LLVM برای آن ها در دسترس هستند در کد متوسط سطح پایین جهانی WebAssembly کامپایل کنید. نتیجه به دست آمده را می توان برای ادغام با پروژه های جاوا اسکریپت، اجرا در مرورگر وب، استفاده در Node.js یا ایجاد برنامه های کاربردی چند پلتفرمی مستقل که با استفاده از زمان اجرا wam راه اندازی شده اند، استفاده کرد. کد پروژه تحت مجوز MIT توزیع شده است. کامپایلر از پیشرفت های پروژه LLVM استفاده می کند و کتابخانه Binaryen برای تولید WebAssembly و بهینه سازی استفاده می شود.
هدف اصلی Emscripten ایجاد ابزاری است که به شما امکان می دهد بدون توجه به زبان برنامه نویسی که در ابتدا این کد در آن نوشته شده است، کد را در وب اجرا کنید. برنامه های کامپایل شده می توانند از تماس با کتابخانه های استاندارد C و C++ (libc، libcxx)، پسوندهای C++، چند رشته ای مبتنی بر pthreads، API های POSIX و بسیاری از کتابخانه های چندرسانه ای استفاده کنند. APIهای یکپارچه سازی با Web API و کد جاوا اسکریپت به طور جداگانه ارائه می شوند.
Emscripten از پخش خروجی کتابخانه SDL2 از طریق Canvas پشتیبانی می کند و همچنین از OpenGL و EGL از طریق WebGL API پشتیبانی می کند که به شما امکان می دهد برنامه های گرافیکی و بازی ها را به WebAssembly تبدیل کنید (به عنوان مثال، یک پورت از جعبه ابزار Qt وجود دارد، موتورهای بازی Unreal Engine و Unit و همچنین موتور شبیهسازی فیزیکی فرآیندهای Bullet پشتیبانی میشوند.
علاوه بر کامپایل کد C/C++، پروژههایی به طور جداگانه برای اجرای مفسرها در مرورگرها و ... در حال توسعه هستند. ماشینهای مجازی برای Lua، C#، Python، Ruby و Perl. همچنین میتوان از رابطهای LLVM غیر از Clang، مانند رابطهای Swift، Rust، D و Fortran استفاده کرد.
تخصیص نسخه شماره 4.0 به دلیل معرفی تغییراتی است که سازگاری را در سطح ABI خراب می کند (هنگام بازسازی پروژه در Emscripten 4.0، نیاز به بازسازی فایل های شی و کتابخانه های کامپایل شده توسط نسخه های قبلی Emscripten خواهد بود). تغییرات عمده در Emscripten 4.0:
- گزینه "-sWASM_LEAGCY_EXCEPTIONS" برای انتخاب بین مکانیزم های مدیریت استثناء قدیمی و جدید اضافه شد. بهطور پیشفرض، مکانیسم قدیمی همچنان استفاده میشود، زیرا همه مرورگرها قابلیتهای WebAssembly را برای مدیریت کنترلکنندههای استثنای جدید پیادهسازی نکردهاند.
- اجزای Compiler-rt، libcxx، libcxxabi و libunwind به شاخه LLVM 19 به روز شده اند.
- حداقل نسخه مرورگر سافاری که در اسمبلی ها پشتیبانی می شود (تنظیم MIN_SAFARI_VERSION) از 14.1 به 15.0 افزایش یافته است، که امکان استفاده از چندین ویژگی پیشرفته WebAssembly را به طور پیش فرض فراهم می کند:
- استفاده از دستورالعملهای تبدیل شناور به int جدید (nontrapping-fptoint) را فعال کرد، که به جای ایجاد استثنا در هنگام سرریز شدن نتیجه، حداقل یا حداکثر مقدار ممکن (ضروری برای SIMD) را برمیگرداند.
- گزینه WASM_BIGINT فعال است که از نوع BigInt برای تبادل مقادیر صحیح 64 بیتی بین WebAssembly و کد جاوا اسکریپت استفاده می کند.
- گزینه BULK_MEMORY فعال است که از دستورات WebAssembly memory.copy و memory.fill برای پیاده سازی توابع C memcpy و memset استفاده می کند.
- عادی سازی مسیر در تابع PATH.basename() (PATH.normalize()) غیرفعال است، یعنی. با فراخوانی 'PATH.basename("a/.")" اکنون به "." به جای "a"، و "PATH.basename("a/b/..")" به جای "a" ".." را برمی گرداند.
- هنگام استفاده از گزینه -sMODULARIZE، توابع کارخانهای که نمونههایی از ماژولها و اشیاء WebAssembly را برای جاوا اسکریپت ایجاد و برمیگردانند، اکنون هنگام کامپایل در حالت پیشفرض WASM_ASYNC_COMPILATION بهعنوان "async" علامتگذاری میشوند.
- قابلیت تعیین کتابخانه های جاوا اسکریپت با استفاده از گزینه "-lfoo.js" اضافه شده است. برخلاف گزینه "--js-library"، کتابخانه در تمام مسیرهای مشخص شده از طریق گزینه "-L" جستجو می شود.
- هنگام پیوند دادن در حالت اشکال زدایی (-O0 یا -sASSERTIONS)، نسخه پیش فرض اشکال زدایی تابع malloc فعال می شود، با بررسی های اثبات فعال برای شناسایی خطاهایی مانند فراخوانی free() دو بار.
منبع: opennet.ru
