Магія підміни. Розповідаємо про мову програмування Aya

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Мова Aya має одну чарівну здатність, а саме можливість скоротити використання повторного коду до максимального рівня можливостей. Продемонструю на простому прикладі

Після імпортування фреймворку JS Jquery, ми призначаємо слово `$1` як запаковану інструкцію із елементами заміни, яка створює DOM елемент з обраним ім’ям, заповнює його вміст обраним текстом та додає об’єкт до HTML структури.

Це відбувається як «визначення суррогата» (substituting) із значеннями заміни.

Згодом, замість того, що писати повну інструкцію, яка містить вкладені приланцюжені функції .html та appendTo, ми використовуємо лише слово `$1` (тут його вигляд обраний довільно, але може бути будь-яким набором символів без проміжку або рядок) додаючи підходящі вхідні значення.

Таким чином ми економимо енергію на створення коду.

github.com/ayauho/Aya

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Ось гідний алгоритм. Хто напише — розбагатіє.
Така собі тулза — яка приклади наводить за приблизним текстовим описом може навіть бути дуже продаваємою серед курсантів вайтішників.
Щоб виконувати простенькі завданнячка немає нічого кращого за таку тулзу.
Пишешь собі: масив, тоді клікаешь на ярлик и тулза тобі викидує щось до роботи з масивами.
Декілька функцій, циклів таке інше. На прозорому eкранчику десь сбоку, або на другому моніторі... а ти вже одбираєшь — ще раз клік и все це переміщується у Блокнот чи куди там — до IDE ?
P.S.
Або трохи інший інтерфейс — ще бистріший.

Левова доля часу витрачається на читання коду, а не на його написання. Є мільйон способів записати код коротше. Але якщо для його читання (та вміння бачити помилки) потрібно вивчити досить складний синтаксис, що погано сумісний з тим самим JS чи іншою мовою якою одночасно має володіти програміст — еволюція відсіє все це як непотреб.

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

В твоєму прикладі потрібно читати як справа наліво, так і зліва направо. Ділянки коду не обмежені синтаксисом. Пробіл не є ефективним обмежувачем, його роль не може конфліктувати зі звичайною мовою. Тому набагато доцільніше витратити час та написати так, як в останньому рядку. Літер багато, зате читається миттєво. Ба більше, такий код можна читати «по діагоналі» та одразу бачити без структурного аналізу, чи потрібна та ділянка для того, що шукаєш.

PS. Тягнути бібліотеку з гугла — моветон. Бо зараз старий світ тріщить по швах, і вираз «у гуглі забанили» вже не викликає посмішку. Виявиться наприклад що твій код не працюватиме в частині України, яку Гугл помилково вважає за IPшником окупованою територією.

Дякую за розгорнутий коментар. Я, напевне, замало слідкую за тенденціями, тому навів мабуть застарілий спосіб тягнути код з гугла. Але по життю я не тягну, чесне слово.
Ваша логіка стосовно сприйняття коду цілком доречна. В той же час, сподіваюся на практиці воно працює трохи по-іншому.
Наприклад, програмуючи в мові Aya , я помітив, що відсутність в коді зайвих елементів і його значне скорочення, тільки на початку виглядає як складно-читабельне, але з часом усвідомлюєш, що це з незвички. А ось плюс, що я помітив в тому, що відсутність в коді зайвого дозволяє краще його проектувати. Я поки що не можу зрозуміти, чому, але можливо тому, що зайві елементи синтаксису (усілякі скобочки і інші значки, без яких можна обійтися) створюють непотрібний фон при уявленні коду під час проектування. Без них якось споглядати код у себе в голові приємніше. Це не просто усвідомити, якщо ви не спробували, але це справді те, що я відчуваю.

Воно то так, але елефанта так не продасиш. Я про складно-читабельне... Як би це... Ось хтось пише диплом. Усе по суті — нічого зайвого. Виходить 5 сторінок. Не приймають. Кажуть — додай води. Припущення: вода необхідна. Пропозиція — оскільки вода генерується або додається згідно умов значно краще ніж суть — нехай вода сама себе й пише. Тобто усіляки скобочки це вода. Більшості вона потрібна аби було за що заціпитися.

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

