Ngôn ngữ lập trình trong đó mọi chức năng gọi / chặn được thực hiện trong một luồng riêng biệt? [đóng cửa]


26

Tôi hiện đang tạo một ngôn ngữ lập trình cho vui, trong đó ý tưởng là mọi hàm gọi / khối mới (nếu mệnh đề, vòng lặp, v.v.) sẽ hoạt động trong một luồng riêng biệt. Thay vì tạo Chủ đề mới, tiêu chuẩn nên tự động thực hiện và nếu bạn muốn nó chạy trong luồng chính, bạn sẽ phải chỉ định điều đó.

Tôi không được thông báo về lập trình song song, đa luồng nhưng tôi biết những điều cơ bản (Tương lai, đối tượng an toàn của luồng). Vì vậy, tôi tự hỏi làm thế nào một ngôn ngữ như vậy có thể trông cú pháp khôn ngoan và nếu nó thậm chí có thể bắt đầu với? Mục tiêu không phải là làm cho nó "hữu ích", nó mang lại nhiều niềm vui cho nó và trải nghiệm học tập.

(Tôi xin lỗi nếu đây là nơi đăng sai. Nếu vậy tôi rất sẵn lòng đánh giá cao nếu bạn chỉ cho tôi đến đúng nơi cho phép một câu hỏi như của tôi.)


17
Tạo chủ đề rất đơn giản. Thủ thuật với đa luồng là khi họ cần nói chuyện với nhau hoặc làm việc với cùng một tài nguyên. Nói cách khác, đó không phải là một thử thách khó khăn, đó là sự tham gia. Vấn đề chính bạn cần giải quyết là làm thế nào bạn kiểm soát điều đó.
JimmyJames

20
IMO, bạn không thể làm điều đó mà không nghiêm túc kéo dài định nghĩa thông thường của từ "hàm" hoặc từ "luồng". Bạn có thể muốn đọc về các diễn viên nếu bạn chưa quen thuộc với họ: en.wikipedia.org/wiki/Actor_model
Solomon Slow

9
Nhận đủ chi tiết và bạn sẽ thấy rằng CPU đã tự động song song hóa các hướng dẫn mà không gây thêm gánh nặng nào cho nhà phát triển phần mềm. Xem Bộ xử lý siêu thựcđặt hàng ngoài đơn hàng .
8bittree

8
Điều đó thực sự nghe có vẻ kinh khủng. Tôi sẽ giải thích lý do tại sao, nhưng Karl Bielefeldt đã làm.
Mason Wheeler

1
Loại mô hình nào bạn muốn hỗ trợ trong ngôn ngữ của bạn? Nó là bắt buộc hay chức năng? Bạn có nói rằng tất cả các câu lệnh sẽ được thực thi cùng một lúc - các khối sau đó / khối khác cùng với những gì xuất hiện sau chúng không?
Bergi

Câu trả lời:


39

mỗi hàm gọi / khối mới (nếu mệnh đề, vòng lặp, v.v.) sẽ hoạt động trong một luồng riêng biệt.

Đọc nhiều hơn về sự tiếp nốiphong cách tiếp tục (và mối quan hệ của chúng với các chủ đề hoặc coroutines) Tôi đề nghị đọc SICP & Lisp trong các mảnh nhỏ . Ngoài ra, Ngôn ngữ lập trình thực dụng cung cấp một cái nhìn tổng quan hữu ích về một số ngôn ngữ và sẽ giúp bạn thiết kế ngôn ngữ của riêng bạn.

Vì vậy, tôi tự hỏi làm thế nào một ngôn ngữ như vậy có thể nhìn cú pháp khôn ngoan

Cú pháp không quan trọng lắm cho việc khám phá ý tưởng . Ngữ nghĩa quan trọng hơn nhiều. Tôi đề nghị áp dụng một số cú pháp giống như S-expr (vì vậy ban đầu bạn có thể sử dụng Scheme và cuộc gọi / cc của nó ).

Khi ý tưởng của bạn rõ ràng hơn (sau một số thử nghiệm), bạn có thể thảo luận chúng trên lambda-the-Ultimate , bạn có thể xác định một cú pháp gợi cảm hơn (điều thực sự quan trọng nếu bạn muốn mọi người chấp nhận ngôn ngữ của bạn và điều quan trọng là chất lượng triển khai, triển khai mẫu phần mềm miễn phí, tài liệu, thư viện chuẩn, giao diện chức năng nước ngoài, v.v.)


25
+1 cho việc đề cập tại sao cú pháp không liên quan. +1 khác nếu tôi có thể giải thích tại sao cú pháp rất quan trọng.
Jörg W Mittag

