17 điểm bởi GN⁺ 2025-10-10 | 1 bình luận | Chia sẻ qua WhatsApp
  • Lavandula là một web framework nhẹ dựa trên ngôn ngữ C, được thiết kế cho phát triển ứng dụng web hiện đại
  • Cung cấp môi trường phát triển trực quan và nhanh chóng, tập trung vào năng suất và hiệu năng mà không có các tính năng thừa
  • Bao gồm hầu hết các tính năng thiết yếu như hệ thống controller/routing, pipeline middleware, framework kiểm thử, thư viện SQLite/JSON
  • Trong tương lai dự kiến sẽ mở rộng thêm các tính năng như ORM, cookie phiên, phục vụ tệp tĩnh, tích hợp nhiều cơ sở dữ liệu khác nhau
  • Tối đa hóa sự tiện lợi cho nhà phát triển với tạo dự án nhanh bằng CLI, unit test tích hợp sẵn, hỗ trợ biến môi trường và logging

Lavandula: Tổng quan về web framework C hiệu năng cao, gọn nhẹ

  • Lavandula là một web framework nhẹ viết bằng C được thiết kế để tạo ra các ứng dụng web hiện đại một cách nhanh chóng và đơn giản
  • Mục tiêu chính là đơn giản, tốc độ cao, năng suất cao; tập trung vào những phần thực sự cần thiết thay vì các tính năng phức tạp, nhằm giảm sự cồng kềnh không cần thiết của các framework nặng

Các đặc điểm chính và tính hữu dụng

  • Được xây dựng trên C, chỉ bao gồm mức phụ thuộc tối thiểu
  • Cung cấp controller và hệ thống routing để dễ dàng cấu hình các HTTP endpoint
  • Hỗ trợ các phương thức HTTP như GET, POST cùng pipeline middleware cục bộ/toàn cục
  • Hỗ trợ tạo và chạy dự án nhanh thông qua công cụ CLI (lavu)
  • Tích hợp sẵn framework unit test, xử lý biến môi trường, logging, tích hợp SQLite, thư viện JSON

Các tính năng đã hoàn thiện

  • Hệ thống controller/routing
  • Hỗ trợ endpoint theo từng phương thức HTTP (GET, POST, v.v.)
  • Pipeline middleware (cục bộ/toàn cục)
  • Mức phụ thuộc tối thiểu (dựa trên mã C thuần)
  • Scaffolding dự án tiện lợi bằng CLI
  • Framework unit test tích hợp sẵn
  • Hỗ trợ biến môi trường, hệ thống logging
  • Tích hợp SQLite/thư viện JSON tích hợp sẵn

Các tính năng đang được phát triển

  • Phân tích HTTP JSON body
  • Cookie phiên
  • Thiết lập chính sách CORS
  • Lavender ORM
  • ELA(Embedded Lavandula) HTML template engine

Kế hoạch sắp tới (lộ trình)

  • Giới hạn tốc độ
  • Phục vụ tệp tĩnh
  • Tích hợp PostgreSQL, MySQL
  • Ứng viên framework tiêm phụ thuộc
  • Tự động hóa danh sách endpoint/route có thể đăng ký
  • Tự động tạo model JSON và hàm CRUD (dùng lệnh 'lavu model')
  • Xử lý tham số URL và routing động

Khái quát cách tạo và chạy dự án

  • Lệnh CLI: lavu new my-project sẽ tự động tạo thư mục dự án và cấu trúc cơ bản
  • Các tệp được tạo tự động:
    • tệp cấu hình (lavandula.yml)
    • mã nguồn main/controller/route
    • makefile
    • mã kiểm thử, v.v.
  • Chạy nhanh: sau khi di chuyển vào thư mục, có thể chạy ngay máy chủ cục bộ bằng lavu run, cổng mặc định là http://localhost:3000/

Giấy phép và thông tin khác

  • Giấy phép: MIT License
  • Phù hợp với tinh thần mã nguồn mở, bất kỳ ai cũng có thể cải thiện/tham gia
  • Được viết trên nền C(97.3%), kèm theo một phần Makefile/Shell script

Tóm tắt các ưu điểm của Lavandula

  • Là một web framework hoàn chỉnh rất hiếm thấy trong hệ sinh thái C, đặc biệt phù hợp với môi trường tài nguyên hạn chế hoặc triển khai máy chủ siêu tốc
  • Được tối ưu cho tốc độ nhanh hơn và overhead thấp hơn so với nhiều framework phổ biến
  • Với CLI, công cụ tích hợp và cấu trúc tối giản, nó mang lại đường cong học tập ngắn và năng suất cao

