Skip to content

Thực thi Code ​

Hệ thống LMS có một sandbox thực thi code chạy trên máy chủ, cho phép bạn viết và chạy code trực tiếp trong trình duyệt mà không cần cài đặt bất kỳ phần mềm nào trên máy tính cá nhân. Trang này mô tả tổng quan về cơ chế thực thi, ngôn ngữ hỗ trợ, các giới hạn kỹ thuật, và các loại lỗi runtime bạn có thể gặp.

Để hiểu cách các loại hoạt động lập trình cụ thể vận hành, xem (tên in đậm là tên loại hoạt động hiện trên giao diện khoá học):

Code Playground ​

Code Playground là widget thực thi code có thể được nhúng trực tiếp vào nội dung bài đọc hoặc bài giảng. Khác với các activity lập trình độc lập, playground:

  • Không tính tiến độ — chạy bao nhiêu lần cũng được, không ảnh hưởng đến hoàn thành bài
  • Không có test case — chỉ chạy và xem output
  • Có thể có nhiều file — playground hỗ trợ project nhiều file (vd: main.py + utils.py)
  • Có thể có sẵn code mẫu — giảng viên đặt code khởi đầu để bạn quan sát hoặc chỉnh sửa

Sử dụng ​

  1. Mở bài học có Code Playground (thường nhúng trong bài đọc).
  2. Quan sát code mẫu (nếu có) hoặc viết code mới vào editor.
  3. Nếu playground có nhiều file, chuyển file qua tab tên file ở phía trên editor.
  4. Nhấn Chạy (▶) — kết quả hiển thị bên dưới editor.
  5. (Tùy chọn) Nhấn icon Toàn màn hình để mở rộng editor.

TIP

Playground là chỗ tốt để thử nhanh ý tưởng trong khi đang đọc bài lý thuyết. Bạn không bị tính lượt thử và không có áp lực pass/fail.

Ngôn ngữ hỗ trợ ​

Sandbox của hệ thống hỗ trợ các ngôn ngữ sau:

Ngôn ngữPhiên bảnGhi chú
Python3.11Standard library; không có numpy/pandas/scipy mặc định
JavaScript / Node.jsNode 20Standard Node API; không có thư viện npm bên ngoài
PHP8.2 (CLI)Chạy ở chế độ CLI, không phải web request
JavaOpenJDK 21Tự động javac rồi java — chỉ cần nộp source .java

Tùy hoạt động cụ thể, giảng viên có thể cố định một ngôn ngữ (vd: Code Practicing chỉ cho Python). Trong Code Playground, ngôn ngữ thường do nội dung bài học quyết định.

WARNING

Một số bài giảng minh họa cú pháp C# / Go / Ruby / Rust / Kotlin / Swift chỉ ở dạng đọc code (Code Reading) hoặc dạng pseudo-code — bạn không thể chạy chúng trong sandbox.

C / C++ chạy được hay không tuỳ hệ thống của tổ chức bạn. Nếu bài yêu cầu chạy C/C++ mà nút Chạy báo lỗi hệ thống, hãy báo giảng viên.

Trình soạn thảo (Editor) ​

Editor sử dụng Monaco — engine của VS Code — với các tính năng:

  • Syntax highlight theo ngôn ngữ
  • Auto-completion + IntelliSense cơ bản
  • Bracket matching, multi-cursor, find & replace
  • Theme sáng/tối, đồng bộ với theme LMS
  • Các phím tắt phổ biến của VS Code: Ctrl/Cmd+/ (comment), Ctrl/Cmd+D (chọn từ trùng), Ctrl/Cmd+F (tìm), Alt+↑/↓ (di chuyển dòng)

Code bạn gõ trong editor được chạy ở máy chủ, không chạy trong trình duyệt. Trình duyệt chỉ chịu trách nhiệm hiển thị editor + gửi code lên server qua Livewire.

Cách sandbox hoạt động ​

Mỗi lần nhấn Chạy / Submit, hệ thống thực hiện các bước:

  1. Đóng gói code của bạn (cùng các file đi kèm) thành thư mục tạm trên máy chủ.
  2. Khởi tạo một container Docker biệt lập với resource limit (xem mục Giới hạn).
  3. Mount thư mục code vào /code trong container.
  4. Thực thi lệnh tương ứng với ngôn ngữ:
    • Python: python /code/main.py
    • Node: node /code/main.js
    • PHP: php /code/main.php
    • Java: javac /code/Main.java && java -cp /code Main
  5. Thu lại stdout + stderr + exit code, gửi về trình duyệt.
  6. Xóa container và toàn bộ file tạm — không lưu lại dấu vết thực thi.