Đề xuất tốt, nhưng để thảo luận về nội dung trên LtU, bạn muốn có một tài khoản và việc lấy kinh nghiệm của tôi không phải là chuyện nhỏ.
Mael

1
Bạn nên sử dụng một nhóm chủ đề để giảm chi phí. vi.wikipedia.org/wiki/Thread_pool
Shawnhcorey

37

Bạn có thể quan tâm đến việc đọc về nghiên cứu dữ liệu song song Haskell . Nếu bạn tìm kiếm trên youtube, Simon Peyton Jones cũng đã đưa ra một số cuộc nói chuyện thú vị liên quan đến chủ đề này.

Nếu tôi nhớ lại chính xác từ các cuộc nói chuyện của anh ấy, trong lập trình chức năng thuần túy, việc tìm cơ hội để tạo ra các chủ đề gần như là chuyện nhỏ. Vấn đề chính của ông trong nghiên cứu của mình là có quá nhiều thứ quá ngắn ngủi, như vậy là quá trình tạo ra các luồng và truyền đạt kết quả của chúng về cơ bản vượt xa lợi ích của việc xử lý song song. Ví dụ, thật dễ dàng để dạy một trình biên dịch quay 100 luồng để tính toán sum $ fmap (+1) <100 length vector>, nhưng liệu chi phí có làm cho nó đáng giá không?

Thủ thuật sau đó là hợp nhất các luồng thành các kích thước có lợi, mà không đặt ra gánh nặng cho lập trình viên để biểu thị điều đó bằng tay. Đây là một vấn đề khó khăn cần phải được bẻ khóa để sử dụng hiệu quả các PC trong tương lai với hàng ngàn lõi.


8
Tôi đã rất vui khi được làm việc với một PC lỗi thời chỉ với hàng trăm lõi ...
Hagen von Eitzen

8
Tôi xin lưu ý rằng đối với các thiết kế song song dữ liệu, chúng tôi đã thực hiện rất nhiều việc song song hóa rất hiệu quả: GPU về cơ bản là 200-1000 máy lõi (chúng thậm chí còn có hệ thống phân cấp bộ nhớ riêng).
Delioth

4
@HagenvonEitzen: Azul Vega JCA (Công cụ tính toán Java) có 16 CPU với 54 lõi mỗi lõi cho tổng số 864 lõi và đó không phải là máy nguyên mẫu hoặc cấp độ nghiên cứu, mà là một sản phẩm thực sự. Nó cũng không lấp đầy toàn bộ tòa nhà hoặc thậm chí toàn bộ căn phòng, đó là một thiết bị có kích thước mặt bàn. Và nó đã có sẵn 9 năm trước. GPU đã được đề cập, tuy nhiên, đây là một cỗ máy có 864 lõi CPU cho mục đích chung .
Jörg W Mittag

3
Tất nhiên, có một lý do tại sao chúng tôi làm có ngày hôm nay những người khổng lồ dữ liệu song song GPU, nhưng không còn những đồ sộ CPU đa lõi là cho máy tính để bàn. Cái trước là khả thi về mặt thương mại, cái sau không, và đó là vì bạn không thể lập trình chúng một cách hiệu quả.
MSalters

@MSalters có lẽ chúng ta chỉ cần một số lượng khỉ vô hạn? Hoặc, các chương trình lượng tử chỉ đơn giản là chạy mọi hoạt động có thể ở mỗi bước?

15

Đây chính xác là những gì Erlang làm. Nó xử lý nối lại các chủ đề bằng cách sử dụng hàng đợi. Đó là một khái niệm tuyệt vời nhưng hơi khó khăn để quấn đầu bạn nếu nền tảng của bạn là ngôn ngữ loại thủ tục hơn. Tôi rất khuyên bạn nên nhìn vào nó.


4

Trước tiên tôi khuyên bạn nên xem PROMELA , một ngôn ngữ được sử dụng để mô tả thuật toán đồng thời để trình kiểm tra mô hình có thể bắt buộc tất cả các thực thi có thể để xác minh rằng nó không có khả năng hành vi không chính xác. (Lập trình đồng thời nổi tiếng là khó để có được quyền, đó là lý do kỹ thuật xác minh như vậy rất quan trọng.) Nó không chạy tất cả các cấu trúc trong chủ đề riêng biệt, nhưng nó không có cú pháp khá kỳ quặc và ngữ nghĩa vì trọng tâm của nó là nondeterminism của chương trình đồng thời.

Tóm tắt hơn, phép tính π là một cách tiếp cận đẹp để mô hình hóa tính toán song song. Thật khó để có được cái đầu của bạn xung quanh trừ khi bạn có được cuốn sách Giao tiếp và Hệ thống di động: Tính toán Pi , của Robin Milner. Nó giúp tôi suy nghĩ về tính toán song song theo nghĩa rộng hơn là "nhiều luồng truy cập vào bộ nhớ dùng chung". Điều khá thú vị là làm thế nào các câu lệnh có điều kiện, "gotos" và vv có thể được xây dựng từ các nguyên thủy song song đơn giản hơn.

