Ngôn ngữ lập trình luồng dữ liệu [đã đóng]


77

Ngôn ngữ lập trình luồng dữ liệu là gì? Tại sao sử dụng nó? Và có bất kỳ lợi ích cho nó?


1
Cảm ơn Tôi chỉ học được những điều mới mẻ
JoshBerke

Các chương trình Dataflow có thể được thực thi trong không gian (tưởng tượng như dây chuyền nhà máy), nơi các chương trình Controlflow tiêu chuẩn được thực thi kịp thời. Xem: openspl.org/what-is-openspl để biết thêm thông tin.
Nemanja Trifunovic

Câu trả lời:


106

Trong ngôn ngữ luồng điều khiển, bạn có một luồng hướng dẫn hoạt động trên dữ liệu bên ngoài. Thực thi có điều kiện, các bước nhảy và các lệnh gọi thủ tục thay đổi dòng lệnh được thực thi. Điều này có thể được coi là các lệnh chạy qua dữ liệu (ví dụ, các lệnh hoạt động trên các thanh ghi được tải bằng dữ liệu bởi các lệnh - dữ liệu là tĩnh trừ khi dòng lệnh di chuyển nó). Câu lệnh "if" của luồng điều khiển nhảy đến nhánh chính xác trong luồng lệnh, nhưng dữ liệu không được di chuyển.

Trong ngôn ngữ luồng dữ liệu, bạn có một luồng dữ liệu được chuyển từ lệnh này sang lệnh khác để được xử lý. Thực thi có điều kiện, các bước nhảy và các lệnh gọi thủ tục định tuyến dữ liệu đến các lệnh khác nhau. Điều này có thể được coi là dữ liệu chảy qua các hướng dẫn tĩnh khác như cách tín hiệu điện chảy qua mạch hoặc nước chảy qua đường ống. Câu lệnh "if" luồng dữ liệu sẽ định tuyến dữ liệu đến nhánh chính xác.

Một số ví dụ về các tính năng và ngôn ngữ của luồng dữ liệu:

Ngôn ngữ văn bản

Ngôn ngữ trực quan

Các sản phẩm nhúng ngôn ngữ luồng dữ liệu trực quan:


Thêm vào danh sách ít được biết đến hơn:
Thịt bò

nhau được gọi là expecco, hoàn chỉnh với giao diện đồ họa (google và tải về bản demo)
blabla999

Ví dụ về cái gì đó KHÔNG phải là luồng dữ liệu?
PlayingPuzzles

Hầu hết các ngôn ngữ không được liệt kê ở trên. C ++, Java, Python, COBOL và khá nhiều bất kỳ ngôn ngữ nào khác bắt buộc trên mạng, hầu hết các ngôn ngữ OO, ngôn ngữ chức năng nhất, ngôn ngữ lập trình logic như Prolog vv vv

1
Tại sao không ai đề cập đến đường ống Unix như một ví dụ phổ biến về lập trình luồng dữ liệu? Ngay cả Wikipedia cũng không đề cập đến nó. Có cái gì đó làm mất tư cách của nó?
Sridhar Sarnobat

27

Ngôn ngữ lập trình luồng dữ liệu là ngôn ngữ tập trung vào trạng thái của chương trình và khiến các hoạt động xảy ra theo bất kỳ thay đổi nào trong trạng thái. Các ngôn ngữ lập trình luồng dữ liệu vốn tồn tại song song, bởi vì các hoạt động dựa trên các đầu vào mà khi gặp nhau sẽ khiến hoạt động thực thi. Điều này có nghĩa là không giống như một chương trình bình thường, nơi một hoạt động được theo sau bởi hoạt động tiếp theo, trong một chương trình luồng dữ liệu, các hoạt động của chương trình sẽ thực thi miễn là các đầu vào được đáp ứng và do đó không có thứ tự thiết lập.

Thông thường các ngôn ngữ lập trình luồng dữ liệu sử dụng một bảng băm lớn trong đó các khóa là dữ liệu của chương trình và các giá trị của bảng là con trỏ đến các hoạt động của chương trình. Điều này làm cho các chương trình đa lõi dễ tạo hơn bằng ngôn ngữ lập trình luồng dữ liệu, vì mỗi lõi chỉ cần bảng băm để hoạt động.

