2009-03-19 11 views
6

câu hỏi lý thuyết. Sau khi đọc cuốn sách lập trình của Armstrongs, tôi đã tự hỏi: Sẽ mất một thời gian để học Erlang. Hãy để một mình làm chủ nó. Nó thực sự là cơ bản khác nhau trong rất nhiều khía cạnh. Vì vậy, câu hỏi của tôi: Có thể viết 'như erlang' hoặc với một số 'erlang như khuôn khổ', mà cho rằng bạn chăm sóc không để tạo ra các chức năng với sideffects, bạn có thể tạo các ứng dụng đáng tin cậy có thể mở rộng cũng như trong Erlang. ? Có thể với cùng một thông điệp gửi, tải các mô hình 'quy trình nhỏ'.có thể làm cho các chương trình đáng tin cậy có khả năng mở rộng đồng thời trong C như trong erlang không?

Lợi thế sẽ không phải là ném tất cả kiến ​​thức C/C++ tích lũy của bạn lên hàng rào.

Bất kỳ suy nghĩ về vấn đề này sẽ được hoan nghênh

Trả lời

8

, nó là có thể, nhưng ...

Có lẽ câu trả lời tốt nhất cho câu hỏi này được đưa ra bởi Luật Đầu Robert Virding của:

“Bất cứ đủ phức tạp chương trình đồng thời bằng một ngôn ngữ khác chứa một quảng cáo đặc biệt, được chỉ định không chính thức, bị lỗi, chậm triển khai một nửa số Erlang. ”

Quy tắc rất tốt là sử dụng đúng công cụ cho nhiệm vụ. Erlang vượt trội về tính đồng thời và độ tin cậy. C/C++ không được thiết kế với các thuộc tính này trong tâm trí.

Nếu bạn không muốn vứt bỏ C/C++ kiến ​​thức và kinh nghiệmdự án của bạn cho phép loại chia, cách tiếp cận tốt là tạo ra một giải pháp hỗn hợp . Viết đồng thời, giao tiếp và xử lý lỗi mã trong Erlang, sau đó thêm C/C + + phần, mà sẽ làm công cụ ràng buộc CPU và IO.

+1

AFAIK, trích dẫn ban đầu là về LISP. tất nhiên, bất cứ ai sẽ nói nó thích hợp hơn về ngôn ngữ yêu thích của mình trong ngày, nhưng cách tiếp cận tối giản của (bản gốc) LISP làm cho nó một chút 'truer' – Javier

+0

Không biết đó là về Lisp. Cảm ơn, Javier – gleber

+0

