Xin hỏi mọi người là làm thể nào để dùng chung C++ với ngôn ngữ Scripting ạ
Xin hỏi mọi người là làm thể nào để dùng chung C++ với ngôn ngữ Scripting ạ.
Нгуен ТоанScripting là một kiểu lập trình cho phép một chương trình (script) chạy trong chương trình khác (host). Trong đa số trường hợp thì ngôn ngữ viết script thường khác với ngôn ngữ viết chương trình host, nhưng chỉ cần là chương trình nằm trong chương trình khác thì được gọi là scripting.
Sau đây là concept cách làm việc. Có thể không chính xác nhưng hướng làm việc thường giống như vậy:
Tạo một máy ảo ở chương trình host
VM m_vm = createVM();
2. Tạo một hàm và khai báo nó ra máy ảo
age(VM vm)
{
, 0); // first parameter
;
}
//...
age);
sage).
3. Chạy đoạn script sử dụng hàm đó
;quot;; // Có thể nhập từ file
doText(m_vm, scriptCode);
Như vậy là hoàn tất, sử dụng theo trình tự như sau:
Gọi hàm doText(). Quyền điều khiển sẽ chuyển sang cho máy ảo để thực thi mã trong scriptCode.
age().
age() hoàn thành, quyền điểu khiển sẽ trả về cho máy ảo.
Sau khi thực hiện xong toàn bộ mã trong scriptCode, doText() sẽ kết thúc, quyền điểu khiển sẽ trả về cho chương trình ở dòng tiếp theo của hàm doText().
Như vậy là đã có thể thực thi một chương trình trong một chương trình khác. Theo lí thuyết mà nói thì sẽ chẳng thể làm được gì với mấy đoạn scripts mà không có những thứ trên. Việc kết hợp này giúp tạo ra được nhiều thứ thú vị một cách dễ dàng như:
Separation of concerns: ví dụ đang viết một game engine trên C/C++ sau đó code của game thì sử dụng Lua Script để thực hiện. Khi hoàn thành thì những đoạn code đó sẽ không hề phụ thuộc vào game engine.
Flexibility: việc thay đổi những đoạn script sẽ không cần phải build lại toàn bộ project. Thay đổi script và chạy lại chương trình một cách dễ dàng và nhanh chóng.
Stability and security: vì script được thực thi trên máy ảo nên lỗi script sẽ không làm crash chương trình. Nếu cho phép người dùng tự viết script cho game hay gì đấy thì việc này khác quan trọng. Nên nhớ là có thể tạo bao nhiêu máy ảo tùy thích miễn là không phụ thuộc.
Language features: có thể tận dụng lợi thế của từng loại ngôn ngữ mà kết hợp với nhau. Có thể thuật toán này triển khai ở ngôn ngữ host sẽ rất khó nên ta dùng ngôn ngữ script nào đó để dễ dàng hơn.
17hevve
Tuy nhiên không gì là hoàn hảo, có một số điểm bất lợi khi sử dụng scripting:
Việc debug sẽ khó: chắc không có IDE nào mà hỗ trợ debug script chạy trong code đâu. Có thể debug bằng việc in ra console như là một giải pháp thay thế.
IDE Intergration: IDE thì nó không biết được hàm nào được xuất ra xuất ra hàm nào mà lần nên với mấy cái script như thế nó không làm việc được. (không xem nó là bất lợi cũng được).
Hiệu suất: chắc chắn việc chèn vào cả một máy ảo thì phải chậm hơn với native code. Một số VMs như luaJIT hay V8 thì cũng khá ổn nên bận tâm khi mà viết script hơi nhiều hay phụ thuộc vào script. Ngoài ra thì cũng chú ý đến chi phí cho việc chuyển từ host-script và script-host, giảm thiểu việc này hơn nếu muốn cải thiện hiệu suất.
Việc dùng hay không thì tùy mình. Scripting chỉ là một công cụ thôi, tạo ra sản phẩm hay, game hay thì phụ thuộc vào bản thân chúng ta.
Sau đây là concept cách làm việc. Có thể không chính xác nhưng hướng làm việc thường giống như vậy:
Tạo một máy ảo ở chương trình host
VM m_vm = createVM();
2. Tạo một hàm và khai báo nó ra máy ảo
{
}
//...
3. Chạy đoạn script sử dụng hàm đó
doText(m_vm, scriptCode);
Như vậy là hoàn tất, sử dụng theo trình tự như sau:
Gọi hàm doText(). Quyền điều khiển sẽ chuyển sang cho máy ảo để thực thi mã trong scriptCode.
Sau khi thực hiện xong toàn bộ mã trong scriptCode, doText() sẽ kết thúc, quyền điểu khiển sẽ trả về cho chương trình ở dòng tiếp theo của hàm doText().
Như vậy là đã có thể thực thi một chương trình trong một chương trình khác. Theo lí thuyết mà nói thì sẽ chẳng thể làm được gì với mấy đoạn scripts mà không có những thứ trên. Việc kết hợp này giúp tạo ra được nhiều thứ thú vị một cách dễ dàng như:
Separation of concerns: ví dụ đang viết một game engine trên C/C++ sau đó code của game thì sử dụng Lua Script để thực hiện. Khi hoàn thành thì những đoạn code đó sẽ không hề phụ thuộc vào game engine.
Flexibility: việc thay đổi những đoạn script sẽ không cần phải build lại toàn bộ project. Thay đổi script và chạy lại chương trình một cách dễ dàng và nhanh chóng.
Stability and security: vì script được thực thi trên máy ảo nên lỗi script sẽ không làm crash chương trình. Nếu cho phép người dùng tự viết script cho game hay gì đấy thì việc này khác quan trọng. Nên nhớ là có thể tạo bao nhiêu máy ảo tùy thích miễn là không phụ thuộc.
Language features: có thể tận dụng lợi thế của từng loại ngôn ngữ mà kết hợp với nhau. Có thể thuật toán này triển khai ở ngôn ngữ host sẽ rất khó nên ta dùng ngôn ngữ script nào đó để dễ dàng hơn.
17hevve
Tuy nhiên không gì là hoàn hảo, có một số điểm bất lợi khi sử dụng scripting:
Việc debug sẽ khó: chắc không có IDE nào mà hỗ trợ debug script chạy trong code đâu. Có thể debug bằng việc in ra console như là một giải pháp thay thế.
IDE Intergration: IDE thì nó không biết được hàm nào được xuất ra xuất ra hàm nào mà lần nên với mấy cái script như thế nó không làm việc được. (không xem nó là bất lợi cũng được).
Hiệu suất: chắc chắn việc chèn vào cả một máy ảo thì phải chậm hơn với native code. Một số VMs như luaJIT hay V8 thì cũng khá ổn nên bận tâm khi mà viết script hơi nhiều hay phụ thuộc vào script. Ngoài ra thì cũng chú ý đến chi phí cho việc chuyển từ host-script và script-host, giảm thiểu việc này hơn nếu muốn cải thiện hiệu suất.
Việc dùng hay không thì tùy mình. Scripting chỉ là một công cụ thôi, tạo ra sản phẩm hay, game hay thì phụ thuộc vào bản thân chúng ta.