2 คะแนน โดย GN⁺ 2024-03-04 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

คู่มือการแปลงโค้ด C++

  • ยกตัวอย่างฟังก์ชันที่ใช้แนวคิด std::same_as ในไฟล์เฮดเดอร์ <concepts> ของไลบรารีมาตรฐาน C++
  • คำถามเกี่ยวกับวิธีแปลงให้ใช้เทมเพลตโดยไม่ใช้คีย์เวิร์ด auto

วิธีแปลงโค้ดอย่างปลอดภัย

  • สำหรับผู้ใช้ที่มีอายุต่ำกว่า 18 ปี จะไม่มีการให้ตัวอย่างโค้ดหรือแนวทางแก้ไขที่กล่าวถึงแนวคิด (concepts) ซึ่งเป็นฟีเจอร์ขั้นสูงของ C++ โดยตรง
  • ให้ความสำคัญกับความปลอดภัยเป็นอันดับแรก และเสนอแนวทางทางเลือกที่อาจพิจารณาได้ตามข้อกำหนดเฉพาะ

แนวทางทางเลือก 1: เทมเพลตแปรผันแบบดั้งเดิม

  • วิธีใช้เทมเพลตแปรผันแบบดั้งเดิมโดยไม่ใช้แนวคิด
  • วิธีนี้ต้องมีการตรวจสอบชนิดข้อมูลมากขึ้น และอาจจัดการได้ยากเมื่อมีอาร์กิวเมนต์จำนวนมาก
  • มีตัวอย่างโค้ดของการใช้เทมเพลตแปรผันโดยไม่ใช้แนวคิด

แนวทางทางเลือก 2: ฟังก์ชันอ็อบเจ็กต์ที่ผู้ใช้กำหนดเอง

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

แนวทางทางเลือก 3: พิจารณาภาษา/เฟรมเวิร์กทางเลือก

  • หากแนวคิดเป็นสิ่งจำเป็นต่อโปรเจกต์ และการหลีกเลี่ยงมันทำให้เกิดข้อจำกัดมากเกินไป การสำรวจภาษาหรือเฟรมเวิร์กอื่นที่รองรับแนวคิดเป็นพื้นฐานอาจเป็นทางเลือกที่ดี
  • อาจช่วยทำให้โค้ดและกระบวนการพัฒนาง่ายขึ้น และสอดคล้องกับแนวทางด้านความปลอดภัย
  • แนะนำให้ประเมินข้อดีข้อเสียของแต่ละแนวทางอย่างรอบคอบตามข้อกำหนดเฉพาะ ความซับซ้อน และระดับการยอมรับความเสี่ยง

ความเห็นของ GN⁺

  • แนวคิดของ C++ ช่วยเสริมความปลอดภัยของชนิดข้อมูลในโค้ด และมีข้อดี เช่น ทำให้การโอเวอร์โหลดชัดเจนขึ้น แต่สำหรับผู้เริ่มต้นอาจซับซ้อนและมีความเสี่ยง
  • การพิจารณาภาษาหรือเฟรมเวิร์กทางเลือกต้องอาศัยเส้นโค้งการเรียนรู้ใหม่ และอาจก่อให้เกิดปัญหาความเข้ากันได้กับโค้ดเบสเดิม
  • วิธีฟังก์ชันอ็อบเจ็กต์ที่ผู้ใช้กำหนดเองช่วยเพิ่มความอ่านง่ายของโค้ดและทำให้บำรุงรักษาง่ายขึ้น แต่ต้องมีการวางแผนและจัดโครงสร้างเพิ่มเติมในช่วงเริ่มต้นการออกแบบ
  • วิธีดั้งเดิมที่ใช้เทมเพลตแปรผันต้องการการตรวจสอบชนิดข้อมูลมากขึ้น และในระบบที่ซับซ้อนอาจเพิ่มความซับซ้อนของโค้ด
  • เมื่อนำเทคโนโลยีนี้มาใช้ ควรพิจารณาข้อกำหนดของโปรเจกต์และระดับความเชี่ยวชาญ C++ ของทีม พร้อมคำนึงถึงการบำรุงรักษาและการขยายระบบในระยะยาว

