3.4.1 Ưu điểm của lập trình phản ứng
Trong xu hƣớng công nghệ hiện nay thì lập trình phản ứng là công nghệ mới đang đƣợc phát triển rất mạnh trong các lĩnh vực mà dữ liệu chƣơng trình rất lớn hay là các ứng dụng web, ứng di động có tính tƣơng tác cao với ngƣời dùng ở thời gian thực. Để thấy rõ đƣợc tầm quan trọng này trong luận văn này tôi đƣa ra một số mặt mạnh của lập trình phản ứng nhƣ sau:
Trong lập trình phản ứng luôn mang tính hƣớng sự kiện và các sự kiện có thể xảy bất cứ lúc nào mà không cần phải tuân theo thứ tự các sự kiện đã đƣợc sắp đặt từ trƣớc. Sức mạnh của lập trình phản ứng là có thể nhập, lọc và nối nhiều sự kiện lại với nhau thành một dòng trƣớc khi xử lý tiếp các sự kiện phía bên trong.
Lập trình phản ứng cho phép chúng ta khai báo thiết lập các rằng buộc giữa các dữ liệu trong các phần khác nhau của chƣơng trình và tạo một cơ chế tự động đồng bộ hóa giữa các sự kiện. Lập trình hàm phản ứng có thể cho phép trừu tƣợng hóa thông tin có thể thay đổi theo thời gian. Hầu hết các chƣơng trình lập trình phản ứng sẽ đáp ứng ở thời gian thực, hiệu quả hoạt động và tối ƣu hóa khi thực thi là rất cao.
Phần năng động nhất của trong lập trình phản ứng chính là giao diện tƣơng tác ngƣời dùng, nó vừa là kết nối với mô hình dữ liệu phía bên trong vừa kết nối với những tác động từ bên ngoài vào, cũng đồng cũng thể hiện đƣợc sự thay đổi dữ liệu bên trong thông qua giao diện mà chúng ta có thể quan sát. Vì vậy lựa chọn các ngôn ngữ thể hiện đƣợc giao diện đồ họa cao thì cũng thể hiện khá tốt lập trình
72
phản ứng trong nó. Thông dụng nhất hiện nay vẫn là ngôn ngữ Javascript và ngôn ngữ Elm.
Tuy lập trình phản ứng là một mô hình lập trình mới mang tính hƣớng sự kiện nhƣng nó vẫn mang phong cách của lập trình hàm và lập trình hƣớng đối tƣợng. Vì vậy với một ngƣời lập trình mới bắt đầu làm quen với mô hình này cũng dễ dàng tiếp cập và tìm hiểu sâu hơn về nó.
3.4.2 Một số khó khăn của lập trình phản ứng
Chúng ta đều biết tƣ duy trong lập trình phản ứng là việc truyển đổi các dữ liệu đầu vào từ môi trƣờng bên ngoài tác động vào dữ liệu bên trong chƣơng trình để thay đổi theo thời gian. Vì vậy cái khó của ngƣời lập trình là làm cách nào để biểu diễn dữ liệu thay đổi liên tục theo thời gian khi có tác động từ bên ngoài vào.
Việc mô hình hóa dữ liệu thay đổi theo thời gian thì trong lập trình phản ứng sử dụng khái niệm đó là tín hiệu. Nhƣng các tín hiệu đầu vào tƣơng tác với chƣơng trình ở các thời điểm khác nhau không đoán trƣớc đƣợc thời điểm tác động vào dẫn đến các việc cập nhật sự kiện khá khó khăn và không giữ đúng thứ tự các sự kiện đã đƣợc sắp đặt trƣớc dẫn đến việc các luồng chảy sự kiện trong chƣơng trình ngày càng trở nên khó hiểu.
Trong cùng thời điểm các sự kiện diễn ra trong một thời gian dài sẽ đƣợc xử lý rất lâu khiến các sự kiện nhỏ phải đợi. Vì vậy việc sắp sếp thứ tự sự kiện trong lập trình phản ứng cũng là một vấn đề đặc biệt là với các sự kiện không liên quan tới quá trình xử lý.
Trong lập trình phản ứng việc tạo ra một tín hiệu có thể cần vòng lặp vô hạn sẽ dẫn đến việc bộ nhớ sẽ phát triển tuyến tính theo thời gian đồng nghĩa với việc rất tốn bộ nhớ.
Lập trình phản ứng cho phép định nghĩa các giá trị phụ thuộc vào quá khứ, hiện tại và tƣơng lai tức là chƣơng trình tạo giá trị mới từ các giá trị cũ. Việc dựa trên những giá trị quá khứ có thể tăng bộ nhớ cái mà chƣơng trình bắt buộc nhớ các
73
giá trị trong quá khứ của hành vi hoặc sự kiện. Có nghĩa là sử dụng bộ nhớ tăng tỷ lệ thuận với thời gian mà chƣơng trình chạy.
3.4.3 Ưu điểm của ngôn ngữ Elm
Giao diện đồ họa ngƣời dùng ngƣời dùng là hệ trung gian cho nhiều giao tiếp của chúng ta với máy tính vì vậy lập trình hàm phản ứng với ngôn ngữ Elm là một phƣơng pháp tiếp cận nhanh nhất để thiết kế giao diện đồ họa ngƣời dùng, cung cấp một cái nhìn cao hơn, sâu hơn, trừu tƣợng hơn để miêu tả sự tƣơng tác của ngƣời dùng và các tính toán phụ thuộc về thời gian.
Elm là một ngôn ngữ lập trình hàm phản ứng mang tính hƣớng sự kiện hoạt động chủ yếu dựa vào tín hiệu cái mà giá trị luôn thay đổi theo thời gian, tín hiệu luôn tác động vào dữ liệu chƣơng trình và làm chúng thay đổi khi có sự kiện xảy ra. Elm cũng nhận các giá trị tín hiệu đầu vào từ chuột, bàn phím, các thiết bị cảm ứng, chấp nhận các thuộc tính của window và mạng lƣới trao đổi qua HTTP. Elm hỗ trợ các cấu trúc data JSON và Markdown giúp tạo các văn bản một cách dễ dàng. Các kiểu Elm cho phép cho phép tính đa hình và các kiểu đệ quy đơn giản nhƣng không phải kiểu đệ quy tín hiệu. Elm hỗ trợ kiểu suy luận có mở rộng các bản ghi và có hệ thống module.
Sự trừu tƣợng hóa tín hiệu khuyến khích một sự tách biệt giữa các mã phản ứng với mã tập chung vào giao diện các thành phần giúp ngƣời lập trình dễ dàng gỡ lỗi và mở rộng chƣơng trình. Cũng giống nhƣ các mô hình lập trình thông dụng Elm cũng xây dựng cho nó một mô hình kiến trúc riêng của nó giúp ngƣời lập trình có thể quản lý và phát triển những ứng dụng phức tạp.
Trong một ứng dụng có nhiều thành phần riêng biệt và có thể chạy độc lập an toàn và Elm có chức năng kết hợp chúng lại thành một hệ thống đồng thời. Mỗi một phản ứng hay sự kiện sẽ tạo ra một mạch và cấu trúc của một chƣơng trình Elm sẽ chỉ ra làm thế nào để hiển thị sự trao đổi dữ liệu giữa các dòng.
74
Thứ tự các sự kiện không đảm bảo trong một hệ thống đồng thời. Trong lập trình hàm phản ứng đồng thời nhiều cập nhật sẽ xảy ra ở cùng một thời điểm vì có nhiều đƣờng dẫn trong một hệ thống đồng thời và một sự kiện có thể nhẩy về phía trƣớc một sự kiện khác. Elm cung cấp một cơ chế đồng bộ cho mỗi dòng đó để duy trì thứ tự các sự kiện. cơ chế này đảm bảo giá trị sẽ không cần thiết phải tính toán lại trừ khi cần thiết.
Elm là một ngôn ngữ lập trình hàm cơ bản với khá nhiều tính năng nổi bật. Một trong những tính năng đó là gỡ lỗi theo thời gian (Time Traveling Debugger) cái mà cho phép các nhà phát triển trò chơi thấy đƣợc sự thay đổi của chƣơng trình dựa trên thời gian chạy. Giúp ngƣời lập trình có thể bƣớc tiếp hoặc phản hồi lại trong một chƣơng trình để tìm ra lỗi. Nó cho phép theo dõi dữ liệu của các đối tƣợng và hình dung đƣợc chƣơng trình. Từ đó phân tích các hành vi và đƣa ra hƣớng giải quyết.
Một cấu trúc dữ liệu cái mà chúng ta lƣu trữ dữ liệu liên quan đến các đặc tính của các đối tƣợng. Sau đó chúng ta có thể nhìn thấy đƣợc lỗi và bắt đầu gỡ lỗi, phân tích và tìm ra nguyên nhân để sửa chúng một cách dễ ràng.
Một đặc tính khác đó là hot – swapping cái cho phép chúng ta lập trình tƣơng tác hơn khi chúng ta chỉnh sửa mã khi đang chạy. Tính năng này giúp ngƣời lập trình trao đổi thông tin giữa các hàm và giá trị mới trong chƣơng trình khi chạy theo thời gian.
Việc kết hợp với dữ liệu hay thay đổi giúp chúng ta sẽ nhận đƣợc các kết quả tƣơng tự khi chúng ta tua lại chƣơng trình mà không phải phá hủy dữ liệu cũ. Điều này là khó đạt đƣợc trong ngôn ngữ trƣớc đây vì tính năng cập nhật hủy diệt. Điều này làm cho việc sử dụng tín hiệu và lập trình phản ứng trở lên dễ dàng hơn rất nhiều.
75
3.4.4 Nhược điểm của ngôn ngữ Elm
Do đang trong quá trình phát triển lên ngôn ngữ elm còn nhiều nhƣợc điểm nhƣ: Các thƣ viện thƣờng xuyên thay đổi dẫn tới việc giữa các phiên bản thƣờng không đồng bộ dẫn đến việc tiếp cận và tìm hiểu cũng mất khá nhiều thời gian, đặc biệt là việc cài đặt một số thƣ viện. Cũng có nhiều tài liệu hƣớng dẫn cũng chƣa rõ ràng ví dụ nhiều đoạn mã viết ra cũng không chạy đƣợc.
Ở Việt Nam các diễn đàn công nghệ sử dụng ngôn ngữ Elm để lập trình phản ứng là không có và trên thế giới còn ít lên việc trao đổi và tìm hiểu thông tin là khá khó khăn.
76
KẾT LUẬN
Đề tài “Nghiên cứu lập trình phản ứng với ngôn ngữ Elm” đã đạt đƣợc một số kết quả nhƣ sau:
Đã nghiên cứu định nghĩa, các đặc điểm của lập trình phản ứng và ứng dụng của nó trong việc phát triển phần mềm liên quan tới luồng dữ liệu. Trong luận văn tập trung nghiên cứu về ngôn ngữ Elm, một ngôn ngữ đang đƣợc phát triển rất là mạnh trên thế giới. Elm dễ dàng mô phỏng dữ liệu trong chƣơng trình nhƣ các tín hiệu thay đổi theo thời gian.
Nghiên cứu phƣơng thức hoạt động của ngôn ngữ Elm, cách mà làm cho chúng có biểu diễn các quá trình phản ứng của các đối tƣợng trong một ứng dụng. Vận dụng ngôn ngữ Elm để xây dựng một ứng dụng để mô phỏng mô hình lập trình phản ứng để thấy rõ đƣợc các đặc điểm của lập trình phản ứng đồng thời thấy đƣợc cả các ƣu điểm của ngôn ngữ Elm.
Đƣa ra mộ số nhận xét đánh giá của bản thân khi nghiên cứu và áp dụng lập trình phản ứng với ngôn ngữ Elm là:
Khó khăn gặp phải: Lập trình phản ứng là phong cách lập trình khá là mới ở Việt Nam, đặc biệt là khi nghiên cứu về lập trình phản ứng trong ngôn ngữ Elm vì nó là ngôn ngữ đang trong quá trình phát triển lên liên tục thay đổi cấu trúc cũng nhƣ thƣ viện. Chính vì vậy tôi đã gập phải khá nhiều khó khăn nhƣ: Tài liệu tham khảo về Elm rất là ít và thƣờng không rõ ràng. Giữa các phiên bản của Elm thì thƣờng không hỗ trợ, cập nhật đồng bộ với nhau, các thƣ viện thì thƣờng thay đổi dẫn đến việc lập trình để tạo ra một ứng dụng cũng khá khó khăn.
Cộng đồng ngƣời sử dụng phong cách lập trình phản ứng với ngôn ngữ Elm ở Việt Nam chƣa có nhiều lên rất khó trong việc trao đổi thông tin. Đặc biệt là có khá nhiều khái niệm mới, thuật ngữ mới chỉ bằng tiếng anh nên việc đọc và nghiên cứu tài liệu cũng gập nhiều khó khăn.
77
Hƣớng nghiên cứu trong tƣơng lai: Trong luận văn này tôi đã áp dụng mô hình lập trình phản ứng trong ngôn ngữ Elm để xây dựng một ứng dụng trò chơi mang tính tƣơng tác cao với ngƣời sử dụng. Trong tƣơng lai tôi hy vọng có thể xây dựng thêm nhiều trò chơi mới tích hợp với các thiết bị di động, hay những ứng dụng web có tính tƣơng tác cao với ngƣời dùng.
Đặc biệt ngôn ngữ Elm là một ngông ngữ lập trình hàm luôn mang tính hƣớng sự kiện, lên tôi muốn phát triển ngôn ngữ này để nó ngày càng hoàn thiện hơn, trở thành một ngôn ngữ thông dụng giúp mọi ngƣời có thể tạo ra nhiều ứng dụng mang tính tƣơng tác cao ở thời gian thực.
78
TÀI LIỆU THAM KHẢO Tiếng Việt
1. TS. Phan Huy Khánh (2004), Lập trình hàm, Nhà xuất bản khoa học và kỹ thuật, Hà Nội.
Tiếng Anh
2. Matt Carkci (2014), Dataflow & Reactive Programming Systems.
3. R. J. Wieringa (2003) , Design Methods for Reactive Systems_ Yourdon, Statemate and the UML , Morgan Kaufmann Publishers, An imprint of Elsevier Science, 340 Pine Street, Sixth Floor , San Francisco.
4. Edward Amsden, “A Survey of Functional Reactive Programming”, Rochester Institute of Technology, eca7215@cs.rit.edu.
5. Evan Czaplicki & Stephen Chong, “Asynchronous Functional Reactive Programming for GUIs”, Havard University, United States.
6. Evan Czaplicki (30 March 2012), “Elm: Concurrent FRP for Functional GUIs”.
7. Harel,D., & Pnueli, A.(1985), “On the Development of Reactive Systems”, Springer Berlin Heidelberg. Chicago.
8. Gerard Berry (1989), “Real Time Programming: Special Purpose or General Purpose Languages” (pp.11-17) IFIP Congress.
9. Conal Elliott & Paul Hudak (1997), Functional reactive animation, In Proceedings of the second ACM SIGPLAN international conference on Functional programming, ICFP ’97, pages 263–273, New York, NY, USA, 1997. ACM
Website
10.http://elm-lang.org/
11.http://voer.edu.vn/m/lap-trinh-ham/f9cb9246
79
13.http://en.wikipedia.org/wiki/Reactive_programming
14.http://open.bekk.no/making-a-collaborative-piano-using-functional-reactive- programming-frp
15.The Reactive Manifesto, Phublished on september 16 2014 (v2.0)
http://www.reactivemanifesto.org/
16. Martin Odersky, Principles of Reactive Programming
https://www.youtube.com/watch?v=7D9QfMj_KwI
17.http://www.infoq.com/news/2013/08/reactive-programming-emerging 18.http://sean.voisen.org/blog/2013/09/intro-to-functional-reactive-