it-swarm-vi.com

Tại sao LISP hữu ích?

LISP rõ ràng là một lợi thế cho AI công cụ, nhưng nó không xuất hiện với tôi rằng LISP nhanh hơn Java, C # hoặc thậm chí C. Tôi không phải là bậc thầy về LISP, nhưng tôi thấy rất khó để hiểu được lợi thế mà người ta sẽ có được khi viết phần mềm kinh doanh trong LISP.

Tuy nhiên, nó được coi là ngôn ngữ của hacker.

Tại sao Paul Graham ủng ​​hộ Lisp? Tại sao Phần mềm ITA chọn LISP thay vì các ngôn ngữ cấp cao khác? Nó có giá trị gì đối với các ngôn ngữ này?

64
Geek

Có một vài lý do khiến tôi trở nên có năng lực với LISP chung.

  1. Mã đồng tính. Điều này cho phép mã tự sửa đổi cấu trúc.
  2. Các macro nhận biết cú pháp. Họ cho phép viết lại mã soạn sẵn.
  3. Chủ nghĩa thực dụng. LISP chung được thiết kế để hoàn thành công việc bởi các chuyên gia làm việc. Hầu hết các ngôn ngữ chức năng không, như một quy luật.
  4. Uyển chuyển. Nó có thể làm rất nhiều thứ khác nhau, tất cả đều ở tốc độ hợp lý.
  5. Chiến tranh. Thế giới thực là lộn xộn. Mã hóa thực dụng kết thúc việc phải sử dụng hoặc phát minh ra các cấu trúc lộn xộn. LISP thông thường có đủ tính chiến tranh để có thể hoàn thành công việc.

Có thể cho rằng lý do thực sự duy nhất để lựa chọn chống lại LISP chung là các thư viện tiêu chuẩn được đề ngày.

Tôi sẽ đi ra ngoài và nói rằng trong trường hợp chung, cú pháp không phải là một vấn đề đối với một nhân viên phần mềm chuyên nghiệp.

78
Paul Nathan

Tôi thích LISP vì nó

  • cách thống nhất, đơn giản và thanh lịch để thể hiện cả mã và dữ liệu.
  • quan điểm độc đáo, mang lại cho tôi 80 điểm IQ quan trọng trong việc giải quyết các vấn đề khó khăn (với mẹo đội mũ cho Alan Kay)
  • môi trường phát triển cực kỳ nhanh nhẹn, tương tác và đàm thoại
  • sức mạnh chưa từng có để tạo và thao túng trừu tượng

Lập trình là chiến đấu phức tạp. Trừu tượng là công cụ hiệu quả duy nhất để chống lại sự phức tạp ngày càng tăng (với kích thước hộp sọ rất hạn chế và không đổi của chúng tôi). Quản lý trừu tượng với LISP giống như có một vị thần với mong muốn n + 1.

24
Maglob

Tôi tin rằng câu trả lời LISP chính xác là nhiều ngôn ngữ hơn. Một cái gì đó như: "Nếu bạn phải hỏi, bạn chưa sẵn sàng."

Sau đó, nếu có ai thắc mắc thêm, câu trả lời đúng là "có" nếu đó là/hoặc câu hỏi hoặc "Bạn chưa sẵn sàng."

21
glenatron

Tôi nghĩ rằng lợi thế LISP trong lĩnh vực trí tuệ nhân tạo (AI) mà mọi người đề cập có phần là một tai nạn lịch sử ... LISP bắt đầu cho/trong AI, nhưng đó là ngôn ngữ có mục đích chung.

