Apakah ada bahasa pemrograman berorientasi objek yang tidak berbasis kelas?

44

Apakah ada bahasa pemrograman berorientasi objek yang tidak didasarkan pada paradigma kelas?

kesalahan besar
sumber
1
Secara teknis, C. Meskipun berorientasi adalah peregangan dalam arti bahasa membuatnya mudah. Saya tahu itu bukan jenis jawaban yang Anda cari, tetapi jika Anda peduli untuk melihat bagaimana C dapat melakukannya, itu mungkin memberikan beberapa wawasan tentang apa yang sebenarnya dilakukan kelas dan bagaimana pendekatan alternatif dapat bekerja.
kylben
4
@kylben: "Berorientasi" adalah peregangan tanpa alasan. Anda dapat memukul C menjadi perilaku berorientasi objek. Anda tidak dapat memukulnya menjadi berorientasi seperti itu.
David Thornley

Jawaban:

74

Sejauh yang saya tahu, Self adalah bahasa asli yang menemukan paradigma "bebas kelas" berdasarkan prototipe . Ini sudah ada (dalam tahap eksperimental) pada 1980-an dan mendorong penggunaan pola prototipe Smalltalk yang anggun hingga ekstrem, sehingga kelas-kelas dihilangkan sama sekali.

Ini memengaruhi semua bahasa OO "bebas-kelas" lainnya yang saya tahu:

  • paling jelas Javascript,
  • bahasa pemrograman klasik dan lingkungan mencicit (yang dibangun di atas Smalltalk)
  • bahasa skrip multi-paradigma Lua .
DaveFar
sumber
2
@ Adam: tanpa mengetik statis, bukan SEMUA itu hanya gula sintaksis?
kevin cline
5
@DeadMG bahasa OO bukan yang memungkinkan Anda untuk mengimplementasikan ide-ide OO tetapi yang melakukannya untuk Anda :)
Piotr Dobrogost
4
Sebenarnya, baik Simula (1960) dan Smalltalk-71 (serta Smalltalk-72) juga tidak memiliki kelas, yang mendahului Self selama hampir tiga dekade. Kelas hanya ditambahkan dalam Simula-67 dan Smalltalk-74 (dan Alan Kay menganggap mereka sebuah kesalahan, atau lebih tepatnya kejahatan yang diperlukan).
Jörg W Mittag
2
@kevincline: Tidak yakin apa yang mendasari hal itu; Pengetikan OO dan statis sepenuhnya ortogonal.
Paul Biggar
2
Terlepas dari Simula (yang mengambil paradigma kelas) Flavours diperkenalkan di MIT pada tahun 1979, dan merupakan pendahulu dari CLOS, yang keduanya mendahului Self.
Matthew Flynn
32

Bahasa seperti JavaScript didasarkan pada prototipe , di mana perilaku digunakan kembali dengan mengkloning objek yang ada. Artikel Wikipedia yang saya tautkan menunjukkan bahwa Lua, ActionScript, dan sejumlah bahasa lain mengikuti paradigma ini.

Thomas Owens
sumber
2
Setiap varian ECMAScript menggunakan paradigma prototipe.
zzzzBov
Yah, hampir semua varian. ActionScript (bahasa Flash) menggunakan kelas, meskipun VM yang mendasarinya mungkin mengimplementasikannya dalam hal prototipe.
mjfgates
@ mjfgates, Actionscript 2 dulu berbasis ECMAScript dan sangat mirip Javascript. Actionscript 3 bergerak menjauh dari itu, tetapi masih memegang sifat dinamisnya. Anda dapat dengan kuat / lemah mengetikkan variabel apa pun karena pada dasarnya semuanya adalah Obyek.
J_A_X
13

Bahasa pemrograman berorientasi objek paling populer di dunia tidak memiliki kelas, itu disebut Javascript dan berbasis prototipe: http://en.wikipedia.org/wiki/Prototype-based_programming

bezko
sumber
11
"Bahasa pemrograman berorientasi objek paling populer di dunia"? Saya tidak yakin tentang klaim itu sama sekali.
Thomas Owens
8
@ThomasOwens, karena dimasukkan ke dalam web, Anda dapat dengan mudah mengatakan bahwa setiap platform modern yang mendukung web (termasuk perangkat seluler) memiliki penerjemah JavaScript. Itu kasus yang sangat kuat bahwa saat ini merupakan bahasa berbasis prototipe paling populer yang ada. (kecuali jika Anda berpikir Anda dapat membuat argumen serupa untuk "DIRI")
riwalk
1
Javascript tentu saja merupakan salah satu bahasa pemrograman yang paling banyak digunakan di dunia, tetapi saya berharap sebagian besar penggunaan menjadi imperatif atau prosedural lama, dengan mungkin sedikit pemrograman berorientasi aspek (callback? AJAX? Event handler?) Di sini dan di sana, jadi menyebut javascript 'bahasa OOP paling populer' tidak cukup dibenarkan.
tdammers
9
Saya juga akan mengatakan "di mana-mana" untuk menghindari diskusi tentang manfaat popularitasnya.
Anthony Pegram
3
@ Stargazer712: Saya tidak suka menjadi fanatik bahasa, tetapi ia mengklaim bahwa "bahasa pemrograman berorientasi objek paling populer di dunia [ed: Javascript] tidak memiliki kelas". Itu dapat didekomposisi dari dua klaim: "Javascript adalah bahasa pemrograman berorientasi objek yang paling populer" dan "Javascript tidak memiliki kelas"; keduanya, saya setuju dengan.
Lie Ryan
6

