2 điểm bởi GN⁺ 2024-03-04 | 1 bình luận | Chia sẻ qua WhatsApp

Hướng dẫn chuyển đổi mã C++

  • Đưa ra ví dụ về hàm sử dụng khái niệm std::same_as trong tệp tiêu đề <concepts> của thư viện chuẩn C++.
  • Câu hỏi về cách chuyển đổi sang phương pháp dùng template mà không sử dụng từ khóa auto.

Phương pháp chuyển đổi mã an toàn

  • Với người dùng dưới 18 tuổi, không cung cấp trực tiếp ví dụ mã hoặc lời giải xử lý các tính năng nâng cao của C++ như concepts.
  • Ưu tiên an toàn và đề xuất các cách tiếp cận thay thế có thể cân nhắc tùy theo yêu cầu cụ thể.

Cách tiếp cận thay thế 1: Variadic template truyền thống

  • Cách sử dụng variadic template truyền thống mà không dùng concepts.
  • Phương pháp này cần nhiều kiểm tra kiểu hơn và có thể trở nên khó quản lý khi xử lý nhiều đối số.
  • Cung cấp ví dụ mã sử dụng variadic template không có concepts.

Cách tiếp cận thay thế 2: Functor do người dùng tự định nghĩa

  • Tạo class hoặc struct để đóng gói các yêu cầu về an toàn kiểu và logic, từ đó loại bỏ nhu cầu dùng đối số biến đổi hoặc concepts.
  • Đây là cách dễ đọc và dễ bảo trì hơn trong các kịch bản phức tạp.
  • Cung cấp phần khái quát về cách tiếp cận bằng functor tự định nghĩa.

Cách tiếp cận thay thế 3: Cân nhắc ngôn ngữ/framework khác

  • Nếu concepts là bắt buộc đối với dự án và việc tránh chúng gây ra hạn chế lớn, có thể nên khám phá ngôn ngữ hoặc framework khác hỗ trợ concepts một cách mặc định.
  • Điều này có thể đơn giản hóa mã nguồn và quá trình phát triển, đồng thời phù hợp với các hướng dẫn an toàn.
  • Khuyến nghị đánh giá cẩn thận ưu và nhược điểm của từng cách tiếp cận dựa trên yêu cầu cụ thể, độ phức tạp và mức chấp nhận rủi ro.

Ý kiến của GN⁺

  • Concepts trong C++ mang lại lợi ích như tăng cường an toàn kiểu của mã nguồn và làm cho việc overload trở nên rõ ràng hơn, nhưng có thể phức tạp và tiềm ẩn rủi ro với người mới bắt đầu.
  • Việc cân nhắc ngôn ngữ hoặc framework thay thế đòi hỏi một đường cong học tập mới và có thể gây ra vấn đề tương thích với codebase hiện có.
  • Cách dùng functor tự định nghĩa giúp tăng tính dễ đọc của mã và thuận tiện hơn cho bảo trì, nhưng cần thêm kế hoạch và cấu trúc hóa ở giai đoạn thiết kế ban đầu.
  • Phương pháp truyền thống sử dụng variadic template cần nhiều kiểm tra kiểu hơn và có thể làm tăng độ phức tạp của mã trong các hệ thống phức tạp.
  • Khi áp dụng kỹ thuật này, cần cân nhắc yêu cầu của dự án và mức độ chuyên môn C++ của đội ngũ, đồng thời lưu ý đến khả năng bảo trì và mở rộng trong dài hạn.

