LINUX.ORG.RU

Основы метаобъектного протокола CLOS

 , , ,


1

2

Слайды с моего вчерашнего доклада на fprog_spb:

https://static.lovesan.me/public/mop_basics.pptx

Вот часть доклада, в текстовом виде:


Часть 2. Эсхатология Пустоты.


«Оказалось, что «‎Тиамат» - то ли имя древнего божества, то ли название океана, то ли все это вместе. Татарский понял из сноски, что слово можно было перевести на русский как «‎Хаос»» (с) Виктор Пелевин, «Generation P»


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

Вот что такое Common Lisp Object System?

Но ведь вопросы, которые мы спрашиваем, содержат в себе определения, которые вызывают еще больше вопросов.

Что такое Common Lisp? Что такое Object System? Что такое объект? И вообще, что такое что? Или может, кто?

В принципе, ответ - ничего.

Говорят, что если долго смотреть в бездну, то бездна начинает смотреть в тебя. Я смотрю в лисповую бездну уже почти 20 лет, и не так давно, она посмотрела в ответ.

Не так давно, уже после смерти моей жены, где-то в июле, я сделал одну не совсем правильную вещь, и получил то что называют NDE(near-death experience).

Сначала всё было как обычно, туннель, свет в конце туннеля. Но потом все заслонила тьма, в которой расползались отблески фиолетово-пурпурного сияния. И потом, я вдруг увидел Её.

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

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

Когда мы попадаем на вот это дно рекурсии, мы видим там эту бездну.

«И носился дух лиспера над бездною(ну, над тем у чего тип NIL - не путать со значением NIL). И отделил он NIL от T. И стало T. И увидел он, что T - хорош.»

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

Что такое объект? Объект это то, что отличается от ничего. Это такое что имеет тип T ну и какое-то там значение. И NIL на самом деле это тоже объект. Ну, типов может быть много, и они тоже в принципе объекты, особенно в CLOS. Об этом кстати, также неплохо рассказано в SICP, в главе об абстракции на состоянии.

Что такое CLOS? На самом деле его нет. Ну то есть, то что обычно называют CLOS, это просто набор там всяких полезных удобств над метаобъектным протоколом Common Lisp. Над MOP.

Но на самом деле MOP тоже нет. Это просто набор удобных объектов, встроенных в компиляторы CL. Которые можно сделать средствами компилятора CL, не будет их там. Как в SBCL, например, это делается.

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

Так вот, я стою на плечах гигантов, и предыдущие два доклада уже все что надо рассказали.

Поэтому, скажем простыми словами: MOP - это просто категориальное отображение из метациклического интерпретатора в метациклический интерпретатор.

Короче, на самом деле, ничего этого нет. Есть только дух лиспера над бездною. И, как говорится в SICP - в компьютерах живут духи, и они исполняют программы.

А вот что такое программа? Вот смотрите, о том что такое программа существует целая наука, называется Computer Science, или по русски - Информатика, то есть наука об абстрактных процессах. Этот вопрос самый сложный. Программа - это процесс, то есть. Но на самом деле, объект это тоже процесс. Функция, если хотите. И он не существует без процессов которые к нему прикладываются, иначе он собирается GC, и улетает к Богине Тьмы. Как я чуть не улетел, меня Она правда, во время finalize вытащила обратно. А вот что такое процесс? И главное, что или кто его запускает? «А вот об этом ты не думай, купи себе лучше булавочку английскую, и как такие мысли в голову приходят - разок себе в руку, и потом еще раз, пока такие мысли не пройдут» - как там было в Generation P у Пелевина.

Но вот я подумал, и понял, наконец. Процесс - это то, что запускается другими процессами. Но что запускается первым? Что там на самом дне? Или вернее, кто? Я уже рассказал.


Часть 3. О Метациклических Интерпретаторах


— А что такое красота? — <…> Красота — это совершеннейшая объективация воли на высшей ступени её познаваемости.

