20 февраля 2006 г.

а почему бы и нет...

Вдруг вспомнилось, что мы как никак программисты. Да и Д1 требовал флуда =)
Так вот! Предлагаю все для прочтения статью. Статья старая, но актуальности ничуть не потерявшая.

Что я предлагаю. Не решать в тысячный раз какой из языков лучше, какой хуже. Каждый силён в своей области. Но вот пофантазировать что же такого может получится если развить тему придумывателей языков программирования! Или, может, кто поделится каким-нибудь know-how из известных ему языков. Тема видится мне достойной внимания.
Welcome!
dW

16 комментариев:

Dark One комментирует...

Муснараа... (см статью)

а если серьёзно, то...

есть тема: ASCII графический язык (хотя можно и не ASCII а просто. только прогу из битмапа выковыривать заее...)=)

Т.е. в роли команд и переменных - пикчи. в перспективе - ужос. :)

Maxim Moiseev комментирует...

Однако!
Что замечательно. Рассказываю предысторию.

Разговорились мы с коллегой по аське по на тему пьянства за клавиатурой. Ну и я предположил идею, что в состоянии близком к наркотическому опьянени. код, возможно будет выглядень а-ля "cccccccccllllllllaaaaaaaaassssssss FFFFFFffooooooo{}".
Коллега идею подхватил. Сказал, что это похоже на аски графику. И тут в моей голове сработал какой-то нейрон и я вспомнил замечательный язык BrainFuck, о котором когда-то читал. Нашёл статейку -- и вот так родился пост.

Так что Д1 осуществил ни что иное как Ревер Инжиниринг =)

А идея конечно да! Хороша, ничего не скажешь. Опять же в этой связи хочется вспомнить очень и не очень давние проблемы с графическими файлами. Типа "используя особым образом сформированный JPEG файл злобные хацкеры могут исполнять на машине юзера какой хочешь зловредный код". Хотя, в случае с таким языком, конечно, в картинке был бы исходник, а не бинарник...

А ведь люди могли бы по-новому взглянуть на некоторые вещи... Новая жизнь чёрного квадрата. Он стал бы Хеллоу Ворлдом. Однозначно.

Dark One комментирует...

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

Maxim Moiseev комментирует...

С .Net там всё сложно. Есть там Reflection.Emit, но туда надо писать тока CIL команды, а это хоть и высокоуровневый, но всё равно ассемблер. Да и код так воротить это жееесть. Есть ещё CompilerServices, они позволяют код компилить, но для этого код нужен. Можно, конечно, код на ходу генерить, но это некошерно.
Как-то прочитал фразочку замечательную (чей копирайт не помню). Возможно стоит посмотреть статейку "Lisp is sin", гугль даст ссылку поточнее. Так вот фразочка: "Ньюбай знает что есть код и есть данные, адвансед программер знает что код это тоже данные и только реальный хацкер твёрдо уверен, что данные это тоже код". В вольном переводе конечно =) (Ах вот нашёл оригинал! Статья здесь, а само изречение вот оно "the newbie realizes that the difference between code and data is trivial. The expert realizes that all code is data. And the true master realizes that all data is code." )

Так вот к чему я веду разговор. К тому, что в Лисп-подобных языках есть такая возможность. Про ЛИСП-макросы я тоже где-то читал. В Ruby есть замечательная весчь. Называется yield. Она выполняет переданный ей блок кода. А если это всё совместить с возможностями скриптового языка, коим Ruby является, то получается можно и чёрта лысого сделать... Например, пишешь какойнить алгоритм, в котором не хвататет у тебя кусочка кода. Вставляешь на месте этого кусочка yield. Потом генеришь код-блок и вставляешь его в момент исполнения. Наверняка это применимо где-то... Сейчас не могу сказать где... Но точно можно придумать задачу для решения.
dW

Maxim Moiseev комментирует...

Я честно говоря очень серьёзно задумался, а что если... Единственная проблема, которую я вижу -- это "сохранение изменённого поведения" с сохранением возможности к генерации нового поведения. Больно сложно сказал. Сейчас объясню. Пишем модуль, который сожержит некий участочек, который может меняться в процессе "обучения". Чтобы организовать дествительно эволюцию этого модуля нам надо не просто один раз сгенерить это поведение, но и каким-то образом сохранить его в виде кода... А вот это сложно. Более того. Чтобы процесс эволюции не остановился после одного шага, надо реализовать возможность генерации ещё более нового поведения на основе не того шаблона, который мы написали сами, а на основе шаблона, который был выработан на первом шаге эволюции. Совсем всё сложно... Но идея хороша.
dW

Maxim Moiseev комментирует...

Насчёт невозможности я бы не стал так круто. Сложности!

Получается такая задачка несколько уровневая. Считать так: первый уровень - это код, который пишем мы (простое программирование). Второй уровень -- код, написанный нами, который генерит код (это что-то типа статических шаблонов кода, которые заполняются в процессе работы программы. выход такого кода будет всё равно основан на одном шаблоне, который мы задаём при написании генератора). Третий уровень -- это код, написанный нами, который генерирует шаблоны для написания генератора кода (сложно сказал, но идея должна быть ясна). Сложность реализации возрастает наверное экспоненциально при линейном изменении уровня. Отсюда следует вывод, что если взять достаточно простую задачу для реализации то написать код третьего уровня будет по меньше мере возможно. Чисто умозрительные заключения, конечно. Надо подумать...
dW

