LINUX.ORG.RU

MetaJS — первый Lisp, который угадывает мысли

 , , ,


6

4

На GitHub выложен исходный код нового языка программирования MetaJS. Синтаксис языка близок к Clojure, MetaJS также как ClojureScript компилируется в JavaScript, но без внешних зависимостей.

MetaJS разрабатывается в рамках проекта Coect.net, поставившего амбициозную задачу заменить электронную почту, XMPP (Jabber) и социальные сети открытым универсальным протоколом.

MetaJS полностью реализован на MetaJS и может перекомпилировать себя. MetaJS обладает рядом интересных возможностей, среди которых можно выделить специальный синтаксис для упрощения последовательных вызовов методов одного объекта (часто применяется, например, в jQuery). MetaJS поддерживет стандартный для Lisp-языков синтаксис определения макросов, короткие анонимные функции в стиле Clojure #(> %1 %2) и деструктуризацию параметров.

Но главная особенность MetaJS — способность в определенных случаях угадывать мысли программиста и генерировать недостающий код. Демонстрация и разоблачение.

>>> Подробности



Проверено: Shaman007 ()

{шутка про «delete: *$ not found, assuming you meant 'delete *'» и «Damn Warren’s Infernal Machine»}

anonymous ()

Реализован сам на себе - это хорошо, но меня всегда интересовало:

А если у вас есть только исходник компилятора MetaJS, написанного на MetaJS, и нету самого компилятора - что делать? Лапу сосать?

vitalif ★★★ ()

Пошел по ссылке. Увидел слово «Macroses». Закрыл ссылку.

tailgunner ★★★★★ ()

Я так понимаю протокол будет такой же как был у skype? Все логины и пароли в одном месте? Смысл?

gh0stwizard ★★★★★ ()
Ответ на: комментарий от anonymous

MetaJS это скорее DWIMC (Do What I Mean, Correctly) или DWIDE (Do What I Did Early). Сейчас используются только точные соответствия при поиске пропущенных параметров и, если есть более двух вариантов, должен быть warning и контроль передается программисту, как при слиянии конфликтов в системах контроля версий.

По сути, MetaJS это попытка сделать красивую идею Literate Programming ближе к реальности.

dogada ()
Ответ на: комментарий от vitalif

А если компилятор написан на Javascript или С, и нет node или gcc?

dogada ()
Ответ на: комментарий от gh0stwizard

Протокол скорее похож на XMPP(Jabber) каждый сервер/провайдер обслуживает своих пользователей. Также можно использовать аутентификацию, основанную на ассиметричном шифровании по типу Mozila Persona.

dogada ()
Ответ на: комментарий от dogada

Ну или более глобально - как компилить сам gcc, не имея C компилятора? Видимо, никак.

Я к тому, что всегда ведь должна существовать реализация компилятора на каком-то другом языке, чтобы его бутстрапить. Ну или просто старая версия. Но как оно тут-то решалось?

vitalif ★★★ ()
Последнее исправление: vitalif (всего исправлений: 1)
Ответ на: комментарий от vitalif

Как я понимаю, это вопрос типа, что будет, если неограниченная сила наткнется на непреодолимое препятствие? Javascript-компилятор есть и сейчас, именно им компилируется новая версия компилятора на MetaJS, и полученным новым Javascript-компилятором опять компилируется MetaJS-код использованный на первом шаге.

Использовать компилятор, написанный на компилируемом языке, это не самоцель (Clojure прекрасно живет и без этого), но способствует более глубокому тестированию кода ;)

dogada ()
Ответ на: комментарий от vitalif

А если у вас есть только исходник компилятора MetaJS, написанного на MetaJS, и нету самого компилятора - что делать? Лапу сосать?

Скомпилируй ручками.

Legioner ★★★★★ ()
Ответ на: комментарий от dogada

А под «destructing», вероятно, имеется в виду «destructuring»?

tailgunner ★★★★★ ()

MetaJS разрабатывается в рамках проекта Coect.net, поставившего амбициозную задачу заменить электронную почту, XMPP (Jabber) и социальные сети открытым универсальным протоколом.