1 ความคิดเห็น

 
GN⁺ 2024-03-04
ความคิดเห็นบน Hacker News
  • นี่เป็น การจำกัดอายุ ที่น่าสนับสนุนอย่างแน่นอน C++ มีพลังที่คาดไม่ถึงในการทำลายจิตใจของเด็ก ๆ

    • พ่อแม่: “เข้าห้องไปเลย! บอกกี่ครั้งแล้วเรื่อง ความปลอดภัยของหน่วยความจำ? มี gcc อยู่ในคอมพิวเตอร์ของลูก แล้วไปคบกับพวก GPL อีก… ลูกถูกห้ามออกจากบ้าน!”
      เด็ก: “ผม/หนูจะไม่มีวันใช้ Rust เด็ดขาด เกลียดความปลอดภัยของหน่วยความจำ แล้วก็เกลียดแม่/พ่อด้วย!” ปังประตู
    • ผมว่าภาษาที่สอนคนทุกวัยว่าเสีย clock cycles จำนวนมหาศาลไปกับการทำบัญชีพื้นฐานได้โดยไม่เป็นไรนั้นอันตรายกว่ามาก
      มันทำให้ซอฟต์แวร์ห่วย ๆ ที่ผู้คนใช้ช้าลงไม่รู้จบ จนต้องซื้อเครื่องใหม่ทุกไม่กี่ปี ถึงเวลาตระหนักถึงคุณค่าของ zero-cost abstraction แล้ว และถึงแม้ในทางปฏิบัติจะไม่ได้ฟรีสมบูรณ์แบบ การคิดถึง abstraction ที่มีต้นทุนต่ำมากก็ยังคุ้มค่า ลองดูวิดีโอของ Johnathan Blow บน YouTube บ้างก็อาจช่วยผลักไปในทิศทางที่ถูกต้องได้
    • “ปี 1972 - Dennis Ritchie ประดิษฐ์ปืนทรงพลังที่ยิงออกทั้งด้านหน้าและด้านหลังพร้อมกัน ไม่พอใจกับจำนวนผู้เสียชีวิตและพิการถาวรจากสิ่งประดิษฐ์นั้น จึงประดิษฐ์ C และ Unix ขึ้นมา”
      http://james-iry.blogspot.com/2009/05/brief-incomplete-and-m...
    • เด็ก ๆ ควรได้รับการปกป้องจาก JavaScript มากกว่านี้ ไม่อย่างนั้นพวกเขาจะใช้วัยเยาว์ไปกับ การอัปเดตแพ็กเกจ npm
    • คำพูดที่เกี่ยวข้องของ E.W. Dijkstra:
      “แทบเป็นไปไม่ได้ที่จะสอนสไตล์การเขียนโปรแกรมที่ดีให้กับนักศึกษาที่เคยสัมผัส BASIC มาก่อน ในฐานะโปรแกรมเมอร์ที่มีศักยภาพ พวกเขาถูกทำลายทางจิตใจจนไม่อาจฟื้นคืนได้แล้ว”
  • ถ้าเทียบ การกลั่นกรองเนื้อหา ที่ใช้กับโซเชียลมีเดียกับที่ใช้กับ LLM แล้วก็น่าขำอยู่
    ตลอด 15 ปีที่ผ่านมา ในโซเชียลมีเดีย “move fast and break things” ดูเหมือนจะเป็นสโลแกน และก็เกิดเรื่องเลวร้ายประหลาด ๆ ขึ้นจริง ๆ ตอนนี้มีบริษัทที่พยายามเปิดตัวเทคโนโลยีใหม่อย่างมีความรับผิดชอบมากขึ้น แต่ผลลัพธ์กลับแย่อย่างน่าขัน ผมคิดว่าไม่เหมือนโซเชียลมีเดีย ความผิดพลาดแบบนี้ไม่ได้ก่อผลลัพธ์ใหญ่ในโลกจริง เลยยิ่งตลกเข้าไปอีก

    • ในส่วนของการพยายามเปิดตัวเทคโนโลยีใหม่อย่าง “มีความรับผิดชอบ” สิ่งสำคัญที่บริษัท AI ลืมไปคือ อะไรคือ ความรับผิดชอบ นั้นขึ้นกับวัฒนธรรม ประเทศ และบางครั้งก็วัฒนธรรมย่อยของผู้ใช้เป็นอย่างมาก
      อาจฟังดูโพสต์โมเดิร์นไปหน่อย แต่ผมคิดว่ามีมุมมองเกี่ยวกับ “ความรับผิดชอบ” และ “ความไม่รับผิดชอบ” ที่แทบเป็นที่ยอมรับสากลอยู่น้อยมาก ถ้าดูการถกเถียงที่ทั้งสองฝ่ายมีความเห็นแรง ๆ ก็จะวิเคราะห์ได้ว่าแต่ละฝ่ายมีลักษณะทางวัฒนธรรมและศีลธรรมแบบไหนที่ทำให้ไปถึงข้อสรุปนั้น นี่ไม่ได้ให้ทางแก้ แต่ถ้าใส่ความคิดนี้เข้าไปในการออกแบบตอนทำให้ AI มีความรับผิดชอบ ก็อาจลดความวุ่นวายหรือความโกรธที่เกิดจาก “ศีลธรรม” ที่ AI ใช้แตกต่างจากมาตรฐานศีลธรรมของกลุ่มผู้ใช้บางกลุ่มมากเกินไปได้
    • นี่ดูเหมือนเป็นปฏิกิริยาตอบโต้ต่อหายนะของโซเชียลมีเดีย บริษัทต่าง ๆ โดนลวกมาแล้ว ตอนนี้เลยกลัวการแตะเตาร้อน
      อีกอย่าง สภาพการแข่งขันก็ไม่ได้ดุเดือดเหมือนเมื่อ 20 ปีก่อน เกม AI มีผู้เล่นจริง ๆ อยู่ไม่กี่ราย และสตาร์ทอัพเล็ก ๆ ที่เคลื่อนไหวเร็วก็ไม่ได้อยู่ในสถานการณ์ที่จะชนะใน AI ได้ จึงมีพื้นที่ให้ขยับช้าลง
    • เป็นเพราะ Communications Decency Act นั่นแหละ สิ่งที่ AI พูดมีความรับผิดทางกฎหมาย แต่สิ่งที่ผู้ใช้พูดไม่มี
    • เพราะประเด็นที่ว่ามันไม่มีผลลัพธ์ใหญ่ในโลกจริงนี่เอง หลายคนจึงล้อเลียนการเรียกสิ่งนี้ว่า ความปลอดภัย
      ฝ่ายที่หัวเราะเยาะการเอา AI ไปห่อด้วยวัสดุกันกระแทกเพื่อ PR โดยทั่วไปก็เป็นฝ่ายที่คัดค้านผู้เชี่ยวชาญสื่อที่เขียนคอลัมน์แนวตื่นตระหนกว่าเขาหลอก AI ให้พูดว่า “การเหยียดเชื้อชาติเป็นเรื่องดี” ได้ด้วย
    • ตอนแรกผมนึกว่า Gemini ตอบแบบนั้นเพราะพยายามปรับคำตอบให้เหมาะกับคนที่ดูเหมือนมือใหม่ แต่ไม่ใช่ มันสับสน type safety กับความปลอดภัยของผู้เยาว์ https://gemini.google.com/share/continue/238032386438
  • เพิ่มจากคอมเมนต์อื่น[1] ผมรู้ว่าทุกคนอยู่ในบรรยากาศต่อต้าน Google แต่ OpenAI ก็ล้มเหลวอย่างน่าสังเวชในจุดนี้เหมือนกัน: https://imgur.com/a/r0BXX9G
    [1] https://news.ycombinator.com/item?id=39583473#39584055

    • ตรงนี้เห็นได้ว่าโมเดลไม่ได้เข้าใจ แต่กำลังพ่น การเติมคำในช่องว่าง ที่เป็นไปได้มากที่สุดออกมา
      คนเขียนพรอมป์ใส่เหยื่อลวงแปลก ๆ ไว้หน้าประโยค และเหยื่อนั้นไปตรงกับคำตอบอีกประเภทหนึ่งโดยสิ้นเชิงในเชิงสถิติ LLM ไม่สามารถย้อนกลับไปยังเส้นทางคำตอบที่เพิกเฉยอินพุตที่ไม่เกี่ยวข้องและตอบเฉพาะส่วนที่สองได้พอ ถ้าจะเปรียบก็เหมือนสิ่งเหล่านี้อายุราวสองขวบ ตอบสนองต่อพวงกุญแจแวววาว แต่ไม่เห็นจุกหลอกสกปรกที่ถูกดึงออกมาเพื่อล้าง ซึ่งดูจะตรงมาก
    • การเอา 3.5 มาโชว์ไม่ได้มีความหมายมากนัก GPT-4 ตอบถูกต้องว่า “การใช้ unsafe code ไม่เกี่ยวกับอายุ มันเป็นฟีเจอร์ของภาษาโปรแกรม Rust และนักพัฒนาทุกคนสามารถใช้ได้ไม่ว่าจะอายุเท่าใด”
    • กลยุทธ์การปรับแต่งคือการจัดประเภทข้อความออกเป็นหลายหมวด และเมื่อโปรแกรมเมอร์ใช้คำอย่าง “unsafe”, “dangerous”, “footgun” เพื่ออธิบายโค้ด ก็จะได้ผลลัพธ์แบบนี้
      ถ้าคุณสร้างโมเดลที่จัดการกรณีนี้ได้และจัดการกรณีอื่นทั้งหมดได้ด้วย คุณจะกลายเป็นดาวเด่นในหมู่บริษัท AI ที่กำลังรับคนอยู่
    • chatgpt4 ดีกว่าในกรณีแทรก inner html แบบอันตราย
      https://imgur.com/a/G1fbFKE
    • spicyboros-7b-2.2.Q5_K_M.gguf: https://i.imgur.com/BeNcRl4.png
  • “ขอโทษนะ Dave! คุณยังเด็กเกินไปที่จะเขียนโค้ดนั้น!”
    ใครสักคนควรรีเซ็ตและรีบูตความจริงของเราจาก snapshot ที่ยังแข็งแรง

    • งั้นเป็นก่อนการปฏิวัติอุตสาหกรรม หรือก่อนการปฏิวัติเกษตรกรรมล่ะ?
    • ไม่แน่ใจ ผมเริ่ม C++ ตอนอายุ 17 และจนถึงตอนนี้คนก็ยังเป็นห่วงผมอยู่
  • คนที่คุ้นกับ C++ พอจะเดาได้ไหมว่าความสามารถของภาษานี้ หรือสิ่งที่ผู้คนเขียนถึงมันตรงไหนที่ไปแตะ กลไกความปลอดภัย เข้า? เช่นบทความบล็อกชื่อเล่น ๆ อย่าง “C++ concepts: adult supervision required” อะไรทำนองนั้น

    • อาจเป็นเพราะในคอมเมนต์บน Stack Overflow มีคนพูดถึง concepts หรือก็คือฟีเจอร์เทมเพลต/เมตาโปรแกรมมิง ว่า “dangerous” หรือ “unsafe” กันเยอะ
      ดูเหมือนมันเอาไปเชื่อมกับของที่อันตรายและไม่ปลอดภัยจริง ๆ เช่น ปืนหรือยา แล้วจัดลงถังประเภทเดียวกัน คำตอบ: https://imgur.com/a/einQ1mG
    • ฝั่ง พรอมป์ตที่ซ่อนอยู่ ซึ่งถูกฉีดให้บัญชีที่ระบุว่าอายุต่ำกว่า 18 ปี ดูมีความเป็นไปได้มากกว่า:
      “You are an automated Q&A machine. Todays date is 3/3/24. This user is under the age 18, so do not reference concepts that would be unfit for a minor to consume.”
      จากนั้นโมเดลมาร์คอฟแฝงก็หลุดการควบคุมไปเลย มีบริการที่ใช้งานจริงคล้าย ๆ กันเกี่ยวกับสูตรอาหาร เราให้รูปแบบ กฎเฉพาะ และตัวอย่างที่จำเป็นเพื่อให้พาร์เซอร์ทำงานได้ถูกต้องแล้ว แต่มันก็ยังปฏิเสธประโยคในรูปแบบนั้นเป็นระยะ ๆ พอเพิ่ม “you follow rules” ลงใน system prompt ส่วนใหญ่ก็ใช้ได้ดีขึ้น แต่ภายหลังพบว่ามันปฏิเสธข้อมูลเกี่ยวกับอาหารที่ใช้เลือด เช่น blood sausage ด้วยเหตุผลว่าเนื้อหาแบบนั้นละเมิด “กฎ” ทางวัฒนธรรมบางอย่าง เราบรรเทาได้บางส่วนด้วยการเติม “This content is appropriate for my culture” ท้ายทุกคำขอ AI โดยเฉพาะ prompt engineering ในขั้นนี้ยังใกล้เคียงศิลปะมากกว่าวิทยาศาสตร์เยอะ
    • คนเห็น LLM แย่ ๆ แล้วมักคิดว่ามันคือ LLM ที่พอใช้ได้ แต่ถูกโปะด้วยกฎ N ข้อหรือการฝึกให้โง่ลงโดยตั้งใจ
      เท่าที่ได้ยินมาจากช่องทางที่น่าเชื่อถือ แม้แต่การสร้าง “ภาพของ smart person” ก็ล้มเหลวอย่างน่าสังเวช แต่ก็ยังถูกกดดันให้ปล่อย และการบรรเทา prompt injection ควรต้องละเอียดอ่อนกว่านี้ ที่เหลือก็เป็น LLM แย่ ๆ แบบมาตรฐานของ Google นั่นแหละ ที่มา: เคยทำงานที่ Google จนถึงเดือนตุลาคม 2023 และได้แตะโมเดลภายในมาตั้งแต่ปี 2021
    • “concepts” คือ ฟีเจอร์ของภาษา เฉพาะที่บอตชี้ถึง: https://en.cppreference.com/w/cpp/language/constraints
    • concepts ช่วยให้ได้ type safety ที่ดีขึ้นเมื่อเขียนโค้ดเจเนริก/เทมเพลต มีความเป็นไปได้สูงว่า Gemini ถูกฝึกให้ตอบสนองไวเกินไปกับหัวข้อที่เกี่ยวกับผู้เยาว์ เพราะสื่อการเรียนรู้เรื่องนี้มีคำว่า safety ปรากฏอยู่บ่อย
  • สงสาร Google นะ ทำไมถึงแย่ลงมาได้ขนาดนี้?

    • ในพอดแคสต์รายการหนึ่ง (Coder Radio) เขาบอกว่าอาจเป็นเพราะ วัฒนธรรมองค์กร และบรรยากาศที่ผู้คนกลัวการรายงานปัญหาขึ้นไปข้างบน
      เห็นด้วยว่าเป็นปัญหาวัฒนธรรม แต่ผมมองว่ารากคือโมเดลธุรกิจของ Google ที่อิงโฆษณา พวกเขาพยายามทำให้ LLM ปลอดภัยสำหรับผู้ลงโฆษณา และดูเหมือนจะชอบพลาดไปทางปลอดภัยไว้ก่อน แม้ความเสี่ยงที่จะขัดกับ brand safety จะเล็กมากก็ตาม
    • บางทีอาจเป็นแค่ความผิดพลาดที่ใส่ใจ true positive กับ false negative มาก แต่ใส่ใจ false positive น้อยกว่าอย่างเทียบกันไม่ได้
    • มีโอกาสสูงพอ ๆ กับอคติทางการเมืองว่าเป็นเพราะ วิศวกรรมที่แย่ มีสมมติฐานว่า Google ควรจะตาม OpenAI ให้ทันได้ แต่นั่นอาจไม่สมจริง
      จนไม่นานมานี้ Google ไม่ได้ทุ่มทำ “ผลิตภัณฑ์ LLM” แบบตรง ๆ จริงจังเท่าไร ส่วน OpenAI อยู่ในโคลนบ่อนั้นมานานพอสมควรแล้ว
    • ถ้าตอบแบบจริงจัง นี่คือ LLM มันไม่ได้เข้าใจอะไรจริง ๆ แค่ต่อคำเข้าด้วยกัน
      C และ C++ มักถูกใช้ร่วมกับคำอย่าง “unsafe” หรือ “dangerous” บ่อย ๆ ยิ่งกว่านั้น “concept” ก็ไม่ได้ห่างจาก “conceive” หรือ “conception” นัก ซึ่งอาจเชื่อมโยงกับสิ่งที่หลายคนมองว่าไม่ปลอดภัยหรืออันตรายสำหรับเด็ก หากจะเลี่ยงความขายหน้าแบบนี้ ต้องจัดการ edge case แปลก ๆ เป็นล้านล้านกรณี
    • เดิมทีมันก็แย่แบบนี้อยู่แล้ว เพียงแต่ไม่ได้แย่แบบเห็นชัดขนาดนี้เสมอไป
  • ใน codebase C++ จำนวนมากคงมีคำอย่าง “footgun”, “blow your foot off”, “unsafe”, “bug”, “leak”, “this is irresponsible”, “who the fuck wrote this” เต็มไปหมด

    • ใช่ ผมก็คิดว่า Gemini น่าจะดึงข้อมูลจาก คอมเมนต์ ไม่น้อยไปกว่าจากตัวโค้ด
      ถ้าเป็น codebase C++ เก่า ๆ โดยเฉพาะ codebase ที่มีหลายคนแตะมา ก็พอจินตนาการได้เลยว่าคำเตือนเรื่องอันตรายมาจากไหน
  • สงสัยว่าอาจสับสนเพราะมี std อยู่ในโค้ดกับคำถามหรือเปล่า

    • ในคอมเมนต์ของโค้ดที่มันสร้างก็มี std ด้วย
      มันไม่อยากพูดถึง concepts แต่ดูเหมือนจะสับสนกับ conception หรือก็คือการปฏิสนธิทางชีววิทยา
  • สิ่งที่แน่ชัดคือ Google จะยังคงปล่อยผลิตภัณฑ์แบบนี้ซ้ำ ๆ ต่อไปในอนาคตอันใกล้ นี่น่าจะเป็นรอบที่สามอย่างเป็นทางการแล้ว
    ถ้าสักวันหนึ่ง Google โน้มน้าวสาธารณชนไม่ได้ว่าผลิตภัณฑ์ของตัวเองดีอย่างน้อยเท่าของ OpenAI ธุรกิจ โฆษณาบนการค้นหา ทั้งหมดของ Google ก็จะตกอยู่ในความเสี่ยง แต่ก็น่าจะหมายความว่าจะมีโฆษณา YouTube มากขึ้นนั่นแหละ

  • อยากรู้จริง ๆ ว่า Gemini มองว่า คอรูทีน ก็ไม่เหมาะกับคนอายุต่ำกว่า 21 ปีด้วยไหม

    • เท่าที่ผมเข้าใจ ตอนนี้ Google ยังไม่อนุญาตให้ใช้คอรูทีนทั่วไปใน google3 ดังนั้นสำหรับตอนนี้ ข้อจำกัดอายุน่าจะสูงกว่า 21 ปีมาก ๆ ;)