Microsoft đã khai tử FoxPro từ 2007, nhưng nay nó được hồi sinh

Công nghệ22 tháng 9, 2026·7 phút đọc

FoxDev Studio mang Visual FoxPro trở lại với runtime 64-bit viết mới hoàn toàn, không cần chuyển đổi mã nguồn hay di trú dữ liệu. Dự án mở trực tiếp các file .dbf, form và thư viện lớp cũ, đồng thời bổ sung FoxScript để chạy lambda và xử lý yêu cầu web ngay trên nền tảng cũ.

Microsoft đã khai tử FoxPro từ 2007, nhưng nay nó được hồi sinh

Visual FoxPro chính thức dừng ở phiên bản 9 vào năm 2007, và đến nay Microsoft vẫn không có ý định hồi sinh nó. Thế nhưng một dự án mang tên FoxDev Studio đang cố gắng làm điều ngược lại: mở lại đúng những dự án, form và bảng dữ liệu mà các lập trình viên FoxPro đã bỏ dở từ nhiều năm trước — không viết lại, không chuyển đổi, không cần bước xuất dữ liệu nào.

Giao diện lập trình với cây đối tượng và bảng thuộc tínhGiao diện lập trình với cây đối tượng và bảng thuộc tính

Điểm đáng chú ý là FoxDev Studio không hoạt động như một trình giả lập hay lớp tương thích. Nó đọc thẳng các file .dbf, chỉ mục, memo và cơ sở dữ liệu ngay tại chỗ, ghi lại cũng tại chỗ, và file sau khi lưu vẫn đúng định dạng cũ. Các lệnh gọi hệ thống, đối tượng automation và thư viện add-in mà ứng dụng cũ phụ thuộc vẫn tiếp tục chạy, nhờ đó những phần không ai muốn động vào vẫn được giữ nguyên.

Vấn đề không nằm ở tính năng, mà ở những khác biệt nhỏ

Theo đội ngũ phát triển, thứ khiến một ứng dụng FoxPro cũ "chết" thường không phải là thiếu tính năng lớn, mà là những sai lệch nhỏ: một con số in lệch đi một cột, một sự kiện đến muộn vài mili giây, hay một mã lỗi bị gán sai. Vì vậy họ chọn cách kiểm chứng hành vi bằng chính Visual FoxPro gốc — chạy thử và đối chiếu kết quả, thay vì đọc tài liệu tham chiếu rồi hy vọng nó đúng.

Kết quả là một runtime viết lại từ đầu, khởi động nhanh, tự chứa và nói rõ những chỗ nó chưa xử lý được, thay vì âm thầm trả về kết quả sai.

Bốn trụ cột kỹ thuật của bản hồi sinh

Visual FoxPro là chương trình 32-bit, và điều này quyết định nhiều thứ hơn ta tưởng. Bảng dữ liệu dừng ở 2 GB, file memo cũng dừng ở 2 GB, một báo cáo lớn có thể hết bộ nhớ dù máy còn thừa RAM — tất cả vì các offset trong xử lý file là số nguyên 32-bit có dấu, chứ không phải do quyết định cấp phép nào.

FoxDev Studio chuyển sang 64-bit toàn phần. Mọi offset file đều 64-bit, và bảng không bao giờ được nạp trọn vào bộ nhớ, nên cùng một file .dbf trước đây "tắc" ở 2 GB nay có thể vươn tới hàng trăm GB. Tuy nhiên có một điều cần lưu ý trước khi dựa vào nó: bảng đã vượt mốc 2 GB sẽ không còn mở được bằng Visual FoxPro gốc nữa. Nếu bạn vẫn làm việc trên cả hai môi trường, đây là cánh cửa một chiều.

Thay vì biên dịch sang p-code rồi chạy bằng runtime như bản gốc, dự án xây dựng trình biên dịch và trình thông dịch bytecode bằng Rust, biên dịch tiếp ra WebAssembly, để cùng một cỗ máy chạy được mã của bạn ở bất kỳ nơi nào ứng dụng chạy. Nhờ dùng chung trình biên dịch, những gì editor gạch chân và những gì runtime từ chối sẽ không bao giờ lệch nhau.

Một chương trình đang chạy ở đây được mô hình hóa thành fiber. Khi cần điều gì từ bên ngoài — một hộp thoại, một form dạng modal, bản ghi kế tiếp — nó không gọi ra và chặn cứng, mà nhường quyền, để công việc được xử lý khi máy đã rời khỏi stack, rồi trả kết quả về. Đó là lý do MESSAGEBOX() dừng chương trình mà không đóng băng cửa sổ phía sau, READ EVENTS chờ mà không quay vòng CPU, và SetFocus có thể kích hoạt GotFocus, còn Init có thể chạy khi form vẫn đang được dựng — đúng thứ tự mà FoxPro xưa nay vẫn làm.

