Mengapa bahasa pemrograman ilmiah begitu aneh? [Tutup]

9

Menurut saya, bahasa pemrograman yang dimaksudkan untuk digunakan dalam sains dan teknik secara konsisten aneh dibandingkan dengan bahasa tujuan umum. Beberapa contoh di atas kepala saya:

  • Di Matlab, setiap fungsi harus ditempatkan dalam file terpisah
  • Dalam R, <- adalah operator assigment, yang bertentangan dengan = dalam hampir setiap bahasa lainnya
  • Matlab, R, Julia dan yang lainnya semuanya terindeks 1
  • Matlab menggunakan% untuk komentar, dan bukan standar # atau //

Tentu saja, semua bahasa ini memiliki beberapa fitur desain yang sebenarnya membuatnya lebih mudah digunakan untuk aplikasi ilmiah, seperti notasi matriks yang lebih alami. Namun, mereka semua secara tak terduga membuat semua pilihan aneh yang tidak membuat apa pun lebih mudah dan bisa dengan mudah dihindari jika perancang bahasa baru saja memilih untuk melakukan apa yang dilakukan 99% dari bahasa lain. Apakah alasan vendor terkunci? Kurangnya kontak dengan komunitas pengembangan perangkat lunak yang lebih luas? Sesuatu yang lain

Saya membaca utas ini dan tidak menemukan penjelasan yang memuaskan. Hanya karena R dirancang sebagai bahasa ilmiah, bukan berarti ia harus sepenuhnya mengabaikan konvensi dan menggunakan <- alih-alih =.

haroba
sumber
6
Jawaban singkat: karena mereka dibuat untuk ilmuwan, bukan untuk programmer.
Bart van Ingen Schenau
19
Jawaban singkat: Karena setiap bahasa yang Anda pikir normal dipengaruhi oleh leluhur yang sama, C.
Ross Patterson
3
Saya pikir Anda akan berjuang untuk menemukan setiap konvensi di seluruh bahasa. Itu tergantung pada warisan mereka.
Robbie Dee
6
Tidak ada yang aneh. Hanya berbeda . Karena tidak ada alasan khusus untuk memilih satu sintaksis daripada yang lain kecuali apa yang digunakan penulis khusus bahasa tertentu.
Jan Hudec
8
99% Anda salah. Jika Anda hanya tahu C dan turunannya, Anda mungkin berpikir begitu, tetapi lebih dari 50% bahasa non-C menggunakan sesuatu yang berbeda untuk penugasan, pengindeksan dan / atau komentar.
david.pfx

Jawaban:

21
  • Ada konvensi yang berbeda. Konvensi dalam matematika, logika, dan ilmu terapan dan konvensi dalam IT Yang pertama jauh lebih tua.
  • Bahasa ilmiah dibuat untuk membuat kehidupan pengguna MEREKA lebih nyaman. Pengguna dilihat sebagai seorang ilmuwan, yang dapat mewujudkan beberapa algoritma dari waktu ke waktu atau untuk memeriksa beberapa teori, tanpa perlu mempelajari sesuatu yang benar-benar baru. Jadi, bahasa untuk para ilmuwan HARUS dibuat dengan standar non-IT. Karena mereka tidak dimaksudkan untuk penggunaan orang-orang TI. Mereka mencapai standar LAIN dan itu bagus karena target pendengaran. Karena UI SW yang baik, dan bahasa adalah UI SW, harus dilakukan berdasarkan kebutuhan pengguna, bukan dari koder.
  • Standar TI kami adalah standar industri. TI adalah industri. Ilmu pengetahuan bukanlah industri. Para ilmuwan bangga akan hal itu. Dan mereka dengan enggan akan mengambil apa pun dari latihan kami ke dalam praktik mereka. Dan mereka tidak suka standar sama sekali. Dan tidak ada yang suka standar asing. Jadi, jika seseorang akan membuat bahasa ilmiah yang akan melihat ke standar TI, itu akan sulit terjual, karena tidak menyukai target pendengaran, bahkan jika secara obyektif lebih nyaman.

Dan bahkan jika kita menilai hanya berdasarkan standar IT ... Maaf, standar apa yang Anda maksud? Sudahkah Anda mencoba menulis prog di APL atau SNOBOL? Kedua bahasa ini, IMHO, PALING kuat di bidang yang sesuai (penghitungan dan string). Tetapi sintaksnya adalah sesuatu yang SANGAT aneh (dan efektif) Membaca satu baris kode APL bisa memakan waktu berhari-hari. Di sisi lain, garis seperti itu adalah SW yang serius. Anda akan kembali ke Mathlab dengan air mata lega.

Adapun "=", banyak orang memiliki masalah untuk terbiasa bahwa itu bukan kesetaraan, tetapi tugas. BTW, dalam Pascal IS IS equality and assignment adalah ": =".

Dan Anda benar-benar berpikir bahwa == untuk kesetaraan lebih alami? Sebaliknya, mencampur = dan == adalah kesalahan paling umum dalam pemrograman C, itu terjadi sangat sering bahkan dalam IDE kontemporer, dengan kontrol otomatisnya.

Tentang pengindeksan dari 1 - itu adalah satu-satunya yang alami. Ketika Anda masih kecil, Anda telah belajar puisi dan lagu, di mana Anda menghitung: satu, dua, tiga ... Dan bukan 0,1,2 ... Dalam matematika sekolah kami mempelajari bahwa penghitungan dimulai dari 1, dan bahwa 0 bukan milik nomor alami / menghitung. Hanya dengan definisi fungsi indeks non-alami datang. Bagaimanapun, 0 ditemukan ribuan tahun setelah nenek moyang kita mengangkat jari.

0-start lebih mudah disadari dan langsung masuk ke praktik IT setelah penampilan C. Namun dalam bahasa Fortran, bahasa pertama, indeks-1 digunakan. Sama dengan bahasa lain dari zaman pra-industri.

Dan ya, saya telah membaca artikel Dyjkstra tentang kealamian penghitungan berbasis 0. Dan sama sekali tidak setuju dengan argumentasinya. Itu wajar bagi musisi ony. Dan bahkan 0 penggemar yang membuat kompiler C dan Java, menghitung baris kode MULAI DARI 1!

Gangnus
sumber
1
": =" untuk penugasan dan pengindeksan berbasis 1 digunakan di Smalltalk juga.
Rory Hunter
1
Saya tidak membeli bahwa pengindeksan berbasis 0 adalah karena kemudahan implementasi (FORTRAN cukup banyak membuktikan hal ini). cs.utexas.edu/users/EWD/transcription/EWD08xx/EWD831.html memberikan beberapa alasan orang mungkin lebih suka pengindeksan berbasis 0, tetapi perhatikan bahwa pilihannya cukup sewenang-wenang.
jk.
2
FORTRAN memiliki pengindeksan berbasis 1. PASCAL diizinkan pengindeksan berbasis arbitrer: Anda bisa mendeklarasikan array yang indeksnya berkisar, misalnya -42 hingga +57. (Lihat en.wikipedia.org/wiki/... untuk contoh di mana ini berguna.)
John R. Strohm
1
@ Gangnus Saya pikir itu adalah kesalahan untuk membandingkan bahasa modern ke C dan menganggapnya sulit untuk dibaca. Itu dirancang untuk menjadi alternatif tingkat tinggi untuk bahasa tingkat yang lebih rendah.
Robbie Dee
1
FORTH adalah bahasa berbasis tumpukan. Pikirkan kalkulator HP. Itu sangat kompak dan cepat, tetapi sulit untuk menulis kode yang tidak bisa ditembus. Di FORTH, Anda jarang menggunakan variabel tetapi mendorong sesuatu ke stack dan menggunakan operator yang bertindak pada stack.
Gort the Robot
16

Pengindeksan dari 1 tidak aneh, itu sepenuhnya normal dan diharapkan kecuali untuk programmer , karena mereka telah dikondisikan untuk mengharapkan penghitungan berbasis 0 oleh C (yang dikondisikan dari properti arsitektur prosesor).

Komentar dilambangkan dalam banyak, banyak cara berbeda dalam bahasa yang berbeda; ada ada cara standar, setiap bahasa memilih simbol atau digraf yang belum diambil.

Tugas juga merupakan konsep yang aneh dan tidak bisa dipahami, kecuali untuk programmer ; kebanyakan orang tidak peduli apakah itu =atau :=atau <-, mereka berjuang untuk memahami maknanya (dan bagi mereka, itu sebenarnya lebih baik tidak digunakan =, karena ini menekankan bahwa penugasan bukanlah kesetaraan - rintangan yang paling umum bagi non-programmer untuk mengerti kode).

Singkatnya, bahasa pemrograman yang ditujukan untuk orang selain programmer profesional terlihat berbeda karena orang yang menggunakannya paling menginginkannya.

Kilian Foth
sumber
4
Saya tidak setuju bahwa pengindeksan dari 1 tidak aneh. Pengindeksan-0 paling tidak sama umum dengan pengindeksan-1 dalam matematika, dan itu jelas telah menjadi norma dalam pemrograman selama bertahun-tahun sebelum munculnya Matlab atau S / R.
haroba
9
@ Akwis Oh, ya, aku sudah melihat bayinya menghitung nol, satu, dua ... Cara yang paling alami, sungguh.
Gangnus
4
Bayi tidak menulis kode. Ada alasan bagus untuk menggunakan pengindeksan-nol (lihat: Dijkstra), dan ketika pengindeksan-nol juga umum dalam matematika saya tidak bisa melihat banyak alasan untuk menggunakan pengindeksan-1.
haroba
1
Jawab @Aqwis atas kata-kata Anda sendiri. Apa yang aneh dan tidak. Suatu hal yang diatur dari masa kanak-kanak dan oleh matematika (bilangan alami tidak termasuk nol), tidak bisa aneh dari sisi mana pun. Dan apa yang bertentangan dengannya, aneh sekali. Dan bahwa Anda telah terbiasa dengan sesuatu yang lain, tidak relevan. Bahasa-bahasa ini tidak dibuat untuk Anda atau saya.
Gangnus
1
@ fresnel Untuk memparafrasekan jawaban: Pengindeksan dari 1 adalah normal. Kecuali untuk pemrogram, karena mereka telah dikondisikan untuk mengharapkannya [pengindeksan dari 0] dari C
Robbie Dee
5

Ada tiga masalah:

  1. Anda tidak mengetahui tradisi tertentu, dan alasan bagus untuk pilihan tertentu.
  2. Anda terlalu menekankan sintaksis, terlalu sedikit pada semantik.
  3. Para insinyur dan ilmuwan tidak memiliki pengalaman dalam desain bahasa, yang mengarah pada sintaksis yang dipertanyakan.

Sekarang ke poin spesifik Anda:

  • Saya tidak tahu Matlab, jadi saya tidak bisa mengomentari persyaratan organisasi file. Perhatikan bahwa Java ingin Anda menggunakan satu file per kelas publik.

  • Dalam R, =dapat digunakan sebagai operator penugasan juga. Perhatikan bahwa diperlukan beberapa operator penugasan <-dan <<-untuk menangani konsep pelingkupannya ( <<-ditugaskan untuk simbol dalam lingkup luar alih-alih membuat simbol baru di dalam fungsi). Panah dapat digunakan ke arah lain juga, berpotensi membuat kode bersih: complex_calculation() -> x.

  • Pengindeksan berbasis 1 adalah standar dalam matematika, yang membuat pengguna Matlab dan R lebih nyaman daripada C. Julia mengikuti Matlab agar memiliki kurva belajar yang lebih baik.

  • %untuk komentar juga digunakan di TeX / LaTeX. Ini #hanya konvensi dari bahasa scripting Unix, dan turunannya.

Anda juga mengabaikan bahwa bahasa pemrograman "nyata" memiliki banyak bagian aneh. Mengapa Skema tidak digunakan =? Sebagai gantinya:

(define foo 5)

Mengapa C digunakan *untuk dereferencing, padahal jelas sebuah caret ^xlebih umum dalam tradisi lain?

amon
sumber
"Saya tidak tahu Matlab, jadi saya tidak bisa mengomentari persyaratan organisasi file. Perhatikan bahwa Java ingin Anda menggunakan satu file per kelas publik." Saya pikir itu sangat masuk akal untuk bahasa untuk mengharapkan Anda untuk membagi proyek Anda menjadi beberapa file. Namun, suatu kelas biasanya jumlah kode yang relatif besar. Fungsi tidak harus seperti itu. Dengan memaksa file terpisah untuk setiap fungsi, Matlab mencegah Anda membuat fungsi-fungsi kecil dan alih-alih mempromosikan fungsi monolitik yang besar.
haroba
1
Saya setuju dengan hampir semua hal, kecuali hal.3. Para ilmuwan tidak membuat bahasa mereka, mereka MEMESAN mereka. Mereka adalah klien, pengguna, tetapi bukan pencipta mereka. Jika seseorang, dia sudah menjadi geek IT. Dan sintaksis bahasa apa pun dipertanyakan, tidak ada yang ideal untuk semua tugas.
Gangnus
Matlab mengkompilasi fungsi / file berdasarkan just-in-time sesuai kebutuhan. Tidak memiliki konsep nyata dari sebuah program, hanya banyak fungsi. Jika saya menjalankan fungsi yang membuat panggilan ke foo (), maka itu akan mencari path-nya untuk file bernama foo.m, kompilasi, dan jalankan. Tidak perlu memberi tahu Matlab terlebih dahulu kumpulan file apa yang ingin saya gunakan.
Simon B
1

Saya kira itu tergantung pada paparan Anda ke bahasa lain. Dari atas kepala saya:

  • C / C ++ memiliki file sumber terpisah (.c / .cpp & .h)
  • Karakter -> digunakan dalam C # untuk ekspresi lambda
  • VB versi lama menggunakan 1 sebagai indeks default (meskipun ini dapat diubah dengan Basis Opsi)
Robbie Dee
sumber
1
Di C dan C ++, Anda bisa mendefinisikan fungsi sebanyak yang Anda inginkan dalam satu file.
haroba
Saya hanya menekankan bahwa tidak biasa bagi modul untuk dipecah menjadi beberapa file. Jika Anda ingin, Anda bisa meletakkan semua fungsi Anda di file terpisah menggunakan bahasa .NET dengan konstruksi kelas parsial .
Robbie Dee
1
Tentu saja tidak biasa bagi modul untuk dipecah menjadi beberapa file, dan dalam banyak kasus diinginkan. Tetapi di Matlab Anda harus meletakkan setiap fungsi dalam file sendiri, yang berarti bahwa jika Anda memiliki seribu fungsi, Anda memerlukan seribu file .
haroba
3
Seperti komentar dalam HTML <!-- ... -->. Tanda persen digunakan untuk penyandian URL: http://example.com/()menjadi http://example.com/%28%29.
amon
Maaf, kesalahan saya.
Robbie Dee