Liên quan đến cú pháp ... cách tốt nhất để giải quyết vấn đề này là viết một số chương trình mẫu. Viết chương trình sắp xếp một mảng hoặc ping đồng thời một số máy chủ và báo cáo máy chủ nào phản hồi nhanh nhất hoặc cố gắng giải quyết song song một mê cung hoặc không có gì. Trong khi bạn đang làm điều này, những điều còn thiếu trong cú pháp của bạn sẽ trở nên rõ ràng và bạn có thể thêm chúng. Sau khi bạn đã thêm một số điều, hãy tự hỏi mình xem chúng có điểm gì chung không, và nếu vậy có lẽ bạn có thể tìm thấy một cách tiếp cận đơn giản hơn có thể phục vụ nhiều mục đích.


4

Các dự án tương tự đã được cố gắng trong quá khứ. Tôi đề nghị đọc lên các tác phẩm kinh điển để loot ý tưởng. (Tất cả các liên kết đến Wikipedia)

  • Unity Ngôn ngữ này đã / được sử dụng để dạy lập trình song song. Tôi không nghĩ rằng nó đã được thực hiện. Cú pháp có phần khó hiểu, nhưng về cơ bản, bạn có một tập hợp các câu lệnh thực thi theo thứ tự không xác định và lặp đi lặp lại cho đến khi không còn gì để làm. Đây là gần nhất với những gì bạn yêu cầu.

  • Occam Ngôn ngữ này được thiết kế để thực sự sử dụng nhưng nó không bao giờ thực sự bắt kịp. Ở đây có một PAR từ khóa có nghĩa là một danh sách các câu lệnh nên được thực thi song song.

  • Erlang Một ngôn ngữ trong thế giới thực. Công cụ này được sử dụng bởi công ty viễn thông Ericsson và có khá nhiều điều sau đây. Họ đã đặt rất nhiều công việc để làm cho sự song song trở nên thiết thực và có thể sử dụng được.

  • Google GO Đây là nhóm yêu thích của tôi. Về mặt khái niệm giống như Erlang, nhưng với cú pháp tốt hơn và sức nặng của Google đằng sau nó. Điều gì có thể sai đi?

Tôi muốn kết thúc với một cảnh báo: Song song là rất khó để có được đúng. Hầu hết các lỗi trong các chương trình hiện đại là kết quả của việc sai . Bạn có chắc chắn muốn đến đó?


Không có ý định xúc phạm đến bất kỳ ngôn ngữ nào không có trong danh sách của tôi. Chỉ là kiến ​​thức của tôi bị hạn chế.
Stig Hemmer

3

Có thể nhưng nó sẽ không hữu ích cho 99 +% của tất cả các ứng dụng đáng suy nghĩ. Logic là kiểu chữ bị ràng buộc theo trình tự, nó là một dòng chảy. Từng bước bạn đạt được giải pháp cho một vấn đề và thứ tự các bước có vấn đề, chủ yếu là vì đầu ra của một bước sẽ là đầu vào cho bước tiếp theo.

Trong một số trường hợp, bạn có rất nhiều nhiệm vụ có thể được thực hiện độc lập với nhau, việc đặt chúng tuần tự trước khi để chúng chạy song song là rất rẻ.

Vì vậy, tôi nghĩ rằng thời gian của bạn sẽ tốt hơn dành cho việc học cách sử dụng các tính năng đa luồng trong ngôn ngữ lập trình yêu thích của bạn.


5
Đây là một câu trả lời tuyệt vời cho một câu hỏi khác nhau; OP không hỏi về sự khôn ngoan của sơ đồ như vậy mà chỉ là liệu nó có thể được thực hiện hay không và "cú pháp" sẽ như thế nào.
DepressionDaniel

9
Những người không yêu cầu nó là cần sự khôn ngoan của tôi nhất. Nếu ai đó hỏi liệu có thể xuống đồi trong giỏ hàng hay không, câu trả lời tốt nhất sẽ không phải là "Bạn đặt cược! Hãy chắc chắn để bôi trơn bánh xe của họ!". Nó sẽ giống như "Vâng, vâng, nhưng ...".
Martin Maat

Nhắc nhở tôi về hướng dẫn ngôn ngữ lắp ráp EIAO cũ - Thực hiện theo bất kỳ thứ tự nào . (Và dù sao đó là Chìa khóa nào?)