А може не звичка? A,B,C,D й A,C,D,B це різні інструкції. Додамо conditions and cycles — наприклад у bash чи regexp багато такого і що ми побачимо? Без декількох різних типів відокремлення — тобто впорядкування первісного квантового хаосу — наприклад суперпозиції A,B,C,D (всі перестановки одночасно) рішення компіляції не буде знайдено.

Я не зовсім зрозумів, що ви маєте на увазі. Як зараз у мене:
— Багато працюю із JS
— Усвідомлюю, що цю мову можна змінити так, щоб позбивитися не обов’язкових символів і покращити синтаксис (Очевидно, що це завжди можливо? Очевидно, що це можливо для JS?)
— Працюю із новою мовою і звикаю до синтаксису
— Тепер відчуваю, що не виконую різну зайву роботу, що радує
— З часом звикаю до нового синтаксису, читабельність і пізнаваємість коду підвищується
— Профіт
Приблизно це я і хотів донести.

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

Подібне нікому не подобається. Ви ж розумієте, що чужі негативні досвіди нікого не зупиняють? Тим паче, коли справу зроблено.

Мені здається наче ваша мова незрозуміла. Що вступає у дісонанс із її описом. Вибачте, якшо що.

Що вам конкретно було не зрозуміло в документації мови, для прикладу? І з яким конкретно елементом опису це вступає у дисонанс?

Це лише перше враження. Читання чужого коду вимагає значно більших ресурсів. Зокрема й таких, яких у мозку нема взагалі — і тоді витрати на чужий код стають більшими за написання нового.

Зайві елементи можна прибрати лише в одному випадку: ви скористуєтесь синтаксисом звичайних мов. Пайтон свого часу був створений саме так — і він таки взяв свою нішу. Яка із часом виявилася вершиною.

Мова не про читання чужого коду, а про читання і звикання до іншого синтаксису.
Думаю дійсно, пайтон став популярним саме тому, що був схожий на синтаксис інших мов.
В моєму прикладі йдеться про незвичну можливість мови. На мою думку збільшення корисних можливостей для мови теж непогано працює, як із Rust, наприклад. В цілому для популярності мови потрібно, щоб всі плюси спрацювали. Особисто я створив нову мову не на рівному місці, звичайно, а тому, шо вирішив, що є можливість покращити ефективність програмування. Чи спрацює це? Що ж буде видно. На даний момент я цілком задоволений зручністю створення нового коду, в порівнянні із JS. Про загальну швидкість поки що робити висновки зарано.

Е... та любий з нас (ДОУчан) може створити власну мову. Або й дві (чи декілька як наприклад я)
А ось заробити гроші (багато) створивши працюючий саме із цією ціллю (добування грошей) інструмент, може чомусь зовсім не кожний з нас.
І саме це я досліджую зараз. А чого це — як я такий розумний, то такий бідний?

Впевнений, що ваше особисте припущення про те, що «любий з нас доучан може створити свою мову» не коректне. Якщо тільки ви не мали на увазі на кшталт «кожен із нас може стати ким завгодно в цьому житті» або «людина здатна майже на все, якщо захоче». Як мінімум ви не врахували, що існують люди із дуже різним рівнем підготовки, чи ви записуєте до «доучан» лише тих, хто має дуже багато років досвіду?
А ви могли б показати ці вищеозначені декілька мов, які ви створили?
Ви програмуєте на власній мові зараз? Поділитесь проектом, який в запрограмували на своїй мові?
Хочу зауважити, що я створив свою мову в першу чергу для того, щоб на ній програмувати, бо це підвищує ефективність моєї роботи.

Частково вони десь у репозиторіях. Частково ще у голові. Одна дозволяє клікери робить (є відео) Інша візерунки крутить. (є відео) Зараз обмірковую третю — мову генерації та трансформації візерунків (для початку) Ще коли у універсітеті вчився інтерпретатор зробив щоб квести моделювати...
Багатенько в цілому виходить. Ще б хоч шось було закінчене. Ось може в цьому році... Сайт також є. Але він скоріш тестовий, дослідницький, як ви кажете — для себе — чим для людей.
Поки що зовсім слабенький (навіть nft не мінтить)
frozen-brushlands-39280.herokuapp.com
Що стосується інших — а чому б ні? «Не боги горшки обжигают»

