Tìm kiếm ngôn ngữ lập trình chức năng / oop / meta tốt với: [đã đóng]


9

Tôi muốn nó sẽ được

  • tạo mã riêng // Có thể biên dịch với một cái gì đó như GHC
  • đa nền tảng (win / linux)
  • Chức năng và một chút hướng đối tượng
  • lambdas, khớp mẫu, tuples và các công cụ chức năng khác
  • Hỗ trợ siêu lập trình tuyệt vời
  • Biên giới thụt lề và tối thiểu
  • gõ tĩnh
  • tôi cũng muốn hỗ trợ Mixin :)
  • khả năng xây dựng trang web dựa trên một số khung cũng là điểm cộng tốt.
  • vì vậy và có, hiệu suất và sự ổn định là vấn đề.

Tôi bắt đầu Haskell , nhưng vẫn không chắc chắn về nó, vì có OCaml. Và tôi đã có kinh nghiệm F #. Nhưng theo như tôi biết thì OCalm là một chút OOP và đôi khi còn nhanh hơn (không chắc về nó) Tôi chưa bao giờ thử nó. Ngoài ra còn có erlang, tôi không biết gì về erlang . Và có lẽ tôi đang thiếu một cái gì đó nữa ..? Python , tôi không biết gì về python ở đây, nó hoạt động và nó rất hay, nó hỗ trợ mixin và phổ biến và nhanh chóng, nhưng tôi thực sự nghĩ rằng python có thể cho tất cả các phép thuật chức năng, tôi nghĩ nó không thể.

Tôi biết rằng chủ đề / chủ đề này giống như nói về không có gì hoặc giống như một cuộc chiến ngôn ngữ, nhưng tôi nghiêm túc và thực sự muốn nghe tầm nhìn của bạn về nó.


2
Tôi nghĩ rằng yêu cầu tạo mã gốc hạn chế rất nhiều các tùy chọn. Tôi nghĩ rằng tầm thường là giá trị một shot.
back2dos

@ back2dos các bạn, tôi thích Nemerle, nhưng sử dụng nó với mono cho các tiện ích nhỏ hoặc web là một công việc ODD. Tôi nghĩ vậy. Và thụt lề vẫn nhận được hỗ trợ xấu. Tôi đang sử dụng Nemerle, nhưng đôi khi. Hiện tại tôi đang sử dụng nó ít hơn F #.
cnd

Có vẻ như bạn muốn C ++ với mô hình chức năng (thời gian chạy) (nó đã có mô hình chức năng thời gian biên dịch).
Klaim

@Klaim Tôi thực sự không muốn C ++. thế hệ mã riêng với ghc -> gcc là OK đối với tôi.
cnd

2
Một ngôn ngữ với tất cả những yêu cầu đó? Có lẽ là một bạn tự viết.
Rein Henrichs

Câu trả lời:


8

Clojure có vẻ khá phù hợp cho tất cả các yêu cầu của bạn.

  • Tạo mã gốc / Có thể biên dịch với một cái gì đó như GHC - Có (tất cả mã Clojure được biên dịch sang mã byte Java, sau đó được biên dịch thành mã gốc thông qua JIT trên JVM)

  • đa nền tảng (win / linux) - Có - bất cứ nơi nào JVM chạy

  • Chức năng và một chút hướng đối tượng - Có - Clojure là ngôn ngữ chức năng đầu tiên và quan trọng nhất, nhưng cũng có hỗ trợ OO nếu bạn muốn nó (thông qua khả năng tương tác Java hoặc các đối tượng kiểu CL). Phải nói rằng, OO thường được coi là không phổ biến trong Clojure.

  • lambdas, khớp mẫu, bộ dữ liệu và các công cụ chức năng khác - Có - đó là một ngôn ngữ chức năng khá chuẩn trong vấn đề này. Auther (Rich Hickey) được lấy cảm hứng từ Haskell.

  • Hỗ trợ siêu lập trình tuyệt vời - Có - "mã là dữ liệu" áp dụng như với tất cả các Lisps và bạn có được chức năng macro tuyệt vời

  • Biên giới thụt lề và tối thiểu - Có mặc dù chắc chắn đó thực sự là một trình soạn thảo chứ không phải là một tính năng ngôn ngữ ??

  • gõ tĩnh - Có - Clojure là động theo mặc định nhưng bạn có thể cung cấp gợi ý kiểu tĩnh hoặc nguyên thủy bất cứ khi nào bạn muốn để tăng hiệu suất

  • Ngoài ra tôi cũng muốn hỗ trợ Mixin :) - Có - có thể đạt được bằng nhiều cách khác nhau (ví dụ: macro) mặc dù bạn có thể không muốn hoặc không cần nó sau khi bạn phát hiện ra chức năng giao thức của Clojure ....

  • khả năng xây dựng trang web dựa trên một số khung cũng là điểm cộng tốt. - Có - có các khung như Ring / Compojure trong Clojure và bạn cũng có thể sử dụng bất kỳ khung Java nào

  • vì vậy và có, hiệu suất và sự ổn định là vấn đề. - Có - Về cơ bản, bạn nhận được tất cả hiệu năng / tính ổn định của JVM, được chứng minh khá tốt trong các ứng dụng doanh nghiệp ....

