ก่อนจะเรียนรู้ว่าคอมพิวเตอร์เก็บข้อมูลอย่างไร เราต้องมาปูพื้นฐานเรื่องการทำงานของคอมพิวเตอร์กันก่อน
การทำงานของคอมพิวเตอร์ในเบื้องต้นนั้น ประกอบด้วย 3 ส่วนหลัก ๆ คือ CPU, RAM, และ Storage

ในการเขียนโค้ดเพื่อสร้างโปรแกรม เราอาจจะมีการประกาศตัวแปร และมีประโยคคำสั่งให้โปรแกรมทำงานตามที่เราต้องการ เราเขียนโค้ด และเก็บไฟล์เอาไว้ใน Storage

ในการ Run โปรแกรม CPU จะอ่านไฟล์ที่เราบันทึกเอาไว้ใน Storage มาเก็บไว้ที่ RAM

RAM คือหน่วยความจำหลัก จะเก็บข้อมูลโปรแกรมที่กำลังทำงานอยู่ หรือข้อมูลที่ใช้ประมวลผลอยู่ในขณะนั้น

Storage คือหน่วยความจำสำรอง อาจจะเป็น Disk drive, Flash drive, Solid-state drive, CD, หรือ DVD ก็ได้ เราใช้ Storage ในการเก็บข้อมูลต่าง ๆ เช่น ไฟล์โค้ดโปรแกรม ไฟล์วีดีโอ ไฟล์เพลง หรือไฟล์เอกสารต่าง ๆ เป็นต้น

Storage VS RAM
Storage และ RAM แตกต่างกันตรงที่ การเก็บข้อมูลใน Storage เมื่อเราปิดเครื่องคอมพิวเตอร์ไป แล้วเปิดขึ้นมาใหม่ ข้อมูลที่บันทึกเอาไว้จะยังคงอยู่
แต่การเก็บข้อมูลของ RAM จะทำได้เฉพาะตอนที่มีไฟฟ้าหล่อเลี้ยงอยู่เท่านั้น หากไม่มีไฟฟ้าหล่อเลี้ยงข้อมูลจะหายไปทันที
ลองนึกถึงตอนเราพิมพ์ Code เอาไว้และยังไม่ได้กด Save โค้ดที่ยังไม่ได้ Save คือข้อมูลที่เก็บอยู่ใน RAM เมื่อไฟดับ และเราเปิดเครื่องขึ้นมาใหม่ จะเห็นว่าข้อมูลที่ยังไม่ได้ Save หายไปเรียบร้อยแล้ว
การทำงานของ CPU & RAM
เบื้องต้นเราอาจจะมองว่า RAM คือพื้นที่เก็บข้อมูลขนาดใหญ่ก็ได้ คล้าย ๆ กับเป็น Data Structure ชนิดหนึ่ง ซึ่งมีการเก็บข้อมูลเป็นชั้น ๆ
แต่ละชั้นประกอบไปด้วยข้อมูล 2 ส่วนคือ
– Address จะเริ่มจาก 0 ไปเรื่อย ๆ
– ค่า 1 กับ 0 (on/off)

ตัวเลขหนึ่งตัวเราเรียกว่า “บิต” (bit) ในหนึ่งชั้นจะมี 8 บิต เราเรียกว่า 1 ไบต์ (byte)

CPU เชื่อมต่อกับ RAM ผ่านสิ่งที่เรียกว่า memory controller ทำหน้าที่อ่านและเขียนข้อมูลลงใน RAM โดยตรง ตามตำแหน่งของ address โดยไม่มี step การค้นหาข้อมูล
สิ่งเดียวที่ CPU ต้องรู้คือ ต้องการเข้าถึง address ใดเท่านั้น ในกรณีที่ต้องการเข้าถึงข้อมูลที่อยู่ห่างกัน memory controller ก็สามารถกระโดดไปยัง address ที่ต้องการได้อย่างรวดเร็ว
แต่การเข้าถึงข้อมูลใน address ที่ 0 และ 1 จะเร็วกว่าการเข้าถึง address ที่ 0 และ 1000 เพราะตำแหน่ง 0 และ 1 อยู่ใกล้กันมากกว่า
ในการเพิ่มประสิทธิภาพให้กับการทำงาน CPU จะมี cache ซึ่งเป็นหน่วยความจำเล็ก ๆ ที่เก็บข้อมูลการเข้าถึง address ต่าง ๆ ไว้ใช้งานเองด้วย (LRU Cache)
แล้วเกี่ยวอะไรกับ Data Structures
Data Structures คือวิธีที่เราใช้ในการเก็บข้อมูล (data) หรือสารสนเทศ (information)
หากเราต้องการเก็บข้อมูล var a = 1 โดยปกติเลข 1 จะเป็น integer ใช้พื้นที่ในการเก็บ 32 บิต จากตัวอย่างรูปด้านล่าง เป็นการเก็บใน address ที่ 0 ถึง 3 (4 X 8 = 32)