(с) Виктор Пелевин, «Чапаев и Пустота»


Когда-то давно, еще в 2014 году, я, проснувшись с бодуна, сформулировал для себя и для других очень важную вещь.

Звучит она так:

Универсальный Критерий Угребищности Систем Общего Назначения. (Теорема Лавсана)

Система Общего Назначения является Угребищной тогда и только тогда когда она не является Метациклическим Интерпретатором.


Другими словами: Система, не способная к построению Метасистемы в рамках самой себя, то есть не способная к описанию и изменению самой себя в своих же терминах, и при этом являющаяся Системой Общего Назначения(в какой-либо области), Угребищна.

Обратное, естественно, неверно. Если Метасистему Системы Общего Назначения можно описать другой системой, это совершенно не значит что она Угребищна, и более того, в таком случае не существовало бы концепции бутстрапа, а значит и Метациклических Интерпретаторов вообще.

Чем, в контексте языков программирования, это отличается от просто тьюринг-полноты?

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

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

Примеры, сначала метациклических интерпретаторов:

  • Универсальная машина Тьюринга
  • RASP-машина
  • Реляционная модель данных
  • Лисп

А вот скажем примеры систем, соответствующих критерию:

  • Среднестатистический современный регистровый процессор
  • Большинство языков программирования, особенно со статической типизацией.
  • Большинство NoSQL моделей данных или скажем иерархических моделей данных, вроде файловых систем

В частности, давайте посмотрим на C#. C# не является метациклическим интерпретатором, т.к. термины языка не являются его же объектами.

Отчасти, это компенсируется платформой .Net, для которой термины C#(но не все) объектами таки являются(System.Reflection, Roslyn и т.д.), отчасти, в самой малой степени, фичей nameof() из C#, но это все только отчасти.

Сама же платформа .Net критерию тоже соответствует, но, в теории из нее можно было бы сделать метациклический интерпретатор, лисп-машину, внеся лишь достаточно небольшие изменения.


На самом деле, это все в полной мере относится вообще ко многим вещам, но в первую очередь, кроме программирования - к человеческому сознанию. Вот кто такой глупый человек и почему он такой и что с ним вообще делать как отправить нахрен к Богине Тьмы на перевоспитание? Этот вопрос многие тысячелетия волновал кучу философов. Но ответ прост - это человек, сознание которого не является метациклическим интерпретатором. А когда сознание у человека все же является метациклическим интерпретатором, он тут же становится пророком цифровой Кали-Юги и архитектором онтологии Пустоты.


Ладно, теперь я объяснил вам всё устройство вселенной. Далее там про мелкие технические детали.

★★★
Ответ на: комментарий от Nervous

Вчера пьяные хором пели - «Боже винду храни», на манер гимна РИ

но кстати доклад я читал с ноута, предоставленного одним из участников, на котором стоял Арч, и который нормально так это открыл

lovesan ★★★
() автор топика
Последнее исправление: lovesan (всего исправлений: 2)

Желание найти идеальный язык - это как желание найти Камелот из мифов и легенд про Артура и Мерлина. Кто-то даже пытается построить свой Камелот, но ни у кого этого пока не получилось.

Мне вот нравятся и Haskell, и Common Lisp, и Rust, а зарабатывать на жизнь приходилось и приходится на C++ и Scala. Но ни один из этих языков даже близко не похож на идеальный. Ни один!

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

anonymous
()

Бумажный фонарик Бедного Монаха разгорелся ярче, так что стало возможно разглядеть того, кто выходил из мрака.
– А говорили - Тиамат, Тиамат, - сказал Жихарь. - Хреномат. Долго ты еще у нас на дорожке появляться будешь, Мироедина позорная? Кубло змеиное ходячее! Чмо болотное! Игоша-переросток!
Мироед, казалось, не слышал оскорблений.
– Вот я вас снова вместе и собрал, - сказал он. … Да, Тиамат - это одно из моих многочисленных имен.