Vì sao sandbox hóa

Cô lập đảm bảo: code bạn viết không thể đụng vào hệ thống file thật, không thể truy cập tài nguyên của user khác, và bị tự động dừng nếu chạy quá lâu hoặc tốn quá nhiều bộ nhớ.

Giới hạn kỹ thuật ​

Giới hạnGiá trị mặc định
Thời gian chạy5 giây mỗi lần thực thi
Bộ nhớ (RAM)128 MB
CPU0.5 core
Mạng (network)Tắt hoàn toàn — không thể gọi API ngoài, không tải file từ internet
Hệ thống fileChỉ ghi được trong /code và /tmp của container; bị xóa sau khi chạy xong
Đầu vào (stdin)Hỗ trợ — nhập input thủ công ở ô bên dưới editor (nếu hoạt động cho phép)

Hệ quả thực tế

  • Code không thể requests.get(...) / fetch(...) / curl ra internet.
  • Không thể pip install / npm install thêm thư viện trong khi chạy — chỉ có standard library sẵn của ngôn ngữ.
  • File bạn ghi (vd: open('output.txt', 'w')) sẽ bị xóa khi container kết thúc.
  • Time/Memory ở Code Practicing có thể được giảng viên thiết lập riêng cho từng bài; ở Code Interactive thường nới lỏng hơn (10–30s).

Chạy quá nhanh bị chặn ​

Để sandbox không bị quá tải, mỗi người chỉ được chạy code một số lần nhất định trong một phút. Bấm Chạy liên tục quá giới hạn này, bạn sẽ thấy:

Bạn đã chạy quá nhiều lần trong một phút. Thử lại sau … giây.

Đây không phải lỗi code của bạn. Đợi đúng số giây được báo rồi chạy lại. Trong bài lập trình có chấm, lượt bị chặn không bị tính là một lần nộp.

Đầu vào & đầu ra (I/O) ​

Standard output ​

print(...) (Python), console.log(...) (JS), echo (PHP), System.out.println(...) (Java) — tất cả đều ghi ra stdout và hiển thị ở panel kết quả.

Standard error ​

Exception, traceback, lỗi biên dịch ghi ra stderr và hiển thị tách biệt (thường có nhãn Stderr hoặc tô đỏ). Khi code có lỗi, luôn đọc stderr trước — đó là chỗ thông tin quan trọng nhất.

Standard input ​

Nếu hoạt động cho phép nhập input, bạn sẽ thấy ô Input bên dưới (hoặc bên cạnh) editor. Mỗi dòng bạn gõ sẽ được đẩy vào stdin của chương trình:

  • Python: input() đọc một dòng
  • Node: dùng readline hoặc đọc từ process.stdin
  • PHP: fgets(STDIN)
  • Java: Scanner sc = new Scanner(System.in); sc.nextLine();

Trong Code Practicing, input được hệ thống tự động cấp từ test case — bạn không cần gõ thủ công.

So sánh output (output matching) ​

Trong Code Practicing và một số playground có expected output, hệ thống so sánh output của bạn với output chuẩn để quyết định Pass/Fail:

  • So sánh chính xác sau khi trim() cuối — nghĩa là một dấu cách thừa giữa dòng vẫn fail.
  • Phân biệt hoa/thường — Hello ≠ hello.
  • Mỗi dòng kết thúc bằng \n — đa số ngôn ngữ tự thêm khi println/print (mặc định).
  • Không có encoding lạ — luôn đảm bảo file source là UTF-8.

Nếu Pass tại nhà mà Fail trên LMS

  • Khoảng trắng/dòng mới thừa trong output (vd: print("a "); print("b") ra "a b\n" thay vì "a\nb").
  • Code dùng feature ngôn ngữ ở phiên bản mới hơn sandbox (vd: Python 3.12 syntax trên sandbox 3.11).
  • Encoding khác (UTF-8 vs Latin-1) cho input/output.
  • Dùng thư viện không có trong standard library.

Các loại lỗi runtime ​

Khi chạy code, bạn có thể gặp các trạng thái sau:

MãTên đầy đủNguyên nhân
ACAcceptedOutput đúng với expected
WAWrong AnswerCode chạy xong nhưng output sai
TLETime Limit ExceededCode chạy quá thời gian cho phép
MLEMemory Limit ExceededCode dùng quá bộ nhớ cho phép
RERuntime ErrorException/crash trong khi chạy (ZeroDivisionError, NullPointerException, …)
CECompilation ErrorJava/C++ không biên dịch được — sai cú pháp