Це зовсім не така мова програмування, яку я очікував побачити. Як ви думаєте, чи можна назвати мовою програмування, наприклад програму, яка буде отримувати від користувача команди, які будуть керувати, скажемо переміщенням фігурою на екрані? Або взагалі чи є мовою програмування будь-яка програма, яка отримує від користувача команди, опрацьовує їх та виводить результат?

Кнопки це атоми. Там є кнопка «execute script» Можна написати: plus, median і якщо воно працює (не пам ятаю чи це так) то программа зрозуміє та виконає, якщо умови її задовільнять.
Тобто, [plus, median] це речення якоїсь мови.
Повторюю — мову написати легко. Важко написати таку мову якою будуть говорити чимало людей віками.
P.S.
Зараз не працює. Атоми виконує, а chains ні. Мабуть коли деплоів у облако, щось наплутав у source files
P.P.S.
Це теж якійсь там доказ)
www.youtube.com/watch?v=ncOWXX_-ls8

До речі, ні JavaScript ні Aya не вважаються «мовами програмування». Це «мови написання скриптів».
Ви можете називати свою розробку «мовою програмування» лише тільки тому, що вона приймає інпути і перетворює їх на аутпути по певним правилам. Та робить так, щоб інпути були у вигляді оригінальних слів.
Але будь-яка повноцінна мова програмування та скриптова мова має певний набір атрибутів, які обов’язкові — і без них це лише програма.
5 обов’язковий атрибутів мови програмування (і мови скриптів):
1) Інпут
2) Аутпути
3) Цикли та умови
4) Математичні та арифметичні операції
5) Змінні та структури даних
Здається у вашої розробки немає цих всіх атрибутів.
Бачу у вас є інпути та аутпути, які приймають набір даних, одного типу (рядок) та видають один тип аутпуту (картинка).
Але, якщо ваша розробка не дозволяє користувачу створювати цикли, умови, працювати з основними математичними операціями (фактично бути калькулятором), не дозволяє призначати змінні основних типів та керувати ними — то, на превеликий жаль вимушу констатувати, що це лише хоч і цікава, але програма. Вибачте.

Так, приймаю ваші зауваження, вони слушні. Сам над цим розмірковував. Часу немає доопрацювати. Зараз працюю над ботом для криптобіржі. Не дуже складним.
На сайті в мене ще мають бути запис у регистри проміжних результатів...
Що стосується умовного виконання та рекурсивного виконання процедур (із синтаксисом їх об явлення) це теж можна — якщо продумати установку флагів якимись іншими процедурами.
Можливо доопрацюю якщо зв явиться невідкладна потреба саме у умовному виконанні. Зараз було б достатньо виконання chains і можливо meta-chains. Колись працювали. Та регистри.
Зараз в приорітеті бот та платна генерація nft на сайті. Та й домен треба прикрутити.
Kernel of my nodejs project це саме атомна функція, який на вхід подається картинка, фільтри, та дія — правило обробки.
А кнопки то UX. Трохи недолугий. Теж не без питань.
Що стосується умовного виконання у межах атомної функції тут ще треба поміркувати. Атом тому й атом що не умовний. Мова of kernel скоріше схожа на Prolog чи LISP чи Forth
Немає часу — зайнятий здобуванням грошей для сім ї

Це не програма. Це філософській камінь. Джерело буття.
До картинки застосовується правило перетворення пікселів — її (цієї картинки) елементарних елементів.
Conway’s Life це щось схоже
Але моя схема більш абстрактна та повнофункціональна.
Ось перетворення «зіркове небо» кожен пиксел із прозрачного стає випадкового кольору.
У цей атом можна також додати фільтри. Наприклад фильтр випадковості залишить на картинці лише три кольори. Або сім. Фільтр області створить лакуну випадковості. А якщо фильтр випадковості скласти із фільтром області наша лакуна буде таких кольорів які нам потрібні.
Також інші фільтри можна обмислювати вічно.
Що мені більш всього подобається що все це діскретне, тобто є початковий набір, дуже лімітований. На виході безліч самих різноманітних варіантів.
Та хоч ліки від раку.
На виході з являється після обчислення квантовий тобто множественній набір рішеннь. Ну й так далі...
Компоновка цих рішень, їх фільтрація призводить до відбіру найбільш ефективних.
Це якась глибина.
Неміряна.