Maxim Moiseev комментирует...

В догонку к предыдущему коменту.

Задача в принципе сходна с некоторым аспектом ООП. Классы -- это нечто, что создаёт объекты. Метаклассы -- то нечто, что создаёт классы.

Здесь же надо итти дальше. Некие метаметаклассы, которые будут создавать метаклассы.... Вот такой вот "дом, который посртоил Джек".
dW

Maxim Moiseev комментирует...

Мы о разных задачах говорим. Ты -- об ИИ. Я -- о моделировании ИИ в определённом диапазоне решений.

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

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

Ха! Возьмём твой пример. Человек чего-то там наблюдал. Ок. Допустим. (даже не просто допустим, согласимся =) ибо это так). Он наблюдал что-то что было до него. Это что-то обзовём природой. Окружающая среда имеет огромный набор различных сочетаний действий: гнущаяся палка, рычаг и прочее. Что дальше. Эти свойства исходят из свойств частиц. Свойства частиц они начерняка тоже откуда-то взялись. И так далее. В итоге мы приходим к проблеме из чего всё произошло. (Вспоминая Дугласа Адамса "Главный вопрос Вселенной и всего такого").
И именно это самое нечто и будет последним-распоследним уровнем косвенности. Изначальным мета-мета-мета-...-классом, который оперирует невообразимым объёмом различных действий на всех нижележащих уровнях. Из этого нечто следуют свойства кварков, потом свойства элментарных частиц, форма и поведение молекул, "изгибабельность" палки и в конечном итоге действия человека, который делает из неё лук. Философия, однако.

В продолжение темы расскажу вот что. Согласно Адамсу, это самое нечто -- "42". На одном из МСДН блогов я узнал, что изначально Visual Studio 2005 в самом начале называлась не иначе как Project 42.
dW

Unknown комментирует...

Макс, не согласен с тобой насчет лука -> атомов -> и т.д. Лук на самом деле - это творение разума. Ведь лук делается из палки и веревки. Двух вещей в принципе не связанных (хотя конечно на уровне кварков может и близких). Но человек его придумал ничего не зная о кварках или даже об атомах. Он просто сопоставил 2 предмета, их свойства и придумал лук. Вот в этом и есть Разум (ну или кто как его называет), т.е. сопоставление нескольких предметов (объектов) и их свойств исоздания из этих объктов чего-то абсолютно нового. Так ведь часто и происходят научные открытия. Я уж не гворю про искуство! :)
А вот если рассмотреть задачку насчет танчиков, то тут конечно попроще. Только мне кажеться для создания хотя бы третьего уровня понадобиться большое кол-во кода. И эти танчики будут занимать мета как Халфа или Дум3, но не из-за графики, а вот из-за частичного ИИ. Хотя... как знать.
(Вообще очень интересную тему подняли :))

Unknown комментирует...
Этот комментарий был удален администратором блога.
Maxim Moiseev комментирует...

А вот и нифига не согласен что палочка и верёвочка из разных областей. Они вообще-то на одном уровне находятся в моей модели. То есть они как бы это сказать... одного уровня мета-мета-мета-...-классы. Соответственно, и весь набор их поведенческих характеристик хоть и очень велик, но всё же ограничен. Мы ведь можем чётко сформулировать свойства деревянной палки. Конечно, если потом подумать, то этот списко можно продолжить и достаточно серьёзно, но всё равно количество вариантов поведения конечно, и следует оно из свойств молекулови атомов, из которых палочка состоит.

А по поводу того, что для реализации 3 уровня для танчиков понадобится сверх сложный код... Я почти так и сказал. Единственное, что можно утверждать, что чем меньше возможностей поведения у объектов самого последнего уровня тем больше вероятность что код третьего уровня будет вообще реализуем в разумное время.

Maxim Moiseev комментирует...

Ну вас всех. Сложными словами кидаетесь, типа энтропия и всё такое. Беее...

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

Dark One комментирует...
Этот комментарий был удален администратором блога.
Maxim Moiseev комментирует...

2Д1: чонить путное написл бы чтоли...

2Йорик: ну да ИИ... тока не такой как твой ИИ. Мой ИИ -- это поиск и накопление информации о более приемлемой стратегии поведения как композита изначальных вариантов этого самого поведения. С учётом того, что множество этих вариантов конечно и описано. А формальное описание задачи -- это дело каждой конкретной задачи. Нельзя создать модель, которая подходила бы одинаково хорошо для решения совершенно различных классов задач. Вот. Это из теории моделирования известно. А ещё из теории автоматов помню какую-то теорему о невозможности создания автомата, который бы строил себе подобных на основе своего описания.

Maxim Moiseev комментирует...

Ээээээээ! Рейвен! Матрицу смотрел?

Dark One комментирует...

Тут весь вопрос в детализации. Мир на самом деле штука проще некуда, и одной из его моделей вполне может служить простое RANDOM(X).

Профессиональный подводник глубин С2Н5ОН легко выразит весь мир коротким "***ДЬ!!!"

Создание ИИ затруднено лишь отсутствием формального определения самому И. Анекдотичное ИИ блондинки - тот же RANDOM.

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