Ada berapa jenis bahasa pemrograman? [Tutup]

30

Pada dasarnya, saya ingin belajar banyak bahasa pemrograman untuk menjadi programmer yang hebat. Saya hanya tahu sedikit tentang kedalaman dan saya berharap seseorang dapat menguraikan berapa banyak kelas atau jenis bahasa pemrograman yang ada . Seperti bagaimana Anda akan menyatukannya jika Anda harus mempelajarinya dalam kelompok.

Berasal dari latar belakang Java, saya terbiasa dengan pengetikan statis, tetapi saya tahu bahwa selain pengetikan dinamis juga harus ada variasi dalam bahasa yang tersedia sehingga saya ingin melihat pengelompokan kategori jika memungkinkan.

sova
sumber
2
Bukankah lebih baik untuk mengatakan "Jenis yang .." daripada berapa banyak?
Amir Rezaei
Yah saya telah belajar bahwa sesuatu seperti Prolog dan C pada dasarnya berbeda, jadi saya pikir masing-masing sesuai dengan jenis bahasa pemrograman yang berbeda, dan saya berharap untuk memahami berapa banyak jenis.
sova
7
2: tipe yang melakukan apa yang Anda inginkan dan tipe yang tidak
Matt Ellen
1
Mempelajari berbagai jenis bahasa pemrograman benar - benar konstruktif ! Anda dapat berpotensi berpendapat bahwa ini harus ditutup sebagai duplikat dari ini, tetapi saya pikir itu adalah pertanyaan yang cukup berbeda untuk tetap terpisah.
Peter Boughton
1
@Sova, saya sarankan untuk membuat pilihan bahasa baru pertama Anda untuk mencoba sesuatu yang tidak menggunakan sintaksis berbasis-c. Itu akan membuat kepala Anda lebih fokus pada cara kerjanya vs bagaimana itu berbeda dari yang Anda tahu terbaik.
Erik Reppen

Jawaban:

73

Itu tergantung pada bagaimana Anda ingin mengklasifikasikan bahasa. Pada dasarnya, bahasa dapat dibagi menjadi dua jenis: bahasa imperatif di mana Anda menginstruksikan komputer bagaimana melakukan tugas, dan bahasa deklaratif di mana Anda memberi tahu komputer apa yang harus dilakukan. Bahasa deklaratif selanjutnya dapat dipecah menjadi bahasa fungsional , di mana sebuah program dibangun dengan menyusun fungsi, dan logikabahasa pemrograman, di mana suatu program dibangun melalui serangkaian koneksi logis. Bahasa imperatif lebih banyak membaca seperti daftar langkah-langkah untuk menyelesaikan masalah, seperti resep. Bahasa imperatif meliputi C, C ++, dan Java; bahasa fungsional meliputi Haskell; bahasa pemrograman logika termasuk Prolog.

Bahasa imperatif terkadang dipecah menjadi dua subkelompok: bahasa prosedural seperti C, dan bahasa berorientasi objek . Bahasa berorientasi objek sedikit ortogonal untuk pengelompokan, meskipun, karena ada bahasa fungsional berorientasi objek (OCaml dan Scala menjadi contoh).

Anda juga dapat mengelompokkan bahasa dengan mengetik: statis dan dinamis . Bahasa yang diketik secara statis adalah bahasa yang pengetikannya diperiksa (dan biasanya ditegakkan) sebelum menjalankan program (biasanya selama fase kompilasi); bahasa yang diketik secara dinamis menunda pemeriksaan jenis ke runtime. C, C ++, dan Java adalah bahasa yang diketik secara statis; Python, Ruby, JavaScript, dan Objective-C adalah bahasa yang diketik secara dinamis. Ada juga bahasa yang tidak diketik , yang meliputi bahasa pemrograman Forth.