[Quy tắc thứ 10 của Greenspun] (https://en.wikipedia.org/wiki/Greenspun%27s_tenth_rule) Một tham chiếu cụ thể đến thực tế là tại một thời điểm nào đó trong bất kỳ dự án đủ lớn nào, DSL nội bộ xuất hiện để thể hiện vấn đề . Rất thường thì điều này sẽ trở thành một ngôn ngữ macro nửa nướng hoặc một số chức năng 'thực thi (giải quyết (cobble()))' nổi lên bởi sự tiến hóa hoang dã và không thể hiểu được đối với những người mới đến. Một nửa điểm là Lisp khuyến khích phát triển có chủ ý các DSL như một cách để bóp nghẹt sự phức tạp mà hầu hết các ngôn ngữ hầu như được thiết kế để ngăn chặn điều này. – zxq9

2

tôi sẽ phá vỡ này thành 2 câu hỏi

Bạn có thể viết đồng thời, khả năng mở rộng các ứng dụng C++

Yes. Nó chắc chắn có thể tạo ra các cấu trúc mức thấp cần thiết để đạt được điều này.

Bạn có muốn viết đồng thời, khả năng mở rộng, C++ ứng dụng

lẽ. Nhưng nếu tôi đã đi cho một ứng dụng đồng thời cao, tôi sẽ chọn một ngôn ngữ được thiết kế để lấp đầy khoảng trống đó hoặc dễ dàng mượn chính nó để làm như vậy (Erlang, F # và có thể C#).

C++ không được thiết kế để xây dựng các ứng dụng đồng thời cao. Nhưng nó chắc chắn có thể được tinh chỉnh để làm như vậy. Các chi phí có thể cao hơn bạn mong đợi mặc dù một khi bạn yếu tố trong quản lý bộ nhớ.

+0

Tại sao bạn thích C# trên C++? Trong C++, bạn có thể làm những việc như sắp xếp cấu trúc dữ liệu được chia sẻ trên các dòng bộ nhớ cache. – RussellH

+0

@RusselH, 2 lý do chính của tôi sẽ là quản lý bộ nhớ và hỗ trợ luồng tốt hơn. C++ có hỗ trợ luồng nhưng nó theo nhiều cách khác nhau. C# đã thiết kế hỗ trợ htreading (mặc dù nó thiếu trong nhiều lĩnh vực). – JaredPar

+0

Tôi thích C#, nhưng tôi không hiểu tại sao nó làm cho việc tạo các ứng dụng có thể mở rộng đồng thời dễ dàng hơn. Nếu bất cứ điều gì, nó ẩn rất nhiều chi tiết mà có thể rất có liên quan. – Toad

1

Có, nhưng bạn sẽ thực hiện thêm một số công việc.

Về tác dụng phụ, hãy xem xét cách nhóm .net/plinq đang tiếp cận. Plinq sẽ không thể ép buộc bạn giao nó với không có tác dụng phụ, nhưng nó sẽ giả định bạn làm như vậy và chơi theo các quy tắc của nó để chúng ta có thể sử dụng api đơn giản hơn. Ngay cả khi ngôn ngữ không có sẵn hỗ trợ cho nó, nó vẫn sẽ đơn giản hóa mọi thứ khi bạn có thể phá vỡ các hoạt động dễ dàng hơn.

0

'vấn đề' chính với C (hoặc C++) để viết chương trình đáng tin cậy và dễ mở rộng là trong C bạn có thể làm mọi thứ. vì vậy, bước đầu tiên là viết một khuôn khổ đơn giản hạn chế một chút. hầu hết các lập trình viên giỏi đều làm điều đó.

trong trường hợp này, các hạn chế sẽ chủ yếu là giúp dễ dàng xác định 'quy trình' trong bất kỳ mức độ cô lập nào bạn muốn. fork() có danh tiếng chậm và chủ đề cũng cần thời gian đáng kể để sinh sản, vì vậy bạn có thể muốn sử dụng đa tác vụ hợp tác, có thể hiệu quả hơn nhiều và thậm chí bạn có thể làm cho nó được ưu tiên (tôi nghĩ đó là những gì Erlang làm). để có được hiệu quả đa lõi, thiết lập một nhóm các chủ đề và làm cho tất cả chúng hoàn thành để chạy các nhiệm vụ.

một phần quan trọng khác là tạo thư viện cấu trúc dữ liệu bất biến thích hợp, để sử dụng chúng (thay vì lib chuẩn), chức năng của bạn sẽ là (chủ yếu) không có tác dụng phụ.

thì đó chỉ là vấn đề thiết lập API tốt để truyền thông điệp và tương lai ... không dễ dàng, nhưng ít nhất nó dường như không thay đổi ngôn ngữ.

+0

tuyệt vời! Nhưng nó đã tồn tại chưa? ; ^) – Toad

1

Tôi có thể làm gì trong một ngôn ngữ hoàn chỉnh Turing mà tôi có thể làm bằng bất kỳ ngôn ngữ hoàn chỉnh nào khác của Turing.

Vì vậy, tôi giải thích câu hỏi của bạn để đọc, thật dễ dàng để viết một ứng dụng đáng tin cậy và có khả năng mở rộng trong C++ như trong Erlang?

Câu trả lời cho điều đó rất có tính chủ quan. Đối với tôi, việc viết nó trong C++ dễ dàng hơn vì những lý do sau:

  • Tôi đã thực hiện nó trong C++ (ít nhất ba lần).
  • Tôi không biết Erlang.
  • Tôi đã đọc rất nhiều về Stackless Python, mà cảm thấy đối với tôi giống như một hệ thống đa nhiệm hợp tác xã nhắn cao đồng thời có trụ sở tại python, nhưng tất nhiên python được viết trên đầu trang của C.

Có nói rằng. Nếu bạn đã biết cả hai ngôn ngữ và bạn đã xác định được vấn đề, thì bạn có thể chọn lựa tốt nhất dựa trên tất cả thông tin bạn có trong tầm tay.

+0

FYI: Trình thông dịch Python chuẩn, CPython, được viết bằng C, không phải C++. – mipadi

+0

@mipadi: Tốt. Đã chỉnh sửa bài đăng của tôi để khắc phục. – grieve

+0

bạn có sử dụng một khung công tác cho các ứng dụng c của mình không? Hay bạn cũng 'tái tạo lại wheel'as được đề xuất trong các bài trả lời trước đây ở đây? – Toad

4

Bạn có thể rõ ràng - hệ thống Erlang/OTP phần lớn được viết bằng C (và Erlang). Câu hỏi đặt ra là 'tại sao bạn muốn?'

Trong những ngày cũ của những người được sử dụng để viết hệ điều hành của riêng họ - nhưng tại sao bạn muốn?

Nếu bạn quyết định sử dụng một hệ điều hành bất thành văn phần mềm của bạn có các tính chất nào đó - nó có thể tồn tại vào đĩa cứng, nó có thể nói chuyện với một mạng, nó có thể vẽ trên màn hình, nó có thể chạy từ dòng lệnh , nó có thể được gọi trong chế độ hàng loạt, v.v ...

Hệ thống Erlang/OTP là 1,5M dòng mã đã được chứng minh là cung cấp thời gian hoạt động 99.9999999% trong hệ thống lớn (hệ thống điện thoại Vương quốc Anh) - đó là 31ms thời gian chết mỗi năm.

Với Erlang/OTP bất thành văn phần mềm của bạn có độ tin cậy cao, nó có thể hot-swap chính nó, bất thành văn ứng dụng của bạn có thể chuyển đổi dự phòng khi một máy tính vật lý chết.

Tại sao bạn muốn viết lại chức năng đó?

+1

31ms một năm? Tôi tự hỏi làm thế nào họ đo được điều đó :) –

+0

đó là tuyệt vời ... nhưng tại sao nó phải là một ngôn ngữ hoàn toàn mới. Nó sẽ là tuyệt vời nếu một trong hai: a) sẽ có một c syntaxy giống như ngôn ngữ có thể được chạy trong erlang VM hoặc b) sẽ có một khuôn khổ erlang mà bạn có thể treo lên đến c Tham quan rất tuyệt nhưng cũng tốt mindf *** s – Toad

+0

Nó không phải là một ngôn ngữ hoàn toàn mới - nó là hội nghị người dùng thường niên lần thứ 14 năm nay ... Nó là một ngôn ngữ telecomms thành công và được sử dụng rộng rãi đã lan rộng đến kinh doanh internet bởi vì nó giải quyết các vấn đề về độ tin cậy và khả năng mở rộng tốt. –