나는 컴퓨터 프로그래머로서 할 수없는 일이 있다는 것을 들었다. 그러나 나는 그것이 무엇인지 모른다. 최근에 저 한테 일어난 한가지는 : 실행되는 프로그램의 소스를 복사하고, 그 프로그램을 수정하고, 클래스에 메소드를 추가 한 다음 실행할 수있는 클래스를 갖는 것이 좋지 않을까요? 프로그램의 복사본을 만들고 종료합니다. 코드가 코드를 작성할 수 있습니까?코드를 작성하는 코드를 작성할 수 있습니까?
답변
quines부터 시작하여 매크로 어셈블러에서 시작한 다음 lex & yacc과 flex & bison에서 시작하십시오. 그런 다음 self-modifying code을 고려하십시오. 그냥 NP-전체의 반대를 찾을 할 수없는 것들 프로그래머를 찾고 있다면 지금
#include<stdio.h>
main()
{
char *a = "main(){char *a = %c%s%c; int b = '%c'; printf(a,b,a,b,b);}";
int b = '"';
printf(a,b,a,b,b);
}
:
여기 (포맷, 새로운 입력으로 출력을 사용)를 quine입니다.
물론입니다. 그것이 많은 바이러스가 작동하는 방법입니다!
죄송합니다. 깜빡했습니다. :) –
대부분의 바이러스는 실제로 코드를 작성하지 않으며 기존 코드에 자신이나 일부만 복사합니다. –
예 코드 생성기를 만들 수 있습니다. 그들은 대부분 사용자 입력을 받아 유효한 코드를 생성합니다. 그러나 다른 가능성이 있습니다.
자체 수정 프로그램도 가능합니다. 그러나 그들은 dos 시대에서 더 일반적이었다.
"코드 생성기"와 같은 전체 클래스가 있습니다. (컴파일러는 사용자가 설정 한대로 설명을 제공하지만). 그리고 그것들은이 짐승의 두 영역을 묘사합니다.
대부분의 코드는 사용자 입력 (대부분 데이터베이스 스키마 사용)을 생성하고 컴파일 된 제품 소스 코드를 생성합니다.
더 진보 된 것들은 실행 가능한 코드를 출력 할 수 있습니다. .NET에는 실행 가능한 코드 작성 전용의 전체 네임 스페이스 (System.CodeDom)가 있습니다. 이러한 개체는 C# (또는 다른 언어) 코드를 사용하여 컴파일하고 현재 실행중인 프로그램에 연결할 수 있습니다.
네, 틀림없이 문맥에서이 타일을 확인하고 싶습니다.이 타일은입니다.
물론 할 수 있습니다! 사실, 동적 언어를 사용하면 프로그램이 실행되는 동안 클래스 자체 또는 다른 클래스를 변경할 수 있습니다. 이전에는 없었던 새로운 클래스를 생성 할 수도 있습니다. 이를 메타 프로그래밍 (metaprogramming)이라고하며 코드가 매우 유연 해집니다. 당신이 계산 가능성의 한계에 대해 배우고 싶다면
는, 계산 가능성 이론에서 halting problem
에 대해 읽어, 앞뒤가 맞지 않는 문제는 다음과 같이 진술 할 수있는 의사 결정 문제는 다음과 설명 제공 프로그램 및 유한 입력, 실행을 끝내거나 영원히 실행할지 여부를 결정하려면 해당 입력을 으로 지정하십시오. computability theory :
앨런 튜링은 일반적인 알고리즘은
너는 단지 나를 때렸다. +1 – Eclipse
다행스럽게도 문제가 해결되면 해결할 수 있습니다. –
나는 PHP로 이것을한다.
클래스의 설정을 유지하려면 로컬 변수 $data
을 유지합니다. $ data는 사전/해시 테이블/assoc 배열입니다 (출처에 따라 다름).
클래스를로드하면 기본적으로 데이터를 정의하는 PHP 파일이 포함됩니다. 클래스를 저장하면 각 데이터 값에 대해 PHP가 기록됩니다. 이것은 느린 쓰기 프로세스이며 (현재 동시성 문제가 있습니다) 읽을 때보 다 빠릅니다. 데이터베이스를 사용하는 것보다 훨씬 더 빠르며 더 가볍습니다.
이와 비슷한 것은 모든 언어에서 작동하지 않습니다. 그것은 PHP가 대단히 즉각적이기 때문에 PHP에서 제게 적합합니다.
"쓰기"라는 단어의 두 가지 의미를 혼동/혼동하고 있습니다. 한 가지 의미는 매체에 바이트를 물리적으로 기록하는 것이고 다른 하나는 소프트웨어를 설계하는 것입니다. 물론 그렇게하도록 설계된 프로그램이라면 이전 프로그램을 수행하도록 할 수 있습니다.
프로그래머가 명시 적으로 의도하지 않은 작업을 수행하는 유일한 방법은 변형 (자체 환경 비트 통합) 및 다른 속도로 다른 돌연변이 복제 (예 : 돌연변이가 종말이면 완전한 멸종을 피하기 위해).
나는 첫 번째 의미를 의미했지만 재미있는 대답은 기쁩니다! 나는 최근에이 질문으로 돌아 왔지만 원래 질문했을 때 프로그램 자체를 복사하고 복사본을 변경 한 다음 사본을 실행 한 다음 (아마도 종료한다고 가정) 문자 그대로 묻는 중입니다. 최근에 저는이 두 번째 의미의 쓰기에 더 관심이 있습니다! – Ziggy
더 많은 코드를 생성하는 코드를 작성할 수있는 기회가 많은 Functional Programming을 살펴보면 Lisp과 같은 언어가 코드와 데이터를 구별하지 못하는 방식이 코드의 중요한 부분입니다.
레일즈는 새로운 애플리케이션을 생성 할 때 데이터베이스 스키마에서 다양한 기본 모델과 컨트롤러 클래스를 생성합니다. 역동적 인 언어로 이런 종류의 일을하는 것은 꽤 표준 적입니다. PHP 파일을 생성하는 데는 PHP가 몇 비트 밖에 없었습니다. 당시 내가 처리했던 문제에 대한 가장 간단한 해결책 이었기 때문입니다.
가능합니다. 당신이 묻고있는 질문에 관해서는 - 아마도 다소 모호합니다 - 당신은 어떤 환경과 언어를 사용하고 있습니까? 코드가 무엇을 기대하며 왜 코드를 추가해야합니까? 구체적인 예를 통해보다 직접적인 관련 응답을 얻을 수 있습니다.
물론입니다. 나는 당신에게 편집기를 제공하고 "즉시"그래픽 효과를 쓸 수 있도록 Paint.NET *에 대한 효과를 썼습니다. 입력을 일시 중지하면 DLL로 컴파일되고로드되어 실행됩니다. 자, 편집기에서, 당신은 단지 dll을 만드는 데 필요한 실제 렌더링 함수를 작성해야 편집기로 작성하고 C# 컴파일러로 보냈습니다.
현재 무료로 다운로드 할 수 있습니다 : http://www.boltbait.com/pdn/codelab/
는 사실, 심지어는 컴파일러로 전송되기 전에 당신을 위해 기록 된 모든 코드를 볼 수있는 옵션이 있습니다. 위에 링크 된 도움말 파일은 모든 것에 대해 이야기합니다.
소스 코드는 해당 페이지에서도 다운로드 할 수 있습니다. http://getpaint.net이
nice :) paint.net이나 gimp 효과를 코드화하고 싶지만 시간을 들여 보지 못했습니다. – Sophia
이 인공 지능의 근본적인 질문 중 하나입니다
*이 Paint.NET은 여기에서 다운로드 할 수있는 무료 이미지 편집기입니다. 개인적으로 나는 그것이 가능하지 않다는 것을 바란다 - 그렇지 않으면 곧 내가 직업에서 빠져 나올 것이다 !!! :)
어쩌면 그렇게 빨리 할 수 없습니다! – Ziggy
인공 지능과 관련하여 Evolutionary algorithms을 살펴보십시오.
항상 코드 생성기를 작성할 수있었습니다. XML 기술을 사용하면 코드 생성기를 사용하는 것이 필수적인 도구가 될 수 있습니다. 다른 회사의 XML 파일을 처리해야하는 회사에서 일한다고 가정합니다. XML 파서를 사용하여 새 XML 파일을 구문 분석하고 모든 콜백 함수가 해당 형식의 XML 파일을 읽도록 설정된 다른 프로그램을 작성하는 프로그램을 작성하는 것은 비교적 간단합니다. 필요에 따라 새 프로그램을 편집해야하지만이 유형의 코드 생성기를 사용하여 새로운 XML 파일 (새로운 구조, 새 이름)을 많이 개발할 때 개발 시간이 필요합니다. 제 생각에 이것은 XML 기술의 강점입니다.
것은, 그것이 실행되는 프로그램의 소스의 사본을 만들어 그 프로그램을 수정하고 있다는 클래스에 메소드를 추가하고 프로그램의 복사본을 실행하고
자체가 당신을 종료 또한 코드를 생성하고 실행 파일 대신 라이브러리에 빌드 한 다음 현재 실행중인 프로그램을 종료하지 않고도 라이브러리를 동적으로로드 할 수 있습니다.
와우! 그게 내가 할 수 있기를 바랄 뿐이야! – Ziggy
그렇다고 꼭 좋은 아이디어는 아닙니다. :-) –
동적 언어는 일반적으로 완전히 별도의 컴파일 단계가 없다는 점에서 사용자가 제안한대로 작동하지 않습니다. 프로그램이 자체 소스 코드를 수정하고 다시 컴파일하고 처음부터 시작할 필요는 없습니다. 일반적으로 새로운 기능은 즉시 컴파일되고 링크됩니다.
커먼 리스프는 이것을 연습하는 데 아주 좋은 언어이지만, 코드를 만들어서 실행할 수있는 곳이 있습니다. 전형적으로, 이것은 "eval"또는 유사한 것으로 불리는 함수를 통해 이루어질 것입니다. Perl은 "평가"기능을 가지고 있으며 일반적으로 스크립팅 언어가이 기능을 사용하는 것이 일반적입니다.
다른 프로그램 (예 : yacc 또는 bison)을 작성하는 프로그램이 많이 있지만 원하는 동적 품질이 아닙니다.
예, 대부분의 Lisp 매크로가 이에 해당합니다 (예를 들어).
리스프 LISP LISP LISP : P 실행할 코드를 생성 코드를 원하고 당신이 그것을 배우고 더 많은 코드를 생성 재귀 물건 당신의 마음을 깨는 느슨한 시간을 가지고 있다면, 농담
, 혀짤배기 배우려고 :)
(eval '(or true false))
Langtom's loop을 살펴보십시오. 이것은 자기 복제 "프로그램"의 가장 단순한 예입니다.
실행중인 프로그램의 원본을 복사하고 해당 프로그램을 수정 한 다음 해당 클래스에 메서드를 추가 한 다음 해당 프로그램의 복사본을 실행할 수있는 클래스를 갖는 것이 좋지 않습니까? 프로그램과 프로그램 자체를 종료
그 이외의 자기 수정 코드를 "더 나은"을 사용하여 해결할 수없는 문제를 해결할 것입니다 거의없는 경우가 .. 있습니다 말했다
은 매우 일반적인가있다 (유용한) 다른 코드를 작성하는 코드의 경우. 가장 명백한 것은 HTML/Javascript를 생성하는 서버 측 웹 응용 프로그램입니다 (물론 HTML 마크 업이지만 이론상으로 동일합니다.) 또한 터미널 환경을 변경하는 모든 스크립트는 일반적으로 부모 쉘에 의해 평가되는 쉘 스크립트를 출력합니다. wxGlade는 베어 본 wx 기반 GUI를 생성하는 코드를 생성합니다.DMS Software Reengineering Toolkit을 참조하십시오.이것은 프로그램을 읽고 수정하거나 파편을 조립하여 프로그램을 생성하는 범용 기계입니다.
이것은 meta-programming이라고하며 유용한 프로그램과 흥미로운 연구 주제를 작성하는 좋은 방법입니다. Jacques Pitrat의 Artificial Beings: the conscience of a conscious machine 도서에 관심이 많습니다. 이것은 주로 메타 지식 기반 컴퓨터 프로그램과 관련이 있습니다.
또 다른 관련 용어는 multi-staged programming입니다 (여러 단계의 프로그램이 있기 때문에 각각 다음 단계를 생성합니다).
char * p = "char * p = % c % s % c; main() {printf (p, 34, p, 34);}"; 34, p, 34);} –
안녕하세요! 변수에 코드가 있습니까? 우린 할 수있어? – Ziggy
Plase는 "반대편 f np-complete"를 설명합니다. 확실히 반대 방향을 의미합니까? –