ถ้าเรามีตัวแปรอื่น var b = 7 เราก็จะเก็บข้อมูลในบล๊อกต่อไป คือ address ที่ 4 ถึง 7 เป็นต้น

ในการเก็บข้อมูลแบบนี้ทำให้เรารู้ว่า system แบบ 8 บิต สามารถเก็บข้อมูลได้ 256 ข้อมูล หากเป็น 32 บิต หรือ 64 บิต ก็จะเก็บข้อมูลได้มากขึ้น

ใน JavaScript มีเมธอดหนึ่งใช้ในการหาผลลัพธ์เลขยกกำลัง โดยสามารถกำหนดฐานและเลขยกกำลังได้ คือ
เมธอด Math.pow() พารามิเตอร์แรกจะเป็นฐาน และพารามิเตอร์ที่สองจะเป็นเลขยกกำลัง เช่น
Math.pow(5,100)
ผลลัพธ์: 7.888609052210118e+69
ถ้าเราเพิ่มฐานจาก 5 เป็น 6 ก็จะได้ผลลัพธ์ดังนี้
Math.pow(6,100)
ผลลัพธ์: 6.533186235000709e+77
แต่ถ้าเราเพิ่มเลขยกกำลังเป็น 1000 จะได้ Infinity กลับมา
Math.pow(6,1000)
ผลลัพธ์: Infinity
ใน JavaScript ผลลัพธ์ Infinity คือขนาดตัวเลขใหญ่เกินไปที่จะเก็บใน RAM ได้ เราเรียกมันว่า integer overflow
ในทางเทคนิคแล้ว JavaScript ไม่มี integer มีแต่สิ่งที่เรียกว่า 64 bit floats เมื่อคอมพิวเตอร์ไม่สามารถจัดเก็บตัวเลขตาม syntax ของ JavaScript ได้ จึงแสดงค่า Infinity ออกมา
สิ่งสำคัญเกี่ยวกับเรื่องนี้คือ ตัวเลขอื่น ๆ หรือชนิดข้อมูลอื่น ๆ ล้วนทำงานในลักษณะเดียวกันนี้
แต่ละ data type มีความต้องการใช้พื้นที่ในการจัดเก็บและประมวลผลข้อมูลที่สัมพันธ์กับชนิดของมัน
ระบบ (system) ทำการจัดสรรพื้นที่ให้ CPU เข้ามาอ่านข้อมูลจากตำแหน่งที่จัดเก็บนี้
Data Structures คือการจัดการข้อมูล ทำให้เราสามารถออกแบบวิธีการตอบโต้กับข้อมูลที่อยู่ใน RAM ได้
ข้อมูลที่อยู่ใน RAM บาง Data Structure จัดเก็บข้อมูลเรียงต่อกัน บาง Data Structure จัดเก็บข้อมูลแยกจากกัน
ซึ่งแต่ละแบบล้วนมีข้อเด่นและข้อจำกัดแตกต่างกันไป ในการเข้าถึงและเขียนข้อมูล
สรุป
การเรียนรู้ว่าคอมพิวเตอร์เก็บข้อมูลอย่างไร ทำให้เรารู้ว่า Data Structure ต่าง ๆ จัดเก็บข้อมูลอย่างไร และเป้าหมายของเราก็คือ การลดการทำงานให้กับ CPU ในการอ่านและเขียนข้อมูล
และนั้นคือเหตุผลที่ Data Structures มีความสำคัญอย่างมากในการพัฒนาซอฟต์แวร์
Sources