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 ()
Последнее исправление: cetjs2 (всего исправлений: 2)

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

Компилятор/интерпретатор выполняющий один и тот же код по разному в зависимости от фаз Луны и расположения пятен на Солнце? Да, это будет полезная и надёжная вещь, которая позволит здорово сэкономить на объёме кода выбросив из него за ненадобностью функцию random. И вообще, на новом языке можно будет написать программу умеющую всё! Запускаешь программу, смотришь что она сделала, если не то что надо, то выключаешь и смотришь на результат. И так пока не выполнится нужная операция.

Даже ИДЕ угадывая мысли её создателей иногда генерирует такой код который приходится ругаясь удалять и писать по другому а тут планируется принципиально новый ИИ который не ошибается и весит немного.

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

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

Не зависимость от чужих глюкофич. Возможность поправить свой компилятор не изучая лишнего языка, возможность использовать при этом фичи своего языка. Тестинг качества фич языка.

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

блин, это же просто майндфак

есть питон, на нём написали питон, сконпеляли и получили... питон

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

Зайдём с другой стороны. Ты бы хотел чтобы исходники gcc были написаны на визуалбейсике? Генерацию исходников на С с небольшими усилиями можно переделать на генерацию исходников на ХХХ. С здесь лишь деталь которую питонщикам особо знать не надо и можно заменить.

Napilnik ★★★★★
()

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

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

В рамках нового законодательства это будет актуально.

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

Предлагаю автору разработать протокол безсерверной передачи сообщений, файлов

Это будет.

и безсерверного развертывания сайтов с динамическим содержанием.

Этого не обещаю ;)

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

и безсерверного развертывания сайтов с динамическим содержанием.

Этого не обещаю ;)

Тогда вся затея обречена на провал.

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

Компилятор/интерпретатор выполняющий один и тот же код по разному в зависимости от фаз Луны и расположения пятен на Солнце?

