it-swarm-vi.com

Chọn ngôn ngữ lập trình chức năng

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ỳ cuối cùng, 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 homoiconicity , macro ( vệ sinh và không hợp vệ sinh), tính không hợp lý 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 các lựa chọn 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ẻ hay 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 trên Edge phải Bây giờ? Tôi đã biết Java khá tốt, nhưng sẽ là khôn ngoan 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 các 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 tìm hiểu tất cả chúng một cách sâu sắc trước khi có thể chọn một.

49
Joanis

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

alt text

Lưu ý rằng Haskell và LISP được sử dụng nhiều hơn các ngành 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:

alt text

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; "lược đồ" Word 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 đồ có thể đại diện hơn (một chút):

alt text

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.

36
Robert Harvey

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.

18
Larry Coleman

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.

16
JasonTrue

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 hoàn toàn 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 dành một lượng thời gian rất lớn để chỉ là hầu như không có thẩm quyền, vì vậy tôi di chuyển trên.

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 bạn có thể dễ dàng trộn các phần chức năng thuần túy của mình với những thứ thiết thực hơn như GUI, IO và kết nối mạng. Bạn có thể có 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 = en

10
Erik

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 , 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 - để 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.

  • Lập trình siêu dữ liệu macro - 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 của Paul Graham " Đánh bại mức trung bình ". 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 các lợi ích của trình tối ưu hóa JIT JVM 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ể từng gần với Java tốc độ với một chút nỗ lực (Clojure hỗ trợ Java nguyên thủy và gõ tĩnh tùy chọn cho những tình huống mà 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 tối ưu hóa Java hoặc C++, được tối ưu hóa phù hợp với những gì bạn thấy trong điểm chuẩn không hoàn hảo 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 để viết mã nhạy cảm hiệu năng đặc biệt trong thuần Java và gọi nó từ Clojure.

  • Đồng thời - Clojure có 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 đa lõi rất cao. 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ữ được suy nghĩ rất kỹ. 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ễ thực hiện .

  • 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" mạnh mẽ, 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. Thực tế là 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 thì đâ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 mình đượ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.

  • Cutting Edge - 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ác 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 để mắt tới.

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!

9
mikera

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 Lược đồ ở 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ữ.

6
Zeke