Tujuan dari pertanyaan ini bukan untuk mengumpulkan daftar cucian fitur bahasa pemrograman yang Anda tidak dapat hidup tanpanya, atau berharap berada dalam bahasa pilihan utama Anda. Tujuan dari pertanyaan ini adalah untuk menjelaskan sudut-sudut desain bahasa yang sebagian besar desainer bahasa mungkin tidak pikirkan. Jadi, alih-alih memikirkan fitur bahasa X, pikirkan sedikit lebih banyak secara filosofis.
Salah satu bias saya, dan mungkin itu mungkin kontroversial, adalah bahwa sisi teknik yang lebih lunak - mengapa dan apa alasannya - berkali-kali lebih penting daripada sisi yang lebih konkret. Misalnya, Ruby dirancang dengan tujuan yang dinyatakan untuk meningkatkan kebahagiaan pengembang. Sementara pendapat Anda mungkin beragam, apakah itu disampaikan atau tidak, fakta bahwa itu adalah tujuan berarti bahwa beberapa pilihan dalam desain bahasa dipengaruhi oleh filosofi itu.
Tolong jangan posting:
- Sintaks perang api. Mari kita hadapi itu, kita memiliki preferensi kita, dan sintaksis penting karena berkaitan dengan desain bahasa. Saya hanya ingin menghindari pertempuran epik tentang sifat emacs vs VI (yang tidak diketahui oleh banyak orang saat ini).
- "Bahasa apa pun yang tidak memiliki fitur X tidak layak ada" ketik komentar. Setidaknya ada satu alasan untuk semua bahasa pemrograman ada - baik atau buruk.
Tolong lakukan posting:
- Ide-ide filosofis yang tampaknya dilewatkan oleh perancang bahasa.
- Konsep teknis yang tampaknya diimplementasikan dengan buruk lebih sering daripada tidak. Tolong berikan contoh rasa sakit yang disebabkannya dan jika Anda memiliki ide tentang bagaimana Anda ingin berfungsi.
- Hal-hal yang Anda inginkan ada di perpustakaan umum platform tetapi jarang ada. Satu hal yang sama, hal-hal yang biasanya ada di perpustakaan umum yang Anda inginkan tidak.
- Fitur konseptual seperti dukungan penanganan uji / pernyataan / kontrak / kesalahan bawaan yang Anda harap semua bahasa pemrograman akan terapkan dengan benar - dan mendefinisikan dengan benar.
Harapan saya adalah bahwa ini akan menjadi topik yang menyenangkan dan membangkitkan semangat.
Sunting: Mengklarifikasi apa yang saya maksud dengan Syntax Flame Wars. Saya tidak mencoba untuk menghindari semua diskusi tentang sintaks, terutama karena sintaks adalah bagian mendasar dari desain bahasa program.
sumber
Jawaban:
Dukungan Unicode secara default
Hari ini dan usia, program sedang dikembangkan untuk digunakan secara internasional, atau dengan asumsi bahwa mereka dapat digunakan secara internasional. Mereka harus memberikan dukungan untuk rangkaian karakter mereka atau membuat program yang ditulis dalam bahasa itu tidak berguna.
sumber
string
danbyte[]
. Seperti halnya Python 3.x denganstr
danbytes
. C (++)char
salah mengerti.u'My Unicode Štring'
. Saya harap Anda bisa melupakan jenis string yang Anda hadapi dan menulis kode.Saya punya pasangan:
Generik / templat. Misalnya, generik Java sangat kuat, tetapi tidak selalu fleksibel. Juga, karena mereka menggunakan tipe erasure, saya telah melihat masalah menerapkannya secara abstrak, terutama di antarmuka. Dan kompiler tidak boleh memperingatkan ketika generik non-spesifik digunakan (Suka
Hashmap
bukanHashmap<String, int>
). Saya pikir mereka dapat ditingkatkan secara signifikan. Templating yang baik sangat berguna, tetapi sering diabaikan.Dukungan Good Date di perpustakaan standar. Maksud saya bisa menambah dan mengurangi tanggal, jam, dan menit, dan tidak harus berurusan dengan jumlah milidetik sejak 1 Januari 1970.
sumber
java.util.Date
memiliki hampir semua kemungkinan gotcha dan masalah. Saya hanya tahu sebagian darijava.time.*
paket baru , tetapi bersih, mudah digunakan dan bebas bug AFAICT. Lebih banyak pengguna tingkat lanjut mungkin menemukan masalah, tetapi ini merupakan peningkatan besar. +++ Masalahnya tampaknya, bahwa ini adalah masalah yang rumit dan versi pertama terburu-buru dan rusak.Harap membuat bahasa Anda dapat dianalisis / diaudit untuk petugas keamanan komputer.
Orang-orang keamanan harus dapat menemukan kerentanan dalam suatu program sebelum dikirimkan. Idealnya, kami dipanggil lebih awal dan dapat mengomentari basis kode saat itu berkembang, tetapi seringkali tidak.
Ketika versi baru dari bahasa atau pustaka inti keluar, hal-hal yang sebelumnya aman mungkin tidak lagi:
javascript:
eval
atau deserialization librariesSetiap perubahan ini dapat meningkatkan jumlah otoritas yang dapat disalahgunakan oleh suatu program, tetapi karena jumlah kewenangan yang digunakan oleh program (ketika berhadapan dengan klien yang tidak jahat) belum berubah, petugas keamanan sulit sekali menemukan jawabannya tanpa intensif audit ulang.
Jadi, tolong pikirkan tentang kami saat merancang dan membuat versi bahasa. Berikut adalah beberapa tips:
Tetapkan beberapa primitif bahwa suatu program dapat diuraikan menjadi.
HTML5 sangat buruk dengan cara ini. Mereka jelas telah menaruh banyak pemikiran dalam keamanan dan memiliki beberapa orang yang sangat pintar, tetapi alih-alih menspesifikasikan elemen program baru seperti
<video>
dalam hal yang lama, atau membuat abstraksi umum yang baru<video>
dan lama<img>
keduanya dapat ditentukan dalam hal,<video>
belum elemen program satu kali lainnya dengan konsekuensi keamanannya sendiri.Jadikan bahasa Anda setuju dengan analisis statis (meskipun tidak diketik secara statis).
Orang-orang keamanan sering menggunakan analisis statis untuk menemukan pola, dan untuk mencoba dan mengesampingkan bagian-bagian dari suatu program sehingga mereka dapat fokus pada bit yang benar-benar rumit.
Harus jelas pengidentifikasi mana yang merupakan variabel lokal dan mana yang tidak.
Misalnya, jangan membuat kesalahan yang sama dengan JavaScript versi lama yang membuatnya tidak mungkin untuk mengetahui apakah
x
ada referensi variabel lokal di bawah ini (menurut pembacaan literal dari versi lama spec):Izinkan keamanan terurai
Banyak sistem yang aman dirancang di sekitar kernel yang aman yang menjaga properti keamanan, sehingga rakyat keamanan dapat memfokuskan upaya mereka pada menganalisis sejumlah kecil kode dan membebaskan sebagian besar programmer dari harus berurusan dengan rakyat keamanan {annoying, pedantic, paranoid} security .
Seharusnya dimungkinkan untuk menulis kernel seperti itu dalam bahasa Anda. Jika salah satu properti keamanan bahasa Anda, apakah hanya sebagian URL saja yang akan diambil, dapatkah penulis kernel melakukan sesuatu untuk menyalurkan semua URL yang mengambil kode mereka? Atau dapatkah pemeriksaan build statis (seperti melihat impor) melayani fungsi yang sama.
Beberapa bahasa seperti Newspeak menggunakan model kemampuan objek. Itu luar biasa dan cara yang bagus untuk mendapatkan keamanan yang terurai.
Tetapi jika Anda tidak dapat melakukan itu, membuat grafik modul menjadi artefak yang dapat dianalisis secara statis dapat memberi Anda cukup banyak manfaat. Jika saya dapat membuktikan bahwa suatu modul tidak dapat mencapai modul I / O file (kecuali dengan memanggil kode dalam sebuah modul di TCB), maka saya dapat mengesampingkan seluruh kelas masalah dari modul itu.
Batasi otoritas bahasa skrip tertanam
Banyak sistem yang berguna diatur sebagai inti statis yang memulai banyak kode yang ditulis dalam bahasa yang dinamis (bahkan fungsional).
Dan menanamkan bahasa skrip dapat membuat sistem menjadi lebih mudah dikembangkan.
Tetapi bahasa scripting seharusnya tidak memiliki otoritas penuh VM.
Jika Anda memilih untuk mengizinkan bahasa skrip tertanam, buat yang mudah bagi invoker untuk membatasi apa yang dapat mereka lakukan. Model kemampuan-objek (lihat komentar di Newspeak di atas) sangat sesuai di sini; jadi ketika mengevaluasi kode dalam bahasa scripting, pemanggil harus meneruskan kode untuk mengeksekusi dan semua variabel global untuk kode itu.
Perlakukan
eval
sebagai bahasa yang menyematkan dirinya sebagai bahasa scriptingJika bahasa Anda dapat memanggil kompilernya sendiri untuk mengubah string menjadi kode, maka izinkanlah untuk di-sandbox sama seperti Anda menggunakan bahasa skrip tertanam apa pun.
Gunakan model konkurensi sederhana
Kami petugas keamanan tidak suka harus khawatir tentang kondisi lomba ketika mencoba mencari tahu apakah properti keamanan dikelola.
Harap pertimbangkan alternatif untuk threading sebelum menetapkan utas sebagai opsi default yang hampir mustahil untuk diamankan.
Salah satu yang sederhana adalah event loop concurrency seperti yang ditemukan di E, Verilog, dan JavaScript.
Jangan mendorong mengutip kebingungan
Beberapa bahasa adalah bahasa lem, dan mereka akhirnya berurusan dengan string dalam banyak bahasa yang berbeda.
Sebagai contoh, JavaScript sering menyusun string HTML, CSS, XML, JSON, dan bahkan JavaScript. Sangat sulit bagi pemrogram untuk mengingat untuk menyandikan string teks biasa dengan benar ketika menggabungkan mereka untuk membuat string dalam bahasa lain, sehingga program JS, tidak mengejutkan, memiliki semua jenis masalah kebingungan mengutip: XSS adalah yang terburuk.
Jika Anda ingin memasukkan fitur komposisi string, cobalah untuk mengurangi beban keamanan programmer. DSL, makro higienis, dan bahasa templat yang disematkan dapat menjadi cara yang bagus untuk melakukan ini dengan memindahkan beban untuk melarikan diri dengan benar ke pengembang perpustakaan atau bahasa dan jauh dari pengembang akhir.
sumber
Beberapa bahasa terbaik dirancang oleh orang-orang yang ingin membuat bahasa untuk diri mereka sendiri.
Jadi saya pikir perancang bahasa harus kurang memperhatikan pengguna mereka. Anda tidak dapat menyenangkan semua orang, Anda juga tidak harus berusaha.
sumber
Hanya 5-10% waktu yang dihabiskan untuk menulis kode. Desainer bahasa harus memperhatikan kesulitan dalam membuat perangkat lunak berfungsi, yang berarti memperbaiki kesalahan dan bug.
Itu berarti harus dari debugger yang baik. Bukan alat dengan sintaksis misterius dan perintah kunci yang hanya sedikit lebih baik daripada banyak pernyataan cetak.
sumber
Saya pikir mereka harus memperhatikan Python, yang melakukan lebih banyak hal dengan benar daripada bahasa lain yang saya temui (dan bahkan jika Anda tidak menyukai beberapa fitur). Itu tidak berarti bahwa mereka harus meniru Python, tetapi penting untuk mengetahui apa yang Python lakukan dengan benar, bahkan jika Anda tidak ingin membuat bahasa seperti Python sama sekali.
Adapun ide-ide filosofis yang relevan di sana, ini adalah yang paling penting dari Zen Python:
Saya pikir bahasa yang mengikuti aturan-aturan ini tentu harus cukup OK, tapi saya hanya tahu satu yang melakukan ini, dan itu Python. Untuk semua kesamaan dengan misalnya Ruby dalam implementasi, Ruby kehilangan hal-hal seperti keterbacaan dan mengundang Anda untuk melakukan kode golf, yang menyenangkan, tetapi tidak berguna dalam pengaturan profesional.
Satu-satunya fitur teknis yang saya lewatkan dalam Python adalah pernyataan "sampai" (seperti saat, tetapi tidak menguji ekspresi pertama kali). Lalu ada banyak hal dalam pustaka standar Python dan bahasa lain yang dapat ditingkatkan, tapi itu tidak sepenuhnya bahasa , jadi itu pertanyaan yang berbeda. :-)
sumber
Kemampuan untuk memodifikasi bahasa yang sesuai dengan kebutuhan Anda adalah hal yang besar bagi saya. Untuk Lisp itu dilakukan dengan macro, untuk Tcl dengan uplevel. Pada tingkat lebih rendah, Ruby menggunakan lambdas dan sejenisnya. Saya hanya ingin kemampuan untuk menambahkan struktur kontrol baru yang sesuai dengan masalah daripada mencetak masalah saya di sekitar struktur kontrol yang tersedia. Sebagai contoh sederhana, konstruksi "do .. hingga" yang ada dalam beberapa bahasa tetapi tidak yang lain adalah cara yang lebih bersih untuk menangani beberapa kasus daripada "sementara", dapat menambahkan struktur baru untuk memenuhi kasus lain sangat berguna.
Dalam pengertian yang lebih umum, ini adalah metaprogramming ... tapi saya kebanyakan menggunakannya untuk membangun struktur kontrol baru.
sumber
Yang paling penting adalah bahasa Anda harus memiliki "gaya". Sebagai contoh, saya akan menyebut C bahasa pemrograman sistem berbasis pointer. Saya akan menyebut Erlang bahasa pemrograman fungsional yang sangat bersamaan. Beberapa bahasa lain (seperti C ++ dan bisa dibilang Jawa) adalah apa yang disebut Allan Kay sebagai bahasa "aglutinatif": Bahasa Frankenstein terdiri dari banyak fitur yang disatukan.
Berikutnya yang paling penting adalah bahwa perubahan bahasa itu sendiri harus menjadi pilihan terakhir. Bahkan yang paling jinak terdengar bisa menjadi kompleks ketika dikombinasikan dengan fitur-fitur lain dari bahasa tersebut. Saya akan mengatakan bahwa untuk menempatkan fitur baru dalam bahasa, Anda perlu:
sumber
Terima kasih atas pertanyaannya. Anda mendapat jawaban yang cukup bagus.
Bukan untuk mengacaukan mata Anda, tetapi saya melihat seorang programmer sebagai saluran informasi. Gagasan / konsep / persyaratan masuk di satu ujung, dan kode keluar di ujung lainnya.
Jika Anda mengambil satu set persyaratan (tidak peduli bagaimana mereka dinyatakan) dan set kode pada papan tulis besar, dan menggambar garis memetakan setiap persyaratan dengan kode yang mengimplementasikannya, kompleksitas grafik itu akan tergantung pada seberapa baik kode mengungkapkan persyaratan. Idealnya, itu harus sangat langsung dan satu-ke-satu, tetapi itu sulit untuk dipraktikkan.
Saya mengukur kekhususan domain dari suatu bahasa sebagai sejauh mana ia menyederhanakan grafik itu. Itu adalah properti yang sangat diinginkan, dan dapat didekati dengan berbagai cara, dengan apa saja dari hanya mendefinisikan kelas / rutin yang tepat (kata benda / kata kerja), ke makro, hingga menulis parser dan juru bahasa / kompiler Anda sendiri.
Biarkan saya memberi contoh apa yang saya maksud. Untuk masalah membuat antarmuka pengguna dialog fleksibel, teknik ini menghilangkan keharusan untuk menulis event-handler, pemindahan data, sebagian besar hal yang biasanya dilakukan di UI. Ini juga menghasilkan pengurangan kode sumber sekitar urutan besarnya. Bahasa meta sebenarnya hanya beberapa rutin dan makro di C / C ++ / Lisp, dan saya juga melakukannya dalam bahasa tanpa makro.
Jika menerapkan persyaratan dapat dilakukan dengan 5 poin suntingan ke kode, atau dengan 10, melakukannya dengan 5 bukan hanya kode yang lebih sedikit, tetapi lebih sedikit peluang untuk kehilangan langkah dan memasukkan bug. Jadi, semakin spesifik bahasa domain, semakin kecil kode, lebih mudah dirawat, dan lebih bebas bug. Saya pikir kita perlu tahu cara mengemudi ke arah itu. Itu tidak berarti kode lebih mudah dibaca, kecuali jika pembaca telah berinvestasi dalam kurva belajar untuk memahami teknik.
sumber
Tipe Integers yang terikat dan berbeda seperti di Pascal dan Ada. Jujur: seberapa sering Anda membutuhkan jangkauan penuh bilangan bulat apa pun? Saya pikir ada banyak yang harus ditingkatkan dalam tipe primitif untuk lebih mewakili dunia nyata.
sumber
type Date_Of_Month is 1 .. 31;
dan meninggalkan keputusan seperti 16 atau 32 bit ke pengoptimal. Tetapi yang lebih penting, menugaskan 32 atau 0 atau -5 ke variabel jenis memberi AndaRANGE_ERROR
.Date_Of_Month
(atauMonth_Of_Year
) di mana ada rentang yang jelas untuk digunakan, tetapi banyak - mungkin sebagian besar - kasus fuzzy.type Persons_Age is 0..120
? Bagaimana jika seseorang memecahkan rekor umur panjang?type Year is 0..9999
? Bagaimana jika Anda seorang Egyptologist?type Egyptian_Year is -9999 .. 300;
. Dalam pengalaman saya, Anda dapat menemukan batas yang berguna untuk bilangan bulat sebagian besar waktu. Dalam hal ini Anda harus mempertimbangkantype Scrolls_Found is array Egyptian_Year of Natural;
Anda tidak dapat / seharusnya tidak memiliki jenis yang tidak terikat sebagai indeks array. Itu hanya vektor serangan untuk peretas. BTW: Ada memungkinkan untuk batas jangkauan dihitung pada waktu berjalan.Ada fitur yang membuat bahasa pemrograman mudah digunakan setelah Anda mempelajarinya, dan ada fitur yang membuatnya mudah dipelajari untuk digunakan. Karena pengguna bahasa idealnya memiliki hubungan jangka panjang dengannya, mengoptimalkan untuk kemudahan penggunaan lebih baik daripada mengoptimalkan untuk kemudahan belajar. Jangan membuat hal-hal lebih sulit daripada yang diperlukan, tetapi jangan mengorbankan ekspresif (bisa menulis sedikit kode yang banyak melakukan) untuk keterbacaan bagi mereka yang tidak terbiasa dengan bahasa. Di sisi lain, bahasa tersebut seharusnya tidak dibaca seperti derau baris untuk orang-orang yang telah bekerja dengannya selama bertahun-tahun; itu tidak mudah digunakan atau dipelajari.
sumber
Konvensi Penamaan (Saya melihat Anda PHP)
sumber
Integrasi kelas satu dengan lingkungan pengembangan.
Saat ini, pengkodean dilakukan dalam lingkungan yang kaya. Untuk HTML / CSS / JS, kami memiliki Firebug dan alat interaktif lainnya. Untuk Java, Eclipse dan IDEA dan IDE sejati lainnya. Dan seterusnya. Ada ekologi alat, dimulai dengan editor tetapi tidak berakhir di sana:
Bahasa harus dibangun untuk memberikan dukungan untuk kegiatan ini. Beberapa kemajuan telah dibuat - anotasi di Jawa untuk membantu pengembang lain memahami maksud kode, misalnya.
Tetapi kebanyakan itu diretas, seperti menggunakan $ Id $ dalam komentar sehingga sumber yang dikendalikan CVS dapat berisi nomor versi. Mengapa saya tidak bisa melakukan hal seperti ini dari bahasa itu sendiri?
sumber
Komputasi Terdistribusi
Makan siang gratis berakhir. Hari ini kita membutuhkan program yang berjalan pada banyak core / banyak prosesor (dan pada keadaan khusus banyak komputer).
Sayangnya menulis kode multi-thread sulit secara konseptual, sehingga benar-benar tidak perlu menambahkan bahasa sebagai penghalang.
Penggunaan C ++ 0x di masa depan tentu saja menarik, untuk semua yang ia bawa sebagai pustaka dan tidak membebaskan Anda dari masalah sinkronisasi yang sebenarnya (Anda tahu, hal-hal yang sangat mudah dipecahkan ...)
Saya sangat suka pendekatan Go untuk masalah: multithreading adalah built-in, dan pendekatan yang diambil (saluran dan goroutine) menetapkan pola pikir yang jauh lebih mudah daripada pendekatan semaphore / mutex / lock tradisional. Masih mudah untuk mengakses struktur yang tidak disinkronkan secara bersamaan (Go memiliki pointer) atau ke jalan buntu (siklus tunggu di saluran ...)
Saya pikir bahasa yang mendukung data yang tidak dapat diubah, seperti bahasa fungsional, mungkin memiliki hak atasnya (saya suka pengalaman di sana).
Juga, model Aktor mungkin menjadi target kami berikutnya. Itu dimaksudkan untuk komputasi terdistribusi juga.
sumber
Sebut saya gila, tetapi salah satu fitur bahasa yang paling penting bagi saya adalah ketersediaan referensi online yang bagus, bersama dengan contoh-contohnya. Saya tahu bahwa saya dapat menemukan hasil pencarian yang bagus untuk bahasa apa pun, tapi saya sangat suka situs MSDN dan Java API. Mereka membuat pemrograman lebih mudah bagi seseorang yang tidak memiliki banyak pengalaman dalam bahasa tertentu.
sumber
Lebih banyak kemampuan untuk membantu kompiler memeriksa kode Anda.
Menjadi seorang programmer sistem tertanam, saya selalu menggunakan C. Tapi saya selalu berharap saya punya lebih banyak / lebih baik cara untuk memberitahu kompiler apa yang saya harapkan dari kode saya sehingga dapat memverifikasinya.
EG saya bisa punya fungsi
tapi saya lebih suka
EG Saya ingin dapat menulis pernyataan tentang fungsi menggunakan semacam bahasa fungsional tingkat tinggi seperti Lisp atau Haskell. Ini tidak akan dikompilasi menjadi kode, tetapi dapat digunakan untuk analisis statis atau dinamis.
sumber
Sintaks kecil dengan sesedikit mungkin kata kunci karena sintaksis verbose sulit dipelajari dan tidak membantu keterbacaan.
Contoh terburuk adalah Ada:
Kata-kata pengisi seperti adalah, seperti, .. tidak masuk akal untuk bahasa pemrograman.
sumber
public static void
.IS
ini maka Anda belum memahami Ada (apakah Anda pernah memprogram Ada?):IS
Memisahkan deklarasi prosedur dari deklarasi variabel lokal dan juga membedakan spesifikasi dari implementasi. Tentu saja Anda hanya akan melihat ketika membandingkan spesifikasi dan implementasi fungsi untuk melihat bahwa ituIS
masuk akal dan bukan pengisi sama sekali.if x then …
untukif (x) …
. Kami telah memperdagangkan sepasang tanda kurung untuk kata kunci kontekstual. Ini masuk akal karena kondisinyax
mungkin ekspresi kompleks dengan tanda kurung sendiri. Menghilangkan pasangan terluar secara drastis dapat meningkatkan keterbacaan. Alternatif tentu saja adalah menggunakan titik dua di sini, seperti di Python. Bahkan, saya percaya sebagian besar pengisi yang ambigu seperti itu bisa diganti dengan titik dua. Tidak yakin metode mana yang saya sukai.is
adalah pengisi karena Ada bisa membiarkanprocedure Hello begin ... end
tanpa ambiguitas.Saya ingin melihat lebih banyak bahasa pembelajaran . Tidak hanya bahasa untuk pemula absolut dengan batasan yang lebih suci daripada Anda, seperti membutuhkan ruang di antara setiap token , tetapi bahasa untuk orang yang sudah mengetahui pemrograman dan ingin mempelajari konsep baru atau menjadi lebih baik dalam pemrograman pada umumnya.
Bagi saya, Haskell adalah contoh yang bagus tentang apa yang saya maksudkan dengan "bahasa pembelajaran" (meskipun bahasa ini juga tumbuh dalam popularitas dan utilitas umum selama bertahun-tahun). Dengan mengabaikan sintaks C yang sudah dikenal dan memiliki operator komposisi fungsi mundur (mis.
(+2) . (*3)
Adalah fungsi yang dikalikan 3, kemudian menambahkan 2), Haskell mengajari saya untuk menulis fungsi yang lebih pendek. Pemeriksa tipe yang kejam membantu saya mempelajari bahasa lebih cepat dan meningkatkan kemampuan saya untuk berpikir secara logis tentang kode. Kedua manfaat ini telah menyebar ke bahasa lain, bahkan bahasa.Tujuan pembelajaran bahasa dan tujuan bahasa umum sering bertentangan. Bahasa pembelajaran harus menantang dan bermanfaat untuk dipelajari, dan harus menegakkan gaya tertentu, bahkan jika gaya itu bukan yang terbaik untuk banyak aplikasi. Bahasa tujuan umum harus baik untuk menyelesaikan pekerjaan, dan penggunaan abstraksi harus diukur dengan cermat dan "masuk akal". Misalnya, ketika memperbaiki situs web, mempelajari tentang monad akan menjadi hal terakhir yang ada di pikiran seorang programmer. Di sisi lain dari koin, ketika seseorang belajar untuk memprogram, mereka tidak harus mengarungi omong kosong "public static void" jika mereka bahkan belum belajar tentang fungsi.
Jika Anda seorang perancang bahasa, putuskan apakah bahasa Anda adalah bahasa pembelajaran atau bahasa terapan. Ini akan menentukan sejauh mana Anda ingin menggunakan kemurnian dalam desain Anda.
sumber
(f ∘ g)(x) = f(g(x))
.g
diterapkan argumen pertama, diikuti olehf
. Jika Anda ingin mengurutkan daftar, mengelompokkannya, dan mendapatkan item pertama dari daftar itu, Anda akan menulis(map head . group . sort) list
ataumap head $ group $ sort list
ataumap head (group (sort list))
. Dalam semua kasus, Anda akhirnya menulis operasi mundur. Ngomong-ngomong, pengimporanControl.Arrow
memungkinkan Anda mengatakannya(sort >>> group >>> map head) list
, tetapi>>>
operatornya terlihat agak canggung dan kasar kepada saya.(map head . group . sort) list
dibaca sebagai "item pertama dari masing-masing kelompok dalam semacamlist
", yang cukup alami — dan, menurut saya, lebih fungsional daripada(sort >>> group >>> map head) list
, yang berbunyi agak imperatif dan terbelakang ketika “mengurutkan kemudian kelompok kemudian mengambil item pertama dari masing-masing kelompok. ..list
">>>
Operator terlihat agak canggung dan verbose - Beberapa bahasa fungsional yang lebih baru telah mulai menggunakan|>
sebagai operator chaining kiri ke kanan, yang mungkin sedikit lebih mudah pada mata ...Sejak kita di 2011,
dukungan multithreading; bukan hanya fitur sinkronisasi (kunci), tetapi fitur bahasa yang membuat multithreading semudah menulis loop:
semua (o di myCollection) {o.someMethod ()}
multi-paradigma; biarkan saya, sang programmer, memutuskan apakah saya ingin keamanan waktu kompilasi dari bahasa statis atau kesederhanaan dari bahasa yang dinamis, berdasarkan kasus per kasus; beri saya fitur berorientasi objek, fitur fungsional, dll.
konsistensi (Saya tahu ini meminta sedikit banyak untuk konsistensi dan multi-paradigma ...)
sumber
uint16_t
nilai ditandatangani, dan yang lain menganggap perbedaan sebagai tidak ditandatangani; itu tidak memberikan jalan bagi programmer untuk menentukan perilaku mana yang diinginkan.Proses Ringan
Saya ingin memiliki Proses Ringan seperti di Erlang. Ini terutama masalah untuk runtime. Ini tidak ada di JVM dan .NET CLR. LWP membantu untuk membuat perangkat lunak bersamaan secara besar-besaran. Idealnya seharusnya tidak ada yang lebih mahal untuk membuat proses karena untuk membuat objek dalam bahasa. Saya ingin membuat jutaan proses dalam aplikasi saya.
Ini diimplementasikan sebagai thread-pool dengan penjadwalan preemtive, sehingga satu tugas tidak memblokir tugas lainnya, dan tugas-tugas tersebut dapat dijadwalkan pada cpu-core yang tersedia.
Dukungan untuk rekursi ekor
Saya ingin mendapat dukungan untuk rekursi ekor. Ini juga bisa menjadi masalah untuk lingkungan runtime. Misalnya JVM tidak memiliki dukungan untuk rekursi ekor.
Pemrograman yang mudah didistribusikan
Saya ingin mendapat dukungan untuk kirim ( ! ) Dan menerima primitif ke bagian aplikasi yang berjalan di komputer lain di netword yang sama seperti di Erlang. Ini membuatnya mudah untuk membangun aplikasi yang skalabel misalnya datastore terdistribusi. Ditambah dengan itu serialisasi built-in dalam bahasa ini juga sangat membantu seperti di erlang. Dan tidak seperti di Jawa saya harus melakukannya secara manual.
sumber
Memfasilitasi metaprogramming.
batasi formulir khusus
Dalam Python tidak ada alasan mengapa mencetaknya bukan fungsi bawaan. Itu terlihat dan bertindak seperti fungsi kecuali untuk tidak ingin ada hubungannya dengan orangtua.
Apakah kita benar-benar membutuhkan
for
,foreach
,while
dan sejenisnya setiap sebagai bentuk khusus mereka sendiri. Bagaimana dengan satu konstruksi looping dan beberapa makro default untuk memberikan gula sintaksis dari bentuk varian looping.meta-programming untuk bentuk khusus
form['if'](test-fn, body-fn)
sumber
each
itu mengambil blok kode sebagai argumen. (Ruby juga memilikifor
danwhile
mengulang, tetapi tidak ada programmer Ruby yang menghargai diri sendiri yang benar-benar menggunakannya.)do..while
loop akan terlihat jika ada satu jenis loop yang memiliki evaluasi di atas? Itu tidak akan terlihat seperti do..while loop sama sekali.Kemampuan jaringan
Bahasa yang dikirimkan tanpa dukungan jaringan cukup lemah di dunia saat ini.
Sebagian besar aplikasi dunia nyata perlu berkomunikasi melalui beberapa jenis jaringan:
Ini juga merupakan landasan dukungan komputasi terdistribusi / cloud tentunya.
sumber
Saya suka bahasa pemrograman yang mudah dipelajari, dan mudah digabungkan untuk menciptakan hal-hal baru.
Misalnya, walaupun menarik untuk memiliki banyak cara untuk menulis sesuatu, saya pikir lebih baik hanya memiliki satu atau dua cara untuk menulisnya. Dengan begitu program lebih mudah dipertahankan.
Bahasa yang konsepnya dapat diterapkan di semua elemen sangat membantu (saya pikir ini disebut ortogonalitas) Jadi, lain kali Anda menghadapi fitur bahasa baru, Anda dapat menyimpulkan bagaimana menggunakannya.
Saya mengerti kadang-kadang sintaks bahasa harus menghalangi untuk melakukan lebih baik dalam fase kompilasi / interpretasi, tapi kadang-kadang saya merasa perancang bahasa menunda pekerjaan ini kepada pengembang. Misalnya, string multiline dalam Java atau Javascript.
Akhirnya, sintaks bahasa adalah antarmuka penggunanya, dan dengan demikian, itu harus jelas, ringkas, intuitif, mudah digunakan, dan harus menghormati kebiasaan Anda.
sumber
sumber
Menambahkan fitur ke bahasa pemrograman yang ada. Jadi, bahasa baru B adalah bahasa lama A plus fitur X.
Contoh yang ada:
sumber
Ketika datang ke teknologi / platform / bahasa / database dll. Sebagian besar waktu turun ke kinerja. Di masa depan banyak perangkat lunak saat ini dapat dirancang menggunakan bahasa grafis karena kita memiliki kemampuan komputasi yang lebih kuat.
Saya berharap untuk hari ketika kita memiliki kekuatan komputasi dan bahasa di mana Anda merancang aplikasi Anda dan Anda tidak perlu khawatir tentang detail bahasa .
Pembaruan: Saya mengirim tautan ke bahasa LabView seperti itu
Pembaruan: Saya harus menjelaskan lebih lanjut apa yang saya maksud dengan "kekuatan komputasi". Kinerja perangkat lunak yang dikompilasi mungkin tidak sekuat perangkat lunak yang dikompilasi berdasarkan bahasa sintaksis. Saya berpikir pemrograman grafis sebagai level pemrograman yang lebih tinggi dan mungkin ada lebih banyak overhead. Komputer saat ini dapat dan dengan mudah menjalankan bahasa pemrograman grafis.
sumber