พอลิกล็อต

พอลิกล็อต () ในทางคอมพิวเตอร์ หมายถึง โปรแกรมคอมพิวเตอร์หรือสคริปต์ที่เขียนขึ้นในรูปแบบที่ถูกต้องของภาษาโปรแกรมหลายภาษาด้วยรหัสต้นฉบับอันเดียวกัน ซึ่งโปรแกรมจะทำงานหรือให้ผลลัพธ์เหมือนกันจากการแปลด้วยคอมไพเลอร์หรืออินเทอร์พรีเตอร์ของภาษานั้นอย่างอิสระ

โดยทั่วไปแล้วพอลิกล็อตเขียนขึ้นจากการผสานภาษาซี ซึ่งอนุญาตให้มีการจำกัดความ (define) วลีต่าง ๆ ได้ด้วยตัวประมวลผลก่อน (preprocessor) รวมกับภาษาสคริปต์อื่น ๆ เช่น ภาษาลิสป์ ภาษาเพิร์ล หรือ sh

เทคนิคที่ใช้เป็นปกติที่สุดสองอย่างสำหรับการสร้างโปรแกรมพอลิกล็อตคือ การใช้ประโยชน์จากอักขระแทนหมายเหตุ (comment) ที่แตกต่างกัน และการจำกัดความวลีด้วยการทำงานในภาษาอื่น และเทคนิคที่ใช้ได้ดีอีกอย่างหนึ่งคือ การพลิกแพลงไวยากรณ์ของภาษา จากตัวอย่างต่อไปนี้เป็นพอลิกล็อตที่เขียนขึ้นเพื่อทำงานบน ภาษาซีแบบแอนซี (ANSI C) ภาษาพีเอชพี และ bash

#define a /*
#<?php
echo "\010Hello, world!\n"// 2> /dev/null > /dev/null \ ;
// 2> /dev/null; x=a;
$x=5 // 2> /dev/null \ ;
if (($x))
// 2> /dev/null; then
return 0;
// 2> /dev/null; fi
#define e ?>
#define b */
#include <stdio.h>
#define main() int main()
#define printf printf(
#define true )
#define function
function main()
{
printf "Hello, world!\n"true/* 2> /dev/null | grep -v true*/;
return 0;
}
#define c /*
main
#*/

โปรแกรมดังกล่าวจะแสดงข้อความ Hello, world! พร้อมทั้งขึ้นบรรทัดใหม่บนจอภาพ สามารถอธิบายได้ดังนี้
 "#" หมายถึงประพจน์ของตัวประมวลผลก่อนในภาษาซี แต่หมายถึงการระบุหมายเหตุใน bash และภาษาพีเอชพี
 "//" คือหมายเหตุในภาษาพีเอชพี และหมายถึงสารบบราก (root directory) ใน bash
 การเปลี่ยนทางของเชลล์ถูกใช้เพื่อขจัดผลลัพธ์ที่ไม่ต้องการ
 โค้ดระบุตำแหน่งภาษาพีเอชพี "<?php" กับ "?>" ยังคงใช้ได้ผล แม้จะอยู่ในบรรทัดที่ระบุหมายเหตุเอาไว้
 ประพจน์ "function main()" สามารถใช้ได้ทั้งในภาษาพีเอชพีและ bash ในขณะที่ภาษาซีจะใช้ "#define" เป็นเครื่องมือแปลงประพจน์นั้นให้กลายเป็น "main()" ขณะแปลภาษา
 อักขระกำหนดหมายเหตุสามารถผสานกันเพื่อให้ทำงานได้หลากหลาย
 "if (($x))" เป็นประพจน์ที่ถูกต้องทั้งใน bash และภาษาพีเอชพี
 "printf" เป็นคำสั่งในตัว (shell builtin) ของ bash ซึ่งเหมือนกับฟังก์ชันในภาษาซี เว้นแต่ไม่มีการกำหนดวงเล็บ (ตัวประมวลผลก่อนของภาษาซีจะเป็นผู้เติมวงเล็บให้)
 สามบรรทัดสุดท้ายถูกใช้เฉพาะใน bash เพื่อเรียกฟังก์ชัน "main" ในภาษาพีเอชพีฟังก์ชันนี้ได้นิยามไว้แล้วแต่ไม่มีการใช้ ส่วนภาษาซีไม่จำเป็นต้องเรียกใช้

 แหล่งข้อมูลอื่น 
 พอลิกล็อตแปดภาษา (ภาษาโคบอล ภาษาปาสกาล ภาษาฟอร์แทรน ภาษาซี โพสต์สคริปต์ เชลล์ยูนิกซ์ ภาษาเครื่องของ Intel x86 และ ภาษาเพิร์ล 5)
 รายชื่อพอลิกล็อต
 พอลิกล็อต Merry Christmas ในสี่ภาษา 
 พอลิกล็อต Happy New year ในสี่ภาษา
 พอลิกล็อตสี่ภาษา  (ภาษาซีแบบแอนซี เชลล์ยูนิกซ์ ภาษาเพิร์ล และ tcl)

หมวดหมู่:การเขียนโปรแกรม