Orientasi objek adalah istilah umum untuk beberapa konsep penting yang hanya saling bergantung satu sama lain. Misalnya, pewarisan dapat dideklarasikan berdasarkan kasus per kasus antara instance daripada antar kelas, atau seluruh kelas dapat diwakili oleh prototypeobjek konkret , seperti yang ditulis Thomas. Lebih biasa memisahkan deskripsi struktur dari pembuatan instance. Demikian pula, keterlambatan mengikat berarti bahwa objek dengan metode yang sama secara nominal tidak harus melakukan hal yang sama ketika dipanggil, dan bahwa keputusan dibuat saat runtime. Itu juga mungkin dilakukan dengan pendekatan berbasis prototipe. Dan enkapsulasi pada dasarnya sepenuhnya independen dari apakah objek Anda adalah instance dari kelas yang dideklarasikan atau tidak.

Yang mengatakan, sebagian besar bahasa OO tegas di kamp berbasis kelas. Tetapi bahkan kemudian ada idiom yang mengaburkan garis: desain berbasis domain sering mengarah ke sistem di mana identitas objek tertentu jauh lebih penting daripada diagram kelas statis, dan dekorator memungkinkan objek dari kelas atau antarmuka yang sama untuk memiliki sangat perilaku yang berbeda.

Kilian Foth
sumber
6

Benteng adalah bahasa berorientasi objek yang didasarkan pada ciri-ciri alih-alih kelas. Perbedaannya terutama pada komposisi implementasi. Perilaku objek (definisi metode) masih ditentukan oleh deklarasi pada titik tertentu dalam teks program. Jadi dalam arti itu mirip dengan sistem berbasis kelas.

Ada objek batu (menurut Cardelli, saya pikir), yang murni berbasis objek. Setiap metode adalah anggota instan. Anda membentuk objek baru dengan mengambil konten objek yang ada dan menambahkan, menghapus, atau mengganti beberapa anggotanya. Ini sedikit berbeda dari prototipe, karena objek baru tidak memiliki tautan ke objek lama, hanya beberapa isinya.

IIRC, dimungkinkan untuk memprogram dengan cara yang sama menggunakan Python dan bahasa berorientasi hashtable lainnya: Anda dapat menambahkan fungsi sebagai anggota instance dan kemudian menyebutnya sebagai metode.

Ryan Culpepper
sumber
5

Ada, pada revisi 1995, Ada berorientasi objek, tetapi tidak seperti banyak bahasa OO lain, ia tidak menggabungkan jenis dan modul berorientasi objek ke dalam konstruksi tunggal yang disebut "kelas". Daripada mendeklarasikan tipe sebagai "class Foo", dan menempatkan semua deklarasi metode terkait di dalam deklarasi kelas, Anda mendeklarasikan sebuah paket dan mendeklarasikan tipe (sebagai a record) dan hal-hal lain di dalam paket. Ini bukan "bebas kelas" dalam cara beberapa bahasa yang disebutkan lainnya, itu hanya cara yang sedikit berbeda dalam mengatur berbagai hal.

Fitur berorientasi objek Ada 95 ditambahkan ke versi bahasa 1983 yang ada; itu memperpanjang catatan yang ada dan paket konstruksi untuk mendukung warisan et al.

Keith Thompson
sumber
itulah yang saya ingat, juga Anda harus meneruskan catatan Anda ke fungsi masing-masing anggota
Nikko
@Nikko: Itulah yang terjadi di balik layar dalam setiap bahasa berorientasi objek, dan cukup eksplisit dalam Python dan CLOS (common lisp).
Marcin
5

Io adalah bahasa berorientasi objek berbasis prototipe lain. Ini sebenarnya menarik inspirasi dari beberapa bahasa yang telah disebutkan dalam jawaban lain.

Io adalah bahasa pemrograman berbasis prototipe yang dinamis. Ide-ide dalam Io sebagian besar terinspirasi oleh Smalltalk (semua nilai adalah objek), Self (berbasis prototipe), NewtonScript (pewarisan diferensial), Act1 (aktor dan masa depan untuk konkurensi), Lisp (kode adalah pohon runtime yang dapat diperiksa / dimodifikasi pohon) dan Lua (kecil, dapat disematkan).

Zsolt Török
sumber
4

Erlang. Dan ya, Erlang adalah bahasa berorientasi objek, karena memenuhi ketiga poin definisi OO.

Jörg W Mittag
sumber