Mengapa beberapa programmer mengategorikan C, Python, C ++ secara berbeda? - tentang level

16

Saya mengambil kursus pengantar tentang python dan instruktur mengatakan bahwa python adalah bahasa tingkat tinggi dan C dan C ++ adalah bahasa tingkat rendah. Itu hanya membingungkan. Saya pikir C, C ++, Python, Java, dll semua bahasa tingkat tinggi.

Saya sedang membaca pertanyaan di stackoverflow pada C, C ++, dll dan semuanya sepertinya merujuk ke bahasa-bahasa tersebut sebagai level tinggi. Menurut saya beberapa programmer menggunakan istilah-istilah itu secara bergantian.

atheistlearner
sumber
1
Seperti banyak hal, level tinggi vs rendah adalah penyederhanaan - berguna untuk pemahaman, tetapi berpotensi menyesatkan jika Anda lupa bahwa itu penyederhanaan. Tingkat apa yang pasti relatif, seperti yang dikatakan orang lain. Tapi itu tidak harus berupa garis - ada arah yang berbeda yang dapat Anda abstraksi (misalnya paradigma yang berbeda). Hanya karena Anda bergerak lebih jauh dari abstraksi mesin tidak berarti Anda bergerak menuju abstraksi yang sesuai untuk aplikasi Anda.
Steve314
Bahkan titik awalnya dapat bervariasi. Sebagai contoh, IMO kalkulus lambda adalah tingkat abstraksi yang sangat rendah - banyak abstrak dalam mesin, tetapi abstraksi yang sangat sederhana yang berfungsi sebagai titik awal untuk bahasa fungsional untuk mulai membangun abstraksi di atas. Bagaimanapun, kalkulus lambda kemungkinan tidak lebih dekat dengan abstraksi ideal untuk aplikasi tertentu selain kode mesin.
Steve314

Jawaban:

31

Level tinggi dan level rendah adalah istilah yang relatif sehingga penggunaannya telah berubah seiring waktu. Pada 70-an UNIX membuat gelombang karena menunjukkan bahwa sistem operasi dapat ditulis terutama dalam bahasa tingkat tinggi: C. Pada saat itu C dianggap tingkat tinggi sebagai kontras dengan assembler.

Saat ini C dianggap sebagai bahasa tingkat rendah karena baik bahasa maupun perpustakaan standar tidak menyediakan struktur data roti dan mentega seperti vektor, kamus, iterator, dan sebagainya. Anda dapat memiliki semua struktur itu dalam program C, tetapi pada akhirnya Anda akan menuliskannya sendiri. Python, Java, dll. Adalah tingkat tinggi relatif terhadap C karena banyak dari struktur data standar dibangun ke bahasa atau merupakan bagian dari perpustakaan standar. Memiliki yang langsung keluar dari kotak membuatnya lebih mudah untuk diprogram pada tingkat yang lebih abstrak.

C adalah level rendah dalam arti kedua: memungkinkan manipulasi langsung perangkat keras komputer (setidaknya langsung seperti yang dimungkinkan oleh OS). Implementasi paling umum dari Python, Java, dll. Setidaknya satu langkah lebih jauh dihapus dari perangkat keras karena mereka berjalan di VM. Jika Anda ingin memanipulasi perangkat keras dari Python, Anda harus menulis ekstensi ke Python VM, biasanya dalam C atau C ++.

C ++ adalah kasus aneh. Ini memberikan banyak struktur data yang bagus sebagai bagian dari pustaka standar, tetapi juga memungkinkan manipulasi perangkat keras tingkat rendah.