Я встретил неожиданно много комментариев здесь и в [дискуссии на Reddit](http://www.reddit.com/r/lisp/comments/1ltb9r/new_lisp_dialect_can_guess_your_...), в которых люди считают, что генерация когда MetaJS непредсказуема. Мой опыт использования MetaJS говорит об обратном, но свой опыт в чужую голову не вставишь...

Очевидно, надо работать над документацией и примерами. Пока я немного изменил пример [магии MetaJS](http://metajs.coect.net/#magic), чтобы сделать генерацию недостающего кода более понятной.

dogada
() автор топика

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

Лучше не надо.

warezpro
()

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


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

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

Даже если и предсказуема - если правила вывода неявных аргументов не тривиальны, то такой код читать нельзя. Писать, кстати, тоже.

Рекомендую Вам ознакомиться с историей. Задумайтесь, почему лучший язык программирования всех времен и народов, Java, настолько многословен (заставляет, например, писать TypeBlahBlahBlah v = new TypeBlahBlahBlah(kekeke);).

anonymous
()

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

Поскольку скобкота на шелл не тянет ни разу, то Вы все делаете неправильно.

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

Я встретил неожиданно много комментариев здесь и в [дискуссии на Reddit](http://www.reddit.com/r/lisp/comments/1ltb9r/new_lisp_dialect_can_guess_your_...), в которых люди считают, что генерация когда MetaJS непредсказуема. Мой опыт использования MetaJS говорит об обратном, но свой опыт в чужую голову не вставишь...

Вопрос в развитии. Допустим сделаешь ты хорошую генерацию кода при выполнении программы, люди её используют много раз а потом бац - обновление версии компилятора с новыми алгоритмами генерации кода при выполнении и совместимость поломана хуже чем в питоне. Тебе же самому будет неудобно что-то добавлять в ИИ и одновременно тянуть воз совместимости со старым кодом. Очевидно что генерация угаданного машинным разумом кода должна быть при написании программы, как в ИДЕ, с последующей проверкой результата человеком: а правильно ли оно угадало или надо исправить. И после редактирования ничего лишнего в код добавляться не должно. Тебе же самому будет неприятно если система например без спроса отформатирует носитель который ты воткнёшь в комп для посмотреть. Или если программа проверятель грамотности текста незаметно заменит слова в отправленном сообщении а ты потом оправдывайся что не туда хотел послать собеседника:)

Контроль типов при задании аргументов функции важная фича обычно препятствующая скрещиванию ежа и ужа, а если компилятор будет сам туда засовывать при выполнении любой найденный поблизости подходящий аргумент то разбираться в них человеку будет необязательно, потом муторно, оно же и так работает, и количество говнокода возрастёт. (пример такого действия был в киберпанке Тюрина где слишком умная свиноферма сама автоматически клепала колбасу, причём ни одна свинья при этом не пострадала, только количество говна уменьшилось и сторож куда-то пропал) Вот добавить _по_разрешению_ погромиста дополнительный код в редактируемый исходник это хорошо. Можно даже пометить изменённые строки если их много.

Napilnik ★★★★★
()

А если у программера нет мыслей?

Vinni_Pooh ★★★★★
()

Лучше бы Вы, автор, к серьезному проекту присоединились: http://ya-lang.com/

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

А что не так? Повторяющийся код читается просто.

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

ну множество интерпретаций самореферентного описания можно попытатся разложить на набор независимых «графов» ну а уж какая семантика у каждого «графа высказываний» ограничивается самим графом , так что семантика самого описания без какого либо «коментария» конкретизируеющего некоторое число базовых вещей ( ну для класического метаинтерпретатора достаточно 5 функций (голова, тело, мультивыбор,совпадение, чёт ещё (построение списка вроде)) и набор подстановок - рекурсия и семантика....) - для других самоописаний вроде как больше требуется обычно

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

кури как был реализован первый Пацкаль - ручками.

если утя сырцы gcc то кратчайший путь использовать воссоздать tcc-подобное которое в процессе подьёма от маш кода тоже не в 1 итерацию /

и вот есть забавная памятка http://homepage.ntlworld.com/edmund.grimley-evans/bcompiler.html

qulinxao ★★☆
()
Ответ на: комментарий от A-234

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

Это, кстати, мысль. Зачем плодить сущности сверх необходимого? Спасибо.

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

а потом бац - обновление версии компилятора с новыми алгоритмами генерации кода при выполнении и совместимость поломана хуже чем в питоне. Тебе же самому будет неудобно что-то добавлять в ИИ и одновременно тянуть воз совместимости со старым кодом.

Такая проблема действительно может возникнуть, но есть два момента:

  • Сам компилятор не генерирует код, он применяет к изменяемым правилам логоса 2 алгоритма (поиск по имени и ассоциации), которые, практически не меняются, как не меняются аксиомы геометрии. Число таких алгоритмов действительно очень ограничено, в данный момент я вижу только 2 таких алгоритма (один из которых сделан, второй - в процессе) и не уверен, что их вообще существует больше 5.
  • Изменение правил логоса или сигнатур функций действительно может привести к волне изменений в конечном коде, но, как говориться, это не баг, а то, за что и боролись. Это опасная возможность, но будет она преимуществом, или проблемой зависит от программиста. Главное, что изменения кода программы будут происходить в ответ на действия программиста, а не в результате обновления компилятора.

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

Согласен, что умная IDE может быть очень полезна, но не вместо, а в дополнение. Мне нравится путь, которому идет http://www.lighttable.com/ - это будуще IDE. Компьютер должен перестраивать программу и давать обратную связь параллельно с изменением текста программы, а не просто мигать курсором, ожидая следующего символа. Когда дойдут руки, я сделаю специальный flymake-режим для Emacs, который будет позволять взаимодействовать с MetaJS компилятором почти интерактивно, как это и должно быть. Компилировать и анализировать ошибки и предупреждения, это не совсем то, что надо.

И после редактирования ничего лишнего в код добавляться не должно.

Если хорошо подумать, то так делать нельзя. Код программы всегда должен держаться в максимально компактной форме. Сейчас добавился один параметр, завтра с новыми правилами заданными самим программистом добавиться два или четыре параметра. Исходник же останется один и тот же. Спасением я вижу здесь системы контроля версий. Если генерируемый Javascript держать в системе контроля версий также как и исходный MetaJS легко заметить, если изменение в одной строке MetaJS почему-то дало изменения в трех js-файлах. Это может быть правильное поведение, но правильное оно или неправильное должен решить программист просмотрев diff всех (т.е. и MetaJS и Javascript) изменений перед каждым комитом. Я лично нахожу этот способ очень удобным и рациональным. Не надо также забывать, что MetaJS стремиться генерировать очень близкий к рукам написанному код (который сейчас проходит почти все проверки JSHint) и просмотр изменений в Javascript не должен быть проблемой. MetaJS изначально создавался не как абстрактный Lisp, а как лучший способ генерировать Javascript, используя те преимущества Lisp, которые не может обеспечить ни один другой язык.

пример такого действия был в киберпанке Тюрина где слишком умная свиноферма сама автоматически клепала колбасу

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

Вот добавить _по_разрешению_ погромиста дополнительный код в редактируемый исходник это хорошо. Можно даже пометить изменённые строки если их много.

Нет. Мухи отдельно, котлеты отдельно.

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

исло таких алгоритмов действительно очень ограничено, в данный момент я вижу только 2 таких алгоритма (один из которых сделан, второй - в процессе) и не уверен, что их вообще существует больше 5.

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

Ты закладываешь в ЯП на будущее ограничение на уровень интеллекта/догадливости его разработчика(ов) - твой язык, делай с ним что хочешь и убеждай других в правильности такого подхода как хочешь.

Код программы всегда должен держаться в максимально компактной форме.

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

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

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

Napilnik ★★★★★
()

Жёлтые заголовки на моём ЛОРе Дожили

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

А, памятка прикольная. Но там-то в принципе ладно, всё понятно. Но что с gcc-то делать в такой ситуации? Его вообще реально поднять, не переписывая нафиг заново? :)))

Причём, они же там вроде вообще недавно на ++ перешли - правда я не вкуривал, насколько полностью, может ++ там чуть-чуть только...

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

MetaJS не изменяет синтаксис языка, а что читать, это ваше личное дело.

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

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

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