2009-01-28 29 views
9

Tôi đã làm việc với một phương ngữ Lisp nhưng cũng học được một số Haskell. Họ chia sẻ một số điểm tương đồng nhưng sự khác biệt chính trong Common Lisp có vẻ là bạn không phải định nghĩa một kiểu cho mỗi hàm, đối số, vv trong khi trong Haskell bạn làm. Ngoài ra, Haskell chủ yếu là một ngôn ngữ biên dịch. Chạy trình biên dịch để tạo tệp thực thi.Sử dụng cho cả hai ngôn ngữ gõ mạnh tĩnh như Haskell và các ngôn ngữ động (mạnh) như Common LIsp

Câu hỏi của tôi là, có các ứng dụng hoặc sử dụng khác nhau trong đó một ngôn ngữ như Haskell có thể có ý nghĩa hơn ngôn ngữ động hơn như Common Lisp. Ví dụ, có vẻ như Lisp có thể được sử dụng để lập trình đáy nhiều hơn, như xây dựng trang web hoặc GUI, nơi Haskell có thể được sử dụng để kiểm tra thời gian biên dịch cần thiết hơn như xây dựng máy chủ TCP/IP hoặc trình phân tích cú pháp mã.

ứng dụng

được ưa thích Lisp: ứng dụng Emacs

được ưa thích Haskell: Pugs darcs

Bạn có đồng ý, và được có bất kỳ nghiên cứu về vấn đề này?

Trả lời

14

Ngôn ngữ lập trình là công cụ để suy nghĩ. Bạn có thể diễn đạt bất kỳ chương trình nào bằng bất kỳ ngôn ngữ nào, nếu bạn sẵn sàng làm việc chăm chỉ. Giá trị chính được cung cấp bởi một ngôn ngữ lập trình trên ngôn ngữ lập trình khác là mức hỗ trợ mà nó cung cấp cho bạn để suy nghĩ về các vấn đề theo những cách khác nhau.

Ví dụ: Haskell là ngôn ngữ nhấn mạnh suy nghĩ về vấn đề của bạn về mặt loại. Nếu có một cách thuận tiện để thể hiện vấn đề của bạn về các kiểu dữ liệu của Haskell, có thể bạn sẽ thấy rằng đó là một ngôn ngữ thuận tiện để viết chương trình của bạn.

Điểm mạnh của Lisp thường có tính chất động và tính đồng nhất của nó (có nghĩa là, các chương trình Lisp rất dễ dàng để biểu diễn và thao tác dưới dạng dữ liệu Lisp) - Lisp là một "ngôn ngữ lập trình lập trình". Nếu chương trình của bạn được thể hiện dễ dàng nhất trong một ngôn ngữ miền cụ thể mới, ví dụ, Lisp làm cho nó rất dễ dàng để làm điều đó. Lisp (và các ngôn ngữ động) khác phù hợp nếu mô tả sự cố của bạn đề cập đến dữ liệu có loại được chỉ định kém hoặc có thể thay đổi khi tiến trình phát triển.

Lựa chọn ngôn ngữ thường là quyết định thẩm mỹ nhiều nhất. Nếu yêu cầu dự án của bạn không giới hạn bạn với các ngôn ngữ cụ thể về tính tương thích, phụ thuộc hoặc lý do hiệu suất, bạn cũng có thể chọn một ngôn ngữ bạn cảm thấy thích nhất.

5

Bạn đang mở nhiều lon giun rất wriggly. Trước tiên, toàn bộ các ngôn ngữ mạnh mẽ và có thể gõ nhẹ. Thứ hai, ngôn ngữ chức năng so với mệnh lệnh có thể.

(Trên thực tế, tôi tò mò: bởi "phương ngữ lisp" làm bạn có nghĩa là Clojure bởi bất kỳ cơ hội Bởi vì đó là phần lớn chức năng và chặt chẽ hơn trong một số cách để Haskell?.)

Được rồi, như vậy. Trước hết, bạn có thể viết khá nhiều chương trình bằng nhiều ngôn ngữ thông thường, với ít nỗ lực hơn. Lợi thế có mục đích để gõ mạnh mẽ là một lớp lớn các lỗi có thể được phát hiện tại thời gian biên dịch. Mặt khác, các ngôn ngữ ít lỗi hơn có thể dễ dàng hơn để mã hóa. Common Lisp rất thú vị vì nó là một ngôn ngữ động với tùy chọn khai báo và sử dụng các kiểu mạnh hơn, cho phép trình biên dịch CL gợi ý cách tối ưu hóa. (Oh, và Lisp thường thực sự thường được thực hiện với trình biên dịch, cho bạn tùy chọn biên dịch hoặc gắn bó với mã được giải thích.)

Có một số nghiên cứu về việc so sánh các ngôn ngữ không được gõ, gõ nhẹ và gõ mạnh. Những nghiên cứu này luôn luôn hoặc nói rằng một trong số họ là tốt hơn, hoặc nói rằng không có sự khác biệt quan sát được. Tuy nhiên, có ít thỏa thuận trong số các nghiên cứu.

