Apa tingkat abstraksi selanjutnya? [Tutup]

15

Karena bahasa pemrograman pada awalnya hanya menggunakan baris-baris kode yang dieksekusi secara berurutan, dan ia berevolusi menjadi fungsi-fungsi yang merupakan salah satu level abstraksi pertama, dan kemudian kelas-kelas dan objek-objek diciptakan untuk abstrak lebih jauh; apa tingkat abstraksi selanjutnya?

Apa yang lebih abstrak dari kelas atau apakah masih ada?

Jordan Medlock
sumber
17
Anda tampaknya berpikir bahwa itu adalah perkembangan linier, dengan urutan ("X lebih abstrak daripada Y lebih abstrak dari Z"). Saya mohon untuk berbeda.
2
Akan menjadi ide yang bagus untuk mengatakan mengapa Anda memohon berbeda. ;) (baca: Saya tertarik!)
sergserg
3
Saya mengusulkan "abstraksi" pamungkas: Lakukan apa yang saya pikirkan, bukan apa yang saya ketik. ;)
Izkata
1
@Delnan: Abstraksi tidak memperkenalkan total order, tetapi dimungkinkan untuk mengatakan "lebih abstrak", "kurang abstrak". Sebagai contoh, implementasi generik dari jenis gabungan lebih abstrak daripada implementasi jenis gabungan yang hanya berfungsi untuk bilangan bulat.
Giorgio
2
Bros, pelajari beberapa teori kategori. Lalu kita bisa membahas apa arti sebenarnya dari abstraksi seperti pria beradab.
davidk01

Jawaban:

32

Saya pikir Anda memiliki beberapa kesalahpahaman tentang sejarah komputasi.

Abstraksi pertama (pada tahun 1936) adalah, pada kenyataannya, Kalkulus Lambda Gereja Alonzo, yang merupakan dasar untuk konsep fungsi tingkat tinggi dan semua bahasa fungsional yang diikuti. Itu secara langsung menginspirasi Lisp (bahasa pemrograman tingkat tinggi tertua kedua, dibuat pada tahun 1959), yang pada gilirannya menginspirasi segala sesuatu mulai dari ML hingga Haskell dan Clojure.

Abstraksi kedua adalah pemrograman prosedural. Itu keluar dari arsitektur komputer von Neumann di mana program berurutan ditulis, satu instruksi pada satu waktu. FORTRAN (bahasa pemrograman tingkat tinggi tertua, 1958) adalah bahasa tingkat tinggi pertama yang keluar dari paradigma prosedural.

Abstraksi ketiga mungkin sebenarnya pemrograman deklaratif, pertama dicontohkan oleh Absys (1967), dan kemudian Prolog (1972). Ini adalah dasar dari pemrograman logika, di mana ekspresi dievaluasi dengan mencocokkan serangkaian deklarasi atau aturan, daripada mengeksekusi serangkaian instruksi.

Abstraksi keempat kemudian adalah pemrograman berorientasi objek, yang membuat penampilan pertamanya dalam program Lisp di tahun 60-an, tetapi kemudian dicontohkan oleh Smalltalk pada tahun 1972. (Meskipun tampaknya ada beberapa perdebatan mengenai apakah gaya pesan-lewat Smalltalk adalah abstraksi berorientasi objek Sejati. Saya tidak akan menyentuh itu.)

Semua abstraksi lain, terutama pada arsitektur komputer von Neumann tradisional, adalah variasi dari keempat tema tersebut. Saya tidak yakin bahwa ada abstraksi lain di luar empat yang bukan hanya variasi atau kombinasi dari mereka.

Tetapi abstraksi pada dasarnya hanyalah cara untuk memodelkan dan menggambarkan suatu algoritma. Anda dapat mendeskripsikan algoritma sebagai serangkaian langkah-langkah terpisah, sebagai seperangkat aturan yang harus dipatuhi, sebagai serangkaian fungsi matematika, atau sebagai objek yang berinteraksi. Sangat sulit untuk membayangkan cara lain untuk menggambarkan atau memodelkan algoritma, dan bahkan jika ada, saya tidak yakin dengan utilitasnya.