Я вже мовчу про генератор правил та фільтрів який можна зробити саме із-за того що ми маємо первісний дискретний набір єлементів.
Тобто цей сайт у мене це сама суть генеративного арту. Але не три Д, тільки Два Д. І не 4 Д (об ємна мультиплікація)

І ще одне відкриття — це важливо, бо 2+2=3+1
У мене на сайті, там є кнопка «комбо», вона працює із двома картинками. Так ось вона працює не дуже корректно. Бо результатом складення двох картинок є одна. Зараз. А це не так.
Якщо складати красну компоненту наприклад 200+100 то у нас 300. Або 255 та 45. А це вже дві! картинки на виході.
Тобто це якесь рішення переповнення.
Тобто 2+2 по модулю 3 це 3+1
Дві змінні на вході. 2 та 2 значення їх. Та дві змінні на виході. Не одна, не переповнення, а дві змінні. Одна із яких повна-повнісінька а друга 2+2=3+1
Тобто там на сайті глибина. Я тільки у шпаринку трохи піддивився.

Мушу розчарувати, мова — це саме про читання чужого.

Якщо так, значить кожен з нас думав про своє, коли писав свої коментарі. На мою думку, якщо ми обговорюємо нову мову, то таке питання, як читання чужого коду не входить до контексту подібного обговорення. Бо читання чужого коду стосується більше наскільки розумно і якісно код структурований на будь-якій мові. На мою думку, обираючи яку нову мову вивчити, люди не думають про те, наскільки їм буде складно чи просто потім читати код, що написаний на цій мові, а думають про те, як вони зможуть реалізовувати проекти і отримувати вигоду програмуючи на цій мові. Це ж і стосується людських мов. Коли ми обираємо нову мову для вивчення, ми не зважаємо на те, наскільки якісно окремі носії цієї мови пишуть тексти, наскільки ці тексти зрозумілі. Взагалі, ми не можемо сказати, наприклад, що тексти на арабській мові зазвичай менш зрозумілі, ніж на китайській, тому тут справа не в мові, а в тому, чиї набори символів вам приходиться читати.

Не зрозумів, що означає

В твоєму прикладі потрібно читати як справа наліво, так і зліва направо.

Не бачу, де потрібно читати з права на ліво. Можливо оператор <- створив таке враження? Якщо так, то ні. Цей оператор схожий на простий assignment, тому ця інструкція читається тільки зліва на право.

Зайшов, подивився. У вас прикладів нема. У цьому топіку є. Один. А на гитхабі у рідмі зовсім нема. А ще онлайн калькулятор теж не завадить. Щоб можна було спробувати самому щось написати. Ось зайдіть на w3cschool learn javascript там прикладів тьма.
Якби я хотів щось написати на aya (до речі як це вимовляється?) то шукав би приклади відповідні до того, що хочу написати. Наприклад: alert test window onload як буде?

Є маленький приклад. зараз працюю над наступним. Все дуже нове, продовжую виправляти помилки, які здаються тут нескінченними.
Маленький приклад: ayauho.com/Reader/reader-aya.html
Вимовляється, сподіваюся як «ая».
window.onload ~ alert ’test’