Anda juga dapat mengelompokkan bahasa berdasarkan disiplin pengetikannya : pengetikan lemah , yang mendukung konversi tipe implisit, dan pengetikan kuat , yang melarang konversi tipe implisit. Garis-garis di antara keduanya agak kabur: menurut beberapa definisi, C adalah bahasa yang diketik dengan lemah, sementara yang lain menganggapnya diketik dengan kuat. Lagipula, mengetikkan disiplin sebenarnya bukan cara yang berguna untuk mengelompokkan bahasa.

mipadi
sumber
1
Akan mengajukan sesuatu yang serupa, tetapi akan memberi +1 dan menambahkan komentar sebagai gantinya. Setiap kategori atau kombinasi juga memiliki banyak spin-off yang dibuat dengan berfokus pada elemen tertentu. OOP, misalnya, menghasilkan: OOP berbasis prototipe, Pemrograman Berorientasi Aspek, Pemrograman Berbasis Komponen, dan sebagainya. Paradigma fungsional juga memiliki spin-off, seperti bahasa di mana proses asinkron atau utas adalah unit dasar dan Anda memprogram dengan menyusun proses paralel secara bersamaan.
CodexArcanum
Bagaimana bahasa scripting, misalnya VBScript, cocok dengan ini? Itu bisa sedikit prosedural dan sedikit OO karena orang dapat membuat berbagai jenis, jadi apakah itu membuatnya menjadi hibrida?
JB King
Ini persis apa yang saya cari. Terima kasih banyak.
sova
3
@JB King bahasa OOP biasanya bersifat prosedural, setidaknya dalam badan metode. Juga, itu adalah kesalahpahaman umum bahwa OOP berarti "objek". Banyak bahasa memiliki tipe dan objek data. Ada banyak perdebatan tentang apa definisi yang tepat dari OOP, tetapi biasanya termasuk warisan dan / atau enkapsulasi (negara pribadi) sebagai tema utama. Bahasa tanpa salah satu dari beberapa bentuk akan sulit untuk diklasifikasikan sebagai bahasa OOP.
CodexArcanum
2
@sova Saya hanya bisa memikirkan dua bahasa yang berfungsi seperti itu. Erlang sangat bergantung pada pemrosesan paralel, tetapi jika Anda ingin lebih tepatnya apa yang saya bicarakan, Anda harus melihat ke dalam Polyphonic C #. Ini adalah bahasa penelitian (sekarang dilipat menjadi C-omega) berdasarkan Pi-Calculus (seperti bagaimana FP didasarkan pada lambda calc) Pi-calc didasarkan pada unit proses, dan Anda mendeklarasikan proses dan kombinasi sinkron dan asik memanggil mereka. Lihat juga Arrows di FP, terutama Haskell. Panah sangat mirip itu.
CodexArcanum
12
  • Majelis
  • Prosedural
    • Dasar
    • C
  • Berorientasi pada objek
    • C #
    • Jawa
  • Deklaratif
    • Prolog
    • SQL
  • Fungsional
    • Pelat
    • Haskell

Ini adalah yang utama, tetapi ada banyak paradigma lain di luar sana, dan ada banyak tumpang tindih di antara mereka.


sumber
Bagaimana dengan deklaratif (mis. Prolog, SQL)?
Bruce Alderman
@ Bruce, dapatkan mereka sekarang.
Ya ini adalah ide umum yang saya pelajari di suatu tempat di sepanjang jalan.
sevenseacat
6
Bukankah seharusnya majelis dianggap prosedural?
MattDavey
2
Bagaimana dengan bahasa pemrograman concatenative (berbasis stack), seperti Forth dan Factor? Anda dapat menganggapnya sebagai jenis pemrograman Fungsional, tetapi mungkin cukup berbeda sehingga layak disebut. en.wikipedia.org/wiki/Concatenative_programming_language
KChaloux
11

Untuk jenis bahasa pemrograman (Paradigma), lihat di sini:
http://en.wikipedia.org/wiki/Programming_paradigm

