2 điểm bởi GN⁺ 2025-03-14 | 1 bình luận | Chia sẻ qua WhatsApp
  • Từng học 5 năm tại một trường máy tính ở Pháp và làm lập trình viên freelance trong 20 năm
  • Chủ yếu thực hiện các dự án cho khách hàng bằng Ruby on Rails
  • Khi bắt đầu học Common Lisp, đã viết một giao thức quản lý máy chủ tạo parser ASN.1
    • Phát triển máy chủ SNMP bằng cách sinh mã C từ Common Lisp
  • Sau đó viết nhiều dự án dựa trên Common Lisp:
    • cl-unix-cybernetics – dự án nhận được nhiều sao nhất trên GitHub
    • Phát triển cl-streamscffi-posix
    • cl-facts – một triple store, đóng vai trò như cơ sở dữ liệu đồ thị Common Lisp
      • Nhanh, có giao dịch nguyên tử, hỗ trợ giao dịch có thể lồng nhau
      • Tương thích với unwind-protect
      • Chỉ cần học 3 macro là có thể sử dụng
      • Đã trình bày tại European Lisp Symposium (ELS)
  • Trong khi tập trung vào phát triển Common Lisp, tác giả đã mất khách hàng nhưng vẫn có niềm tin rất lớn vào tiềm năng của Lisp

Giới hạn của máy ảo (VM) và container

  • Các chuyên gia đã chỉ ra những vấn đề của VM và container:
    • VM làm lãng phí CPU và băng thông không cần thiết
    • Container dựa trên cgroups của Linux tồn tại lỗ hổng thực thi lệnh từ xa (RCE) và leo thang đặc quyền
    • Mỗi năm đều phát hiện các lỗ hổng bảo mật mới
  • Tác giả ưa dùng OpenBSD và tránh được các vấn đề của công cụ DevOps như Terraform, Ansible

Giới hạn của Common Lisp và vấn đề hiệu năng

  • Trong Clojure và các hệ thống tương tự, GC (garbage collector) gây ra vấn đề hiệu năng:
    • Đã có trường hợp thất bại khi phát triển game chiến thuật xử lý hàng nghìn đơn vị
    • GC của JVM kéo theo vấn đề về hiệu năng và chi phí

Quyết định chuyển sang C

  • Nhận ra các giới hạn về hiệu năng và tính di động của Common Lisp:
    • Linux, OpenBSD, GTK+, GNOME đều được viết bằng C
    • Cuối cùng đã chuyển sang C để giải quyết vấn đề hiệu năng và tính di động

Phát triển ngôn ngữ mới KC3

  • Phát triển thư viện tiện ích libc3 → ngôn ngữ C3 → đổi tên thành KC3
  • Đặc điểm của KC3:
    • Có trình thông dịch (ic3) và trình biên dịch (c3c)
    • Tạo cấu trúc dữ liệu từ buffer UTF-8 và chuyển ngược lại
    • Lập trình phòng thủ → giảm thiểu bug ngay từ đầu
    • Không có vấn đề bảo mật
    • Hệ kiểu dữ liệu dựa trên union gắn thẻ bằng enum

Thành quả dựa trên KC3

  • Port cl-facts sang C89:
    • Hoàn thành phát triển trong giai đoạn Covid-19
    • Triển khai thêm triple, xóa, hệ thống truy vấn đệ quy, giao dịch, logging, persistence, v.v.
  • Viết parser và generator cho các kiểu thuật toán:
    • Bao gồm struct, linked list, map, hash table, số phức, tuple, code block, v.v.
    • Nhận rất nhiều cảm hứng từ José Valim (người tạo ra Elixir)
  • ikc3 – REPL in ra kết quả đánh giá của KC3
  • kc3_httpd – phát triển máy chủ web dựa trên framework MVC
    • Trang blog hiện tại cũng đang được phục vụ bằng kc3_httpd
  • Xây dựng website tài liệu → sử dụng bộ chuyển đổi Markdown sang HTML của KC3

Kết luận

  • Dựa trên những kinh nghiệm có được từ Common Lisp để chuyển sang C
  • KC3 đạt được kết quả nổi bật về hiệu năng, bảo mật và tính di động
  • Dự kiến sẽ tiếp tục cung cấp thêm macro và ví dụ liên quan đến KC3 trong tương lai