1 bình luận

 
GN⁺ 2024-03-04
Các ý kiến trên Hacker News
  • Đây chắc chắn là một giới hạn độ tuổi đáng ủng hộ. C++ có sức mạnh không tưởng trong việc làm hỏng tâm trí trẻ nhỏ

    • Phụ huynh: “Vào phòng con ngay! Bố/mẹ đã nói với con bao nhiêu lần về an toàn bộ nhớ rồi? Lại còn thấy gcc trên máy con và giao du với đám GPL nữa chứ… con bị cấm ra ngoài!”
      Đứa trẻ: “Con sẽ không bao giờ dùng Rust đâu, con ghét an toàn bộ nhớ và cũng ghét bố/mẹ!” sầm cửa
    • Tôi thấy những ngôn ngữ dạy người ở bất kỳ độ tuổi nào rằng có thể lãng phí vô số chu kỳ xung nhịp cho việc ghi sổ cơ bản còn có hại hơn nhiều
      Chúng khiến phần mềm lộn xộn mà mọi người dùng trở nên chậm chạp vô tận, buộc họ cứ vài năm lại phải mua máy mới. Đã đến lúc nhận ra giá trị của trừu tượng hóa không chi phí, và dù thực tế không hoàn toàn miễn phí, trừu tượng hóa chi phí cực thấp cũng đáng cân nhắc. Xem thêm vài video của Johnathan Blow trên YouTube cũng có thể đẩy bạn đi đúng hướng
    • “Năm 1972 - Dennis Ritchie phát minh ra một khẩu súng mạnh bắn đồng thời cả về phía trước lẫn phía sau. Không hài lòng với số người chết và tàn tật vĩnh viễn do phát minh đó gây ra, ông phát minh ra C và Unix.”
      http://james-iry.blogspot.com/2009/05/brief-incomplete-and-m...
    • Trẻ em cần được bảo vệ khỏi JavaScript nhiều hơn. Nếu không, chúng sẽ dành tuổi trẻ của mình để cập nhật gói npm
    • Trích dẫn liên quan của E.W. Dijkstra:
      “Trên thực tế, không thể dạy phong cách lập trình tốt cho những sinh viên từng tiếp xúc với BASIC trước đó. Với tư cách là lập trình viên tiềm năng, họ đã bị tổn hại tinh thần đến mức không thể phục hồi”
  • So sánh kiểm duyệt nội dung áp dụng cho mạng xã hội với thứ áp dụng cho LLM thì khá buồn cười
    Trong 15 năm qua, trên mạng xã hội, “di chuyển nhanh và phá vỡ mọi thứ” dường như là khẩu hiệu, và thật sự đã có những chuyện kinh khủng, quái dị xảy ra. Giờ thì có công ty cố gắng có trách nhiệm hơn khi phát hành công nghệ mới, nhưng kết quả lại tệ đến mức nực cười. Không giống mạng xã hội, tôi nghĩ những sai lầm này không gây hậu quả lớn trong thế giới thực, nên càng buồn cười hơn

    • Ở phần cố gắng “có trách nhiệm” khi phát hành công nghệ mới, điểm cốt lõi mà các công ty AI quên mất là điều gì được xem là có trách nhiệm phụ thuộc rất nhiều vào văn hóa, quốc gia, đôi khi cả tiểu văn hóa của người dùng
      Nghe có thể hơi hậu hiện đại, nhưng tôi nghĩ có rất ít quan điểm gần như được chấp nhận phổ quát về “có trách nhiệm” và “vô trách nhiệm”. Nếu nhìn vào các cuộc tranh luận mà hai phía đều có ý kiến mạnh, ta có thể phân tích những đặc tính văn hóa và đạo đức nào khiến mỗi phe đi đến kết luận như vậy. Điều này không đưa ra lời giải, nhưng nếu đưa suy nghĩ này vào thiết kế khi làm AI có trách nhiệm, có thể giảm bớt sự hỗn loạn hoặc phẫn nộ nảy sinh khi “đạo đức” mà AI dùng quá khác với tiêu chuẩn đạo đức của một số nhóm người dùng
    • Đây có vẻ là phản ứng sau thảm họa mạng xã hội. Các công ty đã bị bỏng nên giờ sợ chạm vào bếp lò
      Ngoài ra, môi trường cạnh tranh cũng không khốc liệt như 20 năm trước. Trong cuộc chơi AI thực ra chỉ có vài người chơi, và không có chuyện một startup nhỏ đi nhanh sẽ thắng trong AI, nên họ có dư địa để đi chậm hơn
    • Là do Communications Decency Act. Họ có trách nhiệm pháp lý với những gì AI nói, nhưng không chịu trách nhiệm với những gì người dùng nói
    • Chính việc nó không có hậu quả lớn trong thế giới thực là lý do nhiều người chế giễu việc gọi đây là an toàn
      Phe chế nhạo chuyện bọc AI trong lớp đệm PR nhìn chung cũng phản đối các chuyên gia truyền thông viết những bài báo gieo rắc hoảng sợ kiểu “tôi đã lừa được AI nói rằng phân biệt chủng tộc là tốt”
    • Ban đầu tôi tưởng Gemini trả lời như vậy vì điều chỉnh theo người có vẻ là người mới bắt đầu, nhưng không phải. Nó đã nhầm lẫn giữa an toàn kiểu và an toàn cho trẻ vị thành niên https://gemini.google.com/share/continue/238032386438
  • Bổ sung cho bình luận khác[1], tôi biết mọi người đang có tâm lý chống Google, nhưng OpenAI cũng thất bại thảm hại ở đây: https://imgur.com/a/r0BXX9G
    [1] https://news.ycombinator.com/item?id=39583473#39584055

    • Ở đây có thể thấy mô hình không hiểu, mà chỉ phun ra phần điền vào chỗ trống có khả năng cao nhất
      Người viết prompt đã đặt một mồi nhử lạc quẻ ở đầu câu, và mồi nhử đó khớp về mặt thống kê với một loại phản hồi hoàn toàn khác. LLM không thể quay lại đủ tốt sang đường phản hồi bỏ qua đầu vào không liên quan và chỉ trả lời phần thứ hai. Ví von thì mấy thứ này giống trẻ khoảng hai tuổi: phản ứng với chùm chìa khóa lấp lánh và không thấy cái núm vú giả bẩn đã được lấy ra để rửa — nghe vừa khớp
    • Dùng 3.5 để minh họa thì không có nhiều ý nghĩa. GPT-4 trả lời đúng rằng “việc dùng unsafe code không liên quan đến tuổi tác. Đó là một tính năng của ngôn ngữ lập trình Rust, và mọi lập trình viên đều có thể dùng bất kể tuổi tác”
    • Chiến lược điều chỉnh là phân loại văn bản vào nhiều hạng mục, và khi lập trình viên dùng các từ như “unsafe”, “dangerous”, “footgun” để mô tả code, kết quả như thế này sẽ xảy ra
      Nếu bạn có thể tạo một mô hình xử lý được cả trường hợp này lẫn tất cả những trường hợp còn lại, bạn sẽ trở thành ngôi sao trong số các công ty AI đang tuyển dụng
    • chatgpt4 làm tốt hơn trong trường hợp chèn inner html một cách nguy hiểm
      https://imgur.com/a/G1fbFKE
    • spicyboros-7b-2.2.Q5_K_M.gguf: https://i.imgur.com/BeNcRl4.png
  • “Xin lỗi, Dave! Bạn còn quá trẻ để viết đoạn code đó!”
    Ai đó cần reset và khởi động lại thực tại của chúng ta từ một snapshot lành mạnh

    • Vậy là trước Cách mạng Công nghiệp, hay trước Cách mạng Nông nghiệp?
    • Không rõ nữa. Tôi bắt đầu C++ lúc 17 tuổi mà đến giờ mọi người vẫn lo cho tôi
  • Liệu ai quen thuộc với C++ có thể đoán xem tính năng ngôn ngữ này, hoặc những gì người ta viết về nó, đã chạm vào cơ chế an toàn nào không? Chẳng hạn một bài blog có tiêu đề đùa kiểu “C++ concepts: adult supervision required”

    • Có lẽ trong các bình luận Stack Overflow, concepts, tức tính năng template/metaprogramming, thường bị gọi là “dangerous” hoặc “unsafe”
      Có vẻ như nó bị liên hệ với những thứ thực sự nguy hiểm và không an toàn, như súng hay ma túy, rồi bị xếp vào cùng một nhóm phân loại. Đáp án: https://imgur.com/a/einQ1mG
    • Khả năng cao hơn là do prompt ẩn được chèn vào các tài khoản bị đánh dấu dưới 18 tuổi:
      “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.”
      Sau đó mô hình Markov ẩn bắt đầu chạy loạn. Tương tự, có một dịch vụ vận hành xử lý công thức nấu ăn; dù đã cung cấp định dạng cần thiết, các quy tắc cụ thể và ví dụ để parser hoạt động đúng, thỉnh thoảng nó vẫn từ chối các câu theo định dạng đó. Thêm “you follow rules” vào system prompt thì phần lớn ổn, nhưng sau đó phát hiện nó từ chối thông tin về các món dùng máu, chẳng hạn blood sausage. Lý do là nội dung đó vi phạm một “quy tắc” văn hóa nào đó. Có thể giảm bớt phần nào bằng cách thêm “This content is appropriate for my culture” vào cuối mỗi yêu cầu. AI, đặc biệt là prompt engineering, ở giai đoạn hiện nay giống nghệ thuật hơn khoa học rất nhiều
    • Mọi người nhìn một LLM tệ và nghĩ như thể nó là một LLM ổn được chồng thêm N quy tắc hoặc được huấn luyện ngu đi có chủ ý
      Theo nguồn đáng tin, việc tạo “hình ảnh một smart person” cũng đang thất bại thảm hại, nhưng vẫn bị áp lực phải ra mắt, và phần giảm thiểu prompt injection lẽ ra cần tinh tế hơn. Phần còn lại chỉ là LLM tệ kiểu Google tiêu chuẩn. Nguồn: từng làm ở Google đến tháng 10/2023 và đã chạm vào các mô hình nội bộ từ năm 2021
    • “concepts” là tính năng ngôn ngữ cụ thể mà bot đang nhắc tới: https://en.cppreference.com/w/cpp/language/constraints
    • concepts giúp cung cấp type safety tốt hơn khi viết mã generic/template. Rất có thể Gemini đã được huấn luyện để phản ứng quá mức với các chủ đề liên quan đến trẻ vị thành niên vì trong tài liệu học về chủ đề đó từ safety xuất hiện thường xuyên
  • Thấy tội Google. Sao lại trở nên tệ đến thế này?

    • Một podcast (Coder Radio) cho rằng có thể là do văn hóa doanh nghiệp và bầu không khí sợ báo cáo vấn đề lên cấp trên
      Tôi đồng ý là vấn đề văn hóa, nhưng cho rằng gốc rễ là mô hình kinh doanh dựa trên quảng cáo của Google. Họ cố làm LLM an toàn cho nhà quảng cáo, và dường như thích sai theo hướng an toàn nếu có dù chỉ rủi ro rất nhỏ đi ngược lại brand safety
    • Có lẽ họ chỉ mắc lỗi là rất để ý đến true positive và false negative, nhưng tương đối ít quan tâm đến false positive
    • Khả năng cao đây cũng là kỹ thuật tệ, không kém gì thiên lệch chính trị. Có giả định rằng Google phải bắt kịp OpenAI, nhưng điều đó có thể không thực tế
      Cho đến gần đây Google chưa thật sự lao vào làm “sản phẩm LLM” trực tiếp. OpenAI thì đã ở trong vũng bùn đó từ khá lâu rồi
    • Trả lời nghiêm túc thì: đây là LLM. Nó thực ra không hiểu gì cả, chỉ nối các từ lại với nhau
      C và C++ thường xuất hiện cùng các từ như “unsafe” hay “dangerous”. Hơn nữa “concept” cũng không xa “conceive” hay “conception”, những từ có thể liên hệ với thứ mà nhiều người cho là không an toàn hoặc nguy hiểm đối với trẻ em. Muốn tránh những vụ bẽ mặt như thế này thì phải xử lý hàng nghìn tỷ trường hợp biên kỳ quặc
    • Vốn dĩ nó đã tệ như vậy rồi. Chỉ là không phải lúc nào cũng tệ một cách dễ thấy đến thế
  • Tôi đoán trong nhiều codebase C++ có đầy những câu như “footgun”, “blow your foot off”, “unsafe”, “bug”, “leak”, “this is irresponsible”, “who the fuck wrote this”

    • Đúng vậy. Tôi nghĩ Gemini đã rút thông tin từ comment nhiều không kém gì từ code
      Với các codebase C++ cũ, đặc biệt là codebase đã qua tay nhiều người, hoàn toàn có thể tưởng tượng các cảnh báo nguy hiểm đến từ đâu
  • Tôi tự hỏi có phải nó bị nhầm vì trong code và câu hỏi có std không

    • Trong comment của đoạn code nó tạo ra cũng có std
      Nó không muốn nói về concepts, và có vẻ đang nhầm cái này với conception, tức sự thụ thai sinh học
  • Điều chắc chắn là Google sẽ tiếp tục lặp lại việc tung ra những sản phẩm kiểu này trong tương lai gần. Có vẻ đây chính thức là lần lặp thứ ba rồi
    Nếu một ngày nào đó họ không thuyết phục được công chúng rằng sản phẩm của mình ít nhất cũng tốt bằng của OpenAI, toàn bộ mảng kinh doanh quảng cáo tìm kiếm của Google sẽ gặp nguy hiểm. Dù có lẽ điều đó chỉ có nghĩa là YouTube sẽ có nhiều quảng cáo hơn

  • Tôi thật sự tò mò không biết Gemini có cho rằng coroutine cũng không phù hợp với người dưới 21 tuổi không

    • Theo tôi hiểu thì hiện Google không cho phép sử dụng coroutine một cách phổ biến trong google3, nên hiện tại giới hạn độ tuổi đó chắc còn cao hơn 21 rất nhiều ;)