Ох уж эти велосипедисты. https://tent.io/

anonymous ()

Но главная особенность MetaJS — способность в определенных случаях угадывать мысли программиста и генерировать недостающий код. Демонстрация и разоблачение.

Не хочу вас огорчать, но это лишь усложнит дальнейшую поддержку и разработку. Если так надо, тоже самое можно сделать плагином к редактору/ide, там оно хоть мешать не будет.

anonymous ()
Ответ на: комментарий от anonymous

Будущее трудно прогнозировать. Мне показалась эта идея интересной, и я ее реализовал, чтобы проверить на реальных задачах. Пока MetaJS в версии 0.0.1 трудно сказать, что из этого получится.

Плагин к IDE не подходит совсем. Цель не в том, чтобы генерировать тот же объем кода, нажимая меньшее кол-во кнопок, а в том, туже задачу реализовать меньшим кодом. Здесь фокус даже не на reusable, а на re-editable code. Идея в том, чтобы ослабить зависимость прикладного когда от интерфейсов библиотечного кода.

dogada ()
Ответ на: комментарий от tailgunner

Конечно, спасибо. /me Надо или больше спать, или меньше писать.

dogada ()
Ответ на: комментарий от dogada

Здесь фокус даже не на reusable, а на re-editable code

О том и речь, что он не будет re-editable, а наоборот write-only. Ибо попробуй разберись, какие переменные используются в какой функции и что они значат.

anonymous ()

Это конечно не взлетит, но именно такие попытки и позволяют верить, что человечество еще не обречено.

Красивая идея.

anonymous ()
Ответ на: комментарий от anonymous

tent.io это больше distributed publishing platform, у них все отношения строятся на модели клиент-сервер, и такие типы коммуникации как например групповые чаты, протокол не поддерживает, насколько я знаю. Но, в целом, да, tent.io это идеологически верная технология, вопрос только в удобной для пользователей реализации.

dogada ()
Ответ на: комментарий от d_Artagnan

О планшете тоже можно сказать: еще один наладонник???

dogada ()
Ответ на: комментарий от dogada

Ну а сначала был видимо просто jsный, логично.

На самом деле тоже интересный вопрос - что нужно, чтобы из исходников gcc, не имея бинарника gcc, получить-таки gcc?

vitalif ★★★ ()
Ответ на: комментарий от vitalif

что нужно, чтобы из исходников gcc, не имея бинарника gcc, получить-таки gcc?

Быть Чаком Норрисом.

anonymous ()
Ответ на: комментарий от vitalif

Эх, ну и школота в наши дни пошла..

anonymous ()

первый Lisp, который угадывает мысли

В среду разработки включена шапочка из фольги?

one_more_hokum ★★★ ()

поставившего амбициозную задачу заменить электронную почту, XMPP (Jabber) и социальные сети открытым универсальным протоколом

Однозначно амбициозная. Не меньше, чем курсач на троих. Главное найти обои.

ak380618 ()
Ответ на: комментарий от anonymous

Да какая там школота... Не, ну а правда. На новые архитектуры я понимаю - портируешь, кроссом собираешь, но вот предположим, что у тебя вообще нет бинарника C компилятора. Ну то есть вообще совсем нет. Ассемблер - ладно, есть. Как gcc собирать? :) такая ситуация вообще кем-то предполагается как возможная? :)

vitalif ★★★ ()
Ответ на: комментарий от vitalif

Зачем предполагать фигню? Ради спортивного интереса? Да, предполагают. Так же как предполагают, что будет, если произойдет зомби-апокалипсис, например. Хочешь - планируй, хочешь - готовься, но это не очень распространенное увлечение, всё же.

ForwardToMars ()

По поводу угадывания мыслей. В обычной практике полезен другой подход - угадывать мысли нужно не только компилятору, но и тем, кто через год этот код откроет. Поэтому правильное развитие языков такое, какое мешает писать трудноугадываемый код. Компилятор должен угадывать, что конкретный кусок кода невнятный и не компилить его, даже если он рабочий - это полезно. А вот угадывать, что хотел сказать программист - не нужно. Его напарник через год может оказаться не таким догадливым, как компилятор и код придётся выкинуть и переписать.