Untuk karakteristik lain dari bahasa pemrograman (misalnya Type Systems), lihat di sini: http://en.wikipedia.org/wiki/Programming_language

Robert Harvey
sumber
ah! "paradigma" kata yang bagus! terima kasih
sova
@sova Saya akan menerima ini sebagai jawaban terbaik, karena ada terlalu banyak paradigma untuk dimasukkan dalam jawaban P.SE, apalagi untuk menggambarkan nuansa masing-masing.
Rei Miyasaka
9

Klik gambar untuk melihat PDF. Pemrograman paradigma poster

Anda harus melihat pada Pemrograman Paradigma untuk Dummies: Apa yang Harus Diketahui Setiap Pemrogram oleh Peter Van Roy. Ini akan memberi Anda gambaran tentang bagaimana hal itu terjadi di luar.

Jika Anda ingin melangkah lebih jauh, Anda dapat membaca Konsep, Teknik, dan Model Pemrograman Komputer . Anda tidak akan belajar banyak bahasa dengan cara ini, tetapi Anda akan belajar paradigma yang ada di balik berbagai jenis bahasa. Jadi, belajar bahasa baru akan lebih mudah bagi Anda.

mmdemirbas
sumber
6
  • Prosedural: Majelis, Java, C #, F #, Lisp, Fortran.

  • Diatur berdasarkan: SQL.

  • Berbasis pola: Perl, Regex, Snobol.

  • Berbasis pohon: XSLT.

  • Berbasis array: APL.

Tangurena
sumber
2
+1 untuk menggunakan jenis klasifikasi yang berbeda, dan juga untuk mengakui bahwa 'prosedural' sebenarnya mengandung sebagian besar klasifikasi orang lain. (tentu saja itu hanya berarti bahwa kata tersebut memiliki arti yang sangat sedikit, dan daging ada di subdivisi seperti itu)
Javier
4

Ada berbagai cara untuk menjawab ini, tetapi dalam hal mereka dapat dikategorikan sebagai:

Bahasa mesin: Bahasa mesin adalah bahasa pemrograman tingkat rendah. Ini mudah dipahami oleh komputer tetapi sulit dibaca oleh orang-orang. Inilah sebabnya mengapa orang menggunakan bahasa pemrograman tingkat yang lebih tinggi. Program yang ditulis dalam bahasa tingkat tinggi juga dikompilasi dan / atau diinterpretasikan ke dalam bahasa mesin sehingga komputer dapat menjalankannya.

Bahasa assembly: Bahasa assembly adalah representasi dari bahasa mesin. Dengan kata lain, setiap instruksi bahasa rakitan diterjemahkan menjadi instruksi bahasa mesin. Meskipun pernyataan bahasa assembly dapat dibaca, pernyataan tersebut masih tingkat rendah. Kelemahan dari bahasa assembly adalah bahwa itu tidak portabel, karena setiap platform dilengkapi dengan Bahasa Assembly tertentu.

Bahasa tingkat tinggi : Bahasa tingkat tinggi adalah apa yang kebanyakan programmer gunakan saat ini. Bahasa seperti C, C ++ dan Java adalah bahasa tingkat tinggi. Keuntungan dari bahasa tingkat tinggi adalah bahwa mereka sangat mudah dibaca dan portabel. Kerugian dari bahasa tingkat tinggi adalah bahwa mereka kurang kuat daripada Bahasa Majelis. Karena satu pernyataan dalam bahasa tingkat tinggi diterjemahkan ke dalam banyak pernyataan bahasa mesin.

