LINUX.ORG.RU

Избранные сообщения dmaj

Машина не может мыслить. И программировать тоже.

Форум — Talks

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

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

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

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

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

Многие вещи, которые я продумывал на протяжении своей карьеры, или при участии в Open Source, вообще сложно было формализировать, и еще на порядок сложнее было их описать на естественном языке. Мы также можем столкнуться с этим не только в программировании, но и например, в какой-нибудь теоретической физике или теории категорий - очень сложно описать на естественном языке, что там происходит. На формальном, то есть математическом - еще туда-сюда. То же самое с программированием. Я замечал, что мыслю иногда образами, а иногда настолько абстрактными вещами, когда дело доходит до программирования, что это сложно переложить на какой-либо вообще язык, тем более на естественный.

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

Вот еще, к вопросу о природе сознания, но в том же контексте.

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

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

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

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

«There is no dark side in the moon, really. Matter of fact, it’s all dark. The only thing that makes it look light is the sun». Машина - это как Луна, в этом плане.

Интересно, что этот вопрос исследуется в религиях с древнейших времен.

Вопрос Creatio Ex Nihilo. Можно сказать, что он в религиях даже центральный. И человек - создан по образу и подобию, как говорится; в отличие от машины.

 , ,

lovesan
()

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

Форум — Development

Слайды с моего вчерашнего доклада на 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 критерию тоже соответствует, но, в теории из нее можно было бы сделать метациклический интерпретатор, лисп-машину, внеся лишь достаточно небольшие изменения.


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


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

 , , ,

lovesan
()