Một ví dụ phổ biến của ngôn ngữ lập trình luồng dữ liệu là một chương trình bảng tính trải rộng có các cột dữ liệu bị ảnh hưởng bởi các cột dữ liệu khác. Nếu dữ liệu trong một cột thay đổi, dữ liệu khác trong các cột khác có thể sẽ thay đổi theo nó. Mặc dù chương trình bảng tính là ví dụ phổ biến nhất của ngôn ngữ lập trình luồng dữ liệu, nhưng hầu hết chúng có xu hướng là ngôn ngữ đồ họa.


1
+1 vì bạn đã chia sẻ những gì bạn học được kể từ khi bạn đặt câu hỏi này.
edymtt

2
Cảm ơn. Dễ hiểu hơn câu trả lời được chấp nhận.
tomekwi

17

Một loại lập trình luồng dữ liệu là lập trình phản ứng . Khi phong cách lập trình này được sử dụng trong một ngôn ngữ chức năng, nó được gọi là lập trình phản ứng chức năng . Một ví dụ về ngôn ngữ lập trình phản ứng chức năng cho web là Flapjax .

Ngoài ra, anic là một ngôn ngữ luồng dữ liệu được thảo luận gần đây trên Hacker News.

Một ví dụ khác là Martlet từ Oxford.


1
+1 để đề cập đến lập trình phản ứng.
Ngày 12

Thật thú vị, câu trả lời này dẫn đến một cuộc thảo luận trên SO: " stackoverflow.com/questions/30685707/… ". Nó có thể phụ thuộc vào định nghĩa học thuật liệu chương trình phản ứng và luồng dữ liệu có giống nhau hay không. Tôi có thể đồng ý rằng đó là "một kiểu lập trình luồng dữ liệu".
mihca

9

Dataflow ngôn ngữ lập trình kiến nghị để cô lập một số hành vi địa phương trong cái gọi là " diễn viên ", mà có nghĩa vụ phải chạy song song và trao đổi dữ liệu thông qua các kênh truyền hình point-to-point. Không có khái niệm về bộ nhớ trung tâm (cho cả mã và dữ liệu) không giống như mô hình Von Neumann của máy tính .

Những tác nhân này sử dụng mã thông báo dữ liệu trên đầu vào của họ và tạo ra dữ liệu mới trên đầu ra của họ.

Định nghĩa này không áp đặt các phương tiện để chạy điều này trong thực tế. Tuy nhiên, việc sản xuất / tiêu thụ dữ liệu cần được phân tích cẩn thận: ví dụ: nếu tác nhân B không sử dụng cùng tốc độ với tác nhân A tạo ra dữ liệu, thì giữa chúng cần có một bộ nhớ không giới hạn tiềm năng (FIFO). . Nhiều vấn đề khác có thể phát sinh như bế tắc .

Trong nhiều trường hợp, phân tích này sẽ thất bại vì sự đan xen của các hành vi bên trong là khó thực hiện (vượt quá tầm của các phương pháp chính thức ngày nay).

Mặc dù vậy, các ngôn ngữ lập trình luồng dữ liệu vẫn hấp dẫn trong nhiều lĩnh vực :

  • chẳng hạn để xác định các mô hình tham chiếu cho mã hóa video: một chương trình C thuần túy sẽ không thực hiện công việc vì nó đưa ra giả định rằng mọi thứ chạy như một chuỗi hoạt động, điều này không đúng trong máy tính (đường ống dẫn, VLIW, mutlicores và VLSI) . Có lẽ bạn có thể xem qua: luận án Tiến sĩ gần đây . Ngôn ngữ luồng dữ liệu CAL được đề xuất làm ngôn ngữ hợp nhất cho tham chiếu bộ mã hóa / giải mã video thế hệ tiếp theo.
  • Nhiệm vụ quan trọng khi yêu cầu an toàn: nếu bạn thêm một số giả định mạnh mẽ về việc sản xuất / tiêu thụ dữ liệu, thì bạn sẽ có được một ngôn ngữ có tiềm năng mạnh mẽ về tạo mã, bằng chứng, v.v. (xem các ngôn ngữ đồng bộ )

