ข้าม​ไป​ยัง​เนื้อหา

จำนวนเต็ม​ที่​เชื่อ​ไม่​ได้ — ค่า​เปลี่ยน​ห้า​จุด และ​ไม่มี​จุด​ไหน​แดง

ห้า​คอร์ส​ก่อน​หน้า​ใน​เสา​นี้​สร้าง​เครื่อง​มือ​ประมวล​ผล​ออ​เด​อร์​ตัว​เดิม​ซ้ำ​ที​ละ​ภาษา คอร์ส​นี้​ไม่​สร้าง​อะไร​เลย มัน​หยิบ​ค่า​สอง​ค่าที่​มี​อยู่​แล้ว​คือ​ยอด​ออ​เด​อร์​กับ order id แล้ว​เดิน​ตาม​มัน​ไป​จน​สุด​ทาง เพื่อ​ถาม​คำถาม​เดียว​ว่า​ค่าที่​ออก​ไป​กับ​ค่าที่​ถึง​ปลาย​ทาง เป็น​ค่า​เดียวกัน​อยู่​หรือ​เปล่า คำ​ตอบ​ที่​วัด​ได้​คือ​ไม่ และ​จุด​ที่​บอก​ได้​ว่า​มัน​เปลี่ยน​คือ​ชนิด​ปลาย​ทาง​กับ​ธง​ที่​คุณ​ไม่​ได้​ตั้ง ไม่ใช่​ชื่อ​ภาษา
ความคืบหน้า0 / 8 บทเรียน

คำถาม​เดียว คือ​ค่าที่​ถึง​ปลาย​ทาง​ยัง​เป็น​ค่า​เดิม​หรือ​ไม่ · คำ​ตอบ​วัด​เป็น​จำนวนเต็ม​ล้วน

คำถาม​คือ ยอด​ออ​เด​อร์​กับ order id ที่​เดิน​ผ่าน​ระบบ ยัง​เป็น​ค่า​เดิม​อยู่​หรือ​เปล่า

สิ่ง​ที่​คน​เดา​ถูก​อยู่​แล้ว​คือ​หลาย​ภาษา​ตอบ​ไม่​เหมือน​กัน สิ่ง​ที่​คน​เดา​ไม่​ถูก​คือ ภาษา​เดียว source เดียว ตอบ​ไม่​เหมือน​กันเอง และ​ทุก​ครั้ง​ที่​มัน​ตอบ​ผิด ไม่มี​อะไร​แดง​สัก​อย่าง

rustc a.rs ให้​รหัส​ออก 101 กับ panic ส่วน rustc -O a.rs ให้​รหัส​ออก 0 กับ 4294967281 จาก source ชุด​เดียวกัน เทสต์​ของ​คุณ​รัน​ฝั่ง​ซ้าย ของ​จริง​รัน​ฝั่ง​ขวา

ธี​สิ​ส​ของ​คอร์ส​จึง​เป็น​ประโยค​เดียว คือ ค่า​จำนวนเต็ม​ค่า​หนึ่ง​เปลี่ยน​ได้​ห้า​จุด​ระหว่าง​ทาง และ​ทั้ง​ห้า​จุด​เงียบ จุด​ที่​บอก​ได้​ว่า​มัน​เปลี่ยน​คือ​ชนิด​ปลาย​ทาง​กับ​ธง​ที่​คุณ​ไม่​ได้​ตั้ง

ห้า​หัวข้อ​นี้​คือ​โครง​ของ​แปดบท และ​ทุก​บรรทัด​ข้าง​ล่าง​เป็น​ค่าที่​วัด​มา​แล้ว

  • ตอน​ความ​กว้าง​หมด 10 - 25 แบบ unsigned 32 bit ได้ 4294967281 ที่ Rust Go และ Kotlin ส่วน Java กับ Node กับ Python ได้ -15 เพราะ​อ่าน bit ชุด​เดิม​คนละ​แบบ
  • ตอน​หา​ค่าสัมบูรณ์ Math.abs ของ Integer.MIN_VALUE คืน -2147483648 โดย​ไม่มี exception ส่วน Math.absExact โยน ArithmeticException ออก​มา
  • ตอน​หาร -7 / 2 ได้ -3 ที่​สาม​ภาษา -3.5 ที่ Node และ -4 ที่ Python · เศษ​ของ​มัน​ได้ -1 ที่​สี่​ภาษา และ​ได้ 1 ที่ Python ภาษา​เดียว
  • ตอน​ทศนิยม​กลืน​มัน Node ตอบ​ว่า 2**53 === 2**53+1 เป็น true · จำนวนเต็ม สอง​ค่าที่​ต่าง​กัน​กลาย​เป็น​ค่า​เดียวกัน โดย​ไม่มี​สัญญาณ​ใด​ออก​มา
  • ตอน​มัน​ข้าม​พรมแดน​ของ​การ parse strconv.Atoi ที่​เกิน​ช่วง​คืน 9223372036854775807 พร้อม error ไม่ใช่​คืน 0 · สำนวน n, _ := จึง​กลืน error แล้ว​เดิน​ต่อ​ด้วย​ค่าที่​ใหญ่​ที่สุด​ของ​ชนิด

