Mencari bahasa pemrograman fungsional / oop / meta yang bagus dengan: [ditutup]

9

Aku ingin itu terjadi

  • pembuatan kode asli // Dapat dikompilasi dengan sesuatu seperti GHC
  • lintas-platform (win / linux)
  • Fungsional dan sedikit berorientasi objek
  • lambdas, pencocokan pola, tupel dan hal-hal fungsional lainnya
  • Dukungan pemrograman besar
  • Batas indent dan minimum
  • mengetik statis
  • Saya juga ingin dukungan Mixin :)
  • kemungkinan membangun situs web berdasarkan beberapa framework juga bagus plus.
  • begitu dan ya, kinerja dan stabilitas penting.

Saya memulai Haskell , tetapi masih tidak yakin tentang itu, karena ada OCaml. Dan saya punya pengalaman F #. Tetapi sejauh yang saya tahu OCalm sedikit OOP dan kadang-kadang bahkan lebih cepat (tidak yakin tentang hal itu) saya tidak pernah mencobanya. Ada juga erlang, saya tidak tahu apa-apa tentang erlang . Dan mungkin saya kehilangan sesuatu yang lebih ..? Python , saya tidak tahu tentang python di sini, itu fungsional dan itu oop dan mendukung mixin dan populer dan cepat, tapi saya tidak benar-benar berpikir bahwa python mampu untuk semua sihir fungsional, saya pikir itu tidak bisa.

Saya tahu bahwa utas / topik ini seperti pembicaraan tentang apa-apa atau seperti perang bahasa, tapi saya serius dan benar-benar ingin mendengar visi Anda tentang itu.

cnd
sumber
2
Saya pikir memerlukan pembuatan kode asli sangat membatasi opsi. Saya pikir nemerle layak dicoba.
back2dos
@ back2dos kamu, saya suka Nemerle, tetapi menggunakannya dengan mono untuk utilitas kecil atau web adalah pekerjaan yang agak aneh. Aku pikir begitu. Dan indentasi masih mendapat dukungan buruk. Saya menggunakan Nemerle, tapi kadang-kadang. Untuk saat ini saya menggunakannya lebih rendah dari pada F #.
cnd
Sepertinya Anda ingin C ++ dengan paradigma fungsional (runtime) (sudah memiliki paradigma fungsional waktu kompilasi).
Klaim
@Klaim Saya benar-benar tidak ingin C ++. membuat kode asli dengan ghc -> gcc tidak masalah bagi saya.
cnd
2
Bahasa dengan semua persyaratan itu? Mungkin yang Anda tulis sendiri.
Rein Henrichs

Jawaban:

8

Clojure tampaknya cocok untuk semua kebutuhan Anda.

  • pembuatan kode asli / Mampu mengkompilasi dengan sesuatu seperti GHC - Ya (semua kode Clojure dikompilasi ke bytecode Java yang kemudian dikompilasi ke kode asli melalui JIT pada JVM)

  • cross-platform (win / linux) - Ya - di mana pun JVM berjalan

  • Fungsional dan sedikit berorientasi objek - Ya - Clojure adalah bahasa fungsional yang pertama dan terutama, tetapi juga memiliki dukungan OO jika Anda menginginkannya (melalui interoperabilitas Java atau objek gaya CL). Karena itu, OO umumnya dianggap tidak otomatis di Clojure.

  • lambdas, pencocokan pola, tuple dan hal-hal fungsional lainnya - Ya - ini adalah bahasa fungsional yang cukup standar dalam hal ini. Auther (Rich Hickey) agak terinspirasi oleh Haskell.

  • Dukungan metaprogramming yang bagus - Ya - "code-is-data" berlaku seperti semua Lisps dan Anda mendapatkan fungsionalitas makro yang hebat

  • Batas indent dan minimum - Ya meskipun tentunya itu sebenarnya sebuah editor daripada fitur bahasa ??

  • pengetikan statis - Ya - Clojure adalah dinamis secara default, tetapi Anda dapat memberikan petunjuk tipe statis atau primitif kapan pun Anda suka untuk meningkatkan kinerja

  • Saya juga ingin dukungan Mixin :) - Ya - dapat dicapai dengan berbagai cara (mis. makro) meskipun Anda mungkin tidak mau atau membutuhkannya setelah Anda menemukan fungsi protokol Clojure ....

  • kemungkinan membangun situs web berdasarkan beberapa framework juga bagus plus. - Ya - ada kerangka kerja seperti Ring / Compojure di Clojure dan Anda juga dapat menggunakan kerangka kerja Java apa pun

  • begitu dan ya, kinerja dan stabilitas penting. - Ya - Pada dasarnya Anda mendapatkan semua kinerja / stabilitas JVM yang cukup terbukti dalam aplikasi perusahaan ....

Terlepas dari semua itu, Clojure memiliki beberapa kemampuan yang sangat mengesankan di sekitar concurrency. Sangat layak menonton video ini: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey

mikera
sumber
1
"semuanya dikompilasi ke kode asli melalui JIT di JVM" Totaly salah ... dikompilasi dalam kode asli berarti kita tidak memerlukan sesuatu seperti mesin virtual. Di sini kita membutuhkannya.
BenjaminB
1
Tergantung mengapa Anda membutuhkan kode asli. Jika yang Anda pedulikan adalah kinerja mapan maka JVM benar-benar di atas sana dengan kode asli. Jika Anda membutuhkan pustaka asli, Anda dapat menggunakan JNI dari JVM (yang cukup baik untuk game 3D realtime). Namun jika Anda memerlukan waktu startup dalam milidetik atau memiliki keterbatasan memori seperti pada perangkat yang disematkan maka saya setuju JVM mungkin tidak ideal.
mikera
mikera, Anda juga bisa menginginkan kemudahan penyebaran (satu kurang ketergantungan untuk paket Linux, atau tidak mengharuskan pengguna untuk menginstal JRE pada Windows, bahkan mungkin memberi seseorang .exe atau elf). Ya, memberi hanya biner adalah kasus sudut, tapi tetap saja, itu mungkin dengan aplikasi asli tetapi tidak dengan program yang membutuhkan JVM.
Alexander
1
@Alexander - setuju bahwa Anda ingin kemudahan penyebaran meskipun tergantung pada perspektif Anda pada dependensi ini masih bisa menjadi poin plus untuk Clojure: Aplikasi Clojure memiliki tepat satu ketergantungan langsung (JVM) sedangkan biner asli memiliki setidaknya dua (sistem operasi) dan arsitektur perangkat keras tertentu)
mikera
"semuanya dikompilasi ke kode asli melalui JIT di JVM": NO. (mengklarifikasi itu dan saya menghapus -1 saya)
haylem
8

Gangguan umum

Tampaknya mendukung semua persyaratan di atas. Tautan akan membawa Anda ke buku online yang mencakup semua yang perlu Anda ketahui untuk memulai.

Gary Rowe
sumber
1
Lisp umum tidak menghasilkan kode asli?
Klaim
6
@Klaim: Common Lisp adalah bahasa pemrograman. Bahasa Pemrograman tidak menghasilkan kode, begitu juga kompiler. Jadi, seperti hampir semua bahasa pemrograman lain di planet ini (C, C ++, Java, Ruby, ECMAScript, sebut saja), ada kompiler untuk Common Lisp yang menghasilkan kode asli. Dan seperti hampir semua bahasa pemrograman lainnya, ada kompiler yang menghasilkan bytecode JVML, bytecode CIL, kodeour C, kode sumber ECMAScript. Dan seperti hampir semua bahasa pemrograman lainnya, ada penerjemah.
Jörg W Mittag
2
@Klaim: Apakah Anda berbicara tentang evalfungsinya? Ini hanya sebuah fungsi, Anda dapat mengimplementasikannya sesuka Anda. Beberapa implementasi memiliki penerjemah terpisah yang mereka kirimkan dengan executable yang dikompilasi. Beberapa hanya mengirimkan kompiler itu sendiri dengan executable yang dikompilasi. Beberapa hanya mengkompilasi kode saat runtime. Dan jika Anda berbicara tentang makro: mereka hanya mengeksekusi pada waktu kompilasi . Itulah keindahannya.
Jörg W Mittag
2
@nCdy The () di Lisp muncul sebagai hasil dari menyediakan sintaks untuk membedakan antara daftar dan atom dalam ekspresi-s.
Gary Rowe
1
@ Jörg W Mittag: Saya mulai curiga bahwa Anda hanya suka mengucapkan kata "orthogonal". ;)
FrustratedWithFormsDesigner
5

OCaml adalah satu-satunya bahasa yang menyediakan semua fitur yang Anda minta. (Tapi saya tidak tahu untuk mixin.) Ia bahkan memiliki kerangka kerja web bernama Ocsigen dan itu lebih dari bahasa hype, ini adalah bahasa lama, dengan basis pengguna nyata (perusahaan, universitas, penggemar) dan bertahun-tahun meningkatkan dan menguji .

BenjaminB
sumber
2
Tetapi metaprogramming hanya dilakukan oleh alat eksternal single-pass (CamlP4).
SK-logic
Perhatikan bahwa beberapa "bahasa hype" saat ini "mungkin menjadi" bahasa lama [besok], dengan basis pengguna nyata [...] [...] dan tahun peningkatan dan pengujian ". Mereka bahkan mungkin mencapai tingkat penetrasi pasar dan penerimaan publik yang sama. :)
haylem
2

Jelas Scala dapat memenuhi kebutuhan Anda:

  1. dikompilasi dan dijalankan pada JVM sehingga win / linux / mac.
  2. mendukung pemrograman fungsional dan OO.
  3. ini mendukung hal-hal fungsional yang Anda sebutkan. Pencocokan pola tampak hebat dan aktif digunakan. Itu tidak memiliki dukungan rekursi ekor karena JVM tidak mendukungnya tetapi panggilan rekursi dapat dioptimalkan dalam beberapa kasus.
  4. metaprogramming tidak didukung. Bahasanya bagus ^ W cukup bagus untuk DSL. (tetap)
  5. ini memiliki mixin (ciri).
  6. lihatlah di web Lift framework. Ini menggunakan fitur fungsional dari bahasa dan memiliki fitur-fitur canggih sehingga sangat menarik untuk dilihat. Ada juga beberapa kerangka kerja web lainnya (mainkan !, dll.)
  7. berdasarkan JVM sangat stabil.
  8. Sintaksnya cukup bersih. Tidak ada tanda kurung neraka (lispers maaf, itu hanya pendapat pribadi saya) di sana dan penggunaan titik koma dikurangi menjadi opsional dalam banyak kasus.

Apalagi Scala memiliki dukungan besar untuk pemrograman paralel (oleh Aktor). Komunitas Scala tumbuh dan digunakan dalam proyek nyata (Twitter). Bahasa ini cukup sulit untuk dipelajari karena memiliki banyak fitur dan gula sintaksis tetapi begitu Anda menanganinya, Anda pasti akan menikmati pemrograman dengannya.

masuk akal
sumber
Bila dibandingkan dengan sifat clojure Scala memungkinkan komposisi mixin di mana sifat (antarmuka) dapat mewarisi kelas melalui tipe-linearisasi .
prasoncala
2
4. Metaprogramming tidak didukung sama sekali. DSL diimplementasikan dalam fungsi tingkat tinggi dan overloading, tanpa bantuan metaprogramming. Akibatnya - DSL itu terbatas, membatasi, dan lambat. Tidak ada pembuatan kode waktu kompilasi yang tersedia di Scala. Tidak ada yang seperti Lisp macro.
SK-logic
Saya benar-benar tidak menyukai sintaksis Scala ... Ini pribadi)
cnd
1
@ SK-logic Saya memeriksanya dan sekarang saya setuju dengan Anda. Setelah saya melihat melalui "DSL in Action" dan ada contoh Scala DSL jadi saya pikir itu OK untuk DSL. Jelas Lisp, Clojure akan bekerja lebih baik di sini.
make_sense