Ngoài tất cả những điều đó, Clojure có một số khả năng thực sự ấn tượng xung quanh sự tương tranh. Thật đáng xem video này: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey


1
"Mọi thứ được biên dịch thành mã gốc thông qua JIT trên JVM" Totaly sai ... được biên dịch theo mã gốc có nghĩa là chúng ta không cần một cái gì đó giống như một máy ảo. Ở đây chúng tôi cần nó.
BenjaminB

1
Nó phụ thuộc vào lý do tại sao bạn cần mã gốc. Nếu tất cả những gì bạn quan tâm là hiệu năng trạng thái ổn định thì JVM hoàn toàn ở trên đó với mã gốc. Nếu bạn cần thư viện riêng, bạn có thể sử dụng JNI từ JVM (đủ tốt cho các trò chơi 3D thời gian thực). Tuy nhiên, nếu bạn cần thời gian khởi động tính bằng mili giây hoặc bị hạn chế bộ nhớ nghiêm trọng như trên thiết bị nhúng thì tôi đồng ý rằng JVM có thể không lý tưởng.
mikera

mikera, bạn cũng có thể muốn dễ dàng triển khai (một sự phụ thuộc ít hơn cho gói Linux hoặc không yêu cầu người dùng cài đặt JRE trên Windows, thậm chí có thể cung cấp cho ai đó .exe hoặc elf). Đúng, chỉ đưa ra một nhị phân là một trường hợp góc, nhưng vẫn có thể với một ứng dụng gốc chứ không phải với một chương trình cần JVM.
Alexander

1
@Alexander - đồng ý rằng bạn muốn dễ dàng triển khai mặc dù tùy thuộc vào quan điểm của bạn về các phụ thuộc, đây vẫn có thể là một điểm cộng cho Clojure: Ứng dụng Clojure có chính xác một phụ thuộc trực tiếp (JVM) trong khi nhị phân gốc có ít nhất hai (hệ điều hành và kiến ​​trúc phần cứng cụ thể)
mikera

"Mọi thứ được biên dịch thành mã gốc thông qua JIT trên JVM": NO. (làm rõ điều đó và tôi xóa -1 của mình)
haylem

8

Lisp thường gặp

Nó xuất hiện để hỗ trợ tất cả các yêu cầu trên. Liên kết sẽ đưa bạn đến một cuốn sách trực tuyến bao gồm mọi thứ bạn cần biết để bắt đầu.


1
Lisp thông thường không tạo mã gốc?
Klaim

6
@Klaim: Lisp thông thường là ngôn ngữ lập trình. Ngôn ngữ lập trình không tạo mã, trình biên dịch làm. Vì vậy, giống như mọi ngôn ngữ lập trình khác trên hành tinh (C, C ++, Java, Ruby, ECMAScript, bạn đặt tên cho nó), có các trình biên dịch cho Common Lisp tạo mã gốc. Và cũng giống như hầu hết các ngôn ngữ lập trình khác, có các trình biên dịch tạo mã byte JVML, mã byte CIL, mã nguồn C, mã nguồn ECMAScript. Và cũng giống như hầu hết các ngôn ngữ lập trình khác, đều có người phiên dịch.
Jörg W Mittag

