19 липня 2022 року

Untitled


<aside> 📢 Примітка: Додаткову інформацію про можна знайти на сторінці Мова програмування Move.

</aside>

Вступ

Джен: Дуже дякую за участь у другій частині нашого AMA. Цього разу тема — наша мова програмування Move. Я дуже рада представити вам наших прекрасних гостей, Тодда та Даміра, інженерів-програмістів Move з Mysten Labs!

Тодд: Мене звуть Тодд, і я працюю над Move з 2018 року. Я займаюся компілятором, а також інтеграцією Sui.

Цікавий факт: я працюю в Mysten з березня, а до цього вісім років пропрацював у Facebook (або Meta). Тож у стартап-просторі було весело.

Дамір: Мене звуть Дамір, і я треную та використовую Move з 2019 року, коли люди з Facebook тільки розробляли мову. Я пройшов через першу фазу Move IR, а потім почав використовувати Move. Перш ніж вони написали документацію з мови, я написав першу книгу про неї.

Запитання #1: Якою є історія Move і що відрізняє її від інших мов програмування, таких як Solidity?

Тодд: Щодо історії, Move був створений як мова програмування для проекту Libra та Diem у Meta. Meta розглядала мови програмування смарт-контрактів і намагалася знайти щось, що підходить для проекту, але нічого придатного не було. Коли ми розглядаємо інші мови програмування блокчейну, а саме Solidity, у ньому немає активів чи інших елементів блокчейну як елементів першого класу. У певному сенсі він схожий на Javascript, де ви намагаєтеся побудувати програмування цінності на основі відображень, але в ньому немає моделі програмування на основі активів.

Тому я почав розглядати ці ідеї з лінійної логіки, лінійного програмування, систем лінійних типів та інтегрувати їх у мову програмування як спосіб запровадження дефіциту. І ось що насправді є Move — це мова програмування з дефіцитом.

Ми хотіли переконатися, що у вас є вбудоване поняття: ось деякі значення, ці значення є активами реального світу, ви не повинні мати можливість копіювати їх, і ви хочете переконатися, що вони використовуються правильно.

Нам потрібна ця ідея дефіциту, програмування, яке гарантує, що активи, які ви маєте, не можна скопіювати, що ви використовуєте їх так само, як використовували б гроші, і вони поводяться як фізичні гроші. Для мови блокчейн також потрібні такі речі, як облік. Важливо, щоб ви, якщо ви приходите на ці платформи, платили за гру або за обчислення, які ви використовуєте, та мали якийсь механізм для цього. Тому, хоча ви можете взяти існуючу мову і спробувати додати дефіцит, або додати API, або програмування за допомогою активів, важко отримати ще й облік.

Ще складніше інтегрувати детермінізм: механізм у середовищі блокчейна, який вимагає, щоб усі вузли були згодні з результатом обчислень (наприклад, за однакових вхідних даних ви хочете отримати однаковий вихід). Вам доведеться почати справді перебирати та забороняти безліч бібліотек за недетерміновану поведінку, наприклад, генерацію випадкових чисел.

Отже, ми дивимося на ці речі, і саме з цього почався Move. Ми подумали: давайте просто зробимо дуже просту мову, в якій усі ці речі є відправною точкою для примітивів мови. Move дійсно починалася як дуже проста мова для програмування з ресурсами або активами, і згодом ми трохи ускладнили її. Але такою є його історія, і чому ми не взяли готову мову, як Solidity або навіть Rust.

Ми почали Move зі спрощеної мови та зробили її об’єктно-орієнтованою. Потім ми прийняли ML-подібну систему модулів. Багато чого було розроблено для того, щоб переконатися, що ці блокчейн-додатки прості. З першого дня ще однією важливою річчю була можливість мати надійні гарантії та статичний доказ програм Move. У нас завжди була мета побудувати Move prover у якомусь вигляді статичної верифікації, тому що часто, коли ви повертаєтеся і хочете зробити статичну верифікацію мови, вам доводиться мати справу з усіма цими гидоти, які мова додала для виразності, але не піддаються простою статичною. верифікації. Спочатку Move навіть був повним по Тьюрингу; ми не мали ні загальних циклів, ні рекурсії. Ми сподівалися, що це полегшить статичну верифікацію, але виявилося, що ми цього насправді не зробили. Одна річ, яку ми не прибрали з цієї мови, — це динамічна диспетчеризація, або більш традиційне уявлення про об’єктно-орієнтовані мови, де немає жодного сліду чи чогось іншого. Немає можливості мати опосередковані виклики або функції, де поведінка шляху коду або логіка, яку ви приймаєте, дійсно є суто динамічною в цьому сенсі. Це просто робить певні частини верифікації набагато простішими. Хоча вам доведеться програмувати по-іншому, ми вважаємо, що цей компроміс того вартий.

Таким чином, мова розвивалася з цього погляду. Спочатку ми не мали мови з родовим набором. Не було поліморфізму; він виник пізніше. Є багато справді цікавих речей. Якщо вам коли-небудь буде нудно, просто підіть і прочитайте VM чи IR; там багато справді кумедних навчальних артефактів, і вони є свого роду кумедною археологією. Спочатку Move не мав векторів або інших типів колекцій, у нас був тип байтового масиву, який використовувався всюди, так що ви можете думати, що в кодовій базі все ще є деякі посилання на байтовий масив, що завжди весело.

Я думаю, що одна з речей, якою я пишаюсь найбільше, це наші перевірки безпеки посилань, у нас є перевірка запозичень, ви знаєте, Rust дуже відомий тим, що у нього є перевірка запозичень, це статична перевірка навколо посилань. І вона відома тим, що призводить до надзвичайно заплутаних помилок. І я не кажу, що з Move ніколи не виходило нічого заплутаного, але я думаю, що з точки зору складності системи ми створили щось, що має аналогічний рівень виразності для безпеки посилань, але при цьому принаймні з точки зору формалізму чи реалізації, набагато простіше.

Дамір: Приблизно у 2019 році ми розробляли блокчейн, який мав стати дефі-блокчейном, і нам потрібно було вибрати мову. У той час у вас був тільки solidity, а два інших варіанти були новими та перспективними мовами розробки, одним з яких був Move, а інший, якщо я не помиляюся, був створений хлопцем, який створив криптокотят.