ภาษาการเขียนโปรแกรมเชิงวัตถุมีอยู่ที่ไม่ได้อิงกับคลาสหรือไม่?


44

มีภาษาการเขียนโปรแกรมเชิงวัตถุใด ๆที่ไม่ได้ขึ้นอยู่กับกระบวนทัศน์ของชั้นเรียนหรือไม่?


1
ในทางเทคนิคการพูด C. ถึงแม้ว่าเชิงจะค่อนข้างยืดในความรู้สึกของภาษาทำให้ง่าย ฉันรู้ว่านั่นไม่ใช่คำตอบที่คุณกำลังมองหา แต่ถ้าคุณสนใจที่จะดูว่า C สามารถทำมันได้อย่างไรมันอาจให้ข้อมูลเชิงลึกเกี่ยวกับสิ่งที่คลาสนั้นทำจริง ๆ
kylben

4
@ kylben: "Oriented" เป็นการยืดที่ไม่มีข้อ จำกัด คุณสามารถกระบอง C เป็นพฤติกรรมเชิงวัตถุ คุณไม่สามารถแยกแยะมันให้กลายเป็นแบบนั้นได้
David Thornley

คำตอบ:


74

เท่าที่ผมรู้ว่าตัวเองเป็นภาษาเดิมที่คิดค้น "ชั้นฟรี" กระบวนทัศน์บนพื้นฐานของต้นแบบ มันมีอยู่แล้ว (ในระยะทดลอง) ในช่วงทศวรรษ 1980 และผลักดันการใช้งานต้นแบบอันงดงามของSmalltalkไปสู่รูปแบบสุดขั้วซึ่งชั้นเรียนจะถูกกำจัดอย่างสมบูรณ์

มันมีอิทธิพลต่อภาษา OO "คลาสฟรี" อื่น ๆ ทั้งหมดที่ฉันรู้:

  • จาวาสคริปต์ที่เด่นชัดที่สุด
  • ภาษาโปรแกรมคลาสสิคและสภาพแวดล้อมSqueak (ซึ่งสร้างขึ้นจาก Smalltalk)
  • สคริปต์หลายกระบวนทัศน์ภาษาลัวะ

2
@ อดัม: ไม่มีการพิมพ์คงที่มันไม่ได้เป็นเพียงน้ำตาลประโยค?
วินไคลน์

5
@DeadMG OO language ไม่ใช่ภาษาที่ให้คุณใช้ความคิดของ OO แต่เป็นภาษาที่เหมาะกับคุณ :)
Piotr Dobrogost