До речі: jquery був створений задля того щоб не писати постійно document.getElementId
І ще думка visited
arr.map().filter()...bla-bla() це не розпакована упаковка. Тобто зрозуміліше було б:
for(let i...
але ж не компактніше (таємніше?)
Ну й далі упаковка ->розпаковка та розпаковка -> упаковка...
Це вже кому що треба, а tool одна й та сама.

Не хочете use ще й шось на кшалт штучного інтелекту для виконання таких підстановок?
Накопіть власну базу прикладів, та підставляйте, у залежності від того, що пишете.
Оці всі долари можуть бути внутрішнім результатом генерації rules на власній базі прикладів.
Щоб мову Aya зовсім ніхто не вчив. А просто писав:
 div 'html content' document.body 
І єдине співпадаюче rule було б знайдене штучним інтелектом у rules згенерованих згідно накопленої бази прикладів.
А далі вже складніше. Бо можуть бути найдено декілька rules і потрібно буде вирішити якимось чином обрати те чи інше.
Я колись шось таке хотів написати. Мріялось таке: відкриваю звичайний Notepad Windows та пишу собі:
html example
Й воно перехоплює літери, підшукує, розпаковує. Якісь с++
А потім, придивився уважно, що мені заважає набирати повільно й повторно одне й те саме.
P.S.
Подяки не треба. Хіба що лайкніть якійсь мій твіт.

Приємно, що ви зрозуміли сутність подібної інновації (якщо це інновація). Виконання описаної вами задачі є ультра-гігантською роботою. Наскільки я вас зрозумів, то потрібно, щоб компілятор сам визначав, яке правило відноситься до яких інпутів на основі минулих патернів їх використання. В той же час, як зауважили б деякі, подібна фіча може призвести до втрати декларативності коду, а отже і його підтримуваності. Хоча я б заперечив таким, що замість щоб писати декларації (у вигляді зрозумілих імен змінних чи слів-підстановок) краще описувати те, що відбувається у коментарях.

Я тут розміркував, чого я не продовжив ту власну розробку? Я тепер гугл використовую. Прикладів там тьма. Складаю необхідний запит до пошукової системи, заходжу на обраний сайт та копі-пастю. А якщо люди формалізують наведення прикладів то робити такі запити стане ще легше. Ось до речі, вже де-факто що кожен приклад коду повинен бути у тегах code та с кнопкою copy Тобто воно само уніфікується.
Копіпасту правлю звісно, перевіряю... Лехко та швидко.
Втім, ще й досі бажається власну утіліту мати, яка висить у пам яті, перехоплює інпути, підшукує варіанти та на другому моніторі іх демонструє. А далі вже за бажанням, або свій код продовжувати писати, або клікнути на другому моніторі для вибору чогось більше менш подібного, вже написаного колись.
Keylogger + database of source + нейронна мережа = відшукати те, що потрібно цьому кодеру виходячи з того, що він щойно написав і чому є відповідність у його минулих спробах підкорити світ.

Ну, можна піти ще й далі. Генерувати приклади автоматично, кожен день, кожну годину, кожну хвилину. Так заповнювати базу — генерованою кодо-маячнею. Але, генерована фраза може бути перевірена виконанням її у браузері. Якщо помилки не сталося — фраза коректна і може бути колись «востребована» та видана користувачеві у якомусь контексті. Тоді й відбудеться рєєстрація контексту, зв язків, тобто налипання та семантичне уточнювання до первісно випадково сгенерованої фрази. І наша сінерджі система ось так сама себе вчити буде.
Можливо навіть якимось чином пристосувати зрештою до всього цього звичайну природну мову спілкування — англійську чи що...
А далі ще більше — пристосувати розпізнавання голосових команд та жестів перед камерою і вже буде кодування у вигляді — ну мо, компьютер, напиши мені трохи коду слайдеру.

Я вже думав про подібне, але не так поглиблено, як ви)

Для мене це колись випливло із синтаксису регулярних виразів. Раптово зрозумів що шаблони це добре, але мета-шаблони це ще краще. Або коли макрос складається із макросів. Власне це й буде мета-макрос.
P.S.
Головне, щоб компьютер сам по собі не написав сам собі сайта інтернет магазина де продавав би якусь власну творчість...

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

Скоро таке буде. Програмістам залишиться тільки правити видані шаблони та поєднувати один з одним так щоб не мерехтіли. Щоб люфт був у межах стандартів.

Рано чи пізно кожен зможе бути програмістом не маючи навичків писати на якійсь конкретній мові. Як зараз кожен може стати митцем із Midjorney.

Один джс файл, який вміщує весь код (3.7к рядків) це сильно...

Ctrl+F2, F2 . Але загалом так, не зручно.

Вийшло не скорочення, а подовження. Ви одну строку коду написали двома. Взагалі не зрозуміло в чому тут профіт:

function appendTo(elem, content, parent) {     $(elem).html(content).appendTo(parent); }

Авжеж, це не підходить до одиночних випадків. Ваш приклад майже ідентичний до цього конкретного випадку, за винятком того, що створення функції це більше коду ніж інструкція створення підстановки, та підстановка працює для будь-якого шматка коду, що можна написати в одну строку. Наприклад можна зробити підстановку умові
custom_condition <- a = b & c ! d ? ,
та потім використовувати це так
custom_condition log 'hello world'
що буде ідентично
a = b & c ! d ?  log 'hello',
і призводить до генерації JS
if(a==b&&c!=d) { console.log('hello'); }

Підписатись на коментарі