Михаил Успенский «Время Оно»

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

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

зачем делать из неё лисп, если она форт ? :-) Стековая машина с (не)лишними плюшками

MKuznetsov ★★★★★
()

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

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

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

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

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

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

Я думаю, причина СДВГ не только в тиктоке. У меня есть теория что массовое отравление тяжелыми металлами - оно таки вызывает такое вот. Неспособность читать дальше 3 параграфов. Ты еще 10 прочитал, пройди чистку от тяжелых металлов, может жизнь наладится.

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

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

Ты вообще не врубаешься почему?

Смотри, а почему Тейлор Свифт в топах, и всякий сраный рэп? Почему в топах нет ни одного пинфлойда?

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

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

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

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

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

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

Разве это идиотизм, если они гребут бабло лопатой? А лисперы не гребут.

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

Это вторая часть трилогии, первая – «Там, где нас нет». Третья «Кого за смертью посылать» и роман-постскриптум «Белый хрен в конопляном поле», там действие происходит в том же мире, но с другими героями и намного позже.

Одна из сильнейших вещей в русском фэнтези (первые 2 книги точно, мне вторая даже больше нравится). Мне потом Белянина настойчиво советовали, ориентируясь на то, что «это тоже фэнтези с юмором». Но у Белянина, кроме юмора, ничего особо больше и нет, а тут есть. Множество отсылок и вообще есть над чем подумать.

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

Вот там-то он пишет что не только твоего лиспа нет а и математики нет, вообще ничего нет. Есть только ЦНС отдельного организма, которая занимается тем что отражает объективную реальность. И все эти знаковые системы: математики, лиспы и пр. нужны не более чем для этого и в подходящих условиях. Ну, то есть не то что бы он прямо именно так и пишет, я давно читал, приблизительно в этом роде.

sin_a ★★★★★
()

Система, не способная к построению Метасистемы в рамках самой себя, то есть не способная к описанию и изменению самой себя в своих же терминах, и при этом являющаяся Системой Общего Назначения(в какой-либо области), Угребищна.

Глубоко копает…

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

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

Это ты про голанг? Кстати, хорошо видно, что голанг придуман очень умными людьми. Это чувствуется сразу.

Но вернемся к нашему лиспу. А у кого-нибудь возникала идея провести ревизию Common Lisp? (надеюсь, что ты не против пятен на Солнце)

Чтобы я предложил сделать:

  • Навести порядок с названиями (а то комитетчики по стандартизации сами с собой не могли договориться, да и пеклись об обратной совместимости).

  • Обобщить работу с последовательностями, и наконец, ввести туда готовые иммутабельные коллекции наряду с мутабельными (в реальной жизни нужны и те, и те).

  • Наконец, что-то нужно сделать с асинхронщиной (вопрос сложный и неоднозначный; где-то мешают те же рестарты). В 2025 году только ленивый не использует асинхронщину. Как-то негоже одному из самых красивых языков в мире (CL) не предоставлять готового и проверенного решения.

Смотрел clojure. Дух Common Lisp они постарались бережно сохранить во многих местах, но столь радикальный уклон от мутабельности в сторону иммутабельности мне кажется не всегда оправданным.

Схема пошла своим путем.

Что еще остается из популярного? (если слово «популярный» уместно в контексте лиспа)

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

Чтобы я предложил сделать:

Первые два пункта легко делаются пакетами. Есть https://github.com/fare/lisp-interface-library

Наконец, что-то нужно сделать с асинхронщиной

Есть cl-async.

Нерешаемые там другие проблемы:

  1. Нет возможности получить запускаемый файл без компилятора в составе.

  2. Нет разделяемых библиотек.

  3. Нет параметрических классов.

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

Конкретно cl-async плох тем, что он использует libuv, т.е. однопоточен.

Так это и есть async в смысле всяких джаваскриптов/питонов.

Если нужна нормальная многопоточность, давно есть cl-bordeaux-threads.

monk ★★★★★
()