Namun, ada model komputasi kuantum. Dalam komputasi kuantum, abstraksi baru diperlukan untuk memodelkan algoritma kuantum. Menjadi orang baru di bidang ini, saya tidak bisa mengomentarinya.

greyfade
sumber
4
Dapatkah Pemrograman Berorientasi Aspek dianggap sebagai bentuk lain dari abstraksi?
Shivan Dragon
Pemrograman berorientasi objek keluar dari Lisp di tahun 60an? [rujukan?], waktu yang tepat. Semua yang saya dengar mengatakan bahwa itu berasal dari Simula di tahun 60-an, yang merupakan keturunan langsung ALGOL, bahasa imperatif yang tidak ada hubungannya dengan Lisp. Smalltalk muncul dengan mengambil konsep yang diperkenalkan oleh Simula dan memutarnya untuk merasa lebih "lispy".
Mason Wheeler
3
@MasonWheeler: Ada dalam Lisp 1 dan 1.5 manual, dan itu biasa mendengar Lispers berbicara tentang melakukan program berorientasi objek, terutama orang-orang tua. Orang-orang AI besar dalam melakukan sistem objek di Lisp pada saat itu.
greyfade
2
@ ShivanDragon: Saya akan mengatakan tidak. Ini hanya cara menginstruksikan program yang sebaliknya prosedural dengan memanfaatkan tambahan. Itu tidak benar-benar memodelkan algoritma, juga tampaknya tidak mempengaruhi desain struktur data.
greyfade
4
Sebenarnya, kalkulus kombinator SKI mendahului kalkulus lambda dan Mesin Turing.
Jörg W Mittag
4

Bagi banyak orang, bentuk abstraksi kode paling murni di era pemrograman biner saat ini adalah "fungsi tingkat tinggi". Pada dasarnya, fungsi itu sendiri diperlakukan sebagai data, dan fungsi fungsi didefinisikan, seperti Anda akan melihatnya dalam persamaan matematika dengan operator mendefinisikan hasil operan mereka dan urutan operasi yang telah ditentukan mendefinisikan "bersarang" dari operasi ini. Matematika memiliki sangat sedikit "perintah perintah" dalam strukturnya; dua contoh yang dapat saya pikirkan adalah "biarkan x memiliki beberapa nilai atau nilai apa pun yang sesuai dengan beberapa batasan", dan "fungsi sambungan" di mana input menentukan ekspresi yang diperlukan untuk menghasilkan output. Konstruksi ini mudah direpresentasikan sebagai fungsinya sendiri; "function" x selalu menghasilkan 1, dan "overloads" fungsi didefinisikan dalam hal apa yang diteruskan kepada mereka (yang tidak seperti overload berorientasi objek dapat didefinisikan berdasarkan pada nilai input) yang memungkinkan evaluasi "sedikit demi sedikit" dari sekelompok fungsi bernama, bahkan dalam hal diri mereka sendiri. Dengan demikian, program ini menghilangkan anggapan imperatif pada level rendah, dan sebaliknya berfokus pada "mengevaluasi sendiri" data input yang diberikan.

Fungsi tingkat tinggi ini membentuk tulang punggung "bahasa fungsional"; apa yang dilakukan oleh sebuah program didefinisikan dalam istilah "fungsi murni" (satu input atau lebih, satu atau lebih output, tanpa efek samping atau "keadaan tersembunyi"), yang saling bersarang dan dievaluasi seperlunya. Dalam kasus seperti itu, sebagian besar "logika imperatif" diabstraksi; runtime menangani pemanggilan fungsi yang sebenarnya, dan kondisi apa pun di mana satu atau lebih fungsi lainnya mungkin perlu dipanggil. Dalam program seperti itu, kode tersebut tidak dianggap sebagai "melakukan" sesuatu, itu dianggap sebagai "menjadi" sesuatu, dan apa tepatnya ditentukan ketika program dijalankan memberikan input awal.