สรุป​ที่​ติดปาก​คือ debug panic release wrap · การ​วัด​บอก​ว่า​ไม่ใช่​ทั้ง​สอง​อย่าง

ธง​ที่​ตัดสิน​คือ -C overflow-checks และ​มัน​ตั้ง​ฉาก​กับ​การ optimize สนิท rustc -O -C overflow-checks=on ยัง panic ที่​รหัส​ออก 101 ทั้ง​ที่ optimize แล้ว ส่วน rustc -C overflow-checks=off ให้ 4294967281 ทั้ง​ที่​ไม่​ได้ optimize เลย

debug กับ release เป็น​ผลพลอยได้​ของ​ค่า​ตั้ง​ต้น ไม่ใช่​กลไก และ​การ​เรียก​มัน​ว่า​กลไก คือ​สิ่ง​ที่​ทำให้​คน​มอง​หา​สวิตช์​ผิด​ตัว​ตอน​ของ​ขึ้น production แล้ว​ค่า​ไม่​ตรง

กับ​ดัก​อีก​ชั้น​อยู่​ที่​การ​ทดลอง​เอง ถ้า​คุณ​เขียน​ค่า​เป็น literal rustc ปฏิเสธ​ตั้งแต่ compile ด้วย error: this arithmetic operation will overflow แล้ว​ไม่มี binary ออก​มา ทั้ง​สอง​ฝั่ง การ​ทดลอง​ที่​ใช้ literal จึง​รายงาน​ว่า​สอง​ฝั่ง​ตรง​กัน โดย​ไม่​ได้​วัด​อะไร​เลย

ประกาศ​ไว้​ตรง​นี้ เพื่อ​ไม่​ให้​ใคร​อ่าน​จบ​แล้ว​เชื่อ​ว่า​ได้​ของ​ที่​คอร์ส​นี้​ไม่​ได้​ให้

  • ไม่​วัด​ความเร็ว ทั้ง​คอร์ส​ไม่มี​หน่วย​เวลา​สัก​ตัว หน่วย​คือ​ค่า​จำนวนเต็ม​ที่​เขียน​เป็น string รหัส​ออก ชื่อ class ของ exception และ diagnostic ของ compiler
  • ไม่​แตะ bit บน​สาย คอร์ส สัญญา​บน​สาย เป็น​เจ้าของ เรื่อง​นั้น​ทั้ง​เรื่อง คอร์ส​นี้​เป็น​เจ้าของ​การ​คำนวณ​กับ​พรมแดน​ของ​การ parse
  • ไม่​ทัวร์ API ของ encoding/json struct tag และ Decoder เทียบ Unmarshal เป็น​ของ​คอร์ส Go จาก​ศูนย์ คอร์ส​นี้​เป็น​เจ้าของ​ค่าที่​หาย​ไป
  • ไม่​สอน​ชนิด​ของ​เงิน Money กับ BigDecimal เป็น​ของ บัญชี​แยก​ประเภท​ของ​ระบบ​ชำระ​เงิน คอร์ส​นี้​เป็น​เจ้าของ การ​คำนวณ​บน​ค่า​นั้น ไม่ใช่​ชนิด​ที่​ห่อ​มัน​ไว้
  • ไม่​แตะ​ความ​กว้าง​ของ column ใน database มัน​ต้อง​ใช้ PostgreSQL ซึ่ง​จะ​ดัน probe ทั้ง​ตัว​ออก​ไป​นอก CI · ตัด​ออก​ตั้งแต่​ตอน​ออกแบบ

อ่าน​ห้า​ภาษา​ออก​พอ​ตาม​ตัว​อย่าง​สั้นๆ ได้​ก็​พอ ไม่​ต้อง​รู้​เรื่อง​การ​เข้า​รหัส​จำนวนเต็ม​มา​ก่อน

  • อ่าน Rust Go และ Java ออก ระดับ​ที่​ตาม​ตัวอย่าง​สิบ​บรรทัด​ได้​ก็​พอ ถ้า​ยัง​ไม่​ถึง​ตรง​นั้น เริ่ม​ที่ Rust จาก​ศูนย์ Go จาก​ศูนย์ หรือ Java จาก​ศูนย์ ก่อน
  • ไม่​ต้อง​รู้จัก two’s complement มา​ก่อน บท​ที่ 3 อธิบาย​มัน​ตอน​ที่​มัน​โผล่​ครั้ง​แรก
  • ควร​เคย​เจอ​ค่าที่​ไม่​ตรง​กัน​ระหว่าง​สอง service เพราะ​นั่น​คือ​อาการ​ที่​คอร์ส​นี้​อธิบาย​ต้น​เหตุ
  • ต้อง​มี rustc Go JDK 25 Node และ Python 3 เพราะ​ทุก​ข้อ​อ้าง​มา​จาก probe ที่​คุณ รัน​เอง​ได้ · ไม่​ต้อง​มี Docker และ​ไม่​ต้อง​ต่อ​เน็ต

แผนผัง​นี้​เติม​ขึ้น​เอง​เมื่อ​บท​เรียน​ถูก​เพิ่ม​เข้า​มา