Cửa sổ debugger đang dừng ở một dòng lệnhCửa sổ debugger đang dừng ở một dòng lệnh

Về phần giao diện, một form đang chạy là cây đối tượng sống chứa đúng các thuộc tính như bạn mong đợi, và giao diện được vẽ trực tiếp từ cây đó bằng React. Mỗi đối tượng chỉ tự theo dõi chính nó, nên câu lệnh THISFORM.lblGreeting.Caption = cMsg chỉ vẽ lại đúng một nhãn thay vì toàn bộ form — trên màn hình dày đặc, đó là khác biệt giữa tức thời và ì ạch.

Đáng chú ý là chính cây đối tượng đó cũng là thứ mà trình thiết kế kéo thả chỉnh sửa, chỉ sớm hơn một bước. Không có mô hình thứ hai nào phải đồng bộ với mô hình thứ nhất — vốn là nơi form và trình thiết kế form thường bắt đầu "kể hai câu chuyện khác nhau".

Bài toán hóc búa: thư viện .fll 32-bit

Một file .fll là ảnh 32-bit, trong khi mọi tiến trình trong ứng dụng 64-bit đều là 64-bit, nên không gì bên trong ứng dụng có thể mở nổi nó. Thay vì báo "không thể", dự án cho SET LIBRARY TO khởi động một tiến trình 32-bit nhỏ, với nhiệm vụ duy nhất là giữ thư viện, và runtime giao tiếp với nó.

Các lệnh gọi ở đây là đồng bộ, bởi một chương trình có thể gọi vào thư viện ngay giữa một biểu thức — và câu trả lời đến muộn thì không còn là câu trả lời nữa. Cơ chế này đã được đối chiếu với các thư viện thật, gồm thư viện mã hóa, FoxTools và cả những thư viện dựng từ mẫu API của chính Microsoft. Tất nhiên, thứ gì thuần 64-bit thì không cần cầu nối: DECLARE ... DLL gọi thẳng thư viện hiện đại trong cùng tiến trình, và các đối tượng automation vẫn được truy cập như xưa.

FoxScript: lớp mở rộng cho thời đại mới

Điểm mấu chốt là mọi thứ bạn từng viết vẫn giữ nguyên ý nghĩa. FoxScript chỉ bổ sung thêm hai thứ: một khối lệnh có thể giao cho nơi khác chạy sau (lambda), và một cách trả lời yêu cầu web ngay từ đoạn mã vốn đã hiểu nghiệp vụ của bạn.

Mỗi dòng trong đó đều chạy trên cùng runtime với form của bạn. Các truy vấn, cursor và lệnh gọi thư viện vẫn là FoxPro thuần túy; chỉ lambda và HTTP server là phần FoxScript thêm vào — không có ngôn ngữ thứ hai, không cần dựng thêm dịch vụ nào bên cạnh.

Bản nightly được build lại sau mỗi lần push lên nhánh main và phát hành dưới dạng pre-release trên GitHub. Bản này chưa ký số, nên lần khởi chạy đầu tiên sẽ yêu cầu bạn xác nhận.

Trình duyệt và môi trường chạy thử nghiệmTrình duyệt và môi trường chạy thử nghiệm

Ý nghĩa với cộng đồng lập trình viên Việt Nam

Ở Việt Nam, không ít hệ thống quản lý nội bộ tại các doanh nghiệp, ngân hàng và cơ quan nhà nước vẫn còn vận hành trên nền FoxPro — nhiều phần mềm kế toán, quản lý kho và nhân sự viết từ thập niên 2000 vẫn chạy hằng ngày vì "chạy được thì không sửa". Những hệ thống này thường mắc kẹt vì không tìm được lập trình viên FoxPro, không dám di trú dữ liệu, và không thể nâng cấp lên môi trường 64-bit.

Một runtime tương thích ngược, chạy được trên hạ tầng hiện đại và mở khóa giới hạn 2 GB, có thể là lối thoát nhẹ nhàng hơn nhiều so với việc viết lại toàn bộ hệ thống. Dù vậy, cần lưu ý đây vẫn là dự án non trẻ, tài liệu ghi rõ cả những phần chưa hoàn thiện, nên chưa phù hợp để đưa thẳng vào môi trường sản xuất cho các hệ thống trọng yếu. Đội ngũ phát triển cũng đã công bố lộ trình các hạng mục đang triển khai, theo thứ tự ưu tiên tương đối rõ ràng.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