5

Excel (và các bảng tính khác) về cơ bản là ngôn ngữ luồng dữ liệu. Ngôn ngữ luồng dữ liệu rất giống các ngôn ngữ lập trình hàm, ngoại trừ việc các giá trị ở bên trái của toàn bộ biểu đồ chương trình hoàn toàn không phải là giá trị, mà là các biến (hoặc luồng giá trị), vì vậy khi chúng thay đổi, các thay đổi sẽ gợn sóng và chảy lên đồ thị .


1
Tôi không đồng ý; các trình giải quyết ràng buộc thường hoạt động bằng cách khám phá optima trong không gian tìm kiếm bằng cách phổ biến các ràng buộc. Bảng tính truyền các giá trị chứ không phải các ràng buộc.
Barry Kelly

1
Giải quyết là một tính năng bổ sung mà hầu hết mọi người không sử dụng. Và cây cối cũng là đồ thị; hơn nữa, nếu bất kỳ hai ô nào tham chiếu đến cùng một ô thứ ba, chúng tạo thành một dag và không còn là một cây nữa.
Barry Kelly

4
"Bảng tính truyền các giá trị chứ không phải các ràng buộc." Đúng, luồng giá trị là thứ khiến nó trở thành "luồng dữ liệu".

5

Mozart có hỗ trợ đồng bộ hóa giống như luồng dữ liệu và nó có một số ứng dụng thương mại. Bạn cũng có thể tranh luận rằng make là một ngôn ngữ lập trình luồng dữ liệu.


Cảm ơn đã đề cập đến thực hiện. Đó là thứ đã đưa tôi đến đây. Cunieform dường như là một sự tổng quát hóa của nó.
masterxilo

2

Nhiều công cụ ETL cũng nằm trong lĩnh vực này. Các tác vụ luồng dữ liệu trong MS SSIS là một ví dụ điển hình. Công cụ đồ họa trong trường hợp này.


2

Nó thực sự là một khái niệm khá cũ - vào những năm 1970, thậm chí còn có một ngôn ngữ + máy được xây dựng để lập trình và thực thi luồng dữ liệu hiệu quả ( Manchester Dataflow Machine ).

Điều tuyệt vời về nó là tính hai mặt của nó đối với các ngôn ngữ chức năng lười biếng như Haskell. Do đó, nếu các bước xử lý của bạn là thuần chức năng và cho phép bạn có đủ đơn vị xử lý để đánh giá chúng và chuyển kết quả xung quanh, bạn sẽ có được tính song song tối đa miễn phí - tự động và không cần nỗ lực lập trình!


1

Có một số lĩnh vực nhất định mà lập trình luồng dữ liệu có ý nghĩa hơn nhiều. Phương tiện thời gian thực là một ví dụ và hai môi trường lập trình luồng dữ liệu đồ họa được sử dụng rộng rãi, Pure Data và Max / MSP, đều tập trung vào lập trình phương tiện thời gian thực. Tôi cho rằng bản chất trực quan của chúng cũng ánh xạ độc đáo đến lập trình luồng dữ liệu.


1

Bạn có thể thử Cameleon : www.shinoe.org/cameleon , nó có vẻ đơn giản để sử dụng. Đó là một ngôn ngữ đồ họa để lập trình chức năng có cách tiếp cận luồng dữ liệu (công việc).

Nó được viết bằng C ++, nhưng nó có thể gọi bất kỳ loại chương trình cục bộ hoặc chương trình xa nào được viết bằng bất kỳ ngôn ngữ lập trình nào.

Nó có một cách tiếp cận đa quy mô và dường như đã hoàn chỉnh Turing (đây là một phần mở rộng ròng của Petri ).


a |> f = fa. Luồng dữ liệu này có trong Haskell không (nó lấy giá trị trung bình của danh sách các mục từ 1..200)? [1..200] |> map (* 5) |> filter (> 66) |> Dup (sum, length) |> unsurry (div) trong đó replic (f1, f2) v = (f1 v, f2 v)
aoeu256
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.