Fungsi tingkat tinggi sekarang menjadi pokok dari banyak bahasa imperatif juga; Pernyataan lambda. NET pada dasarnya memungkinkan input fungsional "anonim" ke dalam "fungsi" lain (diterapkan secara imperatif tetapi secara teoritis tidak harus demikian), sehingga memungkinkan "rangkaian" yang sangat dapat disesuaikan untuk "fungsi" yang sangat umum untuk mencapai hasil yang diinginkan.

Abstraksi lain yang biasa terlihat dalam putaran terakhir bahasa pemrograman adalah pengetikan variabel dinamis berdasarkan konsep "bebek-mengetik"; jika terlihat seperti bebek, berenang seperti bebek, terbang seperti bebek dan dukun seperti bebek, Anda dapat menyebutnya bebek. Tidak masalah apakah itu benar-benar mallard atau kanvasback. MUNGKIN penting jika itu sebenarnya angsa atau angsa, tetapi sekali lagi mungkin tidak masalah jika yang Anda pedulikan hanyalah berenang dan terbang, dan agak mirip bebek. Ini dianggap sebagai yang tertinggi dalam warisan objek; Anda tidak peduli apa yang , kecuali untuk memberikan nama; yang lebih penting adalah apa yang dilakukannya. Dalam bahasa seperti itu pada dasarnya hanya ada dua jenis; "atom", satu elemen informasi (satu "nilai"; angka, karakter, fungsi, apa pun), dan "tuple", terdiri dari atom dan "penunjuk" untuk semua hal lain dalam tupel. Bagaimana tepatnya tipe-tipe ini diimplementasikan dalam biner oleh runtime tidak relevan; menggunakan ini, Anda dapat mencapai fungsionalitas hampir setiap jenis yang dapat Anda pikirkan, dari tipe nilai sederhana hingga string ke koleksi (yang, karena nilai dapat berupa "tipe" yang berbeda, memungkinkan untuk "tipe kompleks" alias "objek").

KeithS
sumber
1
"Mengetik bebek" (setidaknya seperti yang Anda gambarkan) tidak benar-benar baru atau terbatas pada bahasa yang diketik secara dinamis; sudah ada sejak lama dalam bahasa yang diketik secara statis sebagai "struktural sub-mengetik", paling baik dilihat di OCaml.
Tikhon Jelvis
2

Orang dapat mempertimbangkan Bahasa Khusus Domain seperti SQL sebagai urutan abstraksi yang lebih tinggi. SQL adalah bahasa yang sangat bertarget yang mengabstraksi operasi seperti penyimpanan dan menyediakan fungsi level yang lebih tinggi berdasarkan teori yang ditetapkan. Juga pertimbangkan berapa banyak bahasa utama saat ini yang tidak menargetkan arsitektur tertentu melainkan Mesin Virtual (seperti JVM atau. NET CLR). Sebagai contoh C # dikompilasi ke IL yang ditafsirkan (atau lebih sering JIT'd --Just In Time Compiled-- ke implementasi asli) oleh mesin runtime asli.

Ada banyak keributan tentang konsep DSL yang digunakan untuk membuat bahasa tingkat sangat tinggi yang dapat digunakan tanpa banyak pengalaman teknis untuk membuat program kerja. Pikirkan jika seseorang mampu menggambarkan entitas dan interaksinya dalam bahasa Inggris yang sederhana dan lingkungan operasi menangani semuanya, mulai dari menyajikan UI yang sederhana, hingga menyimpan data dalam suatu jenis database. Setelah operasi-operasi itu diabstraksikan, Anda bisa membayangkan bagaimana pemrograman menjadi mudah.

Ada beberapa yang ada saat ini seperti JetBrains MPS (yang merupakan toolkit untuk menggambarkan DSL atau generator bahasa). Microsoft memiliki perampokan singkat (dan sangat menjanjikan saya dapat menambahkan) ke ruang ini dengan bahasa M itu (bahasa M begitu lengkap sehingga bahasa itu didefinisikan dalam M).

