Có thể cho một ngôn ngữ lập trình dựa trên ngăn xếp được đồng thời?


14

Tôi đã đọc về các ngôn ngữ lập trình dựa trên ngăn xếp, chẳng hạn như FORTHCat , và dường như với bản chất của chúng, chúng chỉ có thể thực hiện một hành động tại một thời điểm bất kể mô hình của chúng (FORTH là bắt buộc trong khi Cat là chức năng).

Một ngôn ngữ bắt buộc sẽ sửa đổi ngăn xếp và một ngôn ngữ hoàn toàn có chức năng, chẳng hạn như Joy , sẽ trả về một ngăn xếp mới, nhưng điểm quan trọng là chỉ có một ngăn xếp được sử dụng tại một thời điểm.

Vì vậy, ngôn ngữ lập trình dựa trên ngăn xếp có thể đồng thời? Họ có thể đạt được đồng thời bằng cách sử dụng nhiều ngăn xếp cùng một lúc hoặc một cái gì đó giống nhau không?

Có thể thực hiện đánh giá lười biếng trong một ngôn ngữ lập trình dựa trên ngăn xếp?

Vui lòng sửa cho tôi nếu tôi hiểu nhầm bất cứ điều gì về các ngôn ngữ và khái niệm được đề cập ở trên


5
Làm thế nào bất kỳ ngôn ngữ mệnh lệnh có thể được đồng thời?
Bergi


Bạn có thực sự có nghĩa là đồng thời (điều này không quá khó để đạt được, chỉ cần sử dụng nhiều luồng chạy với các ngăn xếp độc lập cộng với bộ nhớ dùng chung) hoặc song song?
Daniel Jour

@DanielJour nếu tôi hiểu rõ, song song có nghĩa là thực thi đồng thời trong khi đồng thời có nghĩa là thực thi độc lập, vì vậy, vâng, ý tôi là đồng thời. Bạn có thể giải thích thêm về các ngăn xếp độc lập cho mỗi luồng không?
Armando H.

Câu trả lời:


16

Vì vậy, ngôn ngữ lập trình dựa trên ngăn xếp có thể đồng thời?

Chắc chắn rồi.

Họ có thể đạt được đồng thời bằng cách sử dụng nhiều ngăn xếp cùng một lúc hoặc một cái gì đó giống nhau không?

Đã cho các ngôn ngữ bình thường đa luồng thường có nghĩa là có nhiều ngăn xếp "cuộc gọi". Sẽ là hoàn toàn tự nhiên khi cung cấp cho mỗi luồng dữ liệu ngăn xếp dữ liệu riêng của mình. Thật đơn giản để có một diễn viên, giả sử, cơ thể của họ được thực thi bằng mã bằng ngôn ngữ dựa trên ngăn xếp. Song song rõ ràng parcác chú thích của la GHC nên đơn giản một cách hợp lý. Vấn đề chính với việc thực thi các thứ song song là bạn không biết hiệu ứng ngăn xếp của mã sẽ là gì cho đến khi bạn thực thi nó. Tuy nhiên, sử dụng cú pháp giống như Joy, người ta có thể tưởng tượng [a b c] parnhư đang thực thia b choặc chống lại một ngăn xếp trống hoặc một bản sao của ngăn xếp và chỉ giữ phần tử trên cùng của ngăn xếp khi hoàn thành (hoặc đẩy một số giá trị giả nếu ngăn xếp trống). Bạn có thể tưởng tượng các biến thể. Song song tiềm ẩn sẽ khó thực hiện một cách ngây thơ so với, nói, một ngôn ngữ hoàn toàn chức năng, nhưng chắc chắn cũng có thể được thực hiện. Mã được biên dịch của một tổ hợp do người dùng định nghĩa thường không quá khác biệt với mã "thông thường".

Có thể thực hiện đánh giá lười biếng trong một ngôn ngữ lập trình dựa trên ngăn xếp?

Hiệu ứng ngăn xếp không rõ là một lần nữa phần khó khăn. Nếu bạn thiết kế ngôn ngữ sao cho tất cả các hiệu ứng ngăn xếp có thể được xác định tĩnh, thì điều đó dường như không quá khó khăn. Nếu bạn có sự lười biếng rõ ràng, thì nó cũng có vẻ tương đối đơn giản và sẽ trông giống như trích dẫn của Joy và i. Một ngôn ngữ tự gọi mình là ngôn ngữ ghép nối lười biếng dường như thực hiện hỗn hợp cả hai cách tiếp cận trên từ những gì tôi có thể nói. Tôi thực sự không thấy một ngôn ngữ kết hợp lười biếng ngầm sẽ hoạt động như thế nào khi đối mặt với các hiệu ứng ngăn xếp động, ít nhất là không theo bất kỳ cách sử dụng mơ hồ nào, nhưng đó có thể chỉ là sự thiếu trí tưởng tượng của tôi.

