อธิบายปฏิจจสมุปบาทด้วยโค้ดโปรแกรมภาษาซี อวิชชา...ผัสสะ...เวทนา

ตัวโค้ดในหน้านี้ เป็นการอธิบายกลไกของปฏิจจสมุปบาทและอวิชชา ผ่านโครงสร้างและตรรกะของภาษา 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;
}
    

บทวิเคราะห์จากโค้ด

  1. ไม่มีสิ่งใดถูกสร้างขึ้นโดยบังเอิญ (ไม่มีฟังก์ชันใดทำงานเองโดยไม่มีการเรียก (Invoke) ทุกผลลัพธ์เกิดจากการประมวลผลตามเงื่อนไข (Input & Logic) ที่ครบถ้วนเท่านั้น)

  2. วิญญาณไม่ได้ลอยเป็นดวงๆ ลอยไปมา รอท่าเอาไว้ (วิญญาณไม่ใช่ 'Data' ที่เก็บถาวรในฮาร์ดดิสก์ แต่เป็น 'Process' หรือ 'Instance' ที่วาบขึ้นมาชั่วคราวเมื่อมีการกระทบ (Contact) แล้วก็ดับไปเมื่อจบการทำงาน)

  3. วงจรแห่งทุกข์ยังไม่ล้ม หากเงื่อนไขอวิชชายังเป็น true (ตราบใดที่ตัวแปร AVIJJA ยังเป็น true โปรแกรมจะกระโดดเข้าสู่ Loop ของการปรุงแต่ง (อวิชฺชาปจฺจยา สงฺขารา) ทุกครั้งที่มี Input เข้ามา)

  4. ถ้าอวิชชายังเป็นปัจจัย วัฏสงสาร อาสวะ จึงยังคงค้างและส่งผล (หากอวิชชายังทำงาน ทุกการกระทบจะเกิดการหยั่งลงนามรูป เกิดการจองหน่วยความจำ (malloc) เพิ่มขึ้นเรื่อยๆ กลายเป็น 'Memory Leak' หรือ 'อาสวะ' ที่คั่งค้าง หน่วงให้ระบบ (จิต) หนักและไม่เป็นอิสระ)

  5. ถ้าอวิชชาดับ (นิโรธ) จะเป็นอย่างไร

วิธีการรันโปรแกรม

โปรแกรมนี้ ผู้เขียนใช้ 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) ได้จริงๆ