อธิบายปฏิจจสมุปบาทด้วยโค้ดโปรแกรมภาษาซี อวิชชา...ผัสสะ...เวทนา
ตัวโค้ดในหน้านี้ เป็นการอธิบายกลไกของปฏิจจสมุปบาทและอวิชชา ผ่านโครงสร้างและตรรกะของภาษา C เพราะภาษาตรรกกะลักษณะนี้ เป็นภาษาที่ "โกหกไม่เป็น" และตรงไปตรงมาตามเหตุปัจจัย
เมื่อเงื่อนไขต้นทางยังคงอยู่ กระบวนการปรุงแต่งจะทำงานซ้ำ ๆ ตามโครงสร้างของมัน ไม่มีสิ่งใดถูกสร้างขึ้นโดยบังเอิญ และไม่มีสิ่งใดดับลงหากเงื่อนไขยังไม่ถูกปิด
ท่านอาจเห็นภาพได้ทันที หากยังไม่เห็น ลองนำโค้ดไปคอมไพล์และสังเกตผลลัพธ์ที่เกิดขึ้นดู
โค้ดโปรแกรม: AVIJJA.CPP
#include "stdafx.h"
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
typedef struct {
const char *label;
} NamaRupa;
bool AVIJJA = true;
const char* AVIJJA_TEXT = "มีตัวเรา";
bool PHYSICAL_BODY_ALIVE = true;
void contact() {
printf("วิญญาณ (การรู้) วาบขึ้น!\n");
if (AVIJJA) {
printf("สังขาร ปรุงวิญญาณ\n");
printf("วิญญาณเจือด้วยอวิชชา\n");
NamaRupa *my_self = NULL;
my_self = (NamaRupa*)malloc(sizeof(NamaRupa));
my_self->label = AVIJJA_TEXT;
printf("วิญญาณหยั่งลงนามรูป\n");
printf("อายตนะถูกเจือด้วยอวิชชา\n");
printf("ผัสสะเจือด้วยอวิชชา\n");
printf("เวทนา ตัณหา อุปาทาน ภพชาติ ฯลฯ\n");
static int heap_counter = 0;
heap_counter++;
printf("สั่งสมในอาสวะ %d [%s]\n", heap_counter, my_self->label );
printf("\n");
}
else
{
printf("สักแต่ว่ารู้\n\n");
}
}
int main() {
printf("เกิดกายเป็นมนุษย์ อวิชชา = true\n");
while (PHYSICAL_BODY_ALIVE==true)
{
char input;
input = getch();
if (input=='c') contact();
if (input=='v') AVIJJA=false;
if (input=='x') PHYSICAL_BODY_ALIVE=false;
}
_CrtDumpMemoryLeaks();
return 0;
}
บทวิเคราะห์จากโค้ด
- ไม่มีสิ่งใดถูกสร้างขึ้นโดยบังเอิญ (ไม่มีฟังก์ชันใดทำงานเองโดยไม่มีการเรียก (Invoke) ทุกผลลัพธ์เกิดจากการประมวลผลตามเงื่อนไข (Input & Logic) ที่ครบถ้วนเท่านั้น)
- วิญญาณไม่ได้ลอยเป็นดวงๆ ลอยไปมา รอท่าเอาไว้ (วิญญาณไม่ใช่ 'Data' ที่เก็บถาวรในฮาร์ดดิสก์ แต่เป็น 'Process' หรือ 'Instance' ที่วาบขึ้นมาชั่วคราวเมื่อมีการกระทบ (Contact) แล้วก็ดับไปเมื่อจบการทำงาน)
- วงจรแห่งทุกข์ยังไม่ล้ม หากเงื่อนไขอวิชชายังเป็น true (ตราบใดที่ตัวแปร AVIJJA ยังเป็น true โปรแกรมจะกระโดดเข้าสู่ Loop ของการปรุงแต่ง (อวิชฺชาปจฺจยา สงฺขารา) ทุกครั้งที่มี Input เข้ามา)
- ถ้าอวิชชายังเป็นปัจจัย วัฏสงสาร อาสวะ จึงยังคงค้างและส่งผล (หากอวิชชายังทำงาน ทุกการกระทบจะเกิดการหยั่งลงนามรูป เกิดการจองหน่วยความจำ (malloc) เพิ่มขึ้นเรื่อยๆ กลายเป็น 'Memory Leak' หรือ 'อาสวะ' ที่คั่งค้าง หน่วงให้ระบบ (จิต) หนักและไม่เป็นอิสระ)
- ถ้าอวิชชาดับ (นิโรธ) จะเป็นอย่างไร
วิธีการรันโปรแกรม
โปรแกรมนี้ ผู้เขียนใช้ Visual C++ 2008 Express Edition หากมีโอกาส ผู้เขียนจะทำคลิปรันโปรแกรมตัวนี้ให้ดูอีกที เพื่อให้ท่านเห็นกระบวนการ
เมื่อรันโปรแกรม เราจะกดปุ่ม F5 เพื่อรันในโหมดดีบัก (Debug mode) จะมีข้อความปรากฏขึ้นว่า:
เกิดกายเป็นมนุษย์ อวิชชา = true
ถ้าเรากดปุ่ม c เป็นการจำลองว่าผัสสะเกิด (ตาเห็นรูป หูได้ยินเสียง หรือใจรับรู้อารมณ์) ฟังก์ชั่น contact จะถูกเรียกให้ทำงานและจบไป:
วิญญาณ (การรู้) วาบขึ้น!
หากอวิชชาเป็นปัจจัย (if AVIJJA เป็นจริง) สิ่งที่ตามมาคือ:
วิญญาณ (การรู้) วาบขึ้น! สังขาร ปรุงวิญญาณ วิญญาณเจือด้วยอวิชชา
จากนั้นจะมีการจองหน่วยความจำด้วย malloc เปรียบเสมือน "วิญญาณหยั่งลงนามรูป" (วิญฺญาณปจฺจยา นามรูปํ):
วิญญาณ (การรู้) วาบขึ้น! สังขาร ปรุงวิญญาณ วิญญาณเจือด้วยอวิชชา อายตนะถูกเจือด้วยอวิชชา ผัสสะเจือด้วยอวิชชา เวทนา ตัณหา อุปาทาน ภพชาติ ฯลฯ สั่งสมในอาสวะ 1 [มีตัวเรา]
เมื่อเราใช้ malloc แต่ไม่คืนหน่วยความจำ (free) มันคือ "อาสวะ" ที่สั่งสมมาในวัฏสงสาร สังเกตจาก heap counter ที่เพิ่มขึ้นเรื่อยๆ
หากกดปุ่ม c ค้างไว้ (เกิดผัสสะต่อเนื่อง):
สังขาร ปรุงวิญญาณ วิญญาณ (การรู้) วาบขึ้น! สังขาร ปรุงวิญญาณ วิญญาณเจือด้วยอวิชชา อายตนะถูกเจือด้วยอวิชชา ผัสสะเจือด้วยอวิชชา เวทนา ตัณหา อุปาทาน ภพชาติ ฯลฯ สั่งสมในอาสวะ 1 [มีตัวเรา] วิญญาณ (การรู้) วาบขึ้น! สังขาร ปรุงวิญญาณ วิญญาณเจือด้วยอวิชชา อายตนะถูกเจือด้วยอวิชชา ผัสสะเจือด้วยอวิชชา เวทนา ตัณหา อุปาทาน ภพชาติ ฯลฯ สั่งสมในอาสวะ 2 [มีตัวเรา] วิญญาณ (การรู้) วาบขึ้น! สังขาร ปรุงวิญญาณ วิญญาณเจือด้วยอวิชชา อายตนะถูกเจือด้วยอวิชชา ผัสสะเจือด้วยอวิชชา เวทนา ตัณหา อุปาทาน ภพชาติ ฯลฯ สั่งสมในอาสวะ 3 [มีตัวเรา] ...จนถึง... วิญญาณ (การรู้) วาบขึ้น! สังขาร ปรุงวิญญาณ วิญญาณเจือด้วยอวิชชา อายตนะถูกเจือด้วยอวิชชา ผัสสะเจือด้วยอวิชชา เวทนา ตัณหา อุปาทาน ภพชาติ ฯลฯ สั่งสมในอาสวะ 323144 [มีตัวเรา]
จะเห็นว่าวงจรแห่งทุกข์เกิดภพชาติในทุกครั้งที่ตาเห็นรูป เพราะตัวแปร avijja ยังเป็น true
เมื่ออวิชชาดับ (นิโรธ)
ถ้าเรากดปุ่ม v โค้ดส่วนนี้จะทำงาน AVIJJA=false; เปรียบได้กับการเกิดปัญญา เมื่ออวิชชาดับ แม้จะมีผัสสะ (กด c) ฟังก์ชั่นจะเข้าเงื่อนไข else แทน:
else {
printf("สักแต่ว่ารู้");
}
ในสภาวะนี้ ไม่มีการ malloc เพิ่ม ไม่มีการสร้างตัวตนเพิ่ม ไม่มีการจองหน่วยความจำค้างไว้ (ไม่มี Memory Leak ใหม่)
และถ้ากดปุ่ม x (จบโปรแกรม/ตาย) หากระบบมีอวิชชาสะสมไว้มาก จะมีการรายงาน Memory Leak ดังรูป:
แต่ถ้าอวิชชาเป็น false ไปก่อนหน้านั้น แม้เครื่องจะดับ (ตาย) ระบบจะสะอาด ไม่มีอะไรค้างคา นี่คือความสัมพันธ์ของเหตุปัจจัยและผลที่ตรงไปตรงมา
บทส่งท้าย: เอหิปัสสิโก – ท้าให้มา Debug ระบบ
เนื้อหาทั้งหมดนี้สอดคล้องกับคำว่า "เอหิปัสสิโก" คือการท้าให้มาดู มาพิสูจน์ระบบ เพราะธรรมะไม่ใช่เรื่องลึกลับ แต่เป็นเรื่องของเหตุปัจจัยที่พิสูจน์ได้ผ่านตรรกะที่ตรงไปตรงมา
คอมพิวเตอร์ทำงานตามคำสั่งอย่างไร จิตที่ขาดสติก็ทำงานตามเหตุปัจจัย (อวิชชา) อย่างนั้น... การเขียนโปรแกรมต้อง Debug โค้ดฉันใด การปฏิบัติธรรมก็คือการ Debug จิต ฉันนั้น
เมื่อเราเข้าใจกลไกของมันอย่างชัดเจน เราจะพบว่า "ตัวตน" ที่เราเคยคิดว่ามีอยู่จริง แท้จริงแล้วก็เป็นเพียงชุดคำสั่งที่ถูกจองไว้ในหน่วยความจำชั่วคราว และพร้อมจะถูกปลดปล่อย (Free Memory) ให้คืนสู่ความว่างได้เสมอ
ลองนำ "สติ" มาเป็น Debugger ดู แล้วเราจะเห็นว่า "วงจรแห่งทุกข์" นี้สามารถหยุดการทำงาน (Terminate) ได้จริงๆ