Chúng ta có nên sử dụng các ngôn ngữ lập trình chức năng và / hoặc logic hơn không?


8

Tôi đã lập trình một chút Haskell và Prolog như một phần của một vài khóa học uni, nhưng đó là về nó. Và tôi chưa bao giờ thấy nó được sử dụng trong công nghiệp (không phải tôi đã có nhiều kinh nghiệm làm việc để bắt đầu nhưng tôi chưa bao giờ thấy một quảng cáo mà bạn bắt buộc phải biết chúng).

Vì vậy, chúng ta nên sử dụng ngôn ngữ lập trình chức năng và / hoặc logic thường xuyên hơn? Có bất kỳ lợi thế hoặc bất lợi cho việc sử dụng hoặc không sử dụng chúng?

Câu trả lời:


9

Tôi tin vào việc sử dụng đúng công cụ cho công việc. Cả hai ngôn ngữ bắt buộc và chức năng đều có vị trí của chúng và không cần phải sử dụng loại này nhiều hơn loại kia.

Đối với những lợi thế / bất lợi, tôi không nghĩ rằng tôi có thể đánh bại câu trả lời của Eric Lippert cho câu hỏi "Tại sao chương trình chức năng chưa được tiếp quản?" Câu hỏi quá.


Hừm Tại sao các downvote?
Adam Lear

1
Tôi không đánh giá thấp nhưng tôi không đồng ý với câu trả lời của anh ấy (chẳng hạn như 'nhầm lẫn' và song song - trong thế giới chức năng, các thuật ngữ đó có nghĩa là 2 điều khác nhau). Tuy nhiên điều đó không có nghĩa là tôi nghĩ đó là câu trả lời tồi.
Maciej Piechotka

Thật vậy, Eric Lippert là một câu trả lời rất nhiều thông tin. Cảm ơn đã chỉ đạo.
gablin

5

Trước hết - vì trình biên dịch phải làm nhiều hơn nữa. Nếu bạn muốn tạo trình biên dịch bắt buộc, bạn gần như có thể thực hiện chuyển đổi 1-1 thành trình biên dịch mã và mã được tạo ra sẽ có tốc độ chấp nhận được (chắc chắn - có thể có nhiều việc phải làm nhưng đó là 'cơ bản' tổng hợp 1-1 + tối ưu hóa). Trình biên dịch hàm phải xử lý nội tuyến tốt, tối ưu hóa cuộc gọi đuôi, v.v. Do đó, việc triển khai các ngôn ngữ chức năng chậm hơn rất nhiều so với C / C ++ / ... trong quá khứ (tuy nhiên chúng đạt được tốc độ cao hơn mỗi lần lặp khi trình biên dịch đang trở nên tốt hơn).

Thứ hai - các lập trình viên đã quá quen với việc tuyên bố rằng họ không thể 'chấp nhận' "không có cách tiếp cận ... trạng thái". Chắc chắn - thiếu trạng thái không hữu ích trong từng điều kiện nhưng thiếu trạng thái (toàn cầu) không có nghĩa là thiếu trạng thái cục bộ.

Thứ ba - lập trình chức năng không có câu chuyện hay đằng sau nó. OOP có câu chuyện hay khi các đối tượng ánh xạ tới các danh từ và mức độ trực quan của nó. Sau đó, bạn biết rằng nó không đơn giản vì bạn không thể tạo một lớp Managerdưới dạng lớp con Employeenhư Employeecó thể được quảng bá Managervà bạn phải chơi xung quanh các nhà trang trí. Các chương trình chức năng có câu chuyện trong toán học là IMHO hữu ích hơn nhưng ít thị trường hơn.

Theo nội bộ từ góc độ máy tính - không có sự khác biệt giữa tính toán song song và đồng thời, nhiều lập trình viên không thấy sự khác biệt và nhiều ngôn ngữ có cùng nguyên thủy để xử lý cả hai. Nhờ thiếu trạng thái cục bộ và các luồng nhẹ trong các ngôn ngữ lập trình chức năng, việc song song hóa thuật toán dễ dàng hơn nhiều. Tuy nhiên, lập trình đồng thời không được thực hiện tự động dễ dàng hơn vì đồng thời là về trạng thái toàn cầu.

Cuối cùng - có rất nhiều chương trình cũ được viết theo phong cách suy luận. Ngay cả việc chuyển từ ngôn ngữ mệnh lệnh sang ngôn ngữ mệnh lệnh cũng đơn giản hơn nhiều so với ngôn ngữ chức năng.

Theo như tôi biết, các ngân hàng đầu tư bắt đầu nắm bắt các chương trình chức năng trong nội bộ để họ tham gia vào XXI c. (trong khu vực rất quan trọng mặc dù ẩn) - vì vậy họ có được động lực.

Tái bút Mặc dù tôi tin rằng các chương trình chức năng "tốt hơn" có nghĩa là chúng che giấu sự phức tạp tốt hơn, nhưng các cách tiếp cận khác không có nghĩa là không có các lĩnh vực như các kịch bản vốn là bắt buộc.


2

Một ngôn ngữ lập trình là một hình thức đại diện của thông tin. Trong trường hợp này hướng dẫn cho máy tính làm theo. Tuy nhiên, việc đại diện cũng rất quan trọng đối với đối tượng mục tiêu (tức là các lập trình viên).

Khái niệm chức năng / logic không được sử dụng phổ biến trong cuộc sống hàng ngày như các khái niệm thủ tục. Nếu bạn đọc hướng dẫn (tức là cách sử dụng tivi, đầu đĩa dvd hoặc xây dựng một số đồ nội thất từ ​​IKEA), chúng chủ yếu được viết theo cách thủ tục (mặc dù bằng ngôn ngữ tự nhiên).

Do đó, rất nhiều người không liên quan sâu sắc đến toán học hay khoa học thường quen thuộc hơn nhiều với các khái niệm thủ tục như vậy so với các khái niệm logic hoặc chức năng.

Tôi nghĩ rằng điều này có nhiều tác động trong việc lựa chọn loại ngôn ngữ lập trình nào được sử dụng. Cuối cùng, tập hợp các vấn đề có thể được giải quyết với bất kỳ ngôn ngữ lập trình nào như vậy là khá giống nhau (miễn là tất cả chúng đều hoàn tất).

Tuy nhiên, rất nhiều ngôn ngữ thủ tục có được ngày càng nhiều khía cạnh của các khái niệm khác. Python có thể làm lambda-tính toán và đóng cửa, ruby ​​là tốt. Javascript được sử dụng nhiều trong công nghiệp thực sự là một ngôn ngữ chức năng (thậm chí hầu hết mọi người "lạm dụng" là bằng cách sử dụng nó nhiều hơn theo cách thủ tục). Do đó, thực sự nhiệm vụ của lập trình viên là sử dụng các tính năng đó một cách thích hợp ở nơi phù hợp.


1
Từ khi nào JavaScript là ngôn ngữ chức năng?
Jonas

1
@Jonas - Nó thực sự là một ngôn ngữ chức năng và nó luôn luôn có. Tất nhiên, một ngôn ngữ có thể đi theo nhiều mô hình cùng một lúc như JavaScript.
ChaosPandion

1
@ChaosPandion: Chỉ vì nó có chức năng đóng và thứ tự cao? :)
Jonas

@Jonas - Thật vậy, rõ ràng chúng ta không nói Haskell ở đây nhưng bạn vẫn có thể gọi nó là chức năng.
ChaosPandion

2
Tôi đoán rằng bạn nên xem xét cách tiếp cận chung cho vấn đề theo cách thành ngữ. Do đó, nếu ngôn ngữ lập trình đề nghị phân chia vấn đề thành các hàm thuần túy thì đó là chức năng. Nếu nó đề nghị phân chia vấn đề thành các đối tượng thì nó là hướng đối tượng. Nếu nó đề nghị "làm điều này và sau đó làm điều đó" thì đó là điều bắt buộc. Do đó lambdas, continuations, v.v. không phải là các tính năng cần thiết chỉ dành cho các ngôn ngữ chức năng và JS không phải là ngôn ngữ chức năng vì nó không 'gợi ý' để suy nghĩ về các chức năng và dữ liệu bất biến.
Maciej Piechotka
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.