Chương trình tự tái sinh (1)

Một trong các bài tập rất hay cho người đang học lập trình (bất kể ngôn ngữ nào) là: hãy viết một chương trình in chính nó ra. Chú ý là phải in ra giống hệt, từng giòng từng chữ từng cái xuống hàng. Ở đây ta giả sử có thể viết chương trình bằng một tệp (file) thôi.

Nếu bạn chưa bao giờ nghĩ về các chương trình kiểu này, hãy dành vài chục phút nghĩ trước khi đọc các ví dụ dưới đây. Bạn sẽ thấy bài tập này liên quan mật thiết đến khái niệm “tự tham chiếu“, một trong những khái niệm trung tâm trong loạt bài Chung qui chỉ tại Cantor.

Thử xét vài ví dụ sau:

  • C/C++:
    main(){char *c="main(){char *c=%c%s%c;printf(c,34,c,34);}";printf(c,34,c,34);}
    
  • Java:
    import java.text.*;class a{public static void main(String x[]){char b[]={34};
    char c[]={123};String s[]=new String[3];s[0]="import java.text.*;class a{2}
    public static void main(String x[]){2}char b[]={2}34};char c[]={2}123};
    String s[]=new String[3];s[0]={1}{0}{1};s[1]=new String(b);s[2]=new String(c);
    System.out.println(MessageFormat.format(s[0],s));}}";s[1]=new String(b);s[2]=
    new String(c);System.out.println(MessageFormat.format(s[0],s));}}
    
  • Common Lisp:
    ((lambda (q) ((lambda (x) `((lambda (q) ,((eval q) x)) ',q))
                  '(lambda (x) `((lambda (q) ,((eval q) x)) ',q))))
     '(lambda (x) `(,x ',x)))
    
  • Perl:
    #!/usr/local/bin/perl
    
    $a='#!/usr/local/bin/perl%c$a=%c%s%c;printf($a,10,39,$a,39,10);%c';printf($a,10,39,$a,39,10);
    

Các ví dụ trên tôi lấy ở đây, và ở đây. Lần tới ta sẽ thiết kế một ví dụ cho riêng ta, không cần đi “chôm” về. Các trương trình tự in bản thân còn được gọi là Quine, họ của triết gia Willard van Orman Quine. Có hai câu hỏi liên quan:

  1. Có nguyên tắc gì để viết các chương trình lọai này không? Cho một ngôn ngữ mới thì làm thế nào ta viết được một chương trình như vậy?
  2. Các chương trình lọai này có ứng dụng gì không?

Chủ đề : Bảo mật và mật mã học, Lý thuyết tính toán. Bookmark the permalink. Trackbacks are closed, but you can post a comment.

One Comment

  1. Anonymous
    Posted 04/10/2005 at 11:56 am | Permalink

    Toi la tai trinh toi viet la tho nay nho dum Email 

    Người viết: Taitrinh

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>