Другие языки программирования и технологии

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

основная ошибка "2года учусь кодить"

Кодить учиться вообще не нужно.
Учи математику, а кодерство там просто как один из вариантов записи
ДБ
Денис Богатов
27 060
Лучший ответ
Александр Романцов не соглашусь, умение придумывать алгоритмы это все-таки далековато от математики как таковой
Да, такое возможно. Удобнее это делать на интерпретируемых языках. В языке Visual FoxPro, например даже есть некоторые специальные возможности для этого - возможность "компилировать" модули во время исполнения, механизм макроподстановки (исполнение команды, заданной в виде текстовой строки) и функция, выполняющая код заданный в виде строки.
Можно, в принципе, и для компилируемых языков написать программу, чтобы она умела изменять исходный код, запускать компилятор и потом запускать вместо себя новую программу.

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

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

Как минимум, это интересная идея, даже если не сильно практичная. Я вот подумываю, возможна ли искусственная эволюция, если научить программу изменять свой код, как живые организмы меняют свой генетический материал. Мы могли бы, в отличии от природных систем, оптимизировать мутации, сделать их осмысленными, чтобы заранее исключить нежизнеспособные варианты. Смена поколений была бы на порядки меньше. Вопрос в том, смогла бы она компенсировать недостаток "численности популяции", т. к. , конечно даже запуск тысячи "особей" потребует значительные вычислительные ресурсы.
Народ че вы парьтесь. я как то несколько лет назад видел код вируса когда то наводившего ужас почти на весь интернет (апокалипсис по моему назывался) так там метаморфозы реализованы банальным random то есть тело вируса поражая какую нить прогу дописывает в разных случайных местах функцию внесения шума что то вроде
Function beginend (n){

Switch (n){

case:2+rand (3-n)> 5

case 7: return beginend(rand (6))

case:n==0: n=n+3;

caserandom(400)> 200:beginend(rand (6));

// итд}

}

За счет таких вот вставок в тело нового экземпляра хеш суммы всегда получаются разные

Ну ясен пень оно же не исходником добавляется а скомпилированной частью уже
Алексей Кушнир
Алексей Кушнир
59 848
Вирусы так делают чтобы уходить от антивируса. Код вируса переодически меняется, соответственно у антивируса уже нет такого образца кода в базе данных.
Реально, но в то же время бессмысленно.

По ГОСТ: Программа - Данные, предназначенные для управления конкретными компонентами системы обработки информации в целях реализации определенного алгоритма.

Что вы собрались менять в программе? Алгоритм или представление в памяти? Оба способа реализуются без непосредственного изменения кода. Настроечные данные (например, параметры командной строки) , согласно этому определению, это частью программы.

Алгоритм, который меняет часть своей программы, тоже является частью программы. Таким образом, поменять часть алгоритма невозможно, так как все изменения ЗАРАНЕЕ спланированы. Это ничем не отличается от использованию глобальных условий, которые включают или отключают часть программы от использования.

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

Пример программ, которые меняют своё представление в виде кода - полиморфные вирусы. Алгоритм их работы при этом не меняется. Они имеют 2 подхода реализации:
1. Вставка незначащих инструкций (используется для "загрузщика", расшифровывающего основное тело вируса)
2. Шифрование исполнимых инструкций (для последующего извлечения и выполнения)
Олег Олег
Олег Олег
11 112
Валерий Торопов "Все изменения заранее спланированы"
Полагаю, это не совсем так. Во-первых, изменения могут определяться внешними данными и иметь широкий диапазон вариаций, в которых модификация "собирается" из разных модулей. Это можно отнести к понятию "синтез программ".

Кроме того, можно представить программу, которая случайным образом меняет свое тело.
на современных процессорах и современных ос нет, на досе в 10 строчек можно меститься. на современных x86 это тоже возможно, но сегмент кода всегда помечен как ro, его можно изменить, но придется изменять код ос, перекомпилировать, в общем это бред.

если просто изменить файл, то в этом нет ничего сложного
FF
Futbol Futbol
7 591
может и возможно, хрен его знает
Метапрограммирование
http://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D1%80%D0%BE%D0%B6%D0%B4%D0%B0%D1%8E%D1%89%D0%B5%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5#.D0.93.D0.B5.D0.BD.D0.B5.D1.80.D0.B0.D1.86.D0.B8.D1.8F_.D0.BA.D0.BE.D0.B4.D0.B0

Программы на ассемблере могут менять свой код при применении некоторых алгоритмов.
Елжас Гумаров
Елжас Гумаров
2 829
нет. в компилируемых яп вообще невозможно, потому что скомпилированная прога уже не имеет никакого отношения к исходнику программы.
другое дело - рантайм генерация кода и её исполнение.
Вася Пупкин
Вася Пупкин
2 501
да, писать можно разные программы если знаешь как
Если программа скомпилирована не в машинные коды, а, например, в код МСИЛ (то есть она написана под .НЕТ) , то вполне реально и даже не очень сложно.

"Компилятор" шарпа, использующий специальные классы .НЕТ, можно за 5 минут написать на шарпе.

С декомпилятором труднее, но тоже реально.