ForwardToMars ()

MetaJS полностью реализован на MetaJS и может перекомпилировать себя.

ехал MetaJS через MetaJS
...
ну вы поняли

перекомпилировать себя

и под какие платформы оно компилится?
так что может всё таки правильнее сказать "может перетранслировать себя"?

и вообще, объясните кто нибудь великий смысл переписывания языка на самом себе?

вот взять тот-же PyPy...
питон - скрипт
чтоб запустить скрипт нужен бинарник-транслятор
тость #> python script.py

чтоб запустить что-то на PyPy нужно...
#> python pypy.py
#> pypy script.py
так получается?

ЗАЧЕМ?????

q11q11 ★★★★★ ()
Ответ на: комментарий от q11q11

и вообще, объясните кто нибудь великий смысл переписывания языка на самом себе?

вот взять тот-же PyPy...

питон - скрипт

чтоб запустить скрипт нужен бинарник-транслятор

тость #> python script.py

чтоб запустить что-то на PyPy нужно...

#> python pypy.py

#> pypy script.py

так получается?

Нет, конечно. GCC написан на C (теперь C++, но это неважно). По вашей логике, чтобы скомпилировать что‐то GCC, надо его каждый раз компилировать? Это не так. А если компиляция осуществляется не вами, а ebuild’ом или аналогом в source-based дистрибутивах, и maintainer’ом в остальных, то какая вам разница, на чём написан исходный код компилятора?

Тот же PyPy тоже компилируется перед использованием. Результат у меня зовётся «pypy-c1.9» и принимает те же аргументы, что и «python».

А смысл, как мне кажется, в том, что компилятор языка — обычно довольно большой и сложный проект. Часто — первый большой и сложный проект на данном языке. Т.е. создатели показывают, что на своём языке можно писать такие проекты.

ZyX ()
Последнее исправление: ZyX (всего исправлений: 2)
Ответ на: комментарий от dogada

Цель не в том, чтобы генерировать тот же объем кода, нажимая меньшее кол-во кнопок, а в том, туже задачу реализовать меньшим кодом. Здесь фокус даже не на reusable, а на re-editable code. Идея в том, чтобы ослабить зависимость прикладного когда от интерфейсов библиотечного кода.

Мне, как человеку сопровождающему чужие проекты, всегда казалось, что важнее не создание кода, а его читаемость :) Данное решение снижает читаемость кода, потому как без контекста хрен поймешь, что это за процедура и какие параметры ей нужны. Явное указание параметров сильно облегчает читабельность кода.

anonymous ()
Ответ на: комментарий от ZyX

Тот же PyPy тоже компилируется перед использованием.

чем он компилится?

блин, это же просто майндфак
есть питон, на нём написали питон, сконпеляли и получили... питон

или на питоне написали тонну скриптов которые ГЕНЕРЯТ исходник питона на C и конпеляют в GCC?

мне это напоминает один фантастический рассказ, там был порошок воды
инструкция гласила: "берёшь порошок воды, разбавляешь водой и пьёшь воду"

наверное я просто чего-то не понимаю в этом мире

q11q11 ★★★★★ ()
Ответ на: комментарий от vitalif

Ок, наводящий вопрос: как был создан первый компилятор?

anonymous ()
Ответ на: комментарий от q11q11

или на питоне написали тонну скриптов которые ГЕНЕРЯТ исходник питона на C и конпеляют в GCC?

Примерно так и есть сам PyPy написан на подмножестве Python, называемом RPython, который транслируется во внутренние структуры, анализируется, оптимизируется и далее транслируется в С/LLVM и компилируется GCC/LLVM. http://doc.pypy.org/en/latest/translation.html

Причина, по которой компилятор пайтона написан на пайтоне, примерно такая же, по которой для сайтостроительства выбирают Python/Ruby/PHP — скорость разработки выше, кода меньше. Другими словами — лень, которая двигатель прогресса.

dogada ()
Ответ на: комментарий от anonymous

Данное решение снижает читаемость кода ... Явное указание параметров сильно облегчает читабельность кода.