Charles E. Grant
sumber
3
C ++ bukan kasus yang aneh, IMO - ini hanya bahasa tingkat campuran. Tingkat abstraksi yang Anda dapatkan tergantung pada fitur yang Anda gunakan.
Steve314
1
@ Steve314: Ya dan tidak: abstraksi biasanya disertai dengan penyembunyian informasi, yaitu bahasa atau perpustakaan seperti kotak hitam yang menyediakan antarmuka, dan tidak ada yang ingin tahu apa yang ada di dalam kotak hitam. C ++ agak aneh dalam hal ini karena ia menawarkan konstruksi tingkat yang lebih tinggi tetapi tidak mencegah programmer mengakses perwakilan mereka dan merusaknya. C ++ adalah satu-satunya bahasa yang saya tahu yang tidak mengisolasi lapisan abstraksi yang berbeda (tapi mungkin ada bahasa lain yang saya tidak tahu).
Giorgio
1
@Giorgio - C ++ memungkinkan Anda untuk menyembunyikan detail implementasi apa pun - misalnya menjadikannya bagian dari internal privat sebuah kelas sehingga satu-satunya cara resmi untuk menggunakannya adalah melalui antarmuka publik dari kelas itu. Tentu saja Anda dapat melanggar aturan dan mengacak memori Anda semua yang Anda inginkan - tetapi dalam praktiknya Anda dapat melakukannya dalam bahasa apa pun yang mendukung pengembangan aplikasi dunia nyata.
Steve314
@Iorgio - Ambil contoh Haskell. "Tidak aman" dalam hal ini cenderung berarti tidak-referensi-transparan (seperti dalam unsafePerformIO). Ada beberapa IOReftipe, tetapi tidak ada yang setara dengan yang reinterpret_castsaya ketahui, dan tidak ada yang setara dengan aritmatika pointer. Tapi itu tidak berarti aman dari orang-orang yang berkeliaran dengan memori. Untuk menjadi bahasa yang praktis, Haskell harus berinteraksi dengan sistem operasi dan perpustakaan di dunia nyata. Ini memiliki "antarmuka fungsi asing". Jika saya benar-benar ingin menumbangkannya, yang perlu saya lakukan adalah menggunakan FFI untuk menulis fungsi subversi primitif.
Steve314
@ Giorgio - Tentu saja saya mungkin kesulitan menemukan nilai yang ingin saya korup dalam memori, tetapi hal yang sama dapat diterapkan di C ++, tergantung pada seberapa baik saya menyembunyikannya. Misalnya, saya mungkin menggunakan PIMPL . Jika saya kemudian hanya memberikan kode objek dan header untuk pustaka yang mengerti apa yang menunjuk ke, calon subversif harus merekayasa balik kode objek untuk mencari tahu apa yang harus ditumbangkan dan bagaimana.
Steve314
8

Pikirkan ini dalam hal skala geser, dari bahasa tingkat RENDAH sampai ke tingkat bahasa TINGGI. Saat suatu bahasa naik skala, dari RENDAH ke TINGGI, bahasa tersebut semakin banyak memberikan abstraksi dari antarmuka spesifik dengan komputer.

Bahasa tingkat RENDAH ditulis untuk mengarahkan komputer secara eksplisit - pikirkan kode mesin dan kode rakitan.

Bahasa tingkat-tinggi mencoba untuk mengabstraksi rincian seluk beluk (terutama alokasi memori dan pelepasan memori). Idenya adalah untuk menyediakan antarmuka yang lebih "alami" untuk pemrograman dan semoga memungkinkan programmer untuk fokus pada desain dan produksi.

Saat ini, C dianggap sebagai bahasa tingkat RENDAH. Itu masih memiliki beberapa abstraksi yang signifikan dari kode mesin dan kode rakitan, jadi secara teknis 'lebih tinggi' dari ini. Namun, itu masih memberikan pengalamatan memori langsung dan tidak menyediakan pengumpulan sampah. Jadi ini adalah detail yang harus dirancang oleh seorang programmer.

Bandingkan ini dengan bahasa lain seperti Python, Ruby atau Haskell dan Anda memiliki antarmuka yang jauh lebih tidak jelas. Bahasa-bahasa ini memiliki pustaka kode besar yang memisahkan sebagian besar perintah komputer. Pernah bertanya-tanya apa yang terjadi pada variabel dalam Python ketika Anda meninggalkan lingkup fungsi lokal, atau menghapusnya? Mungkin tidak benar? Dan itu karena dalam bahasa tingkat TINGGI Anda tidak harus! Mereka menjaga alokasi / rilis memori untuk Anda.

Bahasa tingkat tinggi memiliki keunggulan fungsi. Mereka memungkinkan kita untuk merancang dan mengembangkan secara bebas (dan aman!).

Bahasa tingkat RENDAH memiliki keunggulan kecepatan dalam banyak kasus. Ada biaya untuk menafsirkan kode tingkat TINGGI. Plus, itu agak keren untuk menulis sesuatu di 'komputer speek'.

Semoga ini membantu

Nick Burns
sumber
5

Level tinggi vs level rendah bukanlah hal hitam-putih, tetapi skala berkelanjutan. Istilah ini digunakan untuk menggambarkan seberapa dekat bahasa pemrograman dengan perangkat keras; semakin tinggi levelnya, semakin abstrak perangkat kerasnya.

Level terendah, jelasnya, adalah kode mesin biner - ini adalah representasi yang tepat dari beban OS dan feed ke CPU. Majelis adalah tingkat pertama dari abstraksi yang dibangun di atasnya: alih-alih kode biner, seseorang menulis mnemoik, kode simbolik yang dapat dibaca manusia yang mewakili instruksi mesin biner. Inilah yang digunakan orang untuk pemrograman sistem sebelum UNIX.

