phần mở đầu, mục lục, danh mục tài liệu tham khảo, kết quả đạt đƣợc thì nội dung của luận văn gồm 3 chƣơng. Chƣơng 1 sẽ nghiên cứu về lập trình phản ứng, nội dung trong chƣơng sẽ nêu ra những đặc điểm về lập trình phản ứng, đặc điểm về luồng dữ liệu và xem chúng có những đặc điểm gì tƣơng đồng hay không. Chƣơng 2 tôi sẽ nghiên cứu đôi nét về lập trình hàm từ đó đi sâu về các cú pháp cơ bản của ngôn ngữ lập trình hàm Elm và cách tạo các giao diện đồ họa và tìm hiểu các tín hiệu đầu vào tƣơng tác với chƣơng trình. Sau đó tôi sẽ đi sâu vào cơ chế vận hành của ngôn ngữ Elm với các tín hiệu để thấy rõ đƣợc điểm mạnh của của lập trình hàm phản ứng.
Cũng trong chƣơng này ta nghiên cứu về trình gỡ lỗi và lập trình tƣơng tác trong Elm. Chƣơng 3 sẽ áp dụng ngôn ngữ Elm vào để xây dựng một trò chơi nhỏ thể hiện rõ các đặc điểm của lập trình hàm phản ứng. Qua ứng dụng trò chơi cũng nhƣ các nghiên cứu thì luận văn tôi sẽ đƣa ra một số nhận xét, đánh giá, thảo luận về ƣu nhƣợc điểm của lập trình phản ứng trong chƣơng này. Nhờ những đánh giá này mà các nhà nghiên cứu và ngƣời lập trình có thể tiếp tục phát triển ngôn ngữ Elm dùng nó làm công cụ để tạo ra các ứng dụng mang tính tƣơng tác cao với ngƣời sử dụng.
10 z CHƢƠNG 1-GIỚI THIỆU VỀ LẬP TRÌNH PHẢN ỨNG 1.1 Giới thiệu lập trình phản ứng Lập trình phản ứng là một mô hình lập trình tập trung vào các luồng (flow) dữ liệu và sự lan truyền thay đổi của dữ liệu. Điều này có nghĩa chúng ta có thể biểu diễn các dòng dữ liệu tĩnh hoặc động trong ngôn ngữ lập trình và mô hình lập trình sẽ tự động lan truyền các thay đổi thông qua luồng dữ liệu này. [13] Ví dụ trong lập trình truyền thống (imperative programming) a:= b + c sẽ có nghĩa là gán các kết quả b + c cho a. Sau đó nếu ta gán cho b và c giá trị khác, thì giá trị của a không thay đổi theo.
Nhƣng trong lập trình phản ứng giá trị a sẽ tự động cập nhật khi chúng ta thay đổi giá trị của b hoặc c. Hay nhƣ một chƣơng trình bảng tính Excel là một ví dụ về lập trình phản ứng. Ví dụ ô (cell) A1 chứa công thức “=B1+C1”, thì giá trị của ô A1 này thay đổi khi chúng ta thay đổi giá trị ở ô B1 hoặc C1. Lập trình phản ứng chính cho phép ngƣời lập trình dễ dàng tạo ra các giao diện ngƣời dùng tƣơng tác, hình ảnh động cho các hệ thống thời gian thực, nhƣng vẫn tuân theo mô hình lập trình thông dụng.
Ví dụ trong kiến trúc MVC (Model- View-Controller) với lập trình phản ứng, chúng ta chỉ cần thay đổi mô hình thì giao diện sẽ tự động đƣợc cập nhật và ngƣợc lại khi ngƣời dùng thay đổi giá trị trên giao diện, thì giá trị đó cũng đƣợc tự động cập nhật trên mô hình. Ngôn ngữ lập trình phản ứng có thể thay đổi rất rõ ràng nơi mà các luồng dữ liệu đƣợc thiết lập bằng cách sử dụng các cấu trúc lập trình hàm có trong thƣ viện, ở đó các luồng dữ liệu đƣợc xây dựng từ các cấu trúc ngôn ngữ giống nhƣ lập trình truyền thống hay lập trình hàm. Ví dụ lập trình hàm phản ứng (functional reactive programming) là mô hình lập trình hàm với phong cách lập trình phản ứng đƣợc thực thi bởi một nút trong một đồ thị luồng dữ liệu đã đƣợc cấu trúc. Thƣ viện lập trình phản ứng dành cho các ngôn ngữ khá linh động cho phép xây dựng các nút để xử lý một sự kiện nào đó 11 z từ bên ngoài dựa vào thời gian thực thi chƣơng trình để cập nhật giá trị luồng dữ liệu.
Các nút trong đồ thị luồng dữ liệu là nơi mà chƣơng trình trao đổi thông tin với nhau. Lập trình phản ứng có thể hoàn toàn tĩnh nơi các luồng dữ liệu đƣợc thiết lập tĩnh hoặc là động nơi các dòng dữ liệu có thể thay đổi trong quá trình thực hiện chƣơng trình. Việc trao đổi dữ liệu trong đồ thị dòng dữ liệu tới phạm vi nào đó có thể làm dòng dữ liệu tĩnh trở thành động và có thể cấu trúc lại đồ thị dòng dữ liệu. Lập trình phản ứng có thể đƣợc gọi là bậc cao nếu trong chƣơng trình các luồng dữ liệu có thể tạo ra các luồng dữ liệu khác dẫn tới kết quả đầu ra của một luồng dữ liệu là một đồ thị luồng dữ liệu khác và cũng đƣợc thực hiện bằng các mô hình đánh giá nhƣ lúc đầu.
Trong lập trình phản ứng các tính toán thƣờng đƣợc lƣu trữ trong bộ nhớ và ở dạng dữ liệu cấu trúc. Khi một vài dữ liệu trong chƣơng trình thay đổi sẽ làm thay đổi toàn bộ dữ liệu có liên quan thay đổi theo, việc cập nhật dữ liệu có thể có nhiều cách nhƣng thông thƣờng nhất vẫn là giá trị đƣợc lƣu trữ lại và đƣợc gọi khi cần. Lập trình phản ứng có nhiều điểm giống với các mô hình thiết kế phần mềm chung thƣờng đƣợc sử dụng trong lập trình hƣớng đối tƣợng. Tuy nhiên việc tích hợp các khái niệm luồng dữ liệu vào các ngôn ngữ lập trình sẽ làm cho nó dễ dàng hơn để thể hiện chúng và làm tăng mức chi tiết của biểu đồ luồng dữ liệu.
Về cơ bản trong lập trình phản ứng luôn thể hiện đƣợc dữ liệu nhƣ là “giá trị thay đổi theo thời gian” chúng có thể đƣợc kết hợp, lọc, nối và chuyển đổi để cập nhật giá trị mới nhất. Lập trình phản ứng luôn mang tính hƣớng sự kiện và dữ liệu đƣợc mô hình thành các tín hiệu chứa giá trị hiện tại, thay đổi một cách rời rạc gọi là sự kiện. Các sự kiện này trên thực thực tế là một dòng sự kiện bất đồng bộ, hay cũng có thể nói lập trình phản ứng là lập trình với dòng dữ liệu bất đồng bộ.2 Lập trình phản ứng là luồng dữ liệu Lập trình phản ứng là một thuật ngữ đã trở nên phổ biến gần đây và nguồn gốc của nó xuất hiện là năm 1985. Trên bài báo“On the Development of Reactive Systems” đƣợc viết bởi (David Harel & Amir Pnueli, 1985) đã đƣợc định nghĩa về hệ thống phản ứng (reactive systems): “Các hệ phản ứng… là đƣợc lặp đi lặp lại ngay tức thời bởi các yếu tố bên ngoài và vai trò của chúng là đáp ứng liên tục với các dữ liệu đầu vào từ bên ngoài.”[7] Một vài năm sau đó vào năm 1989 trong bài báo “Real Time Programming: Special Purpose or General Purpose Languages” của (Gerard Berry, 1989) đã tập trung vào khía cạnh phần mềm: “ Hệ phản ứng là điểm thuận lợi để phân biệt giữa ba loại chƣơng trình máy tính.
Chƣơng trình trao đổi thông tin tính toán từ một tập hợp các yếu tố đầu vào; ví dụ điển hình là các trình biên dịch hoặc các chƣơng trình tính toán số. Các chƣơng trình tƣơng tác tƣơng tác phản ứng ở tốc độ của riêng của chúng với ngƣời dùng hoặc với các chƣơng trình khác. Các chƣơng trình phản ứng cũng duy trì tính tƣơng tác liên tục với môi trƣờng của chúng và đƣợc quyết định bởi môi trƣờng. Các chƣơng trình tƣơng tác làm việc ở tốc độ của riêng chúng và chủ yếu là đối phó với các thông tin liên lạc, trong khi đó chƣơng trình phản ứng chỉ làm việc để đáp ứng với nhu cầu bên ngoài và chủ yếu là xử lý chính xác các sự sự kiện diễn ra.” [8] Vì vậy ta có thể nói rằng lập trình phản ứng gồm các yếu tố sau: [2] Xử lý đáp ứng các yêu cầu bên ngoài.
Chủ yếu là xử lý song song các luồng dữ liệu. Điều chỉnh thay đổi phù hợp với dữ liệu đầu vào. Dùng để thực hiện các vấn đề liên quan đến tính tƣơng tác và thƣờng xuyên thay đổi thông tin. 13 z Chúng ta cùng tìm hiểu khái niệm luồng dữ liệu là khi dữ liệu điều khiển thực thi chƣơng trình và kiểm tra các dữ liệu đầu vào sau đó phản ứng với sự thay đổi dữ liệu, cập nhật bất cứ khi nào dữ liệu mới đến.
Bất kỳ hệ thống nào mà ở đó dữ liệu di chuyển giữa các đơn vị mã và đƣợc kích hoạt thực thi chúng có thể đƣợc gọi là luồng dữ liệu trong đó bao gồm các hệ thống phản ứng. Vì vậy ta xem xét lập trình phản ứng là một tập hợp con của luồng dữ liệu nhƣng là một nhóm khá lớn. Trong trƣờng hợp bình thƣờng lập trình phản ứng đƣợc coi nhƣ là một từ đồng nghĩa với luồng dữ liệu. [2] Luồng dữ liệu nhƣ là một mô hình kết nối giữa các đối tƣợng trong một ứng dụng, trong chƣơng trình nó sẽ phản ứng một cách khá hiệu quả với những thay đổi dữ liệu đầu vào từ môi trƣờng bên ngoài vào.
Các nhà nghiên cứu đã tìm hiểu và phát triển những cái lợi thế của các ràng buộc của luồng dữ liệu bằng việc nhúng luồng dữ liệu vào các ngôn ngữ lập trình nhằm xử lý các ràng buộc giữa các giá trị của các đối tƣợng dựa trên các sự kiện tác động bên ngoài cái mà chúng ta thƣờng gọi là phản ứng. Với phƣơng pháp này các đối tƣợng sẽ đƣợc khai báo nhƣ các kiểu dữ liệu căn bản, dữ liểu mảng, con trỏ hay dữ liệu cấu trúc và việc định nghĩa ràng buộc các câu lệnh sẽ tự động tái xử lý các đầu vào thay đổi trong bộ nhớ làm cho chƣơng trình chúng ta hoạt động nhƣ một bảng tính mà các giá trị của biến này phụ thuộc vào biến kia. Một số tính năng của dòng dữ liệu: Dataflow có khả năng quản lý song song các luồng dữ liệu. Dataflow là đáp ứng với sự thay đổi dữ liệu thông qua các sự kiện.
Giá trị truyền vào thay đổi thì dòng dữ liệu thay đổi theo. Dataflow nhƣ sự thay thế cho phƣơng pháp “callback hell”. Dataflow nhƣ một đồ thị chứa tập các nút và khi dữ liệu đến nó sẽ đƣợc xử lý và thực thi một nhiệm vụ nào đó nếu đƣợc yêu cầu từ bên ngoài. 14 z Lập trình phản ứng đƣợc coi là lập trình với các dòng dữ liệu không đồng bộ.