@MartinMaat không ai sẽ tự sát bằng cách viết một ngôn ngữ lập trình cho vui
user253751

2

Clojure có thể đáng xem cho một số ý tưởng.

http://clojure-doc.org/articles/lingu/concurrency_and_abulism.html

Dưới đây là một số suy nghĩ: Nếu chúng ta gọi một đơn vị tính toán có thể được thực hiện độc lập là một nhiệm vụ: 1. Nhiệm vụ là độc lập nên có thể được chạy đồng thời 2. Các nhiệm vụ khác nhau đòi hỏi các tài nguyên khác nhau và mất thời gian khác nhau để chạy 3. Do đó, các tác vụ nên được lên lịch cho thông lượng tối đa 4. Chương trình duy nhất ở vị trí đóng vai trò là người lập lịch là hệ điều hành

Những thứ như táo công văn trung tâm là một nỗ lực để cung cấp một lịch trình như vậy.

Điều trên có nghĩa là trách nhiệm thực thi các nhiệm vụ không nhất thiết là của ngôn ngữ lập trình.

Một suy nghĩ thứ hai là giảm gánh nặng lập trình các hệ thống song song càng nhiều càng tốt. Cách duy nhất để làm điều này là loại bỏ bất kỳ đặc điểm kỹ thuật nào về cách thực hiện một cái gì đó khỏi chương trình. Một chương trình chỉ nên xác định những gì nên được thực hiện và phần còn lại sẽ tự động xảy ra.

Ở trên có lẽ có nghĩa là các ngôn ngữ động và chỉ trong thời gian biên dịch là cách để đi.


2

Những gì bạn đang tìm kiếm được gọi là song song ngầm, và có những ngôn ngữ đã khám phá khái niệm này, như Pháo đài của Sun / Oracle . Trong số những thứ khác, nó (có khả năng) chạy các vòng trong parallell.

Thật không may, nó đã bị ngừng và có rất nhiều liên kết chết ngoài đó, nhưng bạn vẫn có thể tìm thấy một vài tệp PDF trôi nổi ở đó, nếu bạn đủ cứng:

https://www.eecis.udel.edu/~cavazos/cisc879-spring2008/ con /fortress.pdf (thông số ngôn ngữ)

http://stephane.ducasse.free.fr/Teaching/CoursAnnecy/0506-Master/ForPftimeations/Fortress-PLDITutorialSlides9Jun2006.pdf

http://www.oracle.com/technetwork/systems/ts-5206-159453.pdf

http://dl.acm.org/citation.cfm?id=1122972 (trả tiền)

Đáng chú ý là bạn thường không muốn bắt đầu một luồng thực tế cho mọi câu lệnh / biểu thức, vì việc tạo và bắt đầu các luồng có xu hướng tốn kém - thay vào đó, bạn có nhóm các luồng mà bạn đăng các bit công việc cần thực hiện . Nhưng đó là một chi tiết thực hiện.


1
+1 cho Pháo đài phù hợp ... Tôi rất thích ý tưởng về ngôn ngữ này. Tôi thực sự rất buồn khi họ thông báo rằng việc phát triển đã bị ngừng lại ...
Roland Tepp

2

Mặc dù không phải là một ngôn ngữ lập trình như vậy, bạn nên xem VHDL . Nó được sử dụng để mô tả mạch kỹ thuật số, tự nhiên làm mọi thứ song song trừ khi bạn đặc biệt bảo nó làm điều đó một cách thanh thản. Nó có thể cung cấp cho bạn một số ý tưởng cả về cách thiết kế ngôn ngữ của bạn và loại logic nào có thể phù hợp với nó.


0

Điều này có thể được mô phỏng khá dễ dàng trong C ++. Chỉ cần chắc chắn rằng lệnh gọi "mọi" * được thực hiện bởi a std::future. Xử lý giá trị trả lại được thực hiện đơn giản bằng cách gọi .get()về tương lai.

Do đó, bạn có thể tạo nguyên mẫu ngôn ngữ của mình bằng cách biên dịch sang C ++. Điều này cũng cho chúng ta biết cú pháp sẽ như thế nào: điểm khác biệt chính là bạn tách điểm gọi (nơi cung cấp đối số đầu vào) khỏi điểm trả về (nơi sử dụng đầu ra chức năng).

(*) Tôi nói "mọi chức năng" nhưng tùy thuộc vào chức năng của bạn. Là memsetmột nội tại hay một chức năng? Việc gán các số nguyên hay gán các kiểu do người dùng định nghĩa là một hàm gọi?


Và, nếu bạn trì hoãn trả lời một câu hỏi đủ lâu, thường thì nhu cầu trả lời sẽ biến mất. Tôi nghĩ rằng điều này được gọi là "Hiện tại lười biếng".
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.