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.
Jawaban:
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.
sumber
Ini adalah yang utama, tetapi ada banyak paradigma lain di luar sana, dan ada banyak tumpang tindih di antara mereka.
sumber
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
sumber
Klik gambar untuk melihat PDF.
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.
sumber
Prosedural: Majelis, Java, C #, F #, Lisp, Fortran.
Diatur berdasarkan: SQL.
Berbasis pola: Perl, Regex, Snobol.
Berbasis pohon: XSLT.
Berbasis array: APL.
sumber
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:
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.
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.
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.
Bahasa Pemrograman Logika: Bahasa Logika digunakan untuk membuat program yang memungkinkan komputer untuk berpikir secara logis. mis: Bahasa logika
Untuk studi mendalam, periksa:
sumber
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.
sumber
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.
sumber
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.
sumber