Tại sao lập trình chức năng không phổ biến hơn trong ngành? Nó có bắt được bây giờ không? [đóng cửa]


61

Trong bốn năm ở trường đại học, chúng tôi đã sử dụng nhiều chương trình chức năng trong một số ngôn ngữ lập trình chức năng. Nhưng tôi cũng đã sử dụng nhiều lập trình hướng đối tượng và trên thực tế tôi sử dụng các ngôn ngữ hướng đối tượng nhiều hơn khi thực hiện dự án nhỏ của riêng mình để chuẩn bị cho công việc đầu tiên của mình. Nhưng tôi thường ước rằng tôi được mã hóa bằng ngôn ngữ lập trình chức năng khi thực hiện các dự án này.

Tuy nhiên, khi tìm kiếm một công việc, rất hiếm khi thấy một công việc đòi hỏi kiến ​​thức về ngôn ngữ lập trình chức năng.

Tại sao ngôn ngữ lập trình chức năng không được sử dụng nhiều hơn trong ngành? Có khá nhiều tin tức về ngôn ngữ lập trình chức năng ngày nay, vì vậy tôi tự hỏi liệu bây giờ lập trình chức năng có bắt kịp trong ngành không?


3
Ở một mức độ nào đó, tôi không đồng ý với tiền đề của câu hỏi của bạn. Các tính năng ngôn ngữ được lấy cảm hứng từ "ngôn ngữ chức năng" đang được thêm vào các ngôn ngữ như Java và JavaScript. Trên thực tế, JavaScript luôn là (theo một cách nào đó) một ngôn ngữ chức năng, mặc dù rất nhiều người đã không nhận ra nó cho đến gần đây.
MatrixFrog

1
@MatrixFrog: Người ta có thể hỏi "Tại sao chỉ đi một nửa chức năng bằng cách thêm một vài khái niệm chức năng vào các ngôn ngữ phi chức năng thay vì áp dụng ngôn ngữ FP đầy đủ? Sau tất cả các mô hình đã tồn tại trong nhiều năm và rất trưởng thành."
Giorgio

thế giới không chuyển sang các lựa chọn thay thế vượt trội (và FP thuần túy là một lựa chọn thay thế vượt trội) vì các lý do khác nhau bao gồm khả năng tương thích ngược, quán tính, v.v. Hãy xem xét cách bố trí bàn phím DVORAK: hiệu quả hơn cho việc gõ bằng cảm ứng nhưng tất cả chúng ta bị mắc kẹt với QWERTY đơn giản vì có quá nhiều phần mềm với các phím tắt thân thiện với qwerty.
KolA

Câu trả lời:


38

Tôi muốn nói rằng một trong những lý do khiến lập trình chức năng không phổ biến hơn là thiếu cơ sở kiến ​​thức. Kinh nghiệm của tôi là các tập đoàn rất không thích rủi ro trong việc triển khai các công nghệ không phải là luồng chính và muốn đầu tư vào các khung đã thử và đúng (java, c ++, c #). Chỉ khi có nhu cầu kinh doanh (như ở Ericsson) thì các mô hình mới mới được xem xét. Nhưng ngay cả trong trường hợp của Ericsson, tôi đã nghe nói rằng ban quản lý yêu cầu sử dụng c ++ và Joe Armstrong bị buộc phải viết mã các cuộc gọi erlang trong c ++ !! Điều này sẽ cho thấy các tập đoàn bất đắc dĩ phải thực hiện các công nghệ mới như thế nào!


9
Làm thế nào là lập trình chức năng theo bất kỳ cách nào 'mới'?
Evan Plaice

7
Tôi nghĩ anh ấy có nghĩa là 'không sử dụng' thay vì 'mới'.
Vinko Vrsalovic

9
Vì vậy, nó không được sử dụng ... bởi vì nó không được sử dụng? Hừm.
Alex Baranosky

21
@Alex - Chính xác. Sucks, phải không?
KeithS

5
@ Stargazer712: Những lý do đó là gì? Tôi biết rất nhiều nhà phát triển không biết lập trình chức năng, vì vậy sự thiếu hiểu biết có ý nghĩa với tôi. Có phải lập trình chức năng đã có một thất bại lớn trong quá khứ khiến ngành công nghiệp tránh xa nó mà tôi không biết?
Sean McMillan

67

Tôi là một giáo sư và, giống như các lập trình viên, các giáo sư luôn tìm kiếm Next Big Thing. Khi họ nghĩ rằng họ đã tìm thấy một, họ biến nó thành một nhóm nhạc và mọi người chồng chất lên nhau. Vì họ đang giảng cho những sinh viên nghĩ rằng các giáo sư phải thực sự thông minh, nên tại sao họ lại là giáo sư, họ không nhận được sự phản kháng nào.

Lập trình chức năng là một bandwagon như vậy. Chắc chắn rằng nó có rất nhiều câu hỏi thú vị để điều tra, và rất nhiều bài báo hội thảo thú vị để viết. Đây không phải là một ý tưởng đặc biệt mới và bạn có thể thực hiện nó bằng bất kỳ ngôn ngữ hiện đại nào và các ý tưởng không phải là mới để trở nên thú vị. Đó cũng là một kỹ năng tốt để có.

Cho rằng, lập trình chức năng chỉ là một mũi tên cần có trong bộ rung của bạn, không phải là duy nhất, giống như OOP không phải là duy nhất.

Thịt bò của tôi với học viện khoa học máy tính là thiếu sự tương tác thực tế với ngành công nghiệp để xác định những gì thực sự có ý nghĩa trong thế giới thực, tức là kiểm soát chất lượng. Nếu kiểm soát chất lượng ở đó, có thể có một sự nhấn mạnh khác, về việc phân loại các vấn đề và phạm vi giải pháp cho chúng, với sự đánh đổi, thay vì chỉ là các băng thông mới nhất.


1
Đây là một nhận xét thực sự tốt. +1 cho mũi tên trong run rẩy của bạn và phạm vi giải pháp với sự đánh đổi.
user21007

2
+1 cho QC. Thạc sĩ mà có thể đã được nhiều hơn hữu ích với các đối tượng chuyên dụng bao gồm kiểm tra, rà soát mã, độ phức tạp mã và tương tự. Có thể tự động xác minh rằng một chương trình thực hiện những gì cần thiết sau bản vá cuối cùng có giá trị bất kỳ số lượng "nó nên hoạt động ngay bây giờ".
l0b0

5
@ l0b0: Cảm ơn, mặc dù thực sự tôi đã nghĩ đến việc kiểm soát chất lượng của những gì được dạy và làm thế nào. Như nó là, các giáo sư CS chỉ dạy những gì cá nhân họ thấy thú vị nhất. So sánh điều đó với kỹ thuật, nơi có sự tương tác với ngành công nghiệp, hoặc y học, nơi mà sự liên quan trong thế giới thực là rất cao. IME, CS profs cho rằng thế giới thực sẽ thực hiện việc giảng dạy những gì quan trọng trong thế giới thực, nhưng sinh viên không muốn học hỏi - thay vào đó họ háo hức muốn cải thiện những gì giáo sư hào hứng nhất.
Mike Dunlavey

@Mike: về ngôn ngữ hiện đại nào? Bạn có bao gồm C ++ và Java không?
kevin cline

+1. Không thể nói nó tốt hơn bản thân mình.
riwalk

25

Bởi vì vấn đề lớn nhất trong phát triển phần mềm ngày nay là khả năng quản lý sự phức tạp. Đây không phải là trọng tâm của hầu hết các ngôn ngữ lập trình chức năng. Như vậy, ngôn ngữ mà làm làm cho rằng ưu tiên hàng đầu (cụ thể là các ngôn ngữ OOP phổ biến hơn) có xu hướng chỉ ăn cắp một số tính năng mát mà đi ra khỏi chức năng ngôn ngữ học thuật nhiều hơn và do đó ở trên đầu trang.


48
Tôi không đồng ý. Các ngôn ngữ lập trình chức năng cố gắng giảm thiểu việc sử dụng trạng thái và do đó ít phức tạp hơn. Các chương trình được lập trình bằng ngôn ngữ chức năng cũng dễ dàng hơn để kiểm tra và cấu trúc lại.
Jonas

7
@Jonas: rất nhiều lập trình viên cảm thấy vô cùng khó khăn khi viết một chương trình sử dụng hầu như không có trạng thái nào (kể cả bản thân tôi). Từ quan điểm đó, nó thực sự là một phức tạp hơn. (Xin lưu ý rằng tôi không tranh luận về tính hữu ích của lập trình chức năng bằng mọi cách!)
ShdNx

3
@ShdNx: Vâng, tôi biết. Ngay cả tôi cũng nghĩ lập trình chức năng là khó khi tôi mới học nó ở trường đại học. Nhưng sau một thời gian, tôi bắt đầu thích nó hơn là lập trình bắt buộc và OOP cụ thể hơn. Tại trường đại học của tôi, lập trình chức năng đã được dạy trước khi lập trình cấp bách và sinh viên chưa từng lập trình trước khi học đại học nghĩ rằng lập trình cấp bách rất khó ngay từ đầu và lập trình chức năng gần với toán hơn.
Jonas

16
Có một sự khác biệt giữa khó khăn và phức tạp. OOP chắc chắn là khó khăn hơn so với lập trình có cấu trúc vì nó thêm nhiều khái niệm. Đối với số lượng mã đủ lớn, chúng làm giảm độ phức tạp bằng cách cung cấp cấu trúc cho mã. FP cũng giống như vậy: nếu bạn chỉ viết hai dòng thì có vẻ như quá mức cần thiết, nhưng nếu mã của bạn đủ lớn thì cấu trúc mã như các tiểu đơn vị không trạng thái sẽ cải thiện khả năng mở rộng và giảm độ phức tạp của mã.
Muhammad Alkarouri

6
Một trong những điểm nhấn chính của lập trình chức năng là khả năng kết hợp. Nếu đó không phải là một công cụ để quản lý sự phức tạp thì tôi không biết nó là gì.
dan_waterworth

23

Lập trình chức năng chắc chắn là bắt đầu để bắt kịp - từ từ nhưng chắc chắn.

Ví dụ: startup tôi đang xây dựng đang sử dụng ngôn ngữ chức năng (Clojure) làm ngôn ngữ phát triển chính vì các lý do sau:

  • Năng suất - học FP rất khó, nhưng một khi bạn đã hiểu rõ về nó thì rất khó để đánh bại về sức mạnh và tính biểu cảm. Có lẽ tôi đang viết khoảng 1/10 số dòng để triển khai bất kỳ phần chức năng nhất định nào so với những gì tôi cần trong C # hoặc Java

  • Độ tin cậy - các hàm thuần túy dễ dàng lý luận và kiểm tra hơn nhiều so với các đối tượng trạng thái. Do đó bạn có thể viết các bài kiểm tra tốt hơn và xác nhận tính chính xác của mã của bạn dễ dàng hơn nhiều.

  • Đồng thời - ngôn ngữ chức năng nhấn mạnh tính bất biến, có lợi ích to lớn cho các ứng dụng đồng thời hơn là cần chạy hiệu quả trên nhiều lõi. Và dù muốn hay không, chạy trên nhiều lõi là tương lai. Xem http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey để được giải thích rõ ràng về lý do tại sao điều này rất quan trọng

  • Khả năng kết hợp / mô đun hóa - các ngôn ngữ chức năng dường như cho vay để cắm các thành phần dễ dàng hơn so với các hệ thống OO phức tạp. Tôi vẫn chưa tìm ra tất cả các lý do cho việc này, nhưng một phần của nó bắt nguồn từ thực tế là bạn không có tất cả "sự phức tạp ngẫu nhiên" mà các mô hình OO kéo theo chúng. Cuộc nói chuyện về tính đơn giản cấp tiến của Stuart Halloway khám phá những ý tưởng này sâu sắc hơn nhiều.

EDIT : Đáp lại nhận xét của Despertar, một ví dụ về "sự phức tạp ngẫu nhiên" của các hệ thống OOP giới hạn tính mô đun là các vấn đề với nhân bản sâu so với nhân bản nông: bạn không thể ghép các đối tượng lại với nhau và chuyển chúng thành các cấu trúc hỗn hợp mà không có phân tích cẩn thận về ngữ nghĩa nhân bản và đột biến. Trong các trường hợp nhỏ, điều này có thể quản lý được, nhưng trong các hệ thống phức tạp, nó nhanh chóng trở thành một vấn đề quan trọng. Vấn đề này sẽ không tồn tại ở nơi đầu tiên nếu bạn dựa vào cấu trúc dữ liệu chức năng thuần túy.


+1, tôi rất muốn nghe quá trình ra quyết định của bạn xung quanh lý do tại sao bạn chọn Clojure. (Tôi không ủng hộ hoặc chống Clojure, tôi chỉ quan tâm).
dan_waterworth

4
"Học FP là khó": Học bất kỳ mô hình nào cũng khó. Tôi nhớ tôi đã dành bao nhiêu giờ với mã mệnh lệnh (Pascal) trước khi tôi có đủ kinh nghiệm để có năng suất hợp lý. Tôi nghĩ rằng FP ít được biết đến vì nhiều lập trình viên đã học một ngôn ngữ bắt buộc trước tiên và một khi họ học cách lập trình, họ không có thời gian để xem xét một thứ khác. Tôi là một lập trình viên C ++ toàn thời gian và tôi hiện đang học Scala vào buổi tối sau giờ làm việc. Nếu tôi có một gia đình để chăm sóc, tôi có thể quên nó đi.
Giorgio

1
Tôi nghĩ rằng 3 đầu tiên là trường hợp tuyệt vời, tuy nhiên tôi không đồng ý với thứ 4. OOP là cực kỳ mô-đun và thành phần; Đối với tôi đây là một trong những thế mạnh lớn nhất của nó. Nó cũng tuyệt vời trong việc che giấu sự phức tạp thông qua việc đóng gói và trừu tượng hóa.
Despertar

1
@Giorgio. Chính xác. "Học FP rất khó, học OOP thì dễ" cũng vô lý như "Học tiếng Tây Ban Nha thì khó nhưng tiếng Trung thì dễ". Nó phụ thuộc vào ngôn ngữ đầu tiên của bạn. Và tôi đã không chọn tiếng Trung là tương tự tùy ý với OOP - bởi vì thành ngữ OO giống như chữ tượng hình: dễ học từng cái một nhưng khó nhớ tất cả và không thể sáng tác. FP rất giống một ngôn ngữ với bảng chữ cái: các chữ cái riêng biệt vô dụng trong sự cô lập nhưng cho phép soạn thảo bất cứ thứ gì với bộ quy tắc nhỏ hợp lý
KolA

1
(tiếp theo) vậy tại sao nó không phổ biến - chưa - vì những lý do rất giống nhau. Chữ tượng hình tồn tại từ lâu trước khi bảng chữ cái đầu tiên được phát minh và trưởng thành. Nó có thể lấy một thế hệ khác có chữ viết và đọc chữ cái, ý tôi là FP là mô thức đầu tiên của họ
KolA

12

Thiếu ứng dụng sát thủ

Này, cái này ở đây trông tươi. (đào đào đào)

Tôi nghĩ rằng hầu hết các ngôn ngữ lập trình phát triển mạnh nhờ có "ứng dụng sát thủ" - thứ gì đó hấp dẫn dành riêng cho ngôn ngữ này (hoặc được xem theo cách đó). Điều này không có nghĩa là tất cả sự hấp dẫn là ứng dụng đó , nhưng nó đã đưa ngôn ngữ đến một sự chấp nhận lớn hơn.

Đây là quan điểm không chính xác khủng khiếp của tôi về lĩnh vực nào đã thúc đẩy việc áp dụng một số ngôn ngữ chúng ta có ngày nay:

  • C: Hoạt động ở khắp mọi nơi (Đây là cuối thập niên 70 và 80)
  • C ++: Khung GUI (đầu thập niên 90)
  • Java: Applet và servlets (vào cuối những năm 90)
  • Objective-C: Ứng dụng iOS (Trước đó, ứng dụng OS X)
  • Ruby: Đường ray
  • C #: ASP.NET, WinForms
  • PHP: Wordpress, v.v.
  • Javascript: AJAX, đặc biệt là thông qua các khung
  • lua: Kịch bản trò chơi, đặc biệt là WoW

Bên cạnh đó, nhiều ngôn ngữ độc quyền đã lọt vào cửa thông qua các tổ chức bán hàng hùng mạnh (Oracle và ở mức độ thấp hơn các ngôn ngữ của Microsoft), tạo ra hiệu quả của riêng họ.

Một lưu ý rất quan trọng về danh sách đó: "thích hợp" của ngôn ngữ, như được chỉ ra bởi ứng dụng sát thủ, ngày càng cụ thể hơn khi nhiều thập kỷ trôi qua. Lưu ý cái cuối cùng trong danh sách: Cụ thể là kịch bản trò chơi . Các ngôn ngữ ngày càng khó hơn để thu hút sự chú ý vì danh sách những điều đã được ngôn ngữ khác thực hiện đủ tốt.

Vì vậy, những gì bất kỳ ngôn ngữ chức năng cần phải thực sự cất cánh là một thích hợp. Trong thực tế, chưa có bất kỳ ngôn ngữ chức năng khổng lồ nào, nhưng có rất nhiều ngôn ngữ nhỏ hơn:

  • Emacs Lisp: Sử dụng liên tục từ những năm 80 trong Emacs bởi các nhà phát triển. ( Hầu như không bao giờ được sử dụng ở bất cứ nơi nào khác.)
  • Erlang: Bất cứ nơi nào bạn muốn có nhiều tác nhân đồng thời.
  • Đề án: Giáo dục
  • APL / J / K: Tài chính (Hãy gọi các chức năng này, để tranh luận)
  • Lisp thông thường: "AI" - Đây là những gì mọi người có xu hướng nói nó được sử dụng, đó là một phước lành và một lời nguyền.

Bây giờ, ngôn ngữ chính duy nhất tôi cảm thấy tôi đã rời khỏi cuộc thảo luận này là Python. Python đã làm một cái gì đó rất thú vị; nó đã thành công mà không có vẻ là người chiến thắng trong bất kỳ lĩnh vực chính nào. Điều này có thể có nghĩa là tôi đã sai lầm khi xem ngôn ngữ phổ biến theo cách này. Điều đó cũng có nghĩa là một ngôn ngữ đủ tốt có thể trở nên phổ biến mà không cần ứng dụng sát thủ để thúc đẩy việc chấp nhận và chấp nhận, nhưng nó rất khó và có thể mất một thời gian rất dài. (Perl có một câu chuyện tương tự, nhưng đã đến một vài năm trước và bây giờ ít hấp thu hơn.)

Từ điều này, tôi có thể nói những ngôn ngữ chức năng mà tôi nghĩ đang gia tăng:

  • Clojure: Lập trình web, đặc biệt. thông qua Heroku
  • Scala: Nâng (hoặc có thể Chơi, những ngày này) - JVM không có Java

Nếu bạn hỏi tôi nên tìm ngôn ngữ chức năng phổ biến nào tiếp theo, tôi sẽ nói rằng hãy tìm ngôn ngữ chức năng với phát triển đám mây chìa khóa trao tay (a la Heroku hoặc GAE) hoặc phát triển ứng dụng di động chìa khóa trao tay.


Tôi cũng sẽ coi Perl là một ngôn ngữ chính. Đó là một ngôn ngữ cũ mà tôi thường nói là thường được sử dụng với các hệ thống giống Unix. Mặc dù Python dường như là một sự thay thế hiện đại hơn. Nó vẫn là một ngôn ngữ phổ biến đã nhận được rất nhiều sự chú ý và có một cộng đồng lớn.
Despertar

1
@Despertar - Tôi đã không cố gắng hết sức để trở thành người bình đẳng về ngôn ngữ mà tôi đã đề cập :) Và đồng ý, câu chuyện có vẻ rất giống Python, ngoại trừ một vài năm trước.
Jesse Millikan

1
Perl đã có một vài hốc. Bản đầu tiên được phản ánh trong các phiên bản cũ hơn của tài liệu của nó, được gọi là tên viết tắt của "ngôn ngữ báo cáo và trích xuất thực tế". Thứ hai đến cùng một chút sau, và là CGI script - trong nhiều năm, perl là các ngôn ngữ của trang web. Rõ ràng là bây giờ nó đã mất rất nhiều sự phổ biến đó, nhưng hãy xem các trang web cũ vẫn chạy trên cùng một phần mềm mà chúng được xây dựng cùng và bạn sẽ thấy rất nhiều perl (tôi nghĩ về slashdot.org, ngay bây giờ , nhưng có khá nhiều hơn nữa).
Jules

8

Vì lý do tương tự mà Lisp không bao giờ thực sự bị cuốn vào (hãy để flamewar bắt đầu!). Lập trình hàm là một mô hình rất xa lạ so với lập trình bắt buộc và hướng đối tượng. Nếu, giống như đại đa số sinh viên CS, bạn bắt đầu với C và tiến tới C ++ / Java, bạn có xu hướng không muốn học cách suy nghĩ theo cách hoàn toàn trực giao với cách bạn thường nghĩ.


2
Mô hình người ngoài hành tinh? Nó gần với toán học hơn là lập trình bắt buộc. Ở Thụy Điển, tôi nghĩ rằng hầu hết sinh viên CS tại trường đại học là người lập trình chức năng đầu tiên. Ví dụ: chúng tôi đã bắt đầu với Standard ML, trước C, Erlang và Java.
Jonas

4
Đủ công bằng. Tôi biết rằng rất nhiều sinh viên kỹ thuật ở Anh và Ấn Độ được dạy C trước, sau đó là C ++ và / hoặc Java. Thường thì họ không được dạy một ngôn ngữ chức năng nào cả.
Chinmay Kanchi

13
@Jonas Đối với một số người dân ngoài kia, toán học là một mô hình của người ngoài hành tinh và bất cứ điều gì đưa lập trình ra xa khỏi toán học làm cho nó dễ hiểu hơn.
scriptocalypse

5
Tôi đã nghe nói về những người chưa bao giờ nghe nói về cây, hãy để một mình lập trình chức năng, đã tốt nghiệp.
dan_waterworth

1
@ Thâ-D, thực ra, không, tôi đang nói về sinh viên ở Anh.
dan_waterworth

6

Hãy xem xét các doanh nghiệp và lập trình.

Có những doanh nghiệp sử dụng phần mềm của họ như một tài sản chiến lược. Đây không phải là điển hình. Đối với hầu hết các doanh nghiệp, CNTT là thứ hỗ trợ doanh nghiệp thực sự của công ty. Đó là một chi phí cần thiết. Họ bảo thủ bởi vì họ biết rằng với $ X, họ có thể có được CNTT mà họ cần, trong khi nếu họ chuyển sang một thứ khác, họ sẽ tiết kiệm ít hơn $ X nếu mọi thứ suôn sẻ và mất đi thực sự nếu mọi thứ trở nên tồi tệ.

Hơn nữa, trong các doanh nghiệp, điều rẻ nhất để làm thường là những gì họ đã làm ngày hôm qua. Thay đổi, tuy nhiên, mong muốn, là đắt tiền. Nếu một công ty thay đổi từ, giả sử, một giải pháp C # /. NET, thậm chí thành F #, họ sẽ gặp vấn đề. Các lập trình viên của họ (có khả năng không phải là lập trình viên sắc sảo nhất ngoài kia) sẽ phải học một ngôn ngữ mới, và thành thạo cả hai, và sử dụng cả hai thường xuyên. Sẽ có những thói quen được viết trong cả hai trong một thời gian dài. Nếu họ chuyển sang một thứ như Haskell, hoặc nếu họ đang sử dụng C ++ / MFC ngay từ đầu, họ sẽ thay đổi nhiều hơn và điều đó sẽ tốn kém hơn rất nhiều.

Ngoài ra, sẽ có một nguồn cung cấp cho các lập trình viên C # và tiếp tục hỗ trợ của Microsoft trong một thời gian dài sắp tới. Các thực hành CNTT hiện tại có thể được tính vào. Không có cùng mức hỗ trợ thể chế hoặc đảm bảo sự sẵn có liên tục của các lập trình viên.

Do đó, đối với hầu hết các doanh nghiệp, việc thay đổi lập trình chức năng sẽ rất tốn kém và sẽ chỉ tự trả nếu việc giảm chi phí CNTT là đủ trong thời gian dài, ngoại trừ việc về lâu dài có khả năng là iffy.


2

Bạn đã viết mã theo kiểu chức năng, chỉ là bạn không biết nó.

Khi bạn được yêu cầu thực hiện kiểm tra đơn vị cho mã của mình, bạn có xu hướng viết các hàm có thể kiểm tra, không tạo hoặc phụ thuộc vào các hiệu ứng phụ và luôn trả về cùng một kết quả trên cùng một đối số (được gọi là các hàm thuần túy). Đây là lợi thế chính của các chương trình chức năng.

Tôi nghĩ rằng ngôn ngữ chức năng là quá hạn chế. Vì vậy, thay vì thay thế các ngôn ngữ bắt buộc bằng các ngôn ngữ chức năng, các ngôn ngữ mệnh lệnh sẽ có được các tính năng chức năng. Ngày nay, hầu hết mọi ngôn ngữ lập trình đều có phần đóng và lambdas.


1

Tôi tin rằng chỉ có một câu trả lời thực sự cho câu hỏi của bạn. Bạn có thể nhận được rất nhiều lý do liên quan tại sao câu trả lời này là trường hợp, nhưng đó là những câu hỏi khác nhau.

Đây là:

  • Kiến trúc sư phần mềm cung cấp giải pháp họ tự tin sẽ làm việc.
  • Phần lớn các kiến ​​trúc sư không làm việc trong các ngôn ngữ chức năng.
  • Khi các công nghệ và ngôn ngữ được chọn, các doanh nghiệp sẽ tìm thấy những người có thể làm việc với họ.

Có bắt được không? Tất cả phụ thuộc vào việc những người tự tin sử dụng ngôn ngữ chức năng có trở thành kiến ​​trúc sư hay không và chọn sử dụng nó cho các dự án mà họ làm việc.


0

Vấn đề thực sự là nhà nước.

Ngôn ngữ chức năng không có nhà nước toàn cầu. Hầu hết các vấn đề công nghiệp yêu cầu trạng thái ở quy mô lớn (làm thế nào để bạn đại diện cho một sổ cái hoặc một bộ giao dịch) ngay cả khi một số chức năng ở quy mô nhỏ không thực sự yêu cầu nó (xử lý một sổ cái).

Nhưng chúng tôi đang chạy mã trên các máy kiến ​​trúc Von-Neuman vốn đã đầy đủ trạng thái. Vì vậy, chúng tôi chưa thực sự thoát khỏi trạng thái, các ngôn ngữ chức năng chỉ che giấu sự phức tạp của trạng thái khỏi nhà phát triển. Điều này có nghĩa là ngôn ngữ / trình biên dịch phải xử lý trạng thái đằng sau hậu trường và quản lý nó.

Vì vậy, mặc dù các ngôn ngữ chức năng không có trạng thái toàn cầu, thông tin trạng thái của chúng được truyền dưới dạng tham số và kết quả.

Vì vậy, câu hỏi sau đó trở thành ngôn ngữ có thể xử lý nhà nước hiệu quả đằng sau ý nghĩa? Đặc biệt là khi kích thước dữ liệu vượt xa kích thước của kiến ​​trúc.

Nhìn vào nó từ phía Phần cứng

HĐH đã giúp ích rất nhiều trong vài năm qua trong việc trực quan hóa không gian địa chỉ để các ứng dụng không chính thức phải lo lắng về điều đó. Nhưng các ứng dụng không lo lắng về việc rơi vào bẫy đập phần cứng khi áp lực bộ nhớ trở nên mãnh liệt (phần cứng đập sẽ làm chậm quá trình của bạn để thu thập dữ liệu).

Vì lập trình viên không kiểm soát trực tiếp trạng thái trong ngôn ngữ chức năng, họ phải dựa vào trình biên dịch để xử lý việc này và tôi chưa thấy các ngôn ngữ chức năng xử lý tốt việc này.

Về mặt trái ngược của đồng xu, lập trình viên toàn trạng có quyền kiểm soát trực tiếp trạng thái và do đó có thể bù cho các điều kiện bộ nhớ thấp. Mặc dù tôi chưa thấy nhiều lập trình viên thực sự đủ thông minh để làm như vậy.

Nhìn từ phía ngành công nghiệp:

Công nghiệp có rất nhiều lập trình viên nhà nước không hiệu quả.

Nhưng thật dễ dàng để đo lường sự cải thiện trong các chương trình này theo thời gian. Bạn ném một nhóm các nhà phát triển vào vấn đề họ có thể cải thiện mã bằng cách cải thiện cách chương trình xử lý trạng thái.

Đối với các chương trình chức năng, các cải tiến khó đo lường hơn vì bạn cần cải thiện các công cụ sẽ cải thiện các chương trình (chúng tôi chỉ xem xét cách các ứng dụng xử lý trạng thái cơ bản hiệu quả ở đây, chứ không phải cải tiến tổng thể của chương trình).

Vì vậy, đối với ngành công nghiệp, tôi nghĩ rằng nó có khả năng đo lường sự cải tiến trong mã.

Từ góc độ tuyển dụng

Có rất nhiều lập trình viên đầy đủ cho thuê. Các lập trình viên chức năng rất khó tìm. Vì vậy, mô hình cung và cầu cơ bản của bạn sẽ phát huy tác dụng nếu ngành công nghiệp chuyển sang lập trình kiểu chức năng và đó không phải là điều họ muốn xảy ra (lập trình viên đủ đắt như hiện tại).


2
Các ngôn ngữ chức năng, đặc biệt là các ngôn ngữ chức năng "không trong sạch", có thể đối phó với trạng thái toàn cầu hoàn toàn tốt. Tôi thấy rằng các chương trình thường phân rã thành các lớp xen kẽ: ví dụ: trạng thái toàn cầu ... nhưng chuyển trạng thái chức năng ... với trạng thái cục bộ (mặt nạ) thỉnh thoảng để thực hiện các phần quan trọng về hiệu suất của các chuyển đổi đó, v.v. Vấn đề với các ngôn ngữ bắt buộc , IMO , là họ thường dẫn các lập trình viên sử dụng trạng thái không phù hợp, khi các mẫu chức năng sẽ hoạt động tốt hơn. Nhưng ngôn ngữ dường như đang phát triển theo hướng hỗ trợ tốt cả hai phong cách.
Ryan Culpepper

1
Nó rất dễ dàng để đối phó với trạng thái trong các ngôn ngữ chức năng, nhưng nó đòi hỏi một sự thay đổi trong trọng tâm. Trong khi trong các ngôn ngữ bắt buộc, bạn viết các thủ tục sửa đổi trạng thái, trong các ngôn ngữ chức năng bạn viết các hàm trả về các thủ tục sửa đổi trạng thái.
dan_waterworth

"Ngôn ngữ chức năng không có trạng thái toàn cầu" - Bạn không cần trạng thái toàn cầu. Khá nhiều tất cả quản lý nhà nước có thể được thực hiện thông qua các đơn nguyên.
Arunav Sanyal

-3

Câu hỏi này có tiền đề hơi sai. Vì những lý do sau đây:

  1. Lập trình chức năng thực sự khá phổ biến trong ngành. Nhưng nó chỉ được sử dụng ở nơi có sẵn lập trình viên có kinh nghiệm. Người mới bắt đầu không thể mong đợi để biết nó. Hầu như tất cả các dự án lập trình lớn đang sử dụng nó, nhưng họ chỉ giữ nó trong các khu vực được xử lý bởi các lập trình viên có kinh nghiệm. Người mới bắt đầu sẽ đối phó với các mô-đun dễ dàng không yêu cầu lập trình chức năng.
  2. Với thực tế này, các công ty đang tuyển người (thường là những người trẻ đến từ trường đại học) thực sự không thể yêu cầu kinh nghiệm lập trình chức năng. Bất cứ ai trong các dự án đòi hỏi lập trình chức năng đã ở cùng một công ty trong 15 năm.
  3. Các trường đại học đang bắt đầu dạy nó, bởi vì họ đã biết rằng kiến ​​thức lập trình chức năng sẽ rất hữu ích trong 30 năm nữa. Khoảng thời gian của họ là trong 30 năm chứ không phải nửa năm bình thường như ở các công ty.
  4. Những điểm này là lý do khiến mọi người thất vọng khi họ gia nhập lực lượng lao động và thấy rằng những thứ họ học được ở trường đại học không được sử dụng. Nhưng chúng được thiết kế trong khoảng thời gian 30 năm và cuối cùng sẽ hữu ích - chỉ là các công ty đang sử dụng những thứ đơn giản - thứ mà họ có thể mong đợi mọi người biết.
  5. Ngoài ra, bạn sẽ kiêu ngạo nếu bạn nghĩ sau vài năm đại học, bạn biết lập trình chức năng đủ tốt để sử dụng nó trong các dự án phần mềm thực tế. Bắt đầu từ những thứ đơn giản đầu tiên. Bạn không thực sự cần phải làm phần mềm phức tạp nhất như là nhiệm vụ đầu tiên của bạn khi bạn bắt đầu làm việc. Cuối cùng bạn sẽ đến với những thứ phức tạp, nhưng nó cần có thời gian.

2
1) "gần như tất cả các dự án lập trình lớn đang sử dụng nó". Kinh nghiệm của tôi là điều này là xa thực tế. Rất ít công ty đang sử dụng lập trình chức năng như những gì tôi biết. Hầu hết chỉ sử dụng Java và C # (mặc dù C # đã có nhiều cấu trúc chức năng hơn trong vài năm qua), C ++ và C.
Jonas

2
2) Kinh nghiệm của tôi là ngược lại. Những người từ các trường đại học dường như là những người duy nhất biết lập trình chức năng. Ở Thụy Điển, hầu hết các trường đại học dạy lập trình chức năng từ năm đầu tiên. Và các trường đại học như MIT cho đến gần đây đã sử dụng lập trình chức năng trong khóa học lập trình đầu tiên (Scheme).
Jonas

@jonas: không, ngôn ngữ lập trình không liên quan gì đến nó. Tất nhiên C và C ++ và java, vv được sử dụng bởi số lượng lớn các dự án. Các lập trình chức năng cũng đang làm việc trong mã c ++. Thực tế hiện tại dường như là một phần của dự án đang sử dụng OO và một phần của nó sử dụng lập trình chức năng. Cả hai phần đều sử dụng cùng một ngôn ngữ (thường là c / c ++)
tp1

Vâng, bạn cũng có thể làm OO trong C. Nhưng nó không được khuyến khích. C và C ++ không có nhiều cấu trúc để lập trình chức năng, ví dụ như không thay đổi theo mặc định, không hỗ trợ tốt cho khớp mẫu, không bao gồm các cơ sở dữ liệu bất biến, v.v ...
Jonas

Vâng, đó là lý do tại sao nó đòi hỏi các lập trình viên có kinh nghiệm. Vì không thể thay đổi ngôn ngữ lập trình từ ngôn ngữ chính, điều tốt nhất tiếp theo là lập trình chức năng trong c ++. Ngoài ra c ++ có những thứ như const giúp khá nhiều.
tp1

-10

Bởi vì khó gỡ lỗi hơn nữa.


11
Tôi không đồng ý. Không có hiệu ứng tài sản thế chấp, quá trình gỡ lỗi sẽ dễ dàng hơn. Có thể bạn nghĩ nó khó hơn vì mô hình chức năng là khác nhau và cần kinh nghiệm để có được sự thoải mái với cách làm mới, bao gồm cả gỡ lỗi.
Maniero

2
Các ngôn ngữ lập trình hàm thực sự dễ kiểm tra hơn, vì các hàm thuần túy là không trạng thái.
Jonas

4
Jonas, tôi đã không nói "kiểm tra", tôi đã nói "gỡ lỗi" tức là. tìm một lỗi mà bạn đã làm Kiểm tra là một phần của điều đó, nhưng lý do về chương trình, v.v ... cũng vậy - tôi đứng trước điều này. Đó là một chức năng của sức mạnh của FP. Càng nhiều công việc mà bất kỳ dòng mã cụ thể nào làm, càng khó để xem dòng mã nào đang gây ra vấn đề. Ánh xạ giữa dòng mã và hiệu ứng, có sức lan tỏa hơn, vd. một hàm bậc cao hơn có thể chạm vào hàng tá hành vi của chương trình và ngược lại. Các triệu chứng có thể khác nhau giữa các điểm khác nhau cho cùng một lỗi.
Interstar

Theo kinh nghiệm của tôi, không khó để gỡ lỗi. Tôi đang sử dụng F # và tôi không thể tìm thấy bất kỳ lý do nào khiến bạn khó gỡ lỗi hơn C # chẳng hạn. Có thể gỡ lỗi ở Haskell khó hơn vì sự lười biếng (tôi không có ý kiến ​​gì), nhưng lập trình FP háo hức thì đơn giản hơn do không trạng thái như Jonas nói. Nói cách khác, mã FP dễ dự đoán hơn vì bạn biết kết quả không bị ảnh hưởng bởi các biến không nhìn thấy.
Muhammad Alkarouri

2
Miễn là các chức năng của bạn là thuần túy, gỡ lỗi là dễ dàng. Nếu bạn không thể gỡ lỗi bằng cách thêm các bài kiểm tra đơn vị thì bạn không thực hiện đủ công việc viết bài kiểm tra.
dan_waterworth
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.