วันที่: Wed, 23 Jul 2003 09:33:31 -0800 ถึง: Stefan Ram [ลบเพื่อความเป็นส่วนตัว] จาก: Alan Kay [ลบเพื่อความเป็นส่วนตัว] เรื่อง: Re: การชี้แจงของ "object-oriented"
สวัสดีสเตฟาน -
ขออภัยสำหรับความล่าช้า แต่ฉันอยู่ในช่วงวันหยุด
เมื่อ 18:27 +0200 7/17/03 Stefan Ram เขียนว่า:
เรียนดร. เคย์
ฉันต้องการคำศัพท์ที่เชื่อถือได้ในคำว่า "การเขียนโปรแกรมเชิงวัตถุ" สำหรับหน้ากวดวิชาของฉันในหัวข้อ แหล่งข้อมูลสองแหล่งที่ฉันพิจารณาว่าเป็น "เผด็จการ" คือองค์การมาตรฐานสากลซึ่งกำหนด "เชิงวัตถุ" ใน "ISO / IEC 2382-15" และคุณเพราะตามที่พวกเขากล่าวคุณได้ประกาศเกียรติคุณในคำนั้น
ฉันค่อนข้างแน่ใจว่าฉันทำ
น่าเสียดายที่เป็นการยากที่จะค้นหาหน้าเว็บหรือแหล่งที่มาพร้อมกับคำจำกัดความหรือคำอธิบายของคำนั้น ๆ มีรายงานหลายฉบับเกี่ยวกับสิ่งที่คุณอาจพูดถึงในเรื่องนี้ (เช่น "การสืบทอดความหลากหลายและการห่อหุ้ม") แต่สิ่งเหล่านี้ไม่ใช่แหล่งข้อมูลมือแรก ฉันยังทราบด้วยว่าภายหลังคุณให้ความสำคัญกับ "การส่งข้อความ" มากขึ้น แต่ฉันก็ยังอยากจะรู้เกี่ยวกับ
สำหรับบันทึกหน้าบทช่วยสอนของฉันและการเผยแพร่และการเผยแพร่เพิ่มเติมโปรดอธิบาย:
คำว่า "เชิงวัตถุ" ใช้เมื่อใดและที่ไหน
ที่ยูทาห์ในช่วงหลัง พ.ย. 66 เมื่อได้รับอิทธิพลจาก Sketchpad, Simula, การออกแบบสำหรับ ARPAnet, Burroughs B5000 และพื้นหลังของฉันในชีววิทยาและคณิตศาสตร์ฉันคิดว่าสถาปัตยกรรมสำหรับการเขียนโปรแกรม อาจเป็นในปี 1967 เมื่อมีคนถามฉันว่าฉันกำลังทำอะไรอยู่และฉันก็พูดว่า: "เป็นโปรแกรมเชิงวัตถุ"
แนวคิดดั้งเดิมของมันมีส่วนต่าง ๆ ดังต่อไปนี้
ฉันคิดว่าวัตถุเป็นเหมือนเซลล์ชีวภาพและ / หรือคอมพิวเตอร์แต่ละเครื่องบนเครือข่ายเท่านั้นที่สามารถสื่อสารกับข้อความได้ (ดังนั้นการส่งข้อความจึงมาตั้งแต่เริ่มต้น - ใช้เวลาสักครู่เพื่อดูวิธีการส่งข้อความในภาษาโปรแกรมได้อย่างมีประสิทธิภาพเพียงพอ จะมีประโยชน์).
ฉันต้องการกำจัดข้อมูล B5000 เกือบทำสิ่งนี้ผ่านสถาปัตยกรรม HW ที่แทบไม่น่าเชื่อ ฉันรู้ว่าคำเปรียบเทียบเซลล์ / คอมพิวเตอร์ทั้งเครื่องจะกำจัดข้อมูลและ "<-" จะเป็นเพียงข้อความอีกโทเค็น (ฉันใช้เวลาสักครู่ในการคิดสิ่งนี้เพราะฉันคิดว่าสัญลักษณ์เหล่านี้เป็นชื่อสำหรับ ฟังก์ชั่นและขั้นตอน
ภูมิหลังทางคณิตศาสตร์ของฉันทำให้ฉันรู้ว่าแต่ละวัตถุอาจมีจีบราส์หลายอันที่เกี่ยวข้องกับมันและอาจมีครอบครัวของสิ่งเหล่านี้และสิ่งเหล่านี้จะมีประโยชน์มาก คำว่า "polymorphism" ถูกกำหนดไว้มากในภายหลัง (ฉันคิดว่า Peter Wegner) และมันก็ไม่ถูกต้องนักเพราะมันมาจากชื่อของฟังก์ชั่นและฉันต้องการฟังก์ชั่นมากกว่าเล็กน้อย ฉันสร้างคำว่า "genericity" เพื่อจัดการกับพฤติกรรมทั่วไปในรูปแบบเสมือนพีชคณิต
ฉันไม่ชอบวิธีที่ Simula ฉันหรือ Simula 67 ได้รับมรดก (แม้ว่าฉันคิดว่า Nygaard และ Dahl เป็นเพียงนักคิดและนักออกแบบที่ยิ่งใหญ่) ดังนั้นฉันจึงตัดสินใจที่จะละทิ้งมรดกเป็นคุณลักษณะในตัวจนกว่าฉันจะเข้าใจได้ดีขึ้น
การทดลองดั้งเดิมของฉันกับสถาปัตยกรรมนี้ทำโดยใช้แบบจำลองที่ดัดแปลงมาจาก Van Wijngaarten's และ Wirth's "Generalization of Algol" และ Wuler's Euler ทั้งสองนี้ค่อนข้างเหมือน LISP แต่มีไวยากรณ์ที่อ่านได้มากกว่า ฉันไม่เข้าใจแนวคิด LISP ของสัตว์ประหลาดที่จับต้องได้จากโลหะภาษา แต่ได้ใกล้ชิดกับแนวคิดเกี่ยวกับภาษาที่ขยายได้ซึ่งดึงมาจากแหล่งต่าง ๆ รวมถึง IMP ของ Irons
ขั้นตอนที่สองของเรื่องนี้คือการเข้าใจ LISP ในที่สุดและจากนั้นใช้ความเข้าใจนี้เพื่อทำให้ดีขึ้นและมีขนาดเล็กลงและมีประสิทธิภาพมากขึ้นและโครงสร้างที่ล่าช้ามากขึ้น วิทยานิพนธ์ของ Dave Fisher ทำในรูปแบบ "McCarthy" และความคิดของเขาเกี่ยวกับโครงสร้างการควบคุมแบบขยายได้มีประโยชน์มาก อิทธิพลใหญ่อีกอย่างในเวลานี้คือ PLANNER ของคาร์ลเฮวิตต์ (ซึ่งไม่เคยได้รับการยอมรับว่าสมควรได้รับเท่าไรและดีแค่ไหนก่อนหน้านี้ที่สามารถคาดการณ์อารัมภบทได้)
Smalltalk ดั้งเดิมที่ Xerox PARC ออกมาจากด้านบน Smalltalk ต่อมาถูกร้องเรียนเกี่ยวกับในตอนท้ายของบทประวัติศาสตร์: พวกเขา backslid สู่ Simula และไม่ได้แทนที่กลไกการขยายด้วยคนที่ปลอดภัยกว่าซึ่งอยู่ใกล้กับที่เป็นประโยชน์
"การเขียนโปรแกรมเชิงวัตถุ" หมายถึงอะไร? (ไม่จำเป็นต้องมีการแนะนำแบบกวดวิชาเพียงคำอธิบายสั้น ๆ [เช่น "การเขียนโปรแกรมที่มีการสืบทอดความหลากหลายและการห่อหุ้ม"] ในแง่ของแนวคิดอื่น ๆ สำหรับผู้อ่านที่คุ้นเคยกับพวกเขาหากเป็นไปได้นอกจากนี้ยังไม่จำเป็นต้องอธิบาย "วัตถุ "เพราะฉันมีแหล่งที่มาพร้อมกับคำอธิบายของคุณของ" วัตถุ "จาก" Early History of Smalltalk ")
(ฉันไม่ได้เทียบกับประเภท แต่ฉันไม่รู้ระบบชนิดใดที่ไม่เจ็บปวดอย่างสมบูรณ์ดังนั้นฉันยังชอบการพิมพ์แบบไดนามิก)
OOP สำหรับฉันหมายถึงเพียงการส่งข้อความการเก็บรักษาในท้องถิ่นและการป้องกันและการซ่อนกระบวนการของรัฐและการผูกมัดปลายสุดของทุกสิ่ง มันสามารถทำได้ใน Smalltalk และ LISP อาจมีระบบอื่น ๆ ที่เป็นไปได้ แต่ฉันไม่ทราบ
[นอกจากนี้] หนึ่งในสิ่งที่ฉันควรจะกล่าวถึงก็คือมีสองเส้นทางหลักที่ Simula catalysed จุดเริ่มต้น (โดยไม่ได้ตั้งใจ) คือเส้นทางที่ไม่ใช่ข้อมูลขั้นตอนทางชีวภาพ / สุทธิที่ฉันใช้ อีกอันหนึ่งซึ่งต่อมาอีกเล็กน้อยในขณะที่วัตถุของการศึกษาคือประเภทข้อมูลนามธรรมและสิ่งนี้ก็เล่นได้มากขึ้น
ถ้าเราดูประวัติทั้งหมดเราจะเห็นว่าสิ่งที่โปรโต - โอพเริ่มต้นด้วย ADT มีทางแยกเล็ก ๆ น้อย ๆ ต่อสิ่งที่ฉันเรียกว่า "วัตถุ" - ที่นำไปสู่สมอลล์ทอล์ค ฯลฯ - แต่หลังจากทางแยกเล็ก ๆ การก่อตั้ง CS นั้นค่อนข้าง ADT และต้องการที่จะยึดติดกับกระบวนทัศน์กระบวนงานข้อมูล ในอดีตมันน่าดู USAF Burroughs ระบบไฟล์ 220 (ที่ฉันอธิบายไว้ในประวัติ Smalltalk) งานแรกของ Doug Ross ที่ MIT (AED และก่อนหน้านี้) ซึ่งเขาสนับสนุนการฝังตัวชี้ขั้นตอนในโครงสร้างข้อมูล Sketchpad (ซึ่งมี polymorphism แบบเต็ม - เช่นที่อ็อฟเซ็ตเดียวกันในโครงสร้างข้อมูลของมันหมายถึง "display" และจะมีตัวชี้ไปยังรูทีนที่เหมาะสมสำหรับประเภทของวัตถุที่เป็นตัวแทนโครงสร้างและอื่น ๆ และ Burroughs B5000 ซึ่งตารางอ้างอิงของโปรแกรมนั้นเป็น "วัตถุขนาดใหญ่" จริงและมีตัวชี้ไปยัง "ข้อมูล" และ "ขั้นตอน" แต่มักจะทำสิ่งที่ถูกต้องได้หากพยายามไปตามข้อมูลและพบตัวชี้ขั้นตอน และปัญหาแรกที่ฉันแก้ไขกับสิ่งที่ยูทาห์ยุคแรกของฉันคือ "การหายไปของข้อมูล" โดยใช้วิธีการและวัตถุเท่านั้น ในตอนท้ายของยุค 60 (ฉันคิดว่า) Bob Balzer เขียนกระดาษสวย ๆ ที่เรียกว่า "Dataless Programming" และหลังจากนั้นไม่นาน John Reynolds ก็เขียนกระดาษที่ดีพอ ๆ กัน "Gedanken" (ในปี 1970 ฉันคิด) ซึ่งเขาแสดงให้เห็นว่า การแสดงออกทางที่ถูกต้องจะช่วยให้ข้อมูลที่เป็นนามธรรมโดยขั้นตอน แต่บ่อยครั้งสามารถทำสิ่งที่ถูกต้องได้หากพยายามติดตามข้อมูลและพบตัวชี้ขั้นตอน และปัญหาแรกที่ฉันแก้ไขกับสิ่งที่ยูทาห์ยุคแรกของฉันคือ "การหายไปของข้อมูล" โดยใช้วิธีการและวัตถุเท่านั้น ในตอนท้ายของยุค 60 (ฉันคิดว่า) Bob Balzer เขียนกระดาษสวย ๆ ที่เรียกว่า "Dataless Programming" และหลังจากนั้นไม่นาน John Reynolds ก็เขียนกระดาษที่ดีพอ ๆ กัน "Gedanken" (ในปี 1970 ฉันคิด) ซึ่งเขาแสดงให้เห็นว่า การแสดงออกทางที่ถูกต้องจะช่วยให้ข้อมูลที่เป็นนามธรรมโดยขั้นตอน แต่บ่อยครั้งสามารถทำสิ่งที่ถูกต้องได้หากพยายามติดตามข้อมูลและพบตัวชี้ขั้นตอน และปัญหาแรกที่ฉันแก้ไขกับสิ่งที่ยูทาห์ยุคแรกของฉันคือ "การหายไปของข้อมูล" โดยใช้วิธีการและวัตถุเท่านั้น ในตอนท้ายของยุค 60 (ฉันคิดว่า) Bob Balzer เขียนกระดาษสวย ๆ ที่เรียกว่า "Dataless Programming" และหลังจากนั้นไม่นาน John Reynolds ก็เขียนกระดาษที่ดีพอ ๆ กัน "Gedanken" (ในปี 1970 ฉันคิด) ซึ่งเขาแสดงให้เห็นว่า การแสดงออกทางที่ถูกต้องจะช่วยให้ข้อมูลที่เป็นนามธรรมโดยขั้นตอน
คนที่ชอบวัตถุที่ไม่ใช่ข้อมูลนั้นมีจำนวนน้อยและรวมตัวเอง Carl Hewitt, Dave Reed และคนอื่น ๆ อีกสองสามคน - กลุ่มคนส่วนใหญ่มาจากชุมชน ARPA และมีส่วนร่วมไม่ทางใดก็ทางหนึ่ง การออกแบบ ARPAnet → Internet ที่หน่วยการคำนวณพื้นฐานเป็นคอมพิวเตอร์ทั้งเครื่อง แต่เพียงเพื่อแสดงให้เห็นว่าความคิดหัวชนฝาสามารถแขวนบนตลอดอายุเจ็ดสิบแปดมีหลายคนที่พยายามที่จะได้รับด้วย "การเรียกกระบวนการระยะไกล" แทนที่จะคิดเกี่ยวกับวัตถุและข้อความ Sic Transit Gloria mundi
ไชโย
อลันเคย์