Kritik dari konsep titik untuk upaya gagal sebelumnya untuk menghapus programmer dari pekerjaan mengembangkan program, bedanya dengan workbench DSL (sebagaimana Fowler memanggil mereka) adalah bahwa, pengembang masih akan terlibat dalam pengkodean konsep yang Ahli Domain dapat gunakan untuk mengekspresikan kebutuhan domain mereka. Sama seperti vendor OS dan Bahasa membuat alat yang kami gunakan untuk pemrograman, kami akan menggunakan DSL untuk menyediakan alat untuk pengguna bisnis. Orang bisa membayangkan DSL yang menggambarkan data dan logika, sementara pengembang membuat penerjemah yang menyimpan dan mengambil data dan menerapkan logika yang dinyatakan dalam DSL.

Michael Brown
sumber
1

Saya berpendapat bahwa struktur meta, modul, kerangka kerja, platform, dan layanan semuanya adalah pengelompokan fitur tingkat lebih tinggi daripada kelas. Hirarki abstraksi sistem pemrograman saya:

  • jasa
  • platform, tumpukan solusi
  • kerangka kerja
  • modul, paket
  • struktur meta: metaclasses, fungsi tingkat tinggi, generik, templat, sifat, aspek, dekorator
  • objek, kelas, tipe data
  • fungsi, prosedur, subrutin
  • struktur kontrol
  • baris kode

Meta-structure seperti metaclasses , fungsi orde tinggi , dan generik jelas menambahkan abstraksi ke kelas dasar, fungsi, tipe data, dan instance data. Ciri, aspek, dan dekorator adalah mekanisme yang lebih baru untuk menggabungkan fitur kode, dan juga 'mempercepat' kelas dan fungsi lainnya.

Bahkan bahasa pra-objek memiliki modul dan paket, sehingga menempatkannya di atas kelas mungkin bisa diperdebatkan. Namun mereka berisi kelas-kelas dan struktur-meta, jadi saya peringkat mereka lebih tinggi.

Kerangka kerja adalah jawaban yang paling sederhana - mereka mengatur banyak kelas, meta-struktur, modul, fungsi, dan semacamnya untuk memberikan abstraksi tingkat tinggi yang canggih. Namun kerangka kerja masih beroperasi hampir seluruhnya di bidang pemrograman.

Tumpukan solusi atau platform umumnya menggabungkan banyak kerangka kerja, subsistem, atau komponen ke dalam lingkungan untuk menyelesaikan berbagai masalah.

Akhirnya, ada layanan - sering digunakan sebagai layanan Web atau jaringan. Ini adalah arsitektur, kerangka kerja, tumpukan solusi, atau kemampuan aplikasi yang dikirim sebagai bundel lengkap. Internal mereka seringkali buram, terutama mengekspos administrator, pemrograman, dan antarmuka pengguna. PaaS dan SaaS adalah contoh umum.

Sekarang, perkembangan ini mungkin tidak sepenuhnya memuaskan, karena beberapa alasan. Pertama, ia membuat perkembangan linear yang rapi atau hierarki hal-hal yang tidak linier sempurna atau hierarkis. Ini mencakup beberapa abstraksi seperti "tumpukan" dan layanan yang tidak sepenuhnya di bawah kendali pengembang. Dan itu tidak menempatkan debu peri sihir baru. (Spoiler: Tidak ada debu peri sihir. )

Saya pikir itu kesalahan untuk mencari level abstraksi baru . Semua yang saya sebutkan di atas telah ada selama bertahun - tahun , bahkan jika mereka belum pernah sama terkenal atau sepopuler sekarang. Dan selama bertahun-tahun itu, abstraksi yang mungkin terjadi pada setiap tingkat pengkodean telah meningkat. Kami sekarang memiliki koleksi umum dan umum, bukan hanya array. Kami mengulang koleksi, bukan hanya rentang indeks. Kami memiliki pemahaman daftar dan daftar filter dan operasi peta. Banyak fungsi bahasa dapat memiliki sejumlah argumen, dan / atau argumen default. Dan seterusnya. Kami meningkatkan abstraksi di setiap level, jadi menambahkan lebih banyak level bukanlah persyaratan untuk meningkatkan level abstraksi secara keseluruhan.

Jonathan Eunice
sumber
1

