کریس لاتنر، بنیانگذار و معمار اصلی LLVM و خالق زبان برنامه نویسی سوئیفت، و تیم دیویس، رئیس سابق پروژه های هوش مصنوعی گوگل مانند تنسورفلو و JAX، یک زبان برنامه نویسی جدید Mojo را معرفی کردند که سهولت استفاده برای تحقیق و توسعه و نمونه سازی سریع را با هم ترکیب می کند. مناسب بودن برای محصولات نهایی با کارایی بالا اولین مورد از طریق استفاده از نحو آشنای زبان پایتون به دست می آید و دومی به دلیل توانایی کامپایل در کد ماشین، مکانیسم هایی برای مدیریت ایمن حافظه و استفاده از ابزارهایی برای تسریع سخت افزاری محاسبات است.
این پروژه بر روی استفاده برای توسعه یادگیری ماشین متمرکز است، اما به عنوان یک زبان همه منظوره ارائه شده است که قابلیت های زبان پایتون را با برنامه نویسی سیستمی گسترش می دهد و برای طیف گسترده ای از وظایف مناسب است. به عنوان مثال، این زبان در زمینه هایی مانند محاسبات با عملکرد بالا، پردازش داده ها و تبدیل قابل استفاده است. یکی از ویژگیهای جالب Mojo این است که میتوان نماد ایموجی "🔥" را به عنوان پسوند برای فایلهای کد (مثلا "helloworld.🔥")، علاوه بر پسوند متنی ".mojo" مشخص کرد.
در حال حاضر، این زبان در حال توسعه فشرده است و فقط رابط آنلاین برای آزمایش ارائه شده است. مونتاژهای جداگانه برای اجرا در سیستم های محلی قول داده شده است که بعداً پس از دریافت بازخورد در مورد کار محیط وب تعاملی منتشر شوند. کد منبع برای کامپایلر، JIT و سایر پیشرفتهای مربوط به پروژه برنامهریزی شده است تا پس از تکمیل طراحی معماری داخلی باز شود (مدل توسعه یک نمونه اولیه کار پشت درهای بسته شبیه مرحله اولیه توسعه LLVM، Clang است. و سویفت). از آنجایی که سینتکس موجو مبتنی بر پایتون است و نوع سیستم آن نزدیک به C/C++ است، در آینده برنامههایی برای توسعه یک جعبه ابزار برای تسهیل ترجمه پروژههای موجود در C/C++ و Python به Mojo و همچنین توسعه وجود دارد. پروژه های ترکیبی که کد پایتون و موجو را ترکیب می کنند.
این پروژه به گونه ای طراحی شده است که منابع سخت افزاری سیستم های ناهمگن موجود در سیستم را در محاسبات درگیر کند. برای مثال، پردازندههای گرافیکی، شتابدهندههای تخصصی یادگیری ماشین، و دستورالعملهای پردازش برداری (SIMD) میتوانند برای اجرای برنامههای Mojo و موازی کردن محاسبات استفاده شوند. دلیل توسعه یک زیرمجموعه جداگانه از زبان پایتون، به جای پیوستن به کار بهینه سازی CPython موجود، تمرکز بر کامپایل، ادغام قابلیت های برنامه نویسی سیستم، و استفاده از یک معماری داخلی اساسا متفاوت است که به کد اجازه می دهد بر روی GPU ها و شتاب دهنده های سخت افزاری مختلف اجرا می شود. در عین حال، توسعه دهندگان Mojo قصد دارند تا حد امکان به سازگاری با CPython پایبند باشند.
Mojo را می توان هم در حالت تفسیر JIT و هم برای کامپایل در فایل های اجرایی (AOT، پیش از زمان) استفاده کرد. کامپایلر دارای فناوری های مدرن داخلی برای بهینه سازی خودکار، ذخیره سازی حافظه پنهان و کامپایل توزیع شده است. متون منبع در زبان Mojo به کد میانی سطح پایین MLIR (نمایش متوسط چند سطحی) تبدیل می شوند که توسط پروژه LLVM توسعه یافته و ویژگی های اضافی برای بهینه سازی پردازش نمودار جریان داده ارائه می دهد. کامپایلر به شما این امکان را می دهد که از پشتیبان های مختلفی که از MLIR پشتیبانی می کنند برای تولید کد ماشین استفاده کنید.
استفاده از مکانیزمهای سختافزاری اضافی برای سرعت بخشیدن به محاسبات، دستیابی به عملکردی را ممکن میسازد که با محاسبات فشرده، از برنامههای C / C ++ فراتر رود. به عنوان مثال، هنگام آزمایش یک برنامه برای تولید مجموعه Mandelbrot، برنامه کامپایل شده Mojo، زمانی که در ابر AWS (r7iz.metal-16xl) اجرا شد، 6 برابر سریعتر از پیاده سازی C ++ بود (0.03 ثانیه در مقابل 0.20 ثانیه). .)، و همچنین 35 هزار بار سریعتر از یک برنامه پایتون با استفاده از CPython 3.10.9 (0.03 ثانیه در مقابل 1027 ثانیه) و 1500 برابر سریعتر با استفاده از PYPY (0.03 ثانیه در مقابل 46.1 ثانیه).
هنگام ارزیابی عملکرد در زمینه حل مشکلات یادگیری ماشین، پشته هوش مصنوعی موتور استنتاج ماژولار که به زبان Mojo نوشته شده است، در مقایسه با راه حل مبتنی بر کتابخانه TensorFlow، در سیستمی با اینتل 3 برابر سریعتر ظاهر شد. پردازنده هنگام پردازش یک مدل زبان، 6.4 برابر سریعتر در هنگام اجرای مدل تولید توصیه و 2.1 برابر سریعتر هنگام کار با مدلها برای پردازش اطلاعات بصری. هنگام استفاده از پردازنده های AMD، بهره هنگام استفاده از Mojo 3.2، 5 و 2.2 برابر و در هنگام استفاده از پردازنده های ARM - به ترتیب 5.3، 7.5 و 1.7 برابر بود. راه حل مبتنی بر PyTorch با 1.4، 1.1 و 1.5 برابر در CPU اینتل، 2.1، 1.2 و 1.5 برابر در CPU AMD و 4، 4.3 و 1.3 برابر در CPU ARM از Mojo عقب مانده است.
این زبان از تایپ استاتیک و ویژگیهای ایمن در حافظه سطح پایین پشتیبانی میکند که یادآور ویژگیهای Rust مانند ردیابی طول عمر مرجع و جستجوگر وام متغیر (بررسیکننده قرض) است. علاوه بر ابزاری برای عملکرد ایمن با اشاره گرها، این زبان ویژگی هایی را برای کارهای سطح پایین نیز فراهم می کند، به عنوان مثال، دسترسی مستقیم به حافظه در حالت ناامن با استفاده از نوع اشاره گر، فراخوانی دستورالعمل های SIMD منفرد، یا دسترسی به پسوندهای سخت افزاری امکان پذیر است. به عنوان TensorCores و AMX.
برای سادهسازی جداسازی کد پایتون کلاسیک و بهینهشده برای توابع با تعاریف نوع صریح برای همه متغیرها، پیشنهاد میشود به جای «def» از یک کلمه کلیدی جداگانه «fn» استفاده شود. به طور مشابه برای کلاس ها، اگر شما نیاز به بسته بندی استاتیک داده ها در حافظه در زمان کامپایل دارید (مانند C)، به جای "class" می توانید از نوع "struct" استفاده کنید. همچنین می توان به سادگی ماژول ها را به زبان های C / C ++ وارد کرد، به عنوان مثال، برای وارد کردن تابع cos از کتابخانه ریاضی، می توانید "از "math.h" import cos را مشخص کنید.
منبع: opennet.ru