Khi gặp TLE ​

  • Nghĩ về độ phức tạp thuật toán: vòng for lồng → O(n²) có thể quá chậm với n lớn.
  • Ưu tiên dictionary/set thay cho list khi cần lookup — O(1) thay O(n).
  • Tránh đọc input dòng-từng-dòng nếu input lớn — đọc gộp một lần.

Khi gặp MLE ​

  • Tránh tạo list/array khổng lồ nếu không cần.
  • Dùng generator/lazy evaluation (Python: yield).
  • Giải phóng tham chiếu khi không dùng (đặt biến = None).

Khi gặp RE ​

  • Đọc kỹ traceback / stack trace — dòng cuối thường chỉ chính xác chỗ lỗi.
  • Kiểm tra edge case: input rỗng, n=0, chia cho 0, index ra ngoài mảng.

Khi gặp CE (Java) ​

  • Kiểm tra tên class trùng tên file (vd: class Main thì file phải là Main.java).
  • Thiếu ;, sai khai báo type, import sai package.

Bảo mật & quyền riêng tư ​

  • Code bạn viết được lưu vào tài khoản (auto-save) ở Code Interactive / Code Practicing — bạn quay lại vẫn thấy code cũ.
  • Quá trình thực thi không log code của bạn ra file lâu dài; chỉ log metadata (tên user, activity, thời gian, trạng thái pass/fail) để chấm điểm và phục vụ thống kê tiến độ.
  • Sandbox cách ly mạng → code không thể "thoát" ra ngoài để gọi API hay tải file.

Mẹo chung khi viết code trên LMS ​

  1. Test edge cases trước khi submit — n=0, n=1, input rỗng, input cực lớn.
  2. In ra để debug — print(debug_value) rồi xóa trước khi submit. Output thừa có thể fail expected output.
  3. Đọc đề kỹ — đặc biệt format output: có dấu chấm cuối câu? có dòng trống? phân tách bằng dấu phẩy hay dấu cách?
  4. Đừng hard-code đáp án cho test public — hidden test sẽ phát hiện.
  5. Chạy thử với input cực hạn — nếu chạy quá 1–2 giây cho input nhỏ, sẽ TLE với input lớn hơn.
  6. Lưu nháp ra ngoài — nếu code quan trọng, copy về máy hoặc Gist riêng. Sandbox không phải kho lưu trữ.

Câu hỏi thường gặp ​

Code chạy đúng trên máy tôi nhưng fail trên LMS? Nguyên nhân thường gặp: khác phiên bản ngôn ngữ, dùng thư viện không có trong sandbox, khác encoding I/O, hoặc output có khoảng trắng/xuống dòng thừa. Xem So sánh output.

Tôi có thể pip install / npm install thêm thư viện không? Không. Sandbox bị tắt mạng và không lưu trạng thái giữa các lần chạy. Chỉ dùng được standard library. Nếu khóa học cần thư viện cụ thể (vd: numpy), giảng viên phải bật pre-installed images riêng — hỏi giảng viên nếu thiếu.

Hiện ngôn ngữ tôi cần (Go, Rust, C#, Ruby, …) thì sao? Sandbox chạy Python, JavaScript/Node, PHP, Java (và C/C++ tuỳ tổ chức). Các ngôn ngữ khác chỉ xuất hiện ở dạng đọc code hoặc pseudo-code. Phản hồi với giảng viên hoặc admin nếu bạn cần thêm ngôn ngữ.

Tôi muốn nộp file đính kèm thay vì dán code? Code Playground / Code Practicing không hỗ trợ upload file. Nếu cần nộp file, dùng Bài tập (Assignment).

Tôi nhấn Chạy nhưng không thấy output gì cả?

  • Code chưa thực sự gọi print() (Python) / console.log() (JS).
  • Code throw exception trước khi đến print — kiểm tra tab Stderr.
  • print() đặt sau một vòng lặp vô hạn → bị TLE → không kịp in.
  • Output bị buffer (hiếm với 4 ngôn ngữ trên) — thử thêm sys.stdout.flush() (Python).

Code playground có lưu code tự động không? Có ở Code Interactive / Code Practicing (gắn với tài khoản học viên). Code Playground nhúng trong bài đọc thường không lưu giữa các lần truy cập — copy ra ngoài nếu muốn giữ.

LMS Documentation