Abstraksi berikutnya setelah kelas adalah kelas meta . Sesederhana itu;)

kelas yang instansnya adalah kelas. Sama seperti kelas biasa mendefinisikan perilaku objek tertentu, metaclass mendefinisikan perilaku kelas tertentu dan instance mereka. Tidak semua bahasa pemrograman berorientasi objek mendukung metaclasses. Di antara mereka yang melakukannya, sejauh mana metaclasses dapat mengesampingkan aspek perilaku kelas yang diberikan bervariasi. Setiap bahasa memiliki protokol metaobject sendiri, seperangkat aturan yang mengatur bagaimana objek, kelas, dan metaclasses berinteraksi ...

Sebastian Bauer
sumber
1
Metaclasses adalah objek root dari hierarki pewarisan bahasa. .NET's adalah Object. Anda juga bisa menganggap antarmuka sebagai metaclasses; mereka mendefinisikan antarmuka pewaris mereka secara independen dari kelas "induk" aktual pewaris.
KeithS
1
@KeithS bukan itu arti kata itu dalam konteks apa pun yang pernah saya lihat - dari CLOS ke UML ke C #. Metaclass adalah kelas yang instansnya adalah kelas - implementasi yang lemah adalah C # Typeyang memberikan kemampuan reflektif tetapi bukan mutasi (Anda tidak dapat menambahkan metode baru MyTypedengan mengatakan typeof(MyType).Methods += new Method ( "Foo", (int x)=>x*x )seperti yang Anda bisa dalam CLOS)
Pete Kirkham
1

Saya terkejut tidak ada yang menyebutkan teori kategori.

Unit pemrograman yang paling mendasar adalah fungsi yang didasarkan pada tipe. Fungsi biasanya dilambangkan sebagai f: A -> B, di mana A dan B adalah tipe. Jika Anda meletakkan hal-hal ini, yang saya sebut tipe dan fungsi, bersama-sama dengan cara yang benar Anda mendapatkan sesuatu yang disebut kategori. Anda tidak harus berhenti pada titik ini.

Ambillah hal-hal ini, kategori-kategori, dan tanyakan pada diri Anda apa yang akan menjadi cara yang tepat untuk menghubungkan mereka satu sama lain. Jika Anda melakukannya dengan benar, Anda mendapatkan sesuatu yang disebut functor yang berada di antara dua kategori dan biasanya dilambangkan sebagai F: C -> B. Sekali lagi Anda tidak perlu berhenti.

Anda dapat mengambil semua fungsi dan menyatukannya dengan cara yang benar dan jika Anda melakukan sesuatu dengan benar, Anda mulai bertanya-tanya bagaimana menghubungkan dua fungsi dengan satu sama lain. Pada titik ini Anda mendapatkan sesuatu yang disebut transformasi alami, mu: F -> G, di mana F dan G adalah functors.

Pengetahuan saya pada saat ini menjadi kabur tetapi Anda dapat terus melakukan ini dan terus menaiki tangga abstraksi. Objek dan kelas bahkan tidak mendekati untuk menggambarkan seberapa tinggi Anda bisa naik tangga abstraksi. Ada banyak bahasa yang dapat mengekspresikan konsep-konsep di atas secara komputasi dan yang paling menonjol dari bahasa-bahasa tersebut adalah Haskell. Jadi jika Anda benar-benar ingin tahu apa sebenarnya abstraksi, maka pelajari beberapa Haskell atau Agda atau HOL atau ML.

davidk01
sumber
1

Saya pikir model aktor hilang dari daftar kandidat.

Inilah yang saya maksud dengan Aktor:

  • entitas independen
  • yang menerima pesan, dan saat menerima pesan, mungkin
  • buat aktor baru,
  • perbarui beberapa keadaan internal untuk pesan berikutnya,
  • dan mengirim pesan

Model ini adalah sesuatu di luar mesin Turing deterministik, dan sebenarnya lebih dekat dengan perangkat keras dunia nyata kita ketika melihat program bersamaan. Kecuali jika Anda menggunakan langkah-langkah sinkronisasi ekstra (mahal), hari ini, ketika kode Anda menerima data, nilai itu mungkin sudah berubah di sisi lain dari die yang sama, mungkin bahkan di dalam inti yang sama.