Bahasa tingkat tinggi selanjutnya dapat diklasifikasikan sebagai:

  1. Bahasa fungsional: Dalam bahasa fungsional, sebuah program dibagi menjadi beberapa definisi fungsi. Bahasa fungsional adalah sejenis bahasa deklaratif. Mereka sebagian besar didasarkan pada lambda-calculus yang diketik dengan konstanta. Beberapa bahasa Fungsi yang terkenal adalah Scala, F #, Clojure dan Lisp.

  2. Bahasa prosedural: Dalam Bahasa Prosedural, sebuah program ditulis dalam urutan langkah-langkah yang harus diikuti untuk menghasilkan hasil. COBOL, FORTRAN, dan C adalah beberapa bahasa prosedural.

  3. Bahasa Pemrograman Berorientasi Objek: Dalam bahasa OOP, suatu program dibagi menjadi Objek yang berisi data serta metode yang beroperasi pada data. Java, C # dan C ++ adalah bahasa OOP.

  4. Bahasa Pemrograman Logika: Bahasa Logika digunakan untuk membuat program yang memungkinkan komputer untuk berpikir secara logis. mis: Bahasa logika

Untuk studi mendalam, periksa:

Badar
sumber
3

Saya cenderung berpikir dalam hal fitur:

Sintaksis:

Berbasis C atau apa pun yang Anda miliki. Java memiliki sintaks berbasis C. Saya sangat merekomendasikan mencoba sesuatu seperti Python atau Ruby untuk mengeluarkan Anda dari sintaks dan berpikir lebih dalam hal dasar-dasar tentang cara kerja bahasa yang diberikan. Saya berpendapat bahwa tidak ada sintaks yang perlu lebih besar daripada berbasis C dan tidak memiliki masalah blok bangunan di sekitar white-space.

Dikompilasi vs diinterpretasikan w. Build-Process vs. Interpreted / Console:

Saya memiliki sedikit keakraban dengan waktu kompilasi vs masalah run-time lingkungan tetapi saya mendapatkan bahwa ada banyak masalah di sana yang jarang saya pikirkan.

Demikian juga ada banyak bahasa yang ditafsirkan yang masih memiliki sesuatu dari proses kompilasi-ish untuk berjalan di dalam mesin virtual seperti Java. Anda masih harus membangun kembali untuk melihat perubahan pada beberapa hal.

Dan kemudian ada JavaScript dan Python yang dapat Anda jalankan dengan cepat, perintah demi perintah di konsol di lingkungan langsung. Ketiganya dapat mengarah pada cara penulisan kode yang sangat berbeda.

Pengetikan dinamis vs. Ketat:

Saya cenderung melihat keduanya sebagai tradeoffs desain. Saat Anda berada di level yang jauh lebih rendah dan kinerjanya sangat kritis, pengetikan statis sangat masuk akal. Saya tidak pernah mengerti gagasan tentang seseorang yang "lebih aman" daripada yang lain, tetapi saya muncul dalam bahasa yang sangat plastis / dinamis di mana Anda baru saja mempelajari cara kerja sistem pengetikan dan apa yang diharapkan, pada dasarnya. Ketik shenanigans jarang menjadi perhatian saya di JS. Dalam beberapa hal, fleksibilitas dapat membuat segalanya lebih kuat, meskipun diakui sentuhan yang lebih misterius untuk pengembang level Jr. lebih jika Anda tidak tahu tentang beberapa lubang pot dalam bahasa.

Lingkup Tingkat Blok vs. Lingkup Fungsi vs.?:

Block-Level adalah yang paling umum (apa pun di antara {} di sebagian besar bahasa sintaksis berbasis-c). Ruang lingkup JavaScript dibangun di sekitar fungsi (yang juga digunakan untuk membangun objek sehingga objek juga efektif). Ada juga banyak variasi dalam jenis akses apa yang Anda miliki dari lingkup dalam ke luar-lingkup. Saya tidak terbiasa dengan skema pelingkupan lain tapi saya yakin mereka ada.

OOP Klasik vs. Prototypal OOP vs Almost-OOP (struct in C?) Vs Non-OOP:

Bahkan dalam OOP berbasis kelas ada banyak ruang untuk variasi. Apakah Anda dapat melakukan banyak pewarisan (ew, terlalu banyak, ew), mendefinisikan antarmuka, dll ...

