2010-10-26 3 views
15

Mã phức tạp nhất/mạnh mẽ nào bạn có thể viết là hợp lệ với số lượng ngôn ngữ tối đa?Mã phức tạp nhất/mạnh mẽ nào bạn có thể viết là hợp lệ với số lượng ngôn ngữ tối đa?

Ví dụ: mã sau đây hợp lệ trong cả PHP và JavaScript.

function foo($bar) 
{ 
$var = 0; 
for($i=0;$i<100;$i++) 
{ 
$var += ($bar + 2)/(1+$i); 
} 
return $var; 
} 

Tại sao đây là một thách thức hữu ích? Tôi nghĩ rằng đó là một cách hữu ích để suy nghĩ về cách các ngôn ngữ tương tự có thể được, và làm thế nào dễ dàng biết cú pháp của một người có thể dịch sang học tập của người khác.

+1

@Comment tôi nếu điều này được đóng lại, bạn có mở lại phiếu bầu của tôi (Không thể upvote ngay bây giờ khi tôi ra khỏi phiếu bầu) –

+0

Bạn có muốn wiki cộng đồng không? – Gumbo

+1

rosettacode.org có lẽ là một nguồn lực tốt để tìm ra câu trả lời. –

Trả lời

18

Điều này được gọi là Polyglot và có thể rất phức tạp. Đây là một trong tám ngôn ngữ: http://ideology.com.au/polyglot/

Cobol, Pascal, Fortran, C, PostScript, bash, x86 ngôn ngữ máy, và Perl:

                  (*O/*_/ 
Cu #%*)pop mark/CuG 4 def/# 2 def%%%%@@P[TX---P\P_SXPY!Ex(mx2ex("SX!Ex4P)Ex= 
CuG #%*                 *+Ex= 
CuG #%*------------------------------------------------------------------*+Ex= 
CuG #%* POLYGLOT - a program in eight languages  15 February 1991 *+Ex= 
CuG #%* 10th Anniversary Edition      1 December 2001 *+Ex= 
CuG #%*                 *+Ex= 
CuG #%* Written by Kevin Bungard, Peter Lisle, and Chris Tham   *+Ex= 
CuG #%*                 *+Ex= 
CuG #%* Polyglot suports the following languages:      *+Ex= 
CuG #%*  1. COBOL (ANSI)            *+Ex= 
CuG #%*  2. Pascal (ISO)            *+Ex= 
CuG #%*  3. Fortran (ANSI, f77)          *+Ex= 
CuG #%*  4. C (ANSI-ish)            *+Ex= 
CuG #%*  5. PostScript            *+Ex= 
CuG #%*  6. Linux/Unix shell script (bash, sh, csh)     *+Ex= 
CuG #%*  7. x86 machine language (MS-DOS, Win32, Linux)    *+Ex= 
CuG #%*  8. Perl (version 5)           *+Ex= 
CuG #%*                 *+Ex= 
CuG #%* Usage:               *+Ex= 
CuG #%*  1. Rename this file to polyglot.[cob|pas|f77|c|ps|sh|com|pl] *+Ex= 
CuG #%*                 *+Ex= 
CuG #%*  2. Compile and run with your favorite compiler and operating *+Ex= 
CuG #%*  system.             *+Ex= 
CuG #%*                 *+Ex= 
CuG #%* Notes:               *+Ex= 
CuG #%*  1. We have attempted to use only standard language features. *+Ex= 
CuG #%*                 *+Ex= 
CuG #%*  2. Without the -traditional flag gcc will issue a warning. *+Ex= 
CuG #%*                 *+Ex= 
CuG #%*  3. When transferring from Unix to DOS make sure that a LF *+Ex= 
CuG #%*  is correctly translated into a CR/LF.      *+Ex= 
CuG #%*                 *+Ex= 
CuG #%*  4. Keep the blank lines at the start of the program. They *+Ex= 
CuG #%*  are important.           *+Ex= 
CuG #%*                 *+Ex= 
CuG #%*  5. This text is a comment block in all eight languages.  *+Ex= 
CuG #%*                 *+Ex= 
CuG #%* Please mail any comments, corrections or additions to   *+Ex= 
CuG #%* [email protected]          *+Ex= 
CuG #%*                 *+Ex= 
CuG #%*------------------------------------------------------------------*QuZ= 
CuG #%*                 *+Ex= 
CuG #%*!Mx)ExQX5ZZ5SSP5n*5X!)Ex+ExPQXH,B+ExP[-9A-9B(g?(gA'UTTER_XYZZXX!X *+ 
CuG #(*                 *(
C # */);                /*(
C # *) program  polyglot (output);        (*+ 
C #  identification division. 
C #  program-id. polyglot. 
C # 
C #  data   division. 
C #  procedure  division. 
C # 
C # *))cleartomark /Bookman-Demi findfont 36 scalefont setfont  (
C # *                 (
C # 
C # *     hello polyglots$ 
C #  main. 
C #   perform 
C /# *) 2>_$$; echo "hello polyglots"; rm _$$; exit; 
C # * (
C # 
C  *0) unless print "hello polyglots\n"; __END__ 
       print 
C    stop run. 
    -*,    'hello polyglots' 
C 
C   print. 
C    display "hello polyglots".        (
C  */ int i;              /* 
C  */ main() {              /* 
C  */  i=printf ("hello polyglots\n"); O= &i; return *O;   /* 
C  *)                (* 
C  *) begin               (* 
C  *)  writeln ('hello polyglots');        (* 
C  *)                (*) 
C  *) pop 60 360             (
C  *) pop moveto (hello polyglots) show       (
C  *) pop showpage             ((
C  *) 
      end               .(*) 
C)pop%  program  polyglot.          *){*/} 
+5

Làm nổi bật cú pháp là tuyệt vời cho việc này. – JasonFruit

+3

Điều này có thực sự được tính không? Nó không phải là cùng một mã, mỗi lần, chỉ cần triển khai nhiều bằng văn bản theo cách như họ có thể cùng tồn tại trong cùng một tập tin. – Hamish

+1

Tôi sẽ castrate nhà văn, nếu tôi đã phải gỡ lỗi một cái gì đó như thế này. – Margus