Diskusi / pengantar singkat: http://youtube.com/watch?v=7erJ1DV_Tlo

Christopher Creutzig
sumber
posting Anda agak sulit dibaca (dinding teks). Maukah Anda mengeditnya menjadi bentuk yang lebih baik?
nyamuk
0

Jika saya memahami Anda dengan benar, "abstraksi menanjak" Anda dapat dianggap sebagai enkapsulasi logika yang semakin besar, sebagian besar terkait dengan penggunaan kembali kode.

Dari instruksi spesifik yang dieksekusi satu demi satu, kami beralih ke fungsi / subrutin , yang merangkum, atau abstrak, pengelompokan instruksi yang logis ke dalam satu elemen. Kemudian kita memiliki objek , atau modul , yang merangkum subrutin yang berkaitan dengan entitas atau kategori logis tertentu, jadi saya dapat mengelompokkan semua operasi string di bawah Stringkelas, atau semua operasi matematika umum di bawahMath modul (atau kelas statis, dalam bahasa seperti C #) .

Jadi jika itu perkembangan kita, apa yang terjadi selanjutnya? Yah, saya tidak berpikir Anda memiliki langkah selanjutnya yang jelas. Seperti yang dijawab orang lain, progresi Anda hanya berlaku untuk gaya pemrograman imperatif / prosedural, dan paradigma lain tidak membagikan konsep abstraksi Anda. Tetapi jika saya ada sesuatu yang secara logis dapat memperluas metafora Anda, itu layanan .

Layanan mirip dengan kelas dalam arti bahwa itu adalah entitas yang mengekspos fungsionalitas, tetapi menyiratkan pemisahan masalah yang lebih ketat daripada bolak-balik dengan objek yang Anda instantiasi sendiri. Mereka mengekspos serangkaian operasi terbatas, menyembunyikan logika internal, dan bahkan tidak harus berjalan pada mesin yang sama.

Sekali lagi, ada perbedaan yang bagus. Dalam kebanyakan kasus, Anda akan menggunakan objek yang bertindak sebagai proksi ke layanan , dan keduanya akan sangat mirip, tetapi sebagai arsitektur, keduanya berbeda.

Avner Shahar-Kashtan
sumber
0

Bentuk-bentuk abstraksi baru menyembunyikan pekerjaan tingkat rendah dari Anda. Prosedur dan fungsi yang disebutkan menyembunyikan alamat program dari Anda. Objek menyembunyikan manajemen memori dinamis dan beberapa jenis "jika pernyataan" tergantung.

Saya menyarankan bahwa level berikutnya dari abstraksi praktis yang akan menyembunyikan pekerjaan tingkat rendah dari Anda adalah pemrograman fungsional reaktif . Lihatlah "sinyal" dalam sesuatu seperti http://elm-lang.org/ yang menyembunyikan panggilan balik dan memperbarui dependensi yang harus Anda kelola secara eksplisit dalam javascript. FRP dapat menyembunyikan banyak kompleksitas antar-proses, dan komunikasi antar-mesin yang diperlukan dalam aplikasi internet skala besar dan paralelisme kinerja tinggi juga.

Saya cukup yakin bahwa inilah yang akan membuat kita semua bersemangat dalam 5 tahun ke depan.

interstar
sumber
1
FRP memang hebat, tetapi berurusan dengan jenis pemrograman yang cukup spesifik (yaitu pemrograman reaktif ). Ini tidak terlalu bagus untuk memodelkan jenis program lain. Namun, jenis pemrograman yang lebih umum yang diwakilinya - menulis kode Anda dalam aljabar - adalah kandidat yang baik untuk tingkat abstraksi baru.
Tikhon Jelvis
0

Set theory - yang sebagian diimplementasikan dalam basis data relasional, tetapi juga dalam bahasa statistik seperti SAS dan R, memberikan tingkat abstraksi yang berbeda tetapi bisa dibilang lebih tinggi daripada OO.

James Anderson
sumber