В теории да, но на практике любой большой проект обычно приходит к такому состоянию, когда ясно, что ничего не ясно. Отсюда частые примеры из серии, «а давайте все выкинем и напишем заново» или «наш новый проект Y делает тоже самое, что старый проект Х, но делает это правильно и в два раза меньшим кодом».

К сожалению, закон Мура для программного обеспечения не действует, программы не становятся все лучше и быстрее год от года, как процессоры, а медленно эволюционируют, как живые организмы, и даже самые лучшие экземпляры обречены на смерть.

MetaJS это попытка ускорить эволюцию за счет сближения процесса программирования с процессом мышления/речи, который всегда подразумевает какой-то контекст. Например, мы говорим «Принеси пива», а не «Пойди в кухню, найди холодильник, открой холодильник, возьми две бутылки пива, закрой холодильник, принеси сюда, открой, садись рядом, читай комментарии, пей».

Значение контекста сильно недооценивается в современном программировании IMO.

dogada ()
Ответ на: комментарий от anonymous

Это-то понятно - очевидно, в машинном кодах создаётся ассемблер чтобы поудобнее было писать, потом на ассемблере пишется компилятор.

Мне просто интересно, а есть какие-то подобные исходники именно для современных компиляторов :) или если внезапно в мире пропадут все бинарники, то все останутся без компиляторов вообще :)) но это да, как зомби-апокалипсис.

vitalif ★★★ ()
Ответ на: комментарий от vitalif

или если внезапно в мире пропадут все бинарники, то все останутся без компиляторов вообще

Если рассмотреть невероятную ситуацию, что бинарики пропадут, а сорцы останутся, то ничто не мешает ручками откомпилировать тулчейн.

Мне просто интересно, а есть какие-то подобные исходники именно для современных компиляторов

Для большинства толку от них не будет. Ведь они изначально писались либо на себе же, используя существующий компилятор для первой сборки, либо на другом языке высокого уровня.

anonymous ()

Интересно, насколько задумки авторов реализованы в коде?

AVL2 ★★★★★ ()
Ответ на: комментарий от vitalif

Обычно первые компиляторы делают в виде трансляторов на другой язык и в дереве исходников сохраняют эти отраннслированые файлы.

AVL2 ★★★★★ ()
Ответ на: комментарий от AVL2

Сейчас работает поиск необходимых параметров вызываемых функций в контексте вызова, чему есть пример на metajs.coect.net/#magic.

Например, функции по работе с базой данных часто принимают в качестве одного из параметров db или storage, и вызывают друг друга передавая этот параметр при каждом новом вызове. MetaJS, если видит что вызываемая функция требует параметр db, но вызвана без него, ищет параметр в контексте вызова, находит его локальном контексте (аргумент, переданный в вызывающую функцию) и использует его. Принцип работы описан здесь: coect.net/ru/metajs/

Это удобно также для программирования на Node.Js, где последний параметр любой асинхронной функции callback, который можно находить по имени или сигнатуре (err ...).

dogada ()
Ответ на: комментарий от dogada

Честно говоря, я бы не стал называть этот примитивный механизм додумыванием кода.

Но даже в таком виде это очевидная экономия ручного труда программиста.

AVL2 ★★★★★ ()

Но главная особенность MetaJS — способность в определенных случаях угадывать мысли программиста

Автор: Дмитрий Догадайло

Смишно.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Просто ты далёк от понимания процессов, происходящих в мире, отсюда и столь примитивный комментарий.

anonymous ()
Ответ на: комментарий от vitalif

вообще нет бинарника C компилятора

асм в руки и пишешь C компилятор

stevejobs ★★☆☆☆ ()

Чем больше неявных выводов делается относительно кода, тем менее код читабельный. Аппликативные и стековые говноязычки, всякие там APL - как раз вырожденный случай такого нелепого подхода. Практика показывает, что чем больше в коде повторов, чем более явно прописаны все связи, пути и зависимости, тем проще этот код читается.

anonymous ()
Ответ на: комментарий от anonymous

что чем больше в коде повторов

Не позорь анонимусов.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.