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

Ngô Quang Hưng | 30 tháng 03, 2005 | Bản để in Bản để in

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 |

1 lời bình cho bài “Chương trình tự tái sinh (1)”

  1. 1
    Anonymous viết:

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

    Người viết: Taitrinh

Ghi lời bình của bạn: