Nó rất giống như học toán sẽ cải thiện kỹ năng phân tích của bạn và học văn học Latin / cổ điển sẽ cải thiện kỹ năng viết của bạn.
Những người thiết kế những ngôn ngữ đó đã suy nghĩ kỹ về việc viết chương trình nghĩa là gì. Và những ngôn ngữ đó là kết quả của những nghiên cứu đó.
Điều đó nói rằng, học Java cũng sẽ làm cho bạn trở thành một lập trình viên tốt hơn. Và học C. Những lợi ích thực sự đến từ việc học ngôn ngữ với triết lý khác nhau. Sau đó, bạn có thể có ý kiến của riêng bạn về cách viết một chương trình.
Chỉnh sửa
Tôi nhận ra câu trả lời này không hữu ích cho những người chưa học haskell và / hoặc lisp. Dưới đây là một số ví dụ để giải thích thêm những gì tôi muốn nói
LISP
Lisp tin rằng cú pháp nên tối thiểu và mọi thứ nên là danh sách hoặc nguyên thủy (Lisp là viết tắt của Xử lý danh sách). Ngay cả các chương trình chủ yếu là danh sách có chứa các danh sách và biểu tượng khác. Lisp cho phép bạn thao tác các chương trình dưới dạng danh sách và để tạo các chương trình mới một cách nhanh chóng. Do đó toàn bộ code is data and data is code
phương châm.
Hậu quả trực tiếp là các ngôn ngữ Lisp cho phép bạn xác định bất kỳ giao diện nào bạn muốn. Một ví dụ điển hình là compojure là một khung web clojure. Đây là một chức năng định tuyến trông như thế nào
(defroutes app-routes
(GET "/" [] view/page)
(GET "/api" [] (wrap-aleph-handler api/socket-handler))
(route/resources "/static")
(route/not-found "page not found"))
Một ví dụ điển hình khác là khung khuôn mẫu nấc:
(html [:ul
(for [x (range 1 4)]
[:li x])])
Như bạn có thể thấy, kết quả cũng ngắn gọn như trong DSL như ria mép, nhưng cho phép bạn sử dụng các tính năng ngôn ngữ như (for [x (range 1 4)] block)
. Thậm chí đẹp hơn, bạn có tất cả các công cụ để trừu tượng và cấu trúc mã của bạn.
Trong các ngôn ngữ khác, cú pháp phức tạp hơn. Bạn không thể đọc một chương trình Java dưới dạng một loạt các danh sách. Nhưng bằng cách sử dụng Lisp, bạn sẽ hiểu rõ hơn về giao diện lý tưởng sẽ trông như thế nào và những gì trong mã của bạn có thể được trừu tượng hóa thành dữ liệu. Nó cũng giúp bạn thấy ngôn ngữ yêu thích của mình như một cấu trúc dữ liệu lớn và để hiểu rõ hơn về ngữ nghĩa của nó.
Haskell
Haskell tin vào kiểu gõ tĩnh mạnh mẽ và tinh khiết. Các hàm thuần túy giống như các hàm toán học: chúng được xác định trên một tập hợp các giá trị và ánh xạ chúng trên một tập hợp khác. Chức năng không có tác dụng phụ và giá trị là bất biến. Sự tinh khiết là thú vị bởi vì nó không phải là thứ mà một ngôn ngữ đa mô hình có thể có. Một ngôn ngữ là thuần túy hoặc không.
Một hậu quả là bạn không thể thực hiện hành động IO bất cứ khi nào bạn muốn (haskeller tin rằng đây là một điều tốt). Các hành động IO được định nghĩa là các giao dịch, bản thân chúng là các giá trị thuần túy. Các main
giá trị của một chương trình Haskell là một giao dịch IO thực hiện khi bạn chạy chương trình.
Bạn phải đối phó rõ ràng với luồng dữ liệu trong chương trình của bạn. Bạn không thể thực hiện giao tiếp hai thành phần bằng cách viết và đọc nội dung trong một biến toàn cục. Bạn phải xây dựng và vượt qua các giá trị.
Một tính năng khác được đề cập bởi Jimmy Hoffa là hệ thống loại phong phú. Trong khi các ngôn ngữ khác có kiểu gõ tĩnh, trong haskell bạn có thể có những thứ như:
length :: [a] -> Int
(hàm từ danh sách của a đến int)
map :: (a -> b) -> [a] -> [b]
(hàm lấy a to b
biến đổi và danh sách của a và trả về danh sách b)
Điều tuyệt vời là tôi không cần phải giải thích những chức năng đó thực sự làm gì: bạn đã hiểu hành vi của họ. Hơn nữa, các hàm với các chữ ký đó thực sự không thể là gì ngoài việc tính độ dài của danh sách và ánh xạ một biến đổi qua danh sách.
Trong các ngôn ngữ đánh máy khác, hệ thống phân cấp lớp kết hợp với khả năng biến đổi làm cho việc đối phó với các loại đó trở thành một cơn ác mộng. Bạn phải hiểu những thứ như hiệp phương sai và chống đối, không thể có được ngay từ góc độ ngôn ngữ (nghĩa là đơn giản, mạnh mẽ và an toàn).
Hoặc bạn đi theo con đường an toàn (như scala) và kết thúc bằng một ngôn ngữ thực sự phức tạp hoặc bạn đi theo con đường đơn giản và nhận được một cái gì đó bị giới hạn (google go generic giới hạn trong danh sách và bản đồ) hoặc không an toàn (tướng phi tiêu luôn luôn covariant).
Bằng cách sử dụng haskell, bạn chủ yếu tìm hiểu về lợi ích của độ tinh khiết và cách viết mã thuần.