1 bình luận

 
GN⁺ 2025-10-10
Ý kiến Hacker News
  • Tôi cảm thấy đây là đoạn mã C gọn gàng, hiện đại và đẹp nhất mà tôi từng thấy gần đây; tuy không phải mã kernel, nhưng so với các dự án lớn đầy #ifdef và vô số dấu gạch dưới thì đây lại là một ví dụ rất hay để cảm nhận tính thẩm mỹ của C. Đặc biệt, đây là lần đầu tôi thấy mã kiểm thử được viết trong C theo cách như vậy. Làm rất tuyệt. Hồi còn học cấp hai, cấp ba, tôi học ngôn ngữ lập trình đầu tiên là C, và khi cài phần mềm miễn phí lên chiếc PC ở nhà, tôi biết rằng phần lớn chương trình đều được viết bằng C. Khi lần đầu tiếp cận khoa học máy tính một cách bài bản ở đại học, tôi học cấu trúc dữ liệu và thuật toán bằng C++, nhưng vì đã hiểu con trỏ từ trước nên thích nghi rất dễ. Nếu tránh được nhiều yếu tố phức tạp thì có thể thấy C là một ngôn ngữ rất gọn gàng và đơn giản. Tất nhiên, việc có thể trực tiếp chạm vào chính sự phức tạp đó cũng là sức hút của C, nhưng tôi nghĩ cân bằng hợp lý là điều quan trọng.
    • Tôi thường nghe nói rằng con trỏ rất khó hiểu, nhưng thật sự tôi không rõ nó có khó đến thế không. Tôi nhớ lúc mới học chỉ mất khoảng 15 phút là đã nắm được đại khái. Dĩ nhiên để thành thạo thì cần nhiều thời gian hơn, nhưng tôi không thật sự hiểu vì sao con trỏ lại bị xem như thứ có độ khó gần như huyền thoại. Tôi cũng thấy dự án này rất tuyệt; chỉ mong những dự án như vậy khi được đưa vào portfolio của người tìm việc sẽ không sớm bị lưu trữ rồi rơi vào quên lãng.
    • Lời khen dành cho mã nguồn thực sự có ý nghĩa rất lớn với tôi. Tôi luôn bỏ rất nhiều công sức để viết mã theo hướng đó, nên rất biết ơn khi được nghe những lời như vậy.
  • Tôi không muốn mọi người chỉ trích dự án này một cách quá nghiêm trọng, hoặc phân tích vô nghĩa kiểu “liệu có thay thế được PHP hay không”. Tôi nghĩ đây là một ví dụ rất hay về một thử thách thú vị được thực hiện bằng ngôn ngữ C. Nếu có thêm HTML template thì có vẻ nó có thể phát triển thành một framework hoàn chỉnh.
    • Cảm ơn bạn rất nhiều vì những lời tốt đẹp. HTML template đang có trong danh sách ưu tiên và tôi dự định sẽ triển khai nó sau này theo cách thật vui.
    • Tôi đang học C cho vui, và tôi nghĩ dự án này thực sự rất ngầu.
  • Mã rất dễ đọc và được tổ chức tốt. Tuy nhiên, gần như không có error checking, nên có nhiều chỗ không kiểm tra giá trị trả về của snprintf, malloc v.v. Ngoài ra còn có cả một vòng lặp không được dùng. Có vẻ phần xử lý song song vẫn chưa được hỗ trợ nên trước mắt chưa phải vấn đề, nhưng do đặc tính của web server thì về sau việc đưa threading vào sẽ có lợi. Khi cân nhắc triển khai, tôi khuyên nên dùng thư viện như libuv.
    • Cảm ơn bạn đã dành thời gian đưa ra phản hồi rất kỹ. Tôi vốn đã định thêm xử lý song song sau này, nên rất vui vì bạn đã nhắc tới điều đó.
  • Tôi từng dùng thử một framework tương tự tên là Jetzig và thấy rất thú vị, nên cũng đánh giá dự án này rất cao. Tôi cũng thích tổ hợp BSD C CGI và Postgres; tuy chủ yếu làm việc với Python, nhưng việc trực tiếp trải nghiệm ngôn ngữ cấp thấp và các khái niệm bộ nhớ thực sự rất vui. Có người chỉ ra tính thiếu thực tế, nhưng tôi nghĩ khi các thiết bị nhúng ngày càng phổ biến hơn thì giá trị của những framework cấp thấp như thế này sẽ còn cao hơn. Tôi cũng đang thử nghiệm với pico calc, và nếu làm một “ứng dụng di động” cho nó thì tôi sẽ viết mã framework bằng C. Làm rất tuyệt.
  • Theo tôi thì dự án này thực sự rất hay. Phần thiết lập dễ đọc, và nếu có thể tận dụng hiệu năng của C thì đó là một điểm cộng. Đặc biệt, với AI như Claude, có thể dễ dàng tạo ra một phần framework, rồi khi cần thì chỉ bổ sung đúng những gì cần, từ đó tự xây dựng một web framework nhẹ và độc lập nền tảng. Tôi cũng kỳ vọng hiệu năng của nó sẽ khá tốt.
    • Checklist ác mộng bảo trì:
      • Web framework vốn đã khó bảo trì ngay từ đầu vì các tiêu chuẩn luôn thay đổi
      • Nếu là mã do AI viết, có thể sẽ không ai thật sự hiểu rõ nó hoạt động thế nào
      • Được viết bằng C
        Cá nhân tôi vẫn thích sự đơn giản của C thuần, nhưng sự kết hợp giữa mã mạng viết bằng C và mã do AI tạo ra quả thật cũng hơi đáng sợ.
  • Tôi nghĩ việc tự viết một HTTP parser từ đầu bằng C là cực kỳ rủi ro. Nó có thể tạo ra những lỗ hổng nghiêm trọng, nên nếu làm web framework với ý định triển khai thực tế thì an toàn hơn là bắt đầu từ các thư viện đã được kiểm chứng như libmicrohttpd, libevent_http, fastcgi.
    • Tôi rất đồng cảm với kiểu cảnh báo này. Vậy thì rốt cuộc phải làm thế nào mới có thể xây dựng một HTTP server an toàn bằng C nhỉ? Tôi nghĩ đây thật sự có thể trở thành chủ đề của một cuốn sách rất thú vị. Nếu mỗi chương đều chỉ ra một lỗ hổng, đồng thời bàn về các phương pháp mang tính cấu trúc để tiến tới một thư viện HTTP trưởng thành, thì sẽ rất hấp dẫn.
    • Trên thực tế, có lẽ dự án này sẽ không bao giờ được dùng trong môi trường vận hành, nhưng nếu ai đó từng nảy ra ý định như vậy thì xin hãy từ bỏ.
  • Đây là phản hồi không được yêu cầu trước, nhưng tôi nghĩ macro appRoute làm cho kiểu và chữ ký hàm trở nên mơ hồ, đồng thời đưa vào một tầng gián tiếp không cần thiết, nên có lẽ nên bỏ nó đi. Ngoài ra, kiểu AppContext trên thực tế đang trộn lẫn App + HTTP Request + DB cùng nhiều chức năng khác, nên có lẽ RequestContext hoặc ControllerContext sẽ phù hợp hơn. Ngoài ra, giống như nhiều người khác, tôi cũng rất ấn tượng với sự gọn gàng của mã nguồn; đây thực sự là một nỗ lực tuyệt vời.
  • Điều này cho thấy có thể làm được rất nhiều việc nhờ tận dụng macro. Trên thực tế, các web framework hiện đại cũng tích cực dùng những công cụ phức tạp như metaprogramming của từng ngôn ngữ. Tôi rất khen ngợi việc bạn đã tự tay làm ra nó; đây là việc khó, nhưng chắc chắn cũng rất vui. Cũng có người hỏi “tại sao lại làm vậy”, nhưng tôi nghĩ đâu nhất thiết phải có lý do gì cả. Chỉ đơn giản là thích chính việc phát triển phần mềm mà thôi.
    • Cảm ơn bạn rất nhiều, tôi hoàn toàn đồng ý.
  • Tôi hy vọng các nhà cung cấp phần cứng sẽ áp dụng dự án này để chất lượng các trang web quản trị của họ khá hơn một chút.
  • Tôi ngạc nhiên khi một dự án với ý tưởng hay và được viết rất chăm chút như thế này lại nhận nhiều phản ứng tiêu cực đến vậy. Kỹ năng mà Ashton tích lũy được lần này là một tài sản quý giá sẽ không biến mất trong tương lai.
    • Tôi thật sự rất biết ơn vì bạn đã đánh giá như vậy.