Ngẫu nhiên, không có gì lạ khi các ngôn ngữ dựa trên ngăn xếp có nhiều ngăn xếp, ví dụ Forth có ngăn xếp dữ liệu và ngăn xếp trả về mà bạn cũng có thể đặt dữ liệu tùy ý.


8

Tôi biết một chút về FORTH vì vậy tôi sẽ giới hạn bản thân mình về điều đó. Nó là một ngôn ngữ cấp thấp, cho phép bạn là lập trình viên truy cập vào tất cả các tài nguyên phần cứng. Vì vậy, bạn có thể làm bất cứ điều gì bạn thích.

Đồng thời

Để có các chương trình song song (chỉnh sửa: được sử dụng để nói các chương trình đồng thời thực sự), bạn cần ít nhất hai đơn vị thực thi (CPU-s). Sẽ là khá tầm thường khi thực hiện một từ trong FORTH, ví dụ: "chạy từ này trên bộ xử lý 2 bằng hai đối số này". Từ này sẽ phân bổ hai ngăn xếp cần thiết trên bộ xử lý 2 và bắt đầu chạy từ. Bạn sẽ cần phải hạn chế phần nào chính xác những cấu trúc bạn có thể sử dụng trong chương trình đó.

Nếu số lượng chương trình đồng thời lớn hơn số lượng đơn vị thực thi, bạn sẽ sử dụng chương trình "giả ngẫu nhiên". Về cơ bản có hai cách để làm điều đó: coroutines hoặc đa nhiệm phòng ngừa. Trong mọi trường hợp đều có thể (không dễ, nhưng được mô tả kỹ trong tài liệu) làm thế nào để đạt được điều này và FORTH cho phép bạn truy cập tất cả những thứ cấp thấp bạn cần.

Đánh giá lười biếng

Tất nhiên bạn có thể làm điều này trong FORTH như trong bất kỳ ngôn ngữ lập trình nào. Nó sẽ không thanh lịch hoặc "tích hợp" như Haskell nói. Tôi sẽ sử dụng một ví dụ rất ngây thơ.

Ý tưởng là bạn định nghĩa một "hàm" (được sử dụng một cách lỏng lẻo ở đây) để trả về một tập hợp các thứ. Một ví dụ sẽ là một hàm trả về tất cả các số nguyên. Sau đó, bạn thực hiện các thao tác trên bộ này và khi bạn hoàn thành đưa ra kết quả. Ví dụ: bạn có thể muốn tính tổng tất cả các số nguyên cho đến khi tổng lớn hơn 1000. Một đánh giá không lười biếng trước tiên sẽ phân bổ tất cả các số nguyên dưới dạng một tập hợp, điều này là không thể vì có vô số số nguyên. Sau đó nó sẽ bắt đầu làm việc trên bộ này. Một triển khai lười biếng sẽ có cách "cho tôi giá trị tiếp theo trong tập hợp". Làm điều này thực sự chỉ cần một biến trong funktion "giá trị cuối cùng cho".

Haskell làm mọi thứ theo cách này. Tất nhiên nó xử lý các tình huống phức tạp hơn nhưng ý tưởng là như nhau. Nó tạo ra sự đánh giá theo cách cho phép bạn là một lập trình viên tập trung vào vấn đề, chứ không phải làm thế nào để giải quyết nó.


4
"Để có các chương trình đồng thời thực sự, bạn cần ít nhất hai đơn vị thực hiện". Đây chỉ là một vấn đề thực hiện. Từ góc độ ngôn ngữ lập trình, hầu như không có sự khác biệt giữa hai luồng chạy trên một CPU hoặc trên hai. Theo một nghĩa nào đó, mỗi luồng có thể được coi là một "đơn vị thực thi" của riêng nó.
Thằn lằn rời rạc

1
Đôi khi, các chi tiết giả định phải được xem xét. Một ví dụ là khi giao tiếp với thế giới thực bên ngoài một máy tính thực. Trong thời gian thực khó khăn, vì "câu trả lời đúng quá muộn là sai", thời gian có thể khác nhau khi bạn so sánh việc chạy trên hai đơn vị thoát hiểm với việc chạy xen kẽ trên một đơn vị.
ghellquist

Đôi khi chúng ta làm. Tuy nhiên, tôi nghi ngờ đây là một trường hợp như vậy. Ví dụ, câu hỏi không đề cập đến các yêu cầu lập lịch thời gian thực.
Thằn lằn rời rạc

3
"Đồng thời"! = "Song song". Nhiều luồng chạy trên một máy CPU đơn có thể nói là chạy đồng thời với nhau, mặc dù không có xử lý song song nào xảy ra.
Solomon chậm

Điểm lấy về tương tranh vs song song. Tôi sẽ thay đổi văn bản.
ghellquist
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.