C adalah langkah selanjutnya dalam rantai abstraksi, menggabungkan pola-pola umum ke dalam konstruksi kontrol aliran dan mengabstraksi instruksi spesifik-mesin ke dalam sintaksis platform-agnostik, dan abstraksi terakhir ini adalah salah satu faktor utama yang membuat UNIX revolusioner dan sangat sukses, karena itu berarti kode yang sama dapat dikompilasi untuk platform apa pun tanpa perubahan besar.

C ++ menambahkan lapisan abstraksi lain: ia menambahkan kelas (mengabstraksi vtable dan konteks lewat ke sintaks OOP), newdandelete (menggabungkan alokasi memori dan inisialisasi variabel ke dalam satu konstruksi tunggal), memeriksa tipe waktu kompilasi, templat (tipe kompilasi-waktu aman metaprogramming), dan sekumpulan kenyamanan sintaksis waktu kompilasi seperti ruang nama, fungsi dan kelebihan operator, dll.

Python mengambil langkah besar lagi dari perangkat keras. C ++ masih memberi programmer kontrol penuh atas alokasi memori, dan memungkinkan untuk manipulasi RAM secara langsung; Python menangani manajemen memori untuk Anda. Selain itu, alih-alih mengkompilasi kode Anda ke semua instruksi mesin asli, ia menjalankannya melawan mesin virtual; ini membawa penalti kinerja (yang kadang-kadang bisa lumayan, tapi biasanya bukan sesuatu yang perlu dikhawatirkan), tetapi juga memungkinkan untuk hal-hal rapi yang rumit di C ++ dan sangat sulit di C, seperti memanipulasi fungsi dan kelas saat dijalankan waktu, mendapatkan nama objek sewenang-wenang pada waktu berjalan, membuat instance kelas dengan nama pada waktu berjalan, menambal monyet, dll. dll

Jadi ketika orang membagi bahasa menjadi bahasa "tingkat tinggi" dan "tingkat rendah", mereka menggambar garis arbitrer di suatu tempat, dan kalimat itu tidak selalu sama. Pada tahun 1970, garis adalah antara perakitan dan C (mengabstraksi instruksi mesin khusus platform menjadi faktor penentu); pada tahun 1987, mungkin ada di suatu tempat antara C dan C ++; hari ini, mungkin antara C ++ dan Java (dengan manajemen memori otomatis sebagai faktor penentu).

Singkat cerita: tingkat tinggi adalah skala geser, dan untuk tiga bahasa yang Anda sebutkan itu C <C ++ <Python.

tammmer
sumber
Saya akan mengatakan level tinggi vs level rendah bukan satu skala, tetapi sebaliknya dua skala terpisah. Tingkat rendah berhubungan dengan seberapa baik suatu bahasa berhubungan dengan perilaku mesin, sedangkan tingkat tinggi berhubungan dengan kemampuannya untuk memberikan abstraksi. C # lebih dari bahasa tingkat tinggi dari C99, tetapi juga tingkat lebih rendah dari bahasa yang didefinisikan oleh Standar C, karena perilaku misalnya menggunakan pointer "int" untuk memproses nilai "pendek" dalam array dua pada waktu didefinisikan dalam C #, tetapi tidak dalam C99.
supercat
3

Garis antara bahasa "tingkat rendah" dan "tingkat tinggi" bergeser dari waktu ke waktu.
Sebagai contoh:
Kembali pada zaman UNIX, C adalah bahasa tingkat tinggi.
Saat ini C tidak memiliki struktur seperti jenis pemetaan (kamus), iterator, dll. Yang dimiliki oleh bahasa tingkat tinggi seperti Python. Jadi garis telah bergeser, dan C sekarang telah jatuh ke dalam kelompok tingkat rendah.

Bahasa Level Rendah: Bahasa
-bahasa ini "dekat" dengan apa yang dapat dieksekusi mesin (level terendah adalah: Kode Perakitan!)
Ketika bekerja dengan bahasa-bahasa ini, programmer harus memikirkan hal-hal tingkat terendah seperti manajemen memori .. Anda sangat dekat dengan perangkat keras, bahwa Anda harus langsung bekerja dengannya.

Bahasa Tingkat Tinggi: Bahasa
-bahasa ini membawa Anda menjauh dari perangkat keras, karena mereka mengelola hal-hal seperti memori itu sendiri. Ketika Anda bekerja dengan bahasa-bahasa ini, memori adalah faktor (jelas), tetapi Anda tidak bekerja dengan perangkat keras secara langsung. Alih-alih bahasa yang mengaturnya, menjauhkan Anda (mungkin lebih tinggi) dari antarmuka perangkat keras yang lebih rendah.

pradyunsg
sumber