2
@Klaim: Bạn đang nói về evalchức năng? Nó chỉ là một chức năng, bạn có thể thực hiện nó theo bất kỳ cách nào bạn muốn. Một số triển khai có một trình thông dịch riêng mà chúng gửi cùng với tệp thực thi được biên dịch. Một số chỉ gửi trình biên dịch với trình thực thi được biên dịch. Một số chỉ biên dịch mã trong thời gian chạy anyway. Và nếu bạn đang nói về macro: những cái đó chỉ thực thi vào thời gian biên dịch . Đó là vẻ đẹp của nó.
Jörg W Mittag

2
@nCdy Các () s trong Lisp xuất hiện do kết quả của việc cung cấp cú pháp để phân biệt giữa các danh sáchnguyên tử trong một biểu thức s.
Gary Rowe

1
@ Jorg W Mittag: Tôi bắt đầu nghi ngờ rằng bạn chỉ thích nói từ "trực giao". ;)
Thất vọngWithFormsDesigner

5

OCaml là ngôn ngữ duy nhất cung cấp tất cả các tính năng bạn yêu cầu. . .


2
Nhưng siêu lập trình chỉ được thực hiện bởi một công cụ bên ngoài một lần (CamlP4).
SK-logic

Lưu ý rằng một số "ngôn ngữ cường điệu" ngày nay có thể trở thành "ngôn ngữ cũ [s] ngày mai, với cơ sở người dùng thực [s] [...] và nhiều năm cải thiện và thử nghiệm". Họ thậm chí có thể đạt được cùng mức độ thâm nhập thị trường và sự chấp nhận của công chúng. :)
haylem

2

Chắc chắn Scala có thể phù hợp với yêu cầu của bạn:

  1. được biên dịch và chạy trên JVM vì vậy nó là win / linux / mac.
  2. hỗ trợ cả lập trình chức năng và OO.
  3. Nó hỗ trợ các công cụ chức năng mà bạn đề cập. Mẫu phù hợp trông tuyệt vời và tích cực sử dụng. Nó thiếu hỗ trợ đệ quy đuôi vì JVM không hỗ trợ nhưng các cuộc gọi đệ quy có thể được tối ưu hóa trong một số trường hợp.
  4. siêu lập trình không được hỗ trợ. Ngôn ngữ rất tuyệt ^ W khá tốt cho DSL. (đã sửa)
  5. nó có mixin (đặc điểm).
  6. có một cái nhìn vào khung web nâng. Nó sử dụng các tính năng chức năng của ngôn ngữ và có các tính năng nâng cao nên rất thú vị để xem xét. Ngoài ra còn có một số khung web khác (chơi!, V.v.)
  7. dựa trên JVM nên ổn định
  8. Cú pháp khá sạch sẽ. Không có địa ngục dấu ngoặc đơn (xin lỗi lispers, đó chỉ là ý kiến ​​cá nhân của tôi) ở đó và việc sử dụng dấu chấm phẩy được giảm xuống tùy chọn trong nhiều trường hợp.

Hơn nữa, Scala có sự hỗ trợ tuyệt vời cho lập trình song song (bởi Actors). Cộng đồng Scala đang phát triển và nó được sử dụng trong các dự án thực tế (Twitter). Ngôn ngữ khá khó học vì có rất nhiều tính năng và cú pháp đường nhưng một khi bạn xử lý nó, bạn chắc chắn sẽ thích lập trình với nó.


Khi được so sánh với clojure, đặc điểm của Scala cho phép phối hợp mixin trong đó tính trạng (giao diện) có thể kế thừa các lớp thông qua kiểu tuyến tính hóa .
prasonscala

2
4. Metaprogramming hoàn toàn không được hỗ trợ. DSL được thực hiện trong các chức năng bậc cao và quá tải, mà không cần bất kỳ sự trợ giúp nào của siêu lập trình. Kết quả là - những DSL đó bị hạn chế, hạn chế và chậm. Không có mã tạo thời gian biên dịch có sẵn trong Scala. Không có gì giống như macro Lisp.
SK-logic

Tôi thực sự không thích cú pháp Scala sau tất cả ... Đó là cá nhân)
cnd

1
@ SK-logic Tôi đã kiểm tra nó và bây giờ tôi đồng ý với bạn. Khi tôi đã xem qua "DSL trong hành động" và có ví dụ về Scala DSL vì vậy tôi nghĩ rằng nó ổn đối với DSL. Rõ ràng Lisp, Clojure sẽ hoạt động tốt hơn nhiều ở đây.
make_sense
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.