문제

컴퓨터 프로그래머로서 할 수없는 일이 있다고 들었지만 그들이 무엇인지 모르겠습니다. 최근에 나에게 일어난 한 가지는 다음과 같습니다. 실행하는 프로그램의 소스 사본을 만들 수있는 수업을 갖는 것은 좋지 않을 것입니다. 그 프로그램을 수정 한 다음 수업에 메소드를 추가 한 다음 실행하는 방법을 추가하십시오. 프로그램의 사본은 종료됩니다. 코드가 코드를 작성할 수 있습니까?

도움이 되었습니까?

해결책

보면서 시작하십시오 Quines, 그런 다음 거시적 어셈블러에서 Lex & YACC, 그리고 Flex & Bison. 그런 다음 고려하십시오 자체 수정 코드.

다음은 quine입니다 (형식, 출력을 새 입력으로 사용) :

#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);
}

이제 프로그래머가 NP- 완성의 반대를 찾을 수없는 것들을 찾고 있다면.

다른 팁

계산 가능성의 한계에 대해 배우고 싶다면 중단 문제

계산 가능성 이론에서 중단 문제는 다음과 같이 언급 할 수있는 결정 문제입니다. 프로그램에 대한 설명과 유한 입력이 주어지면 프로그램이 실행 중이거나 영원히 실행되는지 여부를 결정합니다.

Alan Turing은 1936 년 가능한 모든 프로그램 입력 쌍에 대한 중단 문제를 해결하기위한 일반적인 알고리즘이 존재할 수 없다는 것을 증명했습니다.

당연히 그렇지. 그것이 바로 많은 바이러스가 작동하는 방식입니다!

이 주위에 머리를 잡으십시오. 계산 성 이론.

그렇습니다. 이것이 대부분의 LISP 매크로가하는 일입니다 (한 예제).

예, 확실히, 아마도 당신이 이것을 확인하기로 언급하는 맥락에서는 아닐 수도 있습니다. 게시하다 T4에서.

추가 코드를 생성하는 코드를 작성할 수있는 많은 기회가있는 기능 프로그래밍을 살펴보면 LISP와 같은 언어가 코드와 데이터를 구분하지 않는 방식은 전력의 중요한 부분입니다.

Rails는 새 응용 프로그램을 생성 할 때 데이터베이스 스키마에서 다양한 기본 모델 및 컨트롤러 클래스를 생성합니다. 동적 언어로 이런 종류의 작업을 수행하는 것은 매우 표준입니다. PHP 파일을 생성하는 PHP 주변에는 몇 비트의 PHP가 있습니다. 당시 내가 다루고있는 문제에 대한 가장 간단한 솔루션 이었기 때문입니다.

그래서 가능합니다. 그래도 당신이 묻는 질문에 관해서는- 그것은 아마도 약간 모호한 일입니다. 어떤 환경과 언어를 사용하고 있습니까? 코드가 무엇을 기대하고 왜 추가해야합니까? 구체적인 예는보다 직접적인 관련 응답을 가져올 수 있습니다.

예, 코드 생성기를 만들 수 있습니다. 대부분의 경우 사용자 입력을 취하고 유효한 코드를 생성합니다. 그러나 다른 가능성이 있습니다.

자체 수정 프로그램도 가능합니다. 그러나 그들은 DOS 시대에 더 흔했습니다.

물론 당신은 할 수! 실제로, 동적 언어를 사용하는 경우, 프로그램이 여전히 실행중인 동안 클래스는 자체 (또는 다른 클래스)를 변경할 수 있습니다. 이전에 존재하지 않은 새로운 클래스를 만들 수도 있습니다. 이것을 메타 프로 그램이라고하며 코드가 매우 유연해질 수 있습니다.

당신은 "쓰기"라는 단어의 두 가지 의미를 혼란스럽게/혼동하고 있습니다. 하나의 의미는 매체에 바이트의 물리적 글쓰기이고 다른 하나는 소프트웨어를 설계하는 것입니다. 물론 프로그램이 전자를 수행하도록 설계된 경우 전자를 수행 할 수 있습니다.

프로그램이 프로그래머가 명시 적으로 의도하지 않은 일을하는 유일한 방법은 살아있는 생물처럼 행동하는 것입니다. 돌연변이 (그 자체로는 환경에 포함), 다른 돌연변이 체를 다른 비율로 복제합니다 (완전한 멸종을 피하기 위해 다른 돌연변이 체 돌연변이가 말단 인 경우).

당연히 그렇지. 나는 당신에게 편집기를 제공하고 "비행에"그래픽 효과를 쓸 수있는 paint.net*에 효과를 썼습니다. 입력을 일시 중지하면 DLL에 컴파일하고로드하여 실행합니다. 이제 편집기에서는 실제 렌더링 함수 만 작성하면됩니다. DLL을 만드는 데 필요한 다른 모든 것은 편집자가 작성합니다. C# 컴파일러로 보냈습니다.

여기에서 무료로 다운로드 할 수 있습니다. http://www.boltbait.com/pdn/codelab/

실제로, 컴파일러로 전송되기 전에 귀하를 위해 작성된 모든 코드를 볼 수있는 옵션도 있습니다. 도움말 파일 (위의 링크)은 그것에 대해 이야기합니다.

소스 코드는 해당 페이지에서도 다운로드 할 수 있습니다.

*Paint.net은 여기에서 다운로드 할 수있는 무료 이미지 편집기입니다. http://getpaint.net

인공 지능과 관련하여 진화 알고리즘.

실행되는 프로그램 소스의 사본을 작성하고 해당 프로그램을 수정 한 다음 클래스에 메소드를 추가 한 다음 프로그램 사본을 실행하고 종료합니다.