Khu vực lớn nhất trong đó có thể có một số lợi thế rõ ràng là xử lý các đặc điểm phức tạp cho các vấn đề toán học. Trong những trường hợp đó (các thuật toán mã hóa là một ví dụ) một ngôn ngữ chức năng như Haskell có lợi thế bởi vì nó dễ dàng hơn để xác minh sự tương ứng giữa mã Haskell và thuật toán cơ bản.

+2

Lisp phổ biến cũng được nhập mạnh, nó chỉ xác định loại khi chạy, tức là nó được nhập động (trái ngược với tĩnh, như Haskell). Đừng nhầm lẫn "tĩnh" <-> "động" với "yếu" <-> "mạnh"! – Svante

+0

Ngoài ra, Common Lisp hỗ trợ nhiều kiểu lập trình khác nhau, bao gồm lập trình hàm, vì vậy tranh cãi này cũng là một chủ đề phụ (trong đó Haskell là "thuần túy" trong khi CL cũng tự vay theo những cách khác). – Svante

+1

Harlequin, * C * hỗ trợ kiểu chức năng nếu bạn muốn. Haskell không có nhiệm vụ bắt buộc, Clojure chỉ cho phép nó trong một hình thức đặc biệt bị hạn chế. Common Lisp cho phép bạn viết chức năng, nhưng không thực thi nó, cũng như Ruby và Python. –

4

Tôi đến chủ yếu từ góc nhìn chung của Lisp, và theo như tôi thấy, Common Lisp phù hợp cho bất kỳ ứng dụng nào.

Có, mặc định là gõ động (tức là phát hiện kiểu lúc chạy), nhưng bạn có thể khai báo kiểu để tối ưu hóa (như một lưu ý phụ cho người đọc khác: CL được gõ mạnh; không nhầm lẫn yếu/mạnh với tĩnh/dynamic!).

Tôi có thể tưởng tượng rằng Haskell có thể phù hợp hơn một chút để thay thế cho Ada trong lĩnh vực điện tử điện tử, vì nó buộc ít nhất tất cả các loại kiểm tra tại thời gian biên dịch.

Tôi không thấy CL không nên hữu ích như Haskell cho máy chủ TCP/IP hoặc trình phân tích cú pháp mã - thay vào đó ngược lại, nhưng địa chỉ liên hệ của tôi với Haskell đã ngắn gọn.

+4

Haskell không hữu ích khi thay thế Ada. Haskell thường có hiệu suất không thể đoán trước do cấu trúc dữ liệu lười và thu gom rác thải. Đó không phải là điều mong muốn trong phần mềm bay. –

3

Haskell là ngôn ngữ chức năng thuần túy. Trong khi nó cho phép cấu trúc bắt buộc (sử dụng monads), nó thường buộc các lập trình viên phải suy nghĩ vấn đề theo một cách khá khác, sử dụng một cách tiếp cận định hướng toán học hơn. Bạn không thể gán lại một giá trị khác cho một biến, ví dụ.

Người ta cho rằng điều này làm giảm khả năng mắc phải một số loại lỗi. Hơn nữa, các chương trình được viết bằng Haskell có xu hướng ngắn hơn và ngắn gọn hơn so với các chương trình được viết bằng các ngôn ngữ lập trình điển hình. Haskell cũng sử dụng rất nhiều đánh giá không nghiêm ngặt, lười biếng, về mặt lý thuyết có thể cho phép trình biên dịch tối ưu hóa không nếu không có thể (cùng với mô hình không có tác dụng phụ).

Vì bạn đã hỏi về nó, tôi tin rằng hệ thống gõ của Haskell khá tốt và hữu ích. Không chỉ nó bắt lỗi phổ biến, nhưng nó cũng có thể làm cho mã ngắn gọn hơn (!) Và có hiệu quả có thể thay thế các cấu trúc hướng đối tượng từ các ngôn ngữ OO phổ biến.

Một số bộ công cụ phát triển Haskell, như GHC, cũng có các môi trường tương tác.

0

Cách sử dụng tốt nhất để nhập động mà tôi đã tìm thấy là khi bạn phụ thuộc vào những thứ bạn không có quyền kiểm soát để có thể sử dụng động một cách linh hoạt. Ví dụ nhận được thông tin từ tài liệu XML chúng ta có thể làm điều gì đó như thế này:

var volume = parseXML("mydoc.xml").speaker.volume() 

Không sử dụng gõ vịt sẽ dẫn đến một cái gì đó như thế này:

var volume = parseXML("mydoc.xml").getAttrib["speaker"].getAttrib["volume"].ToString() 

Lợi ích của Haskell mặt khác là về an toàn . Ví dụ, bạn có thể đảm bảo, sử dụng các loại, độ đó trong Fahrenheit and Celsius are never mixed unintentionally. Bên cạnh đó tôi thấy rằng các ngôn ngữ gõ tĩnh có IDE tốt hơn.

Các vấn đề liên quan