Dalam JavaScript kami memiliki semacam OOP prototipe hibrida terhambat di mana objek jauh lebih sederhana, sangat bisa berubah, tetapi kami masih memiliki kemampuan untuk memisahkan antarmuka dari masalah internal, yang IMO, adalah aspek penting dari enkapsulasi.

Hal tentang OOP adalah benar-benar ada banyak hal yang dapat Anda lakukan yang pada dasarnya berorientasi pada OOP tanpa secara teknis menjadi OOP. Ada puritan tentu saja tetapi pada akhirnya, Pola Desain adalah tentang mencapai abstraksi tertentu yang bekerja dengan baik dalam situasi tertentu. Jangan terlalu cepat untuk menganggap ide-ide dari bahasa berbasis OOP tidak digunakan dalam sesuatu yang lebih berorientasi pada prosedur. Dan saya tidak berbicara tentang JavaScript. Sama sekali tidak dibatasi oleh versi konyol dari paradigma OOP berbasis prototipe.

Fungsi Kelas Satu:

Tidak memiliki ini dalam bahasa adalah hal yang sulit bagi saya untuk menyerah. Anda dapat melewati fungsi sekitar seperti data untuk digunakan dalam konteks lain. Hal ini membuat skema penanganan acara sangat mudah diimplementasikan tetapi juga membuatnya sangat mudah untuk mengadaptasi bahasa untuk bekerja seperti yang Anda inginkan. Ini, lebih dari apa pun yang saya duga, hal yang telah menjadikan JavaScript sukses yang akhirnya telah dirancang meskipun dalam dua minggu dan membuat sintaksis perkiraan Java ditampar sebagai skema pemasaran.

Penutupan:

Saya tidak yakin di mana perdebatannya untuk Java, tapi saya tahu banyak devs Jawa berteriak-teriak untuk fitur ini satu atau dua tahun yang lalu. Dalam bahasa non-penutupan, ketika suatu fungsi ditutup, apa pun yang entah bagaimana bisa merujuk hal-hal dari dalam fungsi itu tidak akan dapat mengaksesnya karena itu adalah sampah yang dikumpulkan. Dalam penutupan, konteks eksekusi terikat sedemikian rupa sehingga jika Anda dapat mereferensikan hal-hal di dalam fungsi yang ditutup itu dari lingkup lain seperti pada objek atau fungsi yang dikembalikan, Anda pada dasarnya mendapatkan vars tersebut seperti ketika fungsi tersebut ditutup. Ini seperti macet kaki Anda di pintu pengumpulan sampah, meskipun saya menduga itu diterapkan lebih seperti salinan vars yang dibuat menjadi vars lokal dari entitas yang merujuk.

Kaku / Ketat / Aman vs. Memberi Anda Semua Tali yang Anda Inginkan:

JS devs dan Java devs cenderung tidak saling memahami sama sekali dan saya pikir ini ada hubungannya dengan dua bahasa yang berada di sisi yang berseberangan dengan spektrum desain khusus ini. Saya tidak ingin Anda melindungi saya dari diri saya sendiri atau dari para devs lain di tim saya. Saya ingin melakukan lebih banyak dalam kode yang lebih sedikit dan melakukan semuanya dengan cara yang sangat berbeda (tetapi konsisten untuk domain tertentu) tergantung pada situasinya. Ada pengorbanan mutlak untuk keduanya dan banyak bahasa cenderung lebih banyak jatuh di tengah.

Erik Reppen
sumber
Terimakasih banyak. Sangat menyenangkan melakukan upaya pemungutan suara tanpa penjelasan.
Erik Reppen
2

Saya pikir jalan pintas untuk semua ini adalah belajar cukup Lisp untuk melakukan beberapa hal yang berguna. Sebagian besar paradigma ini dimulai sebagai cara menggunakan Lisp, jadi ini adalah cara sederhana untuk mencoba berbagai hal.