또한 코드를 생성하고 실행 파일 대신 라이브러리로 빌드 한 다음 현재 실행중인 프로그램을 종료하지 않고도 라이브러리를 동적으로로드 할 수 있습니다.

동적 언어는 일반적으로 완전히 별도의 컴파일 단계가 없다는 점에서 제안한대로 작동하지 않습니다. 프로그램이 자체 소스 코드를 수정하고, 다시 컴파일하고, 처음부터 시작할 필요는 없습니다. 일반적으로 새로운 기능은 편집 및 연결됩니다.

Common LISP는 이것을 연습하기에 매우 좋은 언어이지만 코드를 만들어서 실행할 수있는 다른 언어가 있습니다. 일반적으로 이것은 "평가"라는 함수 또는 유사한 기능을 통해 이루어집니다. Perl은 "평가"기능을 가지고 있으며 일반적으로 스크립팅 언어가 능력을 갖는 것이 일반적입니다.

YACC 또는 Bison과 같은 다른 프로그램을 작성하는 많은 프로그램이 있지만, 원하는 동적 품질은 없습니다.

보세요 Langtom의 루프. 이것이 자체 재생 "프로그램"의 가장 간단한 예입니다.

"코드 생성기"라는 것들의 전체 등급이 있습니다. (하지만 컴파일러는 설명 할 때 설명에 적합합니다). 그리고 그것들은이 짐승의 두 영역을 묘사합니다.

대부분의 코드는 생성하고, 어떤 형태의 사용자 입력 (대부분 데이터베이스 스키마를 가져옵니다)과 제품 소스 코드를 컴파일합니다.

더 고급 된 것들이 실행 가능한 코드를 출력 할 수 있습니다. .NET을 사용하면 실행 가능한 코드 생성 전용 네임 스페이스 (System.Codedom)가 있습니다. 이 객체는 C# (또는 다른 언어) 코드를 가져 와서 컴파일 한 다음 현재 실행중인 프로그램에 연결할 수 있습니다.

나는 이것을 PHP에서한다.

클래스의 설정을 지속하려면 로컬 변수를 $data. $ 데이터는 사전/해시 가능/협회 배열입니다 (출신의 위치에 따라 다름).

클래스를로드하면 기본적으로 데이터를 정의하는 PHP 파일이 포함됩니다. 수업을 저장하면 각 데이터 값에 대해 PHP를 작성합니다. 느린 쓰기 프로세스이지만 (현재 동시성 문제가 있습니다) 표시등보다 빠릅니다. 데이터베이스를 사용하는 것보다 훨씬 빠르고 가볍습니다.

이와 같은 것이 모든 언어에 효과가있는 것은 아닙니다. PHP는 비행기가 매우 많기 때문에 PHP에서 저에게 효과적입니다.

코드 생성기를 항상 작성하는 것이 가능했습니다. XML 기술을 사용하면 코드 생성기를 사용하는 것이 필수 도구가 될 수 있습니다. 다른 회사의 XML 파일을 처리 해야하는 회사에서 일한다고 가정 해 봅시다. XML 파서를 사용하여 새 XML 파일을 구문 분석하고 해당 형식의 XML 파일을 읽도록 설정 한 모든 콜백 기능이있는 다른 프로그램을 작성하는 프로그램을 작성하는 것은 비교적 간단합니다. 새로운 프로그램을 요구하기 위해 새 프로그램을 편집해야하지만 새로운 XML 파일 (새 구조, 새 이름) 이이 유형의 코드 생성기를 사용하여 많이 줄인 개발 시간. 제 생각에는 이것은 XML 기술의 강점의 일부입니다.

LISP LISP LISP LISP : p

농담, 코드를 생성하는 코드를 원하고 더 많은 코드를 생성하는 재귀적인 물건으로 배우고 마음을 아프게하는 코드를 원한다면 LISP를 배우십시오 :)

(eval '(or true false))

실행되는 프로그램 소스의 사본을 만들고 해당 프로그램을 수정 한 후 클래스에 메소드를 추가 한 다음 프로그램 사본을 실행하고 종료하는 클래스를 갖는 것이 좋지 않습니까?

자체 지정 코드를 사용하여 "더 나은"문제를 해결할 수없는 문제를 해결할 경우는 거의 없습니다.

즉, 다른 코드를 작성하는 코드의 매우 일반적인 (유용한) 사례가 있습니다. 가장 분명한 서버 측 웹 응용 프로그램은 HTML/JavaScript를 생성하는 것입니다 (HTML은 마크 업이지만 이론적으로는 동일합니다). 또한 터미널 환경을 변경하는 스크립트는 일반적으로 상위 쉘이 평가하는 쉘 스크립트를 출력합니다. WXGLADE는 베어 본 WX 기반 GUI를 생성하는 코드를 생성합니다.

우리를 참조하십시오 DMS 소프트웨어 리엔지니어링 툴킷. 이것은 프로그램을 읽고 수정하거나 조각을 조립하여 프로그램을 생성하는 범용 기계입니다.

이것은 인공 지능의 기본적인 질문 중 하나입니다. 개인적으로 나는 그것이 불가능하기를 바랍니다 - 그렇지 않으면 곧 나는 직업에서 벗어날 것입니다 !!! :)

그것은이라고 메타 프로그래밍 그리고 유용한 프로그램을 작성하는 좋은 방법과 흥미로운 연구 주제입니다. Jacques Pitrat 's 인공 존재 : 의식적인 기계의 양심 책은 당신에게 많은 관심을 가져야합니다. 주로 메타 지식 기반 컴퓨터 프로그램과 관련이 있습니다.

또 다른 관련 용어입니다 다단계 프로그래밍 (여러 단계의 프로그램이 있기 때문에 각 단계는 다음 단계를 생성합니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top