основная ошибка "2года учусь кодить"
Кодить учиться вообще не нужно.
Учи математику, а кодерство там просто как один из вариантов записи
Другие языки программирования и технологии
2 года учусь кодить, и всегда мучал вопрос: реально ли написать программу, способную менять свой свобственный код?
Александр Романцов
не соглашусь, умение придумывать алгоритмы это все-таки далековато от математики как таковой
Да, такое возможно. Удобнее это делать на интерпретируемых языках. В языке Visual FoxPro, например даже есть некоторые специальные возможности для этого - возможность "компилировать" модули во время исполнения, механизм макроподстановки (исполнение команды, заданной в виде текстовой строки) и функция, выполняющая код заданный в виде строки.
Можно, в принципе, и для компилируемых языков написать программу, чтобы она умела изменять исходный код, запускать компилятор и потом запускать вместо себя новую программу.
Полагаю, что можно сделать и программу, которая будет менять скомпилированный код прямо в памяти. Сейчас не знаю, но, если я правильно помню, во времена MS DOS такой фокус можно было провернуть используя область данных в качестве набора команд для процессора. По крайней мере это не выглядит невозможным.
Большого практического смысла, наверное, нет у такой программы. Поскольку для синтеза программ выглядит удобнее разделить эти части и получим известное решение - т. н. генераторы кода. Он может быть "тупым", управляемым простым алгоритмом или сложным, использующим например логический вывод для синтеза и набор эвристик для оптимизации.
Как минимум, это интересная идея, даже если не сильно практичная. Я вот подумываю, возможна ли искусственная эволюция, если научить программу изменять свой код, как живые организмы меняют свой генетический материал. Мы могли бы, в отличии от природных систем, оптимизировать мутации, сделать их осмысленными, чтобы заранее исключить нежизнеспособные варианты. Смена поколений была бы на порядки меньше. Вопрос в том, смогла бы она компенсировать недостаток "численности популяции", т. к. , конечно даже запуск тысячи "особей" потребует значительные вычислительные ресурсы.
Можно, в принципе, и для компилируемых языков написать программу, чтобы она умела изменять исходный код, запускать компилятор и потом запускать вместо себя новую программу.
Полагаю, что можно сделать и программу, которая будет менять скомпилированный код прямо в памяти. Сейчас не знаю, но, если я правильно помню, во времена 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));
// итд}
}
За счет таких вот вставок в тело нового экземпляра хеш суммы всегда получаются разные
Ну ясен пень оно же не исходником добавляется а скомпилированной частью уже
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));
// итд}
}
За счет таких вот вставок в тело нового экземпляра хеш суммы всегда получаются разные
Ну ясен пень оно же не исходником добавляется а скомпилированной частью уже
Вирусы так делают чтобы уходить от антивируса. Код вируса переодически меняется, соответственно у антивируса уже нет такого образца кода в базе данных.
Реально, но в то же время бессмысленно.
По ГОСТ: Программа - Данные, предназначенные для управления конкретными компонентами системы обработки информации в целях реализации определенного алгоритма.
Что вы собрались менять в программе? Алгоритм или представление в памяти? Оба способа реализуются без непосредственного изменения кода. Настроечные данные (например, параметры командной строки) , согласно этому определению, это частью программы.
Алгоритм, который меняет часть своей программы, тоже является частью программы. Таким образом, поменять часть алгоритма невозможно, так как все изменения ЗАРАНЕЕ спланированы. Это ничем не отличается от использованию глобальных условий, которые включают или отключают часть программы от использования.
Пример программ, которые наиболее близко подходят к изменению своего алгоритма, см. в разделе нейронные сети, но это изменение всё равно распланировано.
Пример программ, которые меняют своё представление в виде кода - полиморфные вирусы. Алгоритм их работы при этом не меняется. Они имеют 2 подхода реализации:
1. Вставка незначащих инструкций (используется для "загрузщика", расшифровывающего основное тело вируса)
2. Шифрование исполнимых инструкций (для последующего извлечения и выполнения)
По ГОСТ: Программа - Данные, предназначенные для управления конкретными компонентами системы обработки информации в целях реализации определенного алгоритма.
Что вы собрались менять в программе? Алгоритм или представление в памяти? Оба способа реализуются без непосредственного изменения кода. Настроечные данные (например, параметры командной строки) , согласно этому определению, это частью программы.
Алгоритм, который меняет часть своей программы, тоже является частью программы. Таким образом, поменять часть алгоритма невозможно, так как все изменения ЗАРАНЕЕ спланированы. Это ничем не отличается от использованию глобальных условий, которые включают или отключают часть программы от использования.
Пример программ, которые наиболее близко подходят к изменению своего алгоритма, см. в разделе нейронные сети, но это изменение всё равно распланировано.
Пример программ, которые меняют своё представление в виде кода - полиморфные вирусы. Алгоритм их работы при этом не меняется. Они имеют 2 подхода реализации:
1. Вставка незначащих инструкций (используется для "загрузщика", расшифровывающего основное тело вируса)
2. Шифрование исполнимых инструкций (для последующего извлечения и выполнения)
Валерий Торопов
"Все изменения заранее спланированы"
Полагаю, это не совсем так. Во-первых, изменения могут определяться внешними данными и иметь широкий диапазон вариаций, в которых модификация "собирается" из разных модулей. Это можно отнести к понятию "синтез программ".
Кроме того, можно представить программу, которая случайным образом меняет свое тело.
Полагаю, это не совсем так. Во-первых, изменения могут определяться внешними данными и иметь широкий диапазон вариаций, в которых модификация "собирается" из разных модулей. Это можно отнести к понятию "синтез программ".
Кроме того, можно представить программу, которая случайным образом меняет свое тело.
на современных процессорах и современных ос нет, на досе в 10 строчек можно меститься. на современных x86 это тоже возможно, но сегмент кода всегда помечен как ro, его можно изменить, но придется изменять код ос, перекомпилировать, в общем это бред.
если просто изменить файл, то в этом нет ничего сложного
если просто изменить файл, то в этом нет ничего сложного
может и возможно, хрен его знает
Да.
UPD: http://prntscr.com/42olxq
UPD: http://prntscr.com/42olxq
Метапрограммирование
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
Программы на ассемблере могут менять свой код при применении некоторых алгоритмов.
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
Программы на ассемблере могут менять свой код при применении некоторых алгоритмов.
нет. в компилируемых яп вообще невозможно, потому что скомпилированная прога уже не имеет никакого отношения к исходнику программы.
другое дело - рантайм генерация кода и её исполнение.
другое дело - рантайм генерация кода и её исполнение.
да, писать можно разные программы если знаешь как
Если программа скомпилирована не в машинные коды, а, например, в код МСИЛ (то есть она написана под .НЕТ) , то вполне реально и даже не очень сложно.
"Компилятор" шарпа, использующий специальные классы .НЕТ, можно за 5 минут написать на шарпе.
С декомпилятором труднее, но тоже реально.
"Компилятор" шарпа, использующий специальные классы .НЕТ, можно за 5 минут написать на шарпе.
С декомпилятором труднее, но тоже реально.
Похожие вопросы
- написал программу на с++ работает, но есть маленький вопрос
- Помогите написать программу со switch в СИ
- Программа-эта и есть программный код тоесть программный код является программой
- Помогите написать программу на С. Тема Составление программ с использованием массивов
- Люди напишите пожалуйста подробно ! как узнать исходный код программ и игр ? Заранее благодарен .
- Нужно написать программу на паскале
- написать программу на ассемблере: найти (в строке) и вывести слово, у которого код первого символа наибольший
- Какую написать программу?
- Как написать программу в паскале
- Как написать программу на Delphi программа которая бы постоянно висело в памяти и через определенное