Tôi tin rằng tốc độ thực thi không phải là khía cạnh quan trọng duy nhất của ngôn ngữ (mặc dù tôi đã làm một lần). Tuy nhiên, một trong những khía cạnh tôi thích về LISP là đối với tôi, nó kết hợp Python và C trong một. Tôi có thể bắt đầu viết mã mà không cần khai báo và nguyên mẫu ngay lập tức và rất nhanh chóng (thời gian chạy và REPL rất quan trọng cho việc này). Sau khi tôi có một cái gì đó đang chạy, tôi thêm khai báo kiểu và "tối ưu hóa" mã của mình, từng chút một. tự hỏi để nhấn một phím trong SLIME và xem ngôn ngữ máy được tạo cho chức năng mà tôi quan tâm. Trong Python, không có khai báo kiểu nào, vì vậy tôi không thể tăng thêm tốc độ, nhưng trong C, hoàn thành mọi thứ nhanh chóng thì đau đớn hơn nhiều. LISP rất hữu ích trong trường hợp này.

Phải nói rằng, tôi thích LISP chủ yếu vì macro . Khi bạn cuối cùng đã hiểu những gì macro có thể đạt được, tôi nghĩ rằng bạn đưa ra dấu ngoặc đơn dễ dàng. Ngoài ra, các biên tập viên như Emacs tự quản lý dấu ngoặc đơn để bạn không phải làm vậy. Tuy nhiên, tôi thừa nhận rằng tôi đã không tìm thấy dấu ngoặc đơn ngay từ đầu và tôi biết một số người không thể chịu đựng được chúng. Nhưng vì toàn bộ mục đích của macro là tạo mã tại thời điểm biên dịch, mã trong LISP sử dụng cấu trúc dữ liệu tiêu chuẩn và dấu ngoặc đơn giản là biểu diễn mã dưới dạng danh sách, cần thiết để viết macro đơn giản.

Tôi không biết bất kỳ ngôn ngữ nào khác mà bạn có thể viết một ít ngôn ngữ để mô tả vấn đề của bạn tốt hơn với sự dễ dàng của LISP. Đó là lợi thế mà Paul Graham nói về trong Đánh bại mức trung bình. Đó là mô-đun cực đoan và đồng nhất. Trong Java Tôi phải viết rất nhiều văn bản thô để thể hiện một ý tưởng duy nhất. Trong LISP tôi có thể viết một số macro tạo mã đó tự động và sau đó chỉ cần sử dụng các macro đó. Dù sao, bạn phải hiểu một số ví dụ về điều này và sau đó phán xét cho chính mình. Khi tôi "nhìn thấy" nó, tôi đã bị thổi bay và tôi vẫn nghĩ rằng LISP là ngôn ngữ tuyệt vời nhất cho lý do này. Tôi luôn tìm kiếm các macro trong các ngôn ngữ chính để xem chúng có khớp không sức mạnh của các macro LISP, nhưng cho đến nay tôi không tìm thấy bất kỳ. Forth là một giây gần gũi.

Tôi sẽ kết thúc với một vài lời chỉ trích, liên quan đến phần mềm kinh doanh:

  1. Phần mềm kinh doanh cần thư viện, và những cái tốt, và LISP không giỏi về điều này. Tôi thường không cần chúng, nhưng khi tôi làm, tôi phải chọn từ một ít phần mềm chưa hoàn chỉnh mà một vài người sử dụng. Tôi nên góp phần sửa lỗi này, tôi đoán ...

  2. Phần mềm kinh doanh thường được xây dựng bởi các nhóm lớn người và tôi nghĩ rằng giao tiếp có thể bị cản trở bởi các macro, vì về cơ bản chúng thay đổi ngôn ngữ. Rất nhiều lập trình viên thoải mái hơn trong việc phát hiện các mẫu nhất định trong mã, ngay cả khi văn bản chương trình dài hơn và lặp đi lặp lại nhiều hơn. Tôi cho rằng tại ITA họ có một số quy tắc liên quan đến macro hoặc họ có một thư viện macro khổng lồ giúp việc cộng tác trở nên dễ dàng (hoặc đơn giản hơn, tất cả các lập trình viên đều là chuyên gia LISP).

18
Pau Fernández

Tôi không thích LISP.

