Chọn ngôn ngữ lập trình chức năng [đã đóng]


48

Gần đây tôi đã đọc rất nhiều chủ đề về các ngôn ngữ lập trình chức năng (gần như trong năm vừa qua). Tôi thực sự muốn chọn một và tìm hiểu nó kỹ lưỡng.

Học kỳ [khóa học] vừa qua, tôi đã được giới thiệu về Đề án. Tôi yêu nó. Yêu thích sự đơn giản cực độ của cú pháp, nguyên tắc đồng âm , các macro ( hợp vệ sinh và không vệ sinh), n-arity của thủ tục, v.v.

Vấn đề với Scheme là ngôn ngữ học thuật. Tôi không nghĩ rằng nó thực sự được sử dụng trong môi trường sản xuất. Tôi không tin rằng nó đặc biệt tốt trong hồ sơ xin việc của chúng tôi. Vì vậy, tôi đã tìm kiếm xung quanh để thay thế. Có rất nhiều trong số họ và bằng cách nào đó tất cả họ dường như có một mức độ phổ biến tương tự.

Một số suy nghĩ về một số ngôn ngữ chức năng khác mà tôi đã xem xét:

  • Clojure: Nghe có vẻ tuyệt vời vì nó có thể truy cập vào thế giới Java, nó được định hướng theo khả năng mở rộng và đồng thời, nhưng không phải là thế giới Java ngay từ đầu? Tôi đã biết Java khá rõ, nhưng sẽ tốt hơn nếu thêm nhiều năng lượng hơn tùy thuộc vào JVM?
  • Haskell: Trông giống như một ngôn ngữ được đánh giá cao, nhưng từ những gì tôi đã đọc, nó cũng giống ngôn ngữ học thuật hơn.
  • Lisp: Nó đã tồn tại mãi mãi. Nó dường như có hầu hết những gì tôi thích từ Scheme. Nó có một cộng đồng lớn. Đối với những gì tôi [nghĩ rằng tôi] biết, nó có lẽ là ngôn ngữ lập trình chức năng được sử dụng rộng rãi nhất trong công nghiệp (?).
  • F #: Không thực sự xem xét nó. Tôi không phải là một fan hâm mộ lớn của MS. Tôi không có tiền để trả cho phần mềm của họ (tôi có thể có chúng miễn phí từ các liên minh đại học, nhưng tôi có xu hướng đi theo các giải pháp dựa vào cộng đồng). Mặc dù ... tôi đoán nó sẽ là sự lựa chọn định hướng nghề nghiệp tốt nhất.

Tối nay, tôi đang nghiêng về Lisp. Một tuần trước, đó là Haskell. Trước đó nó là Clojure. Trong năm vừa qua, tôi đã thực hiện một số Đề án cho vui, không thúc đẩy nó vì lý do bạn biết. Bây giờ tôi muốn nghiêm túc (về việc học một, về thực hiện các dự án thực sự với nó, về việc cuối cùng có thể làm việc chuyên nghiệp với nó). Vấn đề của tôi là tôi sẽ cần phải tìm hiểu sâu tất cả trước khi có thể chọn một.


5
Dù bạn chọn gì, hãy viết rất nhiều mã bạn sử dụng cho một cái gì đó trong đó.

8
Không nghĩ gì về Scala ?
ykombinator

@ykombinator: Tôi đã nghe nói về nó, nhưng tôi chưa tìm kiếm thêm. Tôi không biết liệu nó có cung cấp bất cứ thứ gì tôi đã liệt kê hay không, hoặc có thể nó sẽ mang lại sự kết hợp của các tùy chọn thú vị từ mỗi người trong số họ ... Không biết. Âm thanh với tôi như ngôn ngữ cấu hình khá thấp, mặc dù nó dường như đang trở nên phổ biến.
Joanis