Ada sejumlah "jenis" bahasa di sekitar, tetapi yang baru selalu dapat muncul. Pada dasarnya, tujuan bahasa adalah untuk memungkinkan penyandian ide, konsep, atau persyaratan, secara langsung. Untuk itu, mungkin ada situasi di mana paradigma yang ada inginkan, dan yang baru mungkin diperlukan.

Salah satu cara untuk melihatnya adalah dalam hal struktur permukaan. Seberapa langsung memungkinkan Anda untuk menyandikan ide secara ringkas, sehingga jika Anda berubah pikiran tentang apa yang Anda inginkan, perubahan yang sesuai dengan kode juga mudah, dengan sedikit peluang untuk memperkenalkan bug.

Cara lain untuk melihatnya adalah dalam hal struktur kontrol. Ketika bahasa dieksekusi (jika itu) apa urutan di mana sesuatu terjadi, untuk mencapai apa yang Anda inginkan? Contohnya adalah: eksekusi langsung, rekursi, backtrack, paralelisme sederhana. Satu I (batuk sederhana) ditemukan adalah eksekusi diferensial .

Sudut pandang lain yang bermanfaat adalah bahwa setiap kali struktur data dirancang, bahasa lahir. Data "dieksekusi" oleh program aplikasi yang menyisirnya dan melakukan hal-hal, sama seperti sebuah program hanya sekelompok data (seperti kode byte) yang digunakan oleh juru bahasa untuk melakukan sesuatu.

Mike Dunlavey
sumber
Keren. Saya akan belajar LISP dan menjadi tercerahkan. Menyenangkan: D
sova
Namun, jika Anda mengatakan bahwa tindakan menggunakan struktur data menciptakan bahasa perantara baru maka Anda juga bisa berpendapat bahwa bahasa baru lahir di setiap algoritma (semua operasi harus dilakukan pada struktur data), dan dengan pengurangan, bahasa baru dilahirkan di setiap baris kode. Saya pikir Anda memaksudkan hal lain, tetapi saya belum yakin saya mengerti?
sova
@sova: Bagi saya, teori informasi adalah wahyu yang luar biasa (baik Shannon maupun Kolmogorov). Ini tentang bagaimana makna disandikan dan melewati saluran, dengan konsep bandwidth, deteksi kesalahan, pengkodean minimal, keacakan, dll. Jadi, data mengkodekan informasi, dan algoritma adalah saluran. Program menyandikan informasi, dan pemrograman adalah saluran. Jadi, informasi apa yang dikodekan? dari mana datangnya dan kapan? kemana akan pergi apa sumber kesalahan (noise)? bagaimana mereka dikoreksi? Saya menemukan perspektif yang bermanfaat.
Mike Dunlavey
@sova: (lanjutan) Anda tidak harus menguasai semua matematika yang mematikan. Bagi saya, yang penting adalah kerangka yang diberikannya untuk memikirkan hal-hal.
Mike Dunlavey
1

Saya harus menambahkan bahwa ada bahasa pemrograman untuk aplikasi tertentu. Salah satu yang terlintas dalam pikiran adalah APT (Automatic Programmed Tool) bahasa yang digunakan dalam pembuatan untuk peralatan mesin.

Dave
sumber
Saya ingat itu. Saya bahkan mungkin menggunakannya. Wah, itu canggih. Anda tidak harus memandu mesin penggilingan secara manual, cukup tekan tombol mulai. Dan jika ada bug, neraka akan lepas.
Mike Dunlavey
Saya telah bekerja pada program yang menghasilkan gcode untuk mesin giling. Saya benar-benar memegang dan melihat hasil dari bug pemrograman, sering kali milik saya.
David Thornley
Saya menghabiskan 20 tahun menginstal postprocessors pada sekumpulan sistem.
Dave