1 bình luận

 
GN⁺ 2025-03-14
Ý kiến trên Hacker News
  • Tôi có quan điểm ngược lại. Hồi nhỏ tôi dùng VB rất nhiều, sau đó học Java, C, C++ ở đại học và chủ yếu dùng C.

    • Sau đó tôi trở thành nhà phát triển cốt lõi của Xfce và làm việc trong 5 năm
    • Rồi tôi chuyển sang phát triển backend và dùng Java, Scala, Python. Những ngôn ngữ này có các vấn đề khác, nhưng tôi thích thư viện chuẩn và hệ thống quản lý phụ thuộc của chúng
    • 12 năm sau tôi quay lại với Xfce, nhưng C vẫn rất khó. Có quá nhiều vấn đề như rò rỉ bộ nhớ, dereference con trỏ NULL, tranh chấp dữ liệu
    • Khi dùng Rust, tôi có năng suất cao hơn so với C
  • Tôi hoàn toàn đồng cảm với cảm giác đó. Trong vài năm qua tôi luôn có một thôi thúc mạnh mẽ muốn phát triển thứ gì đó bằng C thuần

    • Ngôn ngữ chính của tôi là C++, nhưng việc dùng các thư viện C cũ thực sự rất thú vị. Giao diện của chúng đơn giản và cơ bản
    • Khi phát triển bằng C thuần, tôi thích việc có thể tập trung 100% vào thuật toán
    • Với tôi, C buộc tôi phải tự mình làm việc. Nó không che giấu phép màu hay sự phức tạp
    • Những người xung quanh tôi muốn dùng các tính năng C++ mới nhất, còn tôi thì ngày càng muốn loại bỏ bớt các tính năng C++
  • Tôi bắt đầu lập trình bằng C từ rất lâu trước đây, và đến giờ đôi khi vẫn muốn quay lại thời đó

    • Nhưng khi thực sự cố viết một ứng dụng cấp độ production bằng C, tôi lại nhận ra vì sao mình đã bỏ nó
    • Có quá nhiều thứ bạn phải tự làm mà không có sự hỗ trợ từ máy tính
    • Nếu ngày nay phải chọn một ngôn ngữ cấp thấp, có lẽ tôi sẽ chọn Ada. Nó giống C nhưng có nhiều hỗ trợ từ trình biên dịch hơn
  • Sau khi đọc bài blog, tôi thấy bối rối về điều tác giả muốn truyền đạt

    • Tôi tự hỏi liệu lý do chương trình của tác giả không được dùng có thật sự là vì ngôn ngữ hay không
    • Có thể có vấn đề liên quan đến mức tiêu thụ bộ nhớ
    • Tác giả không nhắc đến bài học rút ra hay thống kê người dùng
    • Không có tính năng mới nào được thêm vào, có vẻ đây chỉ là một bản viết lại để luyện tập
  • Có đưa ra ví dụ mã kc3

  • C là ngôn ngữ đầu tiên của tôi, và tôi đã tạo các ứng dụng console đơn giản cùng những trò chơi nhỏ bằng nó

    • Nhưng tôi không muốn quay lại. Công cụ build và quản lý phụ thuộc đã lỗi thời
    • Zig là C mới của tôi. Nó đi kèm trình biên dịch C và có thể dùng header C mà không cần wrapper
    • Tôi dùng Go khi cần một ngôn ngữ đơn giản, và Rust khi cần hiệu năng cùng độ an toàn
  • Thỉnh thoảng tôi viết code C như một sở thích. Nhưng có quá nhiều công việc lặp đi lặp lại nên rất chán

    • Viết trình biên dịch bằng C giống như xử lý tagged union
    • Tôi từng nghĩ đến việc viết generator để giảm bớt việc lặp lại, nhưng vẫn chưa làm
    • Khi phát triển dự án bằng C, tôi đã cân nhắc dùng một ngôn ngữ nhúng để phục vụ việc tạo prototype
  • C thành công vì nó thực dụng

    • Nó không an toàn, nhưng bạn có thể làm điều mình muốn
  • Tôi không hiểu gì cả

    • Tôi thắc mắc killer app là gì, vấn đề liên quan đến CL là gì, và liệu C có phải là lựa chọn duy nhất hay không
    • Tôi cũng thắc mắc liệu có thực sự chắc chắn không có vấn đề bảo mật khi chạy mã KC3
  • Bài viết này giống như một câu chuyện cảnh báo không có kết thúc có hậu