1
Tôi không biết bạn đã nghe nói thế giới Java ở đâu "ngoài rìa" - hiện tại nó đang trải qua thời kỳ phục hưng lớn, chủ yếu nhờ vào một) OpenJDK trở thành triển khai tiêu chuẩn b) các ngôn ngữ JVM mới như Scala và Clojure và c) thực tế là các dự án dữ liệu / đám mây lớn đang gia tăng chọn JVM làm nền tảng đích và d) Android. Vào đầu năm 2012, đây có lẽ là nền tảng thú vị nhất được ra mắt .....
mikera

1
@mikera: Đồng ý. Điều này đã hơn một năm tuổi, ngay sau khi Oracle mua lại Sun microsystems và có tất cả những điều đáng lo ngại và suy đoán về tương lai của Java bị xâm phạm bởi một tập đoàn kiểm soát nhiều hơn đang nắm quyền kiểm soát ...
Joanis

Câu trả lời:


35

Vì bạn muốn có một  ngôn ngữ thực tế :

văn bản thay thế

Lưu ý rằng Haskell và Lisp được sử dụng nhiều hơn những người khác trong ngành, mặc dù gần đây đã có một số quan tâm đến Clojure và F #.

Nhưng hãy nhìn những gì xảy ra khi chúng ta thêm Scheme vào hỗn hợp:

văn bản thay thế

Hmm, bây giờ trông không giống ngôn ngữ hàn lâm lắm phải không?

Trên thực tế, biểu đồ trên có lẽ là một lời nói dối; từ "lược đồ" có thể xuất hiện trong quảng cáo trợ giúp trong các ngữ cảnh khác bên cạnh các ngôn ngữ lập trình. :)

Vì vậy, đây là một biểu đồ khác có thể (một chút) đại diện hơn:

văn bản thay thế

Nếu bạn muốn khám phá một phương ngữ thực sự của Scheme, hãy xem Vợt.


Wow, bài đăng tốt đẹp. Vợt chính xác là những gì tôi đang sử dụng ... PLT-Scheme là tên của nó khi tôi bắt đầu học nó. Đó là dòng màu đỏ trong đồ họa cuối cùng làm phiền tôi. Không bao giờ nghĩ rằng Scheme có thể được sử dụng nhiều như vậy. Và Clojure dường như đang cất cánh. Hmm ...
Joanis

@M. Joanis: Lấy hai biểu đồ cuối cùng với một hạt muối; giao diện cầu thang và tính biến động của biểu đồ cuối cùng cho thấy rằng không có nhiều điểm dữ liệu trong biểu đồ, mặc dù điều đó cho thấy ai đó nghĩ rằng các ngôn ngữ đáng để trả tiền.
Robert Harvey

@Robert Harvey, điều gì đã thay đổi từ biểu đồ thứ hai sang biểu đồ thứ ba?
systemovich

@Geoffrey: Nhìn vào chú thích; Tôi đã thêm từ "nhà phát triển" vào cụm từ tìm kiếm.
Robert Harvey

Lưu ý rằng Haskell và Lisp cũng là từ đồng âm và dữ liệu của True không khái quát với phần còn lại của thế giới. ITJobsWatch liệt kê 79 công việc Scala, 55 F #, 47 Haskell, 30 Lisp và 7 công việc Clojure.
Jon Harrop

17

Nếu bạn muốn học lập trình chức năng, bạn có thể được phục vụ tốt hơn để học Haskell trước, sau đó sử dụng bất kỳ ngôn ngữ nào bạn muốn. Bạn có thể học lập trình chức năng bằng các ngôn ngữ khác, nhưng chúng vẫn cho phép mã bắt buộc và hướng đối tượng. Nếu bạn viết một chương trình thực tế trong Haskell, bạn sẽ học lập trình chức năng nhanh hơn vì các mô hình khác sẽ không có sẵn để quay trở lại.

Sau khi viết chương trình Haskell của bạn, bạn sẽ có các công cụ như đơn nguyên và kỹ thuật như mã hóa điểm miễn phí để mang đến ngôn ngữ bạn chọn. Các khái niệm dường như ánh xạ đặc biệt tốt với Đề án.


Tôi nghĩ rằng bạn đúng về việc chọn một ngôn ngữ chức năng thuần túy đầu tiên. Tôi sẽ rất thích thú khi thấy một trật tự của các ngôn ngữ chức năng bởi độ tinh khiết.
Joanis

@M. Joanis: trong số các ngôn ngữ được liệt kê trong câu hỏi của bạn, tôi sẽ nói rằng Haskell là ngôn ngữ thuần khiết nhất, tiếp theo là Clojure, F # và Lisp.
Larry Coleman

15

Trên thực tế, nếu bạn có thể triển khai một hệ thống khá phức tạp trong Đề án, bạn sẽ khá mong muốn tại các công ty nơi bạn có thể muốn làm việc. Trước đây trong sự nghiệp của tôi, tôi đã gặp một số sinh viên đã thực hiện một số lượng công việc khá lớn trong Đề án, và lần duy nhất đó là một bất lợi là khi họ không thể giải thích công việc của họ hoặc không thực sự hiểu nó đủ để thực hiện dữ liệu cơ bản cấu trúc và thuật toán trong một khoảng thời gian hợp lý. Tôi luôn để thí sinh trả lời những câu hỏi như vậy bằng ngôn ngữ ưa thích của họ; Tôi đã gặp một số người nghĩ rằng họ giỏi nhất ở Scheme, người đã cố gắng đấu tranh khá nhiều với những thứ dễ dàng, như thêm một yếu tố vào danh sách liên kết, điều đó làm tôi bối rối.

Nhưng nếu bạn có thể "có được" Scheme đủ tốt để viết ngay cả một ứng dụng web trung bình, đó sẽ là một điểm bán hàng khá tốt tại hầu hết các công ty phần mềm nghiêm túc.

Nếu bạn đang phỏng vấn tại một cửa hàng "blub" và các nhà phát triển chỉ nghĩ bạn thật kỳ lạ vì sự thành thạo của bạn tại Scheme hoặc Haskell hoặc F #, có lẽ bạn sẽ không muốn làm việc ở đó. Trong hầu hết các trường hợp, các nhà phát triển có thẩm quyền có được sự lựa chọn hợp đồng biểu diễn của họ, vì vậy đừng đổ mồ hôi "tính thực tế" trừ khi các lựa chọn duy nhất bạn có thể tưởng tượng trong tương lai là công ty. Làm việc có năng lực, linh hoạt và phá vỡ các vấn đề.

Đại học không phải là về thực tiễn. Đó là về việc tạo ra một môi trường an toàn để khám phá và học hỏi. Trên thực tế, điều đó hữu ích, ngay cả khi bạn kết thúc việc viết phần mềm thông thường cho phần còn lại của sự nghiệp.

Điều đó đang được nói, tôi không hiểu tại sao bạn muốn giới hạn chỉ một trong những lựa chọn đó sớm như vậy. Bạn có thể dễ dàng hiểu được tất cả bốn ngôn ngữ trong khoảng 4 tuần, sau đó chọn một ngôn ngữ để tập trung vào mạng lưới đó tốt nhất với ý tưởng hiện tại của bạn. Sau đó quay lại một trong những lựa chọn khác của bạn và cố gắng thực hiện một cái gì đó tương tự. Chuyển sang một cái gì đó phức tạp hơn, và xem xét các lựa chọn của bạn một lần nữa. Thử nghiệm là tốt. Trừ khi bạn đang cố gắng kiếm sống vào tháng tới, bạn chưa cần phải trở thành một chuyên gia.

Tôi đã viết một số trong Scheme, F #, Emacs Lisp và Common Lisp, và đọc ít nhất một chút Haskell, ít nhất là đôi khi trong vài năm qua. Tôi không thể nói tôi là một chuyên gia trong bất kỳ ai trong số họ, nhưng mỗi chuyến đi vào những ngôn ngữ đó đã mang lại lợi ích cho tôi trong tất cả các ngôn ngữ khác mà tôi làm việc chuyên nghiệp (C #, Java, Ruby, và đôi khi là Boo, Perl và Python). Sự tò mò sẽ xây dựng cho bạn một sự nghiệp bền bỉ, hoàn thành hơn bất kỳ điều gì khác.


2
"Sự tò mò sẽ xây dựng cho bạn một sự nghiệp bền bỉ, hoàn thành hơn bất kỳ điều gì khác." Tuyên bố này rất truyền cảm. Bạn đúng. Tôi quá vội vàng. Tôi luôn cảm thấy như tất cả sẽ mất quá nhiều thời gian để học ... Nếu tôi có thể quay lại 12 năm, khi tôi bắt đầu, tôi biết sẽ không lãng phí toàn bộ thời gian của mình vào VB và C ++. Tôi cảm thấy như những năm này đã bị lãng phí khá nhiều. Tôi không đủ tò mò. Tôi muốn mã hóa công cụ. Sử dụng các ngôn ngữ tôi biết là đủ. Lúc đó tôi đã nghĩ rằng mình đang biết một số tiền khá lớn, nhưng điều đó thật kinh khủng không phải là trường hợp nào cả.
Joanis

10

Tôi đã tìm hiểu về Haskell một thời gian, nhưng kết luận mà tôi đã đưa ra là nó hơi quá hàn lâm. Rất khó để làm bất cứ điều gì thiết thực. Trong một ngôn ngữ chức năng thuần túy, những thứ như IO không phù hợp với mô hình, vì vậy bạn phải đối phó với các đơn nguyên. Tôi xác định rằng tôi sẽ phải bỏ ra một khoảng thời gian rất lớn để chỉ vừa đủ khả năng, vì vậy tôi đã tiếp tục.

Tôi đã làm Scheme ở trường đại học. Nghe có vẻ tầm thường, nhưng tất cả các parens thực sự gây mất tập trung / gây phiền nhiễu. Khó có thể quay lại đó sau khi sử dụng các ngôn ngữ như Python.

Gần đây tôi đã khám phá F #. Nó là chức năng, nhưng cũng có thể là bắt buộc và hướng đối tượng khi bạn muốn. Điều này, cùng với việc có thể sử dụng bất kỳ thư viện .NET nào, giúp có thể dễ dàng trộn các phần chức năng thuần túy của bạn với những thứ thiết thực hơn như GUI, IO và mạng. Bạn có thể có được một phiên bản độc lập của F #.

http://www.microsoft.com/doads/en/details.aspx?FamilyID=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang=vi


Thực tế là F # và Clojure không hoàn toàn có chức năng đóng vai trò quan trọng trong lợi ích của họ. Có lẽ F # có thể là điểm vào của tôi trong gia đình .Net một ngày nào đó ...
Joanis

1
@MJoanis, bạn đã nêu chi phí là một điểm so với F #, nhưng như Erik chỉ ra, bạn có thể nhận được nó hoàn toàn miễn phí.
Stewol

Nếu tôi đọc các điều khoản đúng, về cơ bản bạn sẽ nhận được nó miễn phí với điều kiện không sử dụng nó (hoặc mua giấy phép). Nhưng tôi hiểu nó vẫn có thể là một điều rất tốt để học trong trường hợp tôi kết thúc ở một công ty sử dụng Visual Studio. Có lẽ tôi sẽ thử một lần khi tôi hoạt động với ngôn ngữ lập trình chức năng miễn phí hơn.
Joanis

1
@M. Joanis: Không, F # thậm chí là nguồn mở và bạn có thể thử chạy trên Mono trên các nền tảng khác.
Jon Harrop

Có thể thời gian đã thay đổi kể từ năm 2010, nhưng vì một người bắt đầu học haskell trong vài tháng qua, tôi không nghĩ làm IO trong haskell là khó khăn cả. Đối với những thứ cơ bản, bạn chỉ cần học một số cú pháp mới Để có được sự hiểu biết cơ bản thực sự mất vài tuần, nhưng tôi thực sự không thấy những gì fuzz nói về các đơn nguyên. Tôi không nghĩ rằng chúng khó học hơn các lớp, trường hợp, thành viên tĩnh và tất cả các nhạc jazz liên quan đến nhà nước khác trong OOP.
sara

9

Tôi đã đánh giá tất cả các ngôn ngữ chức năng chính một hoặc hai năm trở lại, từ quan điểm muốn có một ngôn ngữ lập trình chức năng chung, thực tế.

Cuối cùng tôi đã chọn Clojure , thứ mà sau đó đã được chứng minh là một lựa chọn tuyệt vời.

Nói rộng ra những lý do chính là:

  • Hệ sinh thái thư viện - để một ngôn ngữ trở nên hữu ích, bạn cần truy cập vào các thư viện tốt. Tham gia vào JVM có nghĩa là bạn có quyền truy cập dễ dàng vào hệ sinh thái công cụ và thư viện mã nguồn mở lớn nhất, do đó, việc sử dụng ngôn ngữ JVM là không có trí tuệ từ góc độ thực dụng. Scala cũng đạt điểm cao ở đây.

  • Siêu lập trình vĩ mô - Khía cạnh này của Lisp luôn hấp dẫn tôi, đặc biệt là vì tôi dự đoán sẽ thực hiện khá nhiều việc tạo mã. Tôi đã đánh giá rất cao những lập luận được đưa ra trong bài tiểu luận ngắn " Đánh bại mức trung bình " của Paul Graham . Các Lisps khác nhau tất cả ghi điểm mạnh mẽ ở đây.

  • Hiệu suất là "đủ tốt" - Clojure luôn được biên dịch và nhận được những lợi ích của trình tối ưu hóa JVM JIT và GC tuyệt vời. Như mọi khi, có một số chi phí sử dụng ngôn ngữ chức năng nhưng với Clojure, rõ ràng là bạn có thể sử dụng tốc độ Java một chút với một chút nỗ lực (Clojure hỗ trợ các nguyên hàm Java và gõ tĩnh tùy chọn cho những tình huống bạn cần). Ước tính của tôi là Clojure chậm hơn 2-5 lần so với những gì bạn có thể đạt được với mã Java hoặc C ++ được tối ưu hóa, phù hợp với những gì bạn thấy trong các điểm chuẩn còn thiếu sót và theo thời gian tôi hy vọng khoảng cách đó sẽ thu hẹp hơn nữa. Ngoài ra, thật dễ dàng khi chỉ cần viết mã đặc biệt nhạy cảm với hiệu năng bằng Java thuần túy và gọi nó từ Clojure.

  • Đồng thời - Clojure có một cách tiếp cận khá độc đáo và mạnh mẽ đối với đồng thời, đặc biệt đối với đồng thời rất đa lõi. Hơi khó để giải thích, nhưng video này là tuyệt vời để đưa ra một hương vị của các nguyên tắc. Tôi nghĩ rằng Clojure hiện có câu trả lời tốt nhất cho câu hỏi khó "bạn nên quản lý trạng thái chia sẻ, đồng thời và có thể thay đổi như thế nào trong ngôn ngữ lập trình chức năng?".

  • Thiết kế ngôn ngữ - Clojure là IMO một thiết kế ngôn ngữ rất chu đáo. Các ví dụ đang có vectơ [] và ánh xạ {} ngoài các dấu ngoặc đơn Lisp thông thường, sử dụng các cấu trúc dữ liệu liên tục bất biến, hỗ trợ sự lười biếng trong ngôn ngữ thông qua việc trừu tượng hóa chuỗi và cung cấp cho lập trình viên nhiều tính năng trực giao để giải quyết các vấn đề khác nhau để giải quyết các vấn đề khác nhau . Xem nghệ thuật trừu tượngđơn giản dễ dàng .

  • Cộng đồng - luôn chủ quan, nhưng tôi thích những gì tôi thấy trong cộng đồng Clojure. Thái độ rất hữu ích, mang tính xây dựng và thực dụng. Có một sự nhấn mạnh "hoàn thành công việc", có thể phản ánh thực tế rằng rất nhiều người Clojure (bao gồm cả Rich Hickey) đến từ một nền tảng xây dựng các hệ thống doanh nghiệp phức tạp. Việc cộng đồng Clojure có liên kết mạnh mẽ với cộng đồng Java cũng rất quan trọng trong việc thuyết phục tôi rằng Clojure sẽ không có nguy cơ bị mắc kẹt trong một "ngách".

Nếu tôi phải kể tên một vài nhược điểm nhỏ của Clojure, thì đây sẽ là:

  • Gõ động - thường đây là một lợi thế về năng suất, nhưng trung bình tôi nghĩ tôi sẽ đánh đổi điều này để kiểm tra và suy luận kiểu mạnh hơn. Hầu hết điều này được giảm nhẹ bằng cách có một bộ kiểm tra tự động tốt, nhưng nếu bạn thích các loại của bạn được xác thực tĩnh bởi trình biên dịch thì Haskell hoặc Scala có thể là tách trà của bạn nhiều hơn.

  • Điểm mấu chốt - Clojure đang phát triển rất nhanh và có rất nhiều sự đổi mới đang diễn ra - nhược điểm của điều này là có rất nhiều thử nghiệm, một số thư viện và công cụ vẫn chưa trưởng thành và đôi khi có những thay đổi đột phá giữa các phiên bản chính của Clojure mà bạn cần phải để mắt đến

Nhìn chung, tôi không nghĩ bạn có thể sai với Clojure nếu bạn muốn một ngôn ngữ chức năng hiện đại xuất sắc và thực dụng!


1
Cảm ơn! Bài đăng tuyệt vời! Tôi chỉ là, những ngày này, xem xét sử dụng nó cho một dự án nội bộ của công ty sẽ dựa nhiều vào cây và đệ quy. Thêm vào đó, chúng tôi có khá nhiều mã Java ở đây mà chúng tôi có thể sử dụng lại với Clojure.
Joanis

6

Có vẻ như bạn đã hoàn thành bài tập về nhà, vì vậy bạn có thể đã biết điều này, nhưng Scheme là một phương ngữ của Lisp giống như Lisp thông thường. Nếu bạn thích nhiều thứ về Scheme, nhưng không thích bản chất học thuật của nó, hãy thử Common Lisp. Theo chỉ số TIOBE , đây là ngôn ngữ phổ biến thứ 13 so với Đề án ở vị trí 26.

Rất ít ngôn ngữ bạn đã đề cập xuất hiện trên các mô tả công việc tôi đã thấy gần đây, mặc dù đó có thể chỉ là bộ mẫu nhỏ của tôi. Cá nhân tôi sẽ học Haskell, mặc dù tôi không mong đợi sử dụng ngôn ngữ đó trực tiếp trong công việc của mình. Các khái niệm về lập trình chức năng có giá trị đối với tôi đối với các thiết kế chương trình trong tương lai hơn là khả năng tiếp thị trực tiếp của chính ngôn ngữ.


Cảm ơn liên kết TIOBE, đó là một tài liệu tham khảo thú vị. Tôi đoán bạn đang chọn Haskell vì sự thuần khiết của nó về mặt lập trình chức năng?
Joanis

1
@ M.Joanis: Khá nhiều, mặc dù tôi cũng nghĩ sau này cũng sẽ đón Lisp. Xem lập trình
viên.stackexchange.com/questions/18838/ Kẻ

Câu trả lời được lựa chọn có rất nhiều ý nghĩa. Sự tinh khiết dường như là con đường để đi cho đến khi tôi thực sự nắm bắt được toàn bộ mô hình chức năng.
Joanis
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.