4
ที่จริงแล้วทั้ง Simula (1960) และ Smalltalk-71 (เช่นเดียวกับ Smalltalk-72) ไม่ได้มีชั้นเรียนเช่นกันซึ่งถือกำเนิดตนเองเกือบสามทศวรรษ เรียนเพิ่มใน Simula-67 และ Smalltalk-74 (และ Alan Kay คิดว่าพวกเขาผิดพลาด
Jörg W Mittag

2
@kevincline: ไม่แน่ใจว่าคุณกำลังทำอะไรอยู่ OO และการพิมพ์แบบสแตติกเป็นมุมฉากสมบูรณ์
Paul Biggar

2
นอกเหนือจาก Simula (ซึ่งใช้ในกระบวนทัศน์ของชั้นเรียน) Flavours ได้รับการแนะนำให้รู้จักกับ MIT ในปี 1979 และเป็นปูชนียบุคคลที่ CLOS ซึ่งทั้งสองลงวันที่ก่อนวันจริง
Matthew Flynn

32

ภาษาอย่างจาวาสคริปต์นั้นมีพื้นฐานมาจากต้นแบบที่ซึ่งพฤติกรรมนั้นสามารถนำกลับมาใช้ใหม่ได้โดยการโคลนวัตถุที่มีอยู่ บทความ Wikipedia ที่ฉันเชื่อมโยงไปถึงบ่งชี้ว่า Lua, ActionScript และภาษาอื่น ๆ จำนวนมากเป็นไปตามกระบวนทัศน์นี้


2
ตัวแปร ECMAScript ใด ๆ ใช้กระบวนทัศน์ต้นแบบ
zzzzBov

เกือบทุกตัวแปร ActionScript (ภาษา Flash) ใช้คลาสแม้ว่า VM พื้นฐานอาจนำไปใช้ในแง่ของต้นแบบ
mjfgates

@mjfgates, Actionscript 2 เคยเป็นจาวาสคริปต์ที่ใช้ ECMAScript และคล้ายกันมาก Actionscript 3 กำลังขยับออกไปจากสิ่งนั้น คุณสามารถพิมพ์ตัวแปรใด ๆ ได้อย่างแข็งแรง / อ่อนแอเนื่องจากเนื้อหาทุกอย่างเป็นวัตถุ
J_A_X

13

ภาษาการเขียนโปรแกรมเชิงวัตถุที่เป็นที่นิยมมากที่สุดในโลกไม่มีคลาสเรียกว่า Javascript และเป็นแบบตัวอย่าง: http://en.wikipedia.org/wiki/Prototype-based_programming


11
"ภาษาโปรแกรมเชิงวัตถุที่นิยมมากที่สุดในโลก"? ฉันไม่แน่ใจเกี่ยวกับการอ้างสิทธิ์นี้เลย
โธมัสโอเวนส์

8
@ThomasOwens เนื่องจากมีการรวมไว้ในเว็บคุณสามารถพูดได้อย่างง่ายดายว่าทุกแพลตฟอร์มที่เปิดใช้งานเว็บสมัยใหม่ (รวมถึงอุปกรณ์มือถือ) มีตัวแปลจาวาสคริปต์อยู่ด้วย เป็นกรณีที่แข็งแกร่งมากในขณะนี้ว่าเป็นภาษาต้นแบบต้นแบบที่ได้รับความนิยมสูงสุดในปัจจุบัน (ยกเว้นว่าคุณคิดว่าคุณสามารถโต้แย้งเช่นเดียวกันกับ "ตนเอง")
riwalk

1
Javascript เป็นหนึ่งในภาษาการเขียนโปรแกรมที่ใช้กันอย่างแพร่หลายที่สุดในโลก แต่ฉันคาดหวังว่าการใช้งานส่วนใหญ่จะเป็นคำสั่งหรือขั้นตอนการทำงานแบบเดิม ๆ ดังนั้นการเรียกจาวาสคริปต์ว่า 'ภาษา OOP ที่ได้รับความนิยมมากที่สุด' จึงไม่เป็นธรรม
tdammers

9
ฉันจะพูดว่า "แพร่หลาย" เพื่อหลีกเลี่ยงการอภิปรายเกี่ยวกับข้อดีของความนิยม
Anthony Pegram

3
@ Stargazer712: ฉันไม่ชอบภาษาที่ยิ่งใหญ่ แต่เขาอ้างว่า "ภาษาการเขียนโปรแกรมเชิงวัตถุที่ได้รับความนิยมมากที่สุดในโลก [ed: Javascript] ไม่มีคลาส" สามารถแยกย่อยของสองการเรียกร้อง: "Javascript เป็นภาษาการเขียนโปรแกรมเชิงวัตถุที่นิยมมากที่สุด" และ "Javascript ไม่มีคลาส"; ทั้งสองอย่างนี้ฉันเห็นด้วย
Lie Ryan

6

การวางแนววัตถุเป็นคำศัพท์สำหรับแนวคิดที่สำคัญหลายประการที่เกิดขึ้นเพียงบางส่วนเท่านั้น ยกตัวอย่างเช่นการสืบทอดสามารถประกาศเป็นกรณี ๆ ไประหว่างกรณีมากกว่าระหว่างคลาสหรือทั้งชั้นสามารถแสดงโดยprototypeวัตถุที่เป็นรูปธรรม ตามที่โทมัสเขียน เป็นเรื่องปกติที่จะแยกคำอธิบายโครงสร้างออกจากการสร้างอินสแตนซ์ ในทำนองเดียวกันการโยงล่าช้าหมายความว่าวัตถุที่มีวิธีการเดียวกันในนามไม่จำเป็นต้องทำสิ่งเดียวกันเมื่อมีการเรียกใช้และการตัดสินใจถูกทำขึ้นที่รันไทม์ นั่นก็เป็นไปได้เช่นกันด้วยวิธีการที่ใช้ต้นแบบ และการห่อหุ้มนั้นมีความเป็นอิสระอย่างสมบูรณ์ว่าวัตถุของคุณเป็นอินสแตนซ์ของคลาสที่ประกาศหรือไม่

ที่กล่าวว่าภาษา OO ส่วนใหญ่อยู่ในค่ายตามระดับชั้นเรียนอย่างมั่นคง แต่ถึงกระนั้นก็มีสำนวนที่พร่ามัวสาย: การออกแบบโดเมนขับเคลื่อนมักจะนำไปสู่ระบบที่ตัวตนของวัตถุเฉพาะมีความสำคัญมากกว่าแผนภาพคลาสคงที่และมัณฑนากรอนุญาตให้วัตถุในชั้นเรียนหรืออินเตอร์เฟซเดียวกันมีมาก พฤติกรรมที่แตกต่าง


6

Fortressเป็นภาษาเชิงวัตถุตามลักษณะแทนที่จะเป็นคลาส ความแตกต่างส่วนใหญ่ในองค์ประกอบการใช้งาน พฤติกรรมของวัตถุ (คำจำกัดความวิธี) ยังคงถูกกำหนดโดยการประกาศ ณ จุดเฉพาะในข้อความของโปรแกรม ดังนั้นในแง่นั้นมันคล้ายกับระบบที่ใช้ในระดับเดียวกัน

มีวัตถุแบบแคลคูลัส (โดย Cardelli ฉันคิดว่า) ที่เป็นวัตถุล้วนๆ ทุกวิธีเป็นสมาชิกอินสแตนซ์ คุณสร้างวัตถุใหม่โดยการนำเนื้อหาของวัตถุที่มีอยู่และเพิ่มลบหรือแทนที่สมาชิกบางส่วน มันแตกต่างจากต้นแบบเล็กน้อยเนื่องจากวัตถุใหม่ไม่มีลิงก์ไปยังวัตถุเก่าเพียงเนื้อหาบางส่วน

IIRC เป็นไปได้ที่จะตั้งโปรแกรมในลักษณะที่คล้ายกันโดยใช้ Python และภาษา hashtable ที่มุ่งเน้นอื่น ๆ : คุณสามารถเพิ่มฟังก์ชั่นในฐานะสมาชิกอินสแตนซ์แล้วเรียกมันว่าเป็นวิธีการ


5

Ada จากการปรับปรุงในปี 1995 Ada เป็นแบบเชิงวัตถุ แต่ไม่เหมือนกับภาษา OO อื่น ๆ มากมายมันไม่ได้รวมประเภทและโมดูลเชิงวัตถุไว้ในโครงสร้างเดียวที่เรียกว่า "คลาส" แทนที่จะประกาศประเภทเป็น "class Foo" และการประกาศเมธอดที่เกี่ยวข้องทั้งหมดภายในการประกาศคลาสคุณต้องประกาศแพ็คเกจและประกาศประเภท (เป็นrecord) และสิ่งอื่น ๆ ภายในแพ็คเกจ ไม่ใช่ "คลาสฟรี" ในลักษณะที่ภาษาอื่น ๆ พูดถึง แต่เป็นวิธีการจัดระเบียบสิ่งต่าง ๆ เล็กน้อย

คุณสมบัติเชิงวัตถุของ Ada 95 ถูกเพิ่มเข้ามาในภาษาที่มีอยู่ในปี 1983; มันขยายระเบียนที่มีอยู่และสร้างแพ็คเกจเพื่อสนับสนุนการสืบทอดและ


นั่นคือสิ่งที่ฉันจำได้คุณต้องส่งบันทึกของคุณไปยังฟังก์ชั่นสมาชิกแต่ละคน
นิกโก

@ นิกโก: นั่นคือสิ่งที่เกิดขึ้นเบื้องหลังในทุกภาษาเชิงวัตถุและค่อนข้างชัดเจนใน Python และ CLOS (เสียงกระเพื่อมทั่วไป)
Marcin

5

Ioเป็นภาษาเชิงวัตถุต้นแบบอีกประเภทหนึ่ง จริง ๆ แล้วมันได้แรงบันดาลใจจากหลายภาษาที่ได้กล่าวไปแล้วในคำตอบอื่น ๆ

Io เป็นภาษาการเขียนโปรแกรมแบบไดนามิก ความคิดใน Io ส่วนใหญ่ได้รับแรงบันดาลใจจาก Smalltalk (ค่าทั้งหมดเป็นวัตถุ), Self (ต้นแบบ - based), NewtonScript (การสืบทอดที่แตกต่าง), Act1 (นักแสดงและฟิวเจอร์สสำหรับการทำงานพร้อมกัน), Lisp (รหัสคือ Lua (เล็กฝังได้)


4

Erlang และใช่ Erlang เป็นภาษาเชิงวัตถุเนื่องจากเป็นไปตามคำนิยามของ OO ทั้งสามข้อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.