(Tôi thích nhiều khái niệm mà nó sử dụng, cách nó tạo ra các kỹ thuật mạnh mẽ có sẵn, v.v.

Nhưng tôi chưa bao giờ bị thuyết phục khi thực sự sử dụng nó, ((mặc dù một số người đã thử ) vì lợi ích của ngôn ngữ có thể đạt được với lập trình khác ngôn ngữ (một số trực tiếp, một số gián tiếp), vì vậy không có đủ lợi ích để khiến tôi dành thời gian học nó và đưa ra cú pháp khủng khiếp.)))

Nhưng vâng, vì lý do mà một số người thích nó, hãy kiểm tra các câu hỏi Stack Overflow này:

Có lẽ có thêm một vài câu hỏi liên quan cho những người đó.

13
Peter Boughton

Tôi sẽ hiểu "LISP" là " LISP chung "; Tôi chắc chắn các câu trả lời khác sẽ nói " Lược đồ ". (Gợi ý: LISP là một họ ngôn ngữ.)

"Nhanh hơn" nghĩa là gì? Về thời gian thực hiện để chạy điểm chuẩn, không, nó không nhanh hơn C ( nhưng có thể ).

"Nhanh" về việc Joe Random Hacker mất bao lâu để viết chương trình làm việc hoặc sửa lỗi trong hệ thống phần mềm lớn? Gần như chắc chắn.

Đối với hacker này , tôi sử dụng nó vì tôi muốn viết mã, không phải soạn thảo. Tôi muốn viết một cái gì đó một lần và không liên tục lặp lại chính mình. Và tôi muốn tương tác với chương trình trong khi tôi viết nó.

9
Frank Shearar

Tôi thích LISP vì đó là phương tiện tuyệt vời để bày tỏ suy nghĩ của tôi. Vị ngữ cho ngôn ngữ yêu thích của tôi là "Nếu tôi có thể chọn bất cứ điều gì để diễn đạt ý tưởng, thì nó sẽ là gì?". Hiện tại, đó là LISP * ( Lược đồ để cụ thể), đến mức tôi thấy mình viết ra các ghi chú lập trình trong đó. Như IRL , ghi chú bằng giấy và bút. Ngay cả khi tôi đang nghĩ về các chương trình tôi cần triển khai trong PHP hoặc Ruby hoặc Python.

Đây không phải là một mẹo mà tôi đã tự dạy mình, hoặc một cái gì đó tôi làm cho độ tin cậy của mọt sách (dù sao cũng không ai được nhìn thấy bên trong cuốn sổ tay của tôi); chỉ là LISP rất tự nhiên đối với tôi để suy nghĩ hơn bất kỳ giải pháp thay thế nào và bất kỳ ngôn ngữ nào cộng hưởng với bạn mà sâu sắc là bạn kho báu.

* Mặc dù chỉ là một chú thích, Haskell đang thu hẹp khoảng cách khá nhanh khi tôi tìm hiểu thêm về nó.

7
Inaimathi

Paul Graham sắp xếp câu trả lời cho câu hỏi này trong Điều gì làm cho LISP khác biệt.

Hãy nhớ rằng anh ấy đã sử dụng nó cho khởi nghiệp của mình vào giữa những năm 1990, vì vậy PythonRuby không thực sự trưởng thành vào thời điểm đó (hoặc thậm chí không được sinh ra).

LISP về cơ bản có tất cả các lợi thế của ngôn ngữ động và tôi nghĩ đối với hầu hết các ứng dụng web hiện nay, Python và Ruby là khá tuyệt vời và chúng có lợi thế khuôn khổ và tài liệu và cộng đồng sôi động.

Tính năng sát thủ có lẽ là toàn bộ chương trình được tạo thành từ các biểu thức. Điều này có nghĩa là bạn có thể sắp xếp các khối mã cho các hàm (hoặc macro ...), bởi vì một khối mã không có gì khác hơn là một biểu thức.

Python không chính xác có tính năng này; bạn phải xác định các hàm và chuyển chúng xung quanh. Ruby dường như có các khối, có lẽ nó bị giới hạn đôi chút so với những gì LISP có thể làm (tôi không chắc chắn).

6
hasen

Tôi đã có một phản ứng giật đầu gối với Scheme trong quá khứ, nhưng bây giờ tôi đã sẵn sàng cho LISP ( Clojure , thực sự) một phát bắn.

Bạn thấy đấy, trong nhiều năm tôi đã nhặt được các bit của ngôn ngữ như Java, C #, C++, Python và mọi thứ không còn thách thức nữa.

Clojure có nhiều hứa hẹn, có vẻ rất sạch sẽ và có thể giải quyết nhiều vấn đề trong thế giới thực. Một trường hợp mạnh mẽ cho một ngôn ngữ sạch như Clojure là sự ra đời của máy tính đa lõi.

Yay LISP!

EDIT: Phần mềm ITA được thành lập bởi MIT grads, và Scheme/LISP là ngôn ngữ duy nhất mà nhiều người trong số MIT grads đã học. Mặc dù vậy, công bằng có thể trao đổi nóng các thuật toán LISP trên một hệ thống sản xuất đang chạy, đây là một điểm cộng rất lớn.

6
Job

Điều mà tôi thích ở LISP là nó vượt qua các mô hình. Một số người sẽ nói rằng LISP là chức năng, những người khác sẽ nói đó là tuyên bố và những người khác sẽ nói đó là đa năng. Tôi nghĩ rằng tất cả những điều này bỏ lỡ điểm. Khi bạn sử dụng LISP, mô hình không còn là một hạn chế.

Muốn có đồ vật? Bạn có thể có chúng. Muốn lập trình chức năng? Bạn có thể có nó. Muốn Prolog - lập trình logic kiểu? Viết một số macro. Muốn lập trình khai báo kiểu SQL? Cứ liều thử đi. Bạn muốn sử dụng một số mô hình chưa được phát minh? Tôi tự tin nó có thể được thực hiện trong LISP.

Ngoài Forth - giống như các ngôn ngữ, tôi vẫn chưa thấy một ngôn ngữ khác cung cấp mức độ linh hoạt này.

6
Jason Baker

Vấn đề là sức mạnh. Power = Work (chức năng chương trình)/Thời gian

"Chúng tôi đã không thể chiến thắng các lập trình viên LISP; chúng tôi đã theo đuổi các lập trình viên C++. Chúng tôi đã cố gắng kéo rất nhiều người trong số họ đi được nửa đường đến LISP."

- Guy Steele, Java spec đồng tác giả

Vẽ một số loại đường cong giữa C++ và Java. Tiếp tục đi, và tại một số điểm dọc theo dòng bạn sẽ tìm thấy LISP.

6
compman

Tôi đang học LISP ( newLisp ) vì một vài lý do.

Lý do số một: LISP khiến tôi suy nghĩ khác đi, điều đó khiến tôi trở thành một người lập trình tốt hơn Ruby.

Có vẻ rất lúng túng khi thực hiện một số cách nhất định trong LISP, ví dụ lặp lại lồng nhau để đi qua nhiều danh sách. Vì vậy, nó buộc tôi phải sử dụng những thứ khác, như map. Ngôn ngữ yêu thích của tôi, Ruby, có cùng một phương pháp bản đồ, nhưng tôi không luôn sử dụng nó, bởi vì nó không quen thuộc: Tôi đã học cách làm mọi thứ bằng một kỹ thuật kém và khi ngôn ngữ hỗ trợ kỹ thuật đó, tôi tiếp tục sử dụng nó.

Lý do số hai: LISP là thiết thực và có thư viện hiện đại tốt.

Có một khung web nhẹ, rất đẹp cho newLisp được gọi là chuồn chuồn . Điều này cho phép tôi sử dụng mã newLisp thay vì PHP cho một số tác vụ. Tôi không thực sự thích PHP và newLisp có vẻ thú vị hơn cho tác vụ cụ thể này so với Ruby.

Lý do thứ ba: LISP phù hợp về mặt cú pháp và khái niệm.

Đối với tôi, đây là sự khác biệt lớn giữa Ruby và Python, tính nhất quán.

5
philosodad

"Nhanh hơn" không phải là một điều đơn giản để đo lường - nó thực sự phụ thuộc vào khía cạnh bạn đang đo điểm chuẩn. Tùy thuộc vào nhiệm vụ và việc triển khai LISP, tốc độ có thể đạt tới C. Hãy nhìn vào Bắn ra điểm chuẩn tuyệt vời để tìm hiểu chi tiết. Việc triển khai LISP của SBCL ngang bằng với Java 6 Máy chủ và nhanh hơn đáng kể so với Ruby hoặc Python.

Nhưng, tốc độ thuần túy không phải là lý do chính để chọn ngôn ngữ lập trình - nếu có, tất cả chúng ta sẽ lập trình bằng ngôn ngữ hội vẫn còn, phải không? Đối với tôi, niềm vui hàng ngày của LISP là mã được biên dịch, nhưng tôi không phải gỡ ứng dụng xuống, biên dịch lại mọi thứ và sau đó bắt đầu chạy lại từ đầu. Thay vào đó, tôi có thể thay đổi một chức năng duy nhất và sự thay đổi đó sẽ có hiệu lực ở mọi nơi và tôi có thể thấy ngay hiệu ứng trong ứng dụng của mình. Hơn nữa, cách tiếp cận "viết, kiểm tra, viết nhiều hơn, kiểm tra nhiều hơn" rất nhanh giúp kiểm tra ngay lập tức trước khi viết mã (và sau đó bạn có thể biến các thăm dò tương tác đó thành các bài kiểm tra đơn vị sau này).

Hãy tưởng tượng viết email trong đó sau mỗi dòng, bạn phải nhấn một nút để biên dịch đầu ra email của bạn ra màn hình trước khi tiếp tục suy nghĩ của bạn. Đó là những gì viết bằng Java hoặc một ngôn ngữ khác giống như vậy đối với tôi. Đôi khi, có một lý do để làm điều đó và tôi thích Java tốt, nhưng LISP chỉ là phản ứng nhanh hơn và dễ dàng hoàn thành công việc hơn.

5
Michael H.

Bạn có thể nói "Lòng trung thành với thương hiệu" không?

Tôi bắt đầu ở Fortran. Tôi yêu nó.

Tôi chuyển sang LISP. Lúc đầu tôi ghét nó. Sau đó tôi học cách yêu nó, và ghét Fortran.

Sau này Pascal, C, C++, các bộ lắp ráp khác nhau, C #. (Thật ra tôi không yêu C #.)

Tôi đoán tôi hay thay đổi?

4
Mike Dunlavey

Khi LISP được tạo ra, họ bắt đầu từ toán học, không phải khoa học máy tính (chưa thực sự tồn tại). Và nhóm LISP đã có một số điều THỰC SỰ đúng. LISP đã thu gom rác vào năm 1960 hoặc lâu hơn thế! Họ thực sự đã làm một công việc tuyệt vời.

Tôi nghĩ rằng bài hát Ngọn lửa vĩnh cử bao trùm nó.

4
Zachary K

Một sức hút lớn là cộng đồng. LISP đã có một sức hút đối với các nhà phát triển đầy tham vọng và sáng giá nhất kể từ khi ngôn ngữ được phát minh. Bất cứ nơi nào các nhà nghiên cứu đang cố gắng giải quyết các vấn đề chưa bao giờ được giải quyết, bạn có thể tìm thấy LISP, như trong nghiên cứu trí tuệ nhân tạo (AI), tầm nhìn máy tính, lập kế hoạch, biểu diễn kiến ​​thức và tối ưu hóa heuristic phức tạp. Ngôn ngữ cho vay để giải quyết các vấn đề cả từ dưới lên và từ trên xuống cùng một lúc, điều này dường như giúp ích trong việc đương đầu với những thách thức khó khăn nhất.

Cú pháp mở rộng thông qua các macro có nghĩa là hiếm khi cần phải mở rộng định nghĩa ngôn ngữ. Phần lớn những gì sẽ yêu cầu một phần mở rộng ngôn ngữ trong một ngôn ngữ hạn chế hơn chỉ là một macro với LISP. Vì vậy, các lập trình viên LISP có thể tự do sử dụng các khái niệm ngôn ngữ mới được phát minh mà không cần một tiêu chuẩn ngôn ngữ mới và không nhất thiết phải là một hình phạt tốc độ thực sự. Ở mức độ cơ bản, các chuỗi mã soạn sẵn được thực hiện không cần thiết bằng các phần mở rộng nhỏ. Toàn bộ ý tưởng mới trong luồng điều khiển, như hợp nhất kiểu Prolog, được triển khai hiệu quả và gọn nhẹ như các phần mở rộng.

Hệ thống OOP, ĐÓNG , nằm trong một lớp của riêng nó về tính linh hoạt. Rất khó để đi trở lại thô sơ C++/Java/C # OOP sau khi nếm thử. GoF 5 mẫu thiết kế trở nên không cần thiết vì chúng có thể được thể hiện một cách đơn giản và trực tiếp.

Ngôn ngữ không có chủ sở hữu công ty duy nhất và không có triển khai dứt khoát duy nhất, mặc dù nó có tiêu chuẩn ANSI với nhiều triển khai tuân thủ. Các triển khai mới chủ yếu xuất hiện sau mỗi thập kỷ và những triển khai cũ vẫn còn khá tích cực. Các chuyên gia có thể lên kế hoạch sử dụng kiến ​​thức chuyên ngành của họ trong một thời gian dài sắp tới. Điều này không gây ra một số ma sát vô chính phủ và sự phân mảnh cộng đồng, nhưng điều đó cũng có nghĩa là tấm thảm không thể được kéo ra và ngôn ngữ không thể trở nên phù hợp vì lý do chính trị của công ty hoặc dự án. Luôn luôn có nhiều triển khai thương mại và nguồn mở đang được thực hiện. Những người thực hiện tập trung nhiều hơn thường xuyên điểm chuẩn trong một hệ số gấp đôi của việc triển khai ngôn ngữ mệnh lệnh rất nhanh, được tài trợ rất nhiều.

Điểm nổi bật của thương mại hóa LISP ban đầu là dấu chân bộ nhớ để phù hợp với cả các tính năng an toàn của ngôn ngữ và môi trường phát triển phần mềm tiên tiến mà chúng bao gồm, với các tính năng đáng kinh ngạc như tài liệu trực tuyến đầy đủ bao gồm cả đồ họa. Máy 64 MB Máy LISP tượng trưng không khả thi về chi phí so với máy trạm Sun 8 MB. Hôm nay, RAM giá đã sụp đổ và có sự quan tâm rất lớn đối với các ngôn ngữ LISP, đặc biệt khi xem xét rằng các ngôn ngữ Java chính, C #, PHP ngày nay chỉ tiến bộ tối thiểu những người của 30 năm trước.

Hiện tại có các ngôn ngữ hiện đại đang cạnh tranh với LISP về tư duy với các nhà phát triển thông minh: Python, Lua , Erlang , Haskell , và OCaml . Nhưng không ai cung cấp cùng một sự trưởng thành, khả năng thích ứng, nhiều triển khai và tốc độ tuân thủ tiêu chuẩn.

2
bcaulf

Tôi không thực sự làm LISP. Nhưng nơi tôi làm việc không phần tử hữu hạn với hàng triệu dòng chủ yếu là Fortran. Người mà tôi tôn trọng nhất về công cụ điện toán (mã cơ học chất lỏng tính toán ) nghĩ rằng sự kết hợp lý tưởng là LISP ở bên ngoài (chủ yếu vì bạn tránh các vấn đề lộn xộn với quản lý bộ nhớ) và Fortran ở mức độ thấp thuật toán (Fortran là tốt nhất để khai thác các khả năng vectơ của SSE / AVX , và chúng tôi nghĩ rằng điều này không có khả năng đóng cửa).

1
Omega Centauri