Apakah semua bahasa pada dasarnya sama?


39

Baru-baru ini, saya harus memahami desain program kecil yang ditulis dalam bahasa yang saya tidak tahu tentang ( ABAP , jika Anda harus tahu). Saya bisa mengetahuinya tanpa terlalu banyak kesulitan.

Saya menyadari bahwa menguasai bahasa baru adalah permainan bola yang sama sekali berbeda, tetapi murni memahami maksud kode (khususnya kode standar produksi, yang tidak harus rumit) dalam bahasa apa pun adalah langsung, jika Anda sudah tahu beberapa bahasa (lebih disukai satu prosedural / OO dan satu fungsional).

Apakah ini secara umum benar? Apakah semua bahasa pemrograman terdiri dari konstruksi yang serupa seperti loop, pernyataan kondisional dan pesan yang lewat di antara fungsi? Apakah ada bahasa non-esoterik yang tidak bisa dipahami oleh programmer Java / Ruby / Haskell yang khas? Apakah semua bahasa memiliki asal yang sama?


4
Saya akan mengarahkan Anda ke Beating the Averages oleh Paul Graham. Anda mungkin atau mungkin tidak ingin membaca semuanya, tetapi untuk bagian yang relevan cari judul "The Blub Paradox". Tn. Graham tidak perlu repot menaruh jangkar di dinding teksnya, jadi saya tidak bisa langsung menautkannya.
kwatford

4
Bahasa tidak memiliki asal yang sama. Tetapi semua bahasa mencoba memecahkan beberapa masalah. Saya pikir ini agak analog dengan bahasa lisan. Tujuannya untuk mengekspresikan diri. Saya tidak bisa mengatakan itu mudah untuk memahami bahasa berdasarkan pengetahuan tentang 1 prosedur / OO / fungsional. Saya belum melakukan ini tetapi jika saya mengajukan pertanyaan ini, saya akan melihat perl atau lisp dengan banyak tanda kurung & saya tidak akan bisa mengatakan bahwa mengetahui 1 bahasa dari semua jenis sudah cukup.
shahkalpesh

1
Dalam hal itu: Kalkulus Lambda. Mungkin bukan bahasa 'nyata', tetapi ini adalah ibu dari semua bahasa pemrograman dalam arti tertentu. Saya pernah harus mengimplementasikan bahasa fungsional sehingga dikompilasi ke dalam ekspresi lambda (yang kemudian langsung ditafsirkan). Hasilnya (bagi saya, setidaknya) tidak dapat dibaca meskipun mempertahankan semua pengidentifikasi yang relevan. Terutama fungsi rekursif menggunakan Y-combinator. Satu-satunya cara praktis untuk mengetahui apa yang dilakukan beberapa ekspresi sampel adalah dengan mengevaluasi sendiri. Hal-hal sederhana seperti fibonnaci dan merge sort tidak dapat dibaca.
kwatford

2
Jika Anda tahu bahasa fungsional, Anda harus tahu bahwa loop tidak dimungkinkan di setiap bahasa.
jalf

Piet sangat berbeda. :)

Jawaban:


88

Dasar-dasar sebagian besar bahasa prosedural hampir sama.

Mereka menawarkan:

  • Jenis data skalar: biasanya boolean, integer, float, dan karakter
  • Tipe data majemuk: array (string adalah huruf khusus) dan struktur
  • Konstruksi kode dasar: aritmatika di atas skalar, akses array / struktur, penugasan
  • Struktur kontrol sederhana: if-then, if-then-else, sementara, untuk loop
  • Paket blok kode: fungsi, prosedur dengan parameter
  • Lingkup: area di mana pengidentifikasi memiliki makna tertentu

Jika Anda memahami hal ini, Anda memiliki pemahaman yang baik tentang 90% bahasa di planet ini. Apa yang membuat bahasa ini sedikit lebih sulit untuk dipahami adalah variasi sintaksis aneh yang digunakan orang untuk mengatakan hal-hal dasar yang sama. Beberapa menggunakan notasi singkat yang melibatkan tanda baca aneh (APL menjadi ekstrem). Beberapa menggunakan banyak kata kunci (COBOL menjadi perwakilan yang sangat baik). Itu tidak masalah. Yang penting adalah jika bahasa itu cukup lengkap dengan sendirinya untuk melakukan tugas-tugas kompleks tanpa menyebabkan Anda merobek rambut Anda. (Cobalah mengkode beberapa peretasan string serius dalam skrip shell Window DOS: Turing mampu tetapi sangat buruk dalam segala hal).

Bahasa prosedural yang lebih menarik menawarkan

  • Lingkup bersarang atau leksikal, ruang nama
  • Pointer memungkinkan satu entitas untuk merujuk ke entitas lain, dengan alokasi penyimpanan dinamis
  • Pengemasan kode terkait: paket, objek dengan metode, sifat
  • Kontrol yang lebih canggih: rekursi, kelanjutan, penutupan
  • Operator khusus: operasi string dan array, fungsi matematika

Meskipun secara teknis bukan properti dari langauge, tetapi properti ekosistem di mana bahasa tersebut hidup, adalah perpustakaan yang mudah diakses atau disediakan dengan bahasa sebagai bagian dari alat pengembangan. Memiliki berbagai fasilitas perpustakaan menyederhanakan / mempercepat penulisan aplikasi hanya karena kita tidak perlu menemukan kembali apa yang dilakukan perpustakaan. Sementara Java dan C # secara luas dianggap sebagai bahasa yang baik di dalam dan dari diri mereka sendiri, apa yang membuatnya benar-benar bermanfaat adalah perpustakaan besar yang menyertainya, dan perpustakaan ekstensi yang mudah didapat.

Bahasa yang lebih sulit untuk dipahami adalah yang non-prosedural:

  • Bahasa murni fungsional, tanpa penugasan atau efek samping
  • Bahasa logika, seperti Prolog, di mana perhitungan simbolik dan penyatuan terjadi
  • Bahasa pencocokan pola, di mana Anda menentukan bentuk yang cocok dengan masalah, dan sering kali tindakan dipicu oleh kecocokan
  • Batasi bahasa, yang memungkinkan Anda menentukan hubungan dan secara otomatis menyelesaikan persamaan
  • Bahasa deskripsi perangkat keras, di mana semuanya dijalankan secara paralel
  • Bahasa khusus domain, seperti SQL, Jaring Petri Berwarna, dll.

Ada dua gaya representasional utama untuk bahasa:

  • Berbasis teks, di mana entitas pengidentifikasi nama dan arus informasi dikodekan secara implisit dalam rumus yang menggunakan pengidentifikasi untuk memberi nama entitas (Java, APL, ...)
  • Grafis, di mana entitas digambarkan sebagai node, dan hubungan antara entitas digambarkan sebagai busur eksplisit antara node tersebut (UML, Simulink, LabView)

Bahasa grafis sering memungkinkan sub teks Bahasa sebagai anotasi dalam node dan pada busur. Bahasa grafis yang lebih aneh secara rekursif memungkinkan grafik (dengan teks :) di node dan pada arc. Bahasa grafis yang benar-benar aneh memungkinkan grafik penjelasan menunjuk ke grafik yang diberi keterangan.

Sebagian besar bahasa ini didasarkan pada sejumlah kecil model perhitungan:

  • Kalkulus lambda (dasar untuk Lisp dan semua bahasa fungsional)
  • Sistem pos (atau teknik penulisan ulang string / tree / graph)
  • Mesin Turing (kondisi modifikasi dan pemilihan sel memori baru)

Mengingat fokus oleh sebagian besar industri pada bahasa prosedural dan struktur kontrol yang kompleks, Anda dilayani dengan baik jika Anda mempelajari salah satu bahasa yang lebih menarik dalam kategori ini dengan baik, terutama jika itu mencakup beberapa jenis orientasi objek.

Saya sangat merekomendasikan mempelajari Skema, khususnya dari buku yang sangat indah: Struktur dan Interpretasi Program Komputer . Ini menjelaskan semua konsep dasar ini. Jika Anda mengetahui hal ini, bahasa lain akan tampak sangat mudah kecuali untuk sintaks yang konyol.


3
Jawaban Hebat! Sebagai tindak lanjut (adakah cara untuk mengajukan pertanyaan tindak lanjut dalam SO?), Adakah satu bahasa yang bisa saya kuasai dan klaim untuk memahami semua konsep dalam perangkat lunak pemrograman? Apakah itu Lisp (atau dialek seperti Skema)?

@Anirudh: Tidak ada mekanisme tindak lanjut formal, tetapi Anda dapat membuka pertanyaan baru. Jika itu berisi alasan dan tautan ke pertanyaan ini, itu mungkin bahkan tidak ditutup. ;) Untuk menjawab tindak lanjut Anda, saya sepenuh hati percaya tidak hanya ada satu bahasa, karena paradigma terlalu berbeda.

@Anirudh: Setuju dengan John Y, tidak hanya ada satu. Tetapi jika Anda relatif baru di bidang ini, Anda harus menghabiskan energi yang cukup besar untuk menguasai paradigma prosedural (saya menganggap OO hanya spesialisasi). Tidak ada salahnya untuk melihat paradigma lain (logika, kendala, aliran data) untuk memahami bagaimana mereka bekerja, tetapi untuk sebagian besar pekerjaan industri sehari-hari, bahasa prosedural cukup banyak.
Ira Baxter

1
Sama seperti dengan bahasa alami, "lebih sulit untuk dipahami" adalah subjektif dan tergantung pada bahasa pertama yang Anda pelajari.
NullUserException

1
@NullUserException: Ini menunjukkan Anda harus memilih bahasa pertama Anda dengan hati-hati, untuk memaksimalkan kemudahan memahami orang lain. Itulah inti Skema, dan khususnya buku SICP.
Ira Baxter

6

Bahasa deskripsi perangkat keras adalah bahasa pemrograman, tetapi mereka secara konseptual sangat berbeda. Coba VHDL atau Verilog untuk ukuran. Mereka umum untuk pemrograman FPGA. (Ok, jadi mereka bukan prosesor, tetapi mereka adalah perangkat komputasi tujuan umum. Dan itu harus dianggap perangkat keras yang valid untuk topik ilmu komputer.) Anda harus secara eksplisit membuat hal-hal terjadi secara serial. Ini model yang sama sekali berbeda. Anda telah memikirkan hal-hal yang terjadi secara paralel sebagai aturan bukan pengecualian. Untuk loop di Verilog, ekspansi ke perangkat paralel. Jadi perilaku "yang diharapkan" mungkin tidak seperti yang Anda harapkan.


Itu poin yang bagus. Saya akan mencari Verilog / VHDL.

Saya selalu berpikir bahwa bahasa pemrograman konvensional hanya cara yang sangat payah untuk kode program yang secara alami paralel, seperti VHDL. Ketika Anda mulai sebagai perancang perangkat keras, sedikit tentang segala hal yang terjadi dalam mode serial tampak sangat canggung. (Kami mengajarkan bahasa pemrograman yang salah kepada orang-orang sebagai bahasa pertama mereka: seharusnya Verilog!).
Ira Baxter

4

Tergantung pada apa yang Anda maksud dengan "pada dasarnya." Semua bahasa dengan fleksibilitas apa pun adalah Turing-complete. Dalam pengertian itu: ya, mereka semua pada dasarnya sama.

Pada level rendah, mereka semua melakukan urutan operasi yang sama dan semua Windows, Linux, dan hal-hal OS X (baru-baru ini) semuanya berjalan pada prosesor yang kompatibel dengan Intel menggunakan set instruksi yang sama. Dengan cara itu mereka pada dasarnya juga sama.

Saya menyadari bahwa Anda agak mendefinisikan "pada dasarnya" dalam pertanyaan Anda, tetapi untuk benar-benar menjawabnya, definisi itu harus lebih disempurnakan. Dalam banyak hal mereka semua sama. Dalam banyak hal mereka berbeda. Terlalu mudah untuk mengatakan "itu tergantung." Jika Anda memilih salah satu dari yang ekstrem, pertanyaan tersebut kemungkinan tidak akan menjawab apa yang Anda inginkan sehingga ke mana garis itu ditarik sangat penting untuk menjawab pertanyaan Anda saat Anda menginginkannya.


3

Saya akan mengatakan bahwa suatu bahasa mengkodekan makna. Jika maknanya memiliki arti dalam konteks tertentu maka semua bahasa yang dapat mengekspresikan maknanya dapat dikatakan setara dibatasi oleh maknanya dan konteksnya.

Jika Anda membatasi konteks itu pada mesin Von Neumann standar, maka makna komputasi dari mengubah memori dan komputasi dalam cpu dapat dikatakan sebagai asal - dan mungkin satu-satunya makna yang dimiliki semua bahasa. Semua hal lain dibangun berdasarkan ini.


1
John von Neumann. Dan itu TIDAK diucapkan seperti "orang baru", lebih seperti "orang telanjang".

Terima kasih atas koreksinya - saya mengucapkannya seperti yang Anda katakan.
Preet Sangha

Ketika seseorang menyarankan koreksi, Anda dapat mengedit posting Anda untuk mencerminkannya.
Phil Miller

2

Bahasa pemrograman juga merupakan alat untuk berpikir. Dengan perspektif pemikiran lain, beberapa masalah hilang atau ditransformasikan ke jenis yang berbeda dan lebih mudah dikelola (misalnya, banyak pola desain gaya C ++ hilang begitu saja ketika Anda berpikir dalam Lisp (lihat misalnya presentasi Peter Norvik ini ), dan Erlang membebaskan Anda dari berpikir dari beberapa konkurensi tingkat rendah atau konstruksi komputasi terdistribusi dan memungkinkan Anda hanya berkonsentrasi pada logika aplikasi).

Namun, perlu diketahui bahwa kadang-kadang paradigma "baru" sebagian dapat diterapkan ke bahasa pemrograman "lama" yang menjelaskan mengapa kita misalnya memiliki buku yang mengajarkan pemrograman fungsional untuk programmer Java . Tetapi secara alami mendukung dan mengintegrasikan paradigma yang lebih kuat di tingkat bahasa memungkinkan penerapan paradigma yang lebih alami (dan akibatnya membuatnya tidak mungkin untuk memahami program dalam bahasa yang mendukung paradigma asing, seperti yang ditunjukkan oleh jawaban lain - @Ira Baxter mendaftar bahasa-bahasa non-prosedural) dan @kwatford merujuk pada Paul Graham ).


2
+++++++[>+++++++++++<-]>+.<+++++++++++[>+++<-]>.>>+++++++[>++++++<-]>++++.

Pada level terendah, setiap bahasa pemrograman adalah "sama," tetapi itu tidak berarti bahwa mereka sama pada level di mana Anda benar-benar berinteraksi. Mereka abstrak masalah untuk Anda; itu tidak berarti bahwa mereka mengabstraksi masalah yang sama atau bahwa mereka mengabstraksi setiap masalah dengan cara yang sama.


1

Bahasa dewasa umumnya memiliki beberapa tujuan, dan mereka membuat pengorbanan di mana mereka mengorbankan satu hal untuk yang lain. Bahasa tujuan umum dapat digunakan untuk apa saja, tetapi tidak ada bahasa yang bisa unggul di setiap bidang. Beberapa contoh:

C berusaha untuk menjadi bahasa pemrograman sistem yang ideal. Untuk tujuan ini ia mengorbankan keterbacaan dan keamanan untuk kontrol dan kecepatan tingkat rendah.

Python bertujuan untuk menjadi bahasa scripting yang ideal. Untuk tujuan ini mengorbankan kecepatan dan verifikasi untuk produktivitas dan portabilitas.

Haskell mencoba menjadi bahasa yang aman, murni secara matematis. Untuk tujuan ini ia mengorbankan kemampuan belajar dan konvensi untuk verifikasi dan keandalan.

Pengorbanan dan manfaat ini membuat perbedaan besar dalam bahasa. Ya, kebanyakan bahasa pemrograman dapat digunakan untuk apa saja yang bisa dilakukan oleh komputer, namun tidak satupun dari bahasa-bahasa yang sama harus digunakan untuk semuanya. Semua bahasa di atas adalah yang saya pilih untuk tugas-tugas tertentu tetapi tidak untuk yang lain. Jika saya sedang memprogram sistem operasi saya akan memilih C. Jika saya menulis backend untuk sebuah situs web, saya akan menggunakan Python. Dan jika saya sedang menulis sistem keuangan saya akan menggunakan Haskell.

Pada akhirnya, pilihan Anda sebagai programmer adalah alat yang tepat untuk pekerjaan itu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.