โฟกัสหลักของ Java คืออะไร? เหตุใดจึงใช้เวลานานในการรับคุณลักษณะใหม่


11

ฉันได้รับการสำรวจคุณสมบัติใหม่ใน JDK8 เช่นการแสดงออกแลมบ์ดาวิธีการขยายและสตรีม API ใหม่

เห็นได้ชัดว่าไม่มีคุณสมบัติเหล่านี้ใหม่ในโลกการเขียนโปรแกรมและทำให้สงสัยว่าทำไมสิ่งเหล่านี้ได้รับใน Java จนถึงปัจจุบัน

เรามีการแสดงออกแลมบ์ดาใน Lisp (1958), SML (1973), Haskell (1990), Python (1991), JavaScript (1994), Ruby (1995), Ruby (1995), Scala (2003), C # (2007) และ 55 ปีหลังจาก Lisp และ แทบทุกคนใน Java (2013)

และฉันได้อ่านเกี่ยวกับสตรีมในSIC (1996)

ฉันสงสัยว่าทำไมตอนนี้ หลักฐานแสดงให้เห็นว่าการแข่งขันกับภาษาอื่นไม่ใช่แรงจูงใจ

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

ดังนั้นคำถามของฉันคือ: เราจะยืนยันได้อย่างปลอดภัยหรือไม่ว่าหัวข้อหลักในการเปิดตัว Java ที่กำลังจะมีขึ้นนี้นั้นขนานกันจริงหรือ หรือเราสามารถพิสูจน์เหตุผลอื่น ๆ สำหรับการปรากฏตัวของเทคนิคที่เก่าแก่ที่สุดในหนังสือจนถึงขณะนี้ใน Java?


4
ทั้งหมดนี้สามารถกลายเป็นความสับสนเกี่ยวกับ Java's หลังเวลา
Michael K

5
The evidence suggests- โปรดแบ่งปันงานวิจัยของคุณ

2
ไม่มีคุณสมบัติใดใน Java หรือใน JVM หรือใน JRE ที่เคยใหม่ และแม้กระทั่งการรวมกันของฟีเจอร์ไม่ใช่เรื่องใหม่ แต่ Eiffel มีทั้งหมดในปี 1985 (GC, OO, ความปลอดภัยประเภทแม้กระทั่ง Generics ซึ่ง Java ไม่ได้รับจนถึงปี 2003) ในความเป็นจริงมันเป็นเป้าหมายที่ชัดเจนของนักออกแบบ Java ที่จะไม่แนะนำอะไรใหม่
Jörg W Mittag

2
@MichaelK - ฉันเห็นด้วยว่านี่อาจกลายเป็นสงครามเปลวไฟ มันอาจกลายเป็นคำตอบที่ถูกต้องเกี่ยวกับประวัติศาสตร์ที่ท้าทายของซัน การเข้าซื้อกิจการของ Sun และ Java; และวิธีการที่ผู้ดูแลปัจจุบันของ Java พยายามขับภาษา ความหวังของฉันคือคำตอบจะเน้นไปที่แง่มุมที่สร้างสรรค์ของคำถามนี้

@MichaelT: ฉันหวังว่ามันจะไม่เปลี่ยนเป็นสงครามลุกเป็นไฟและความคิดที่น่าสนใจบางอย่างอาจเกิดขึ้นได้ ตัวอย่างเช่นเรามักจะสันนิษฐานว่าภาษาที่ไม่พัฒนาอย่างต่อเนื่องนั้นล้าหลัง IMO นี้ไม่เป็นความจริงเพราะมันสันนิษฐานว่าวิวัฒนาการของภาษานั้นเป็นแบบเส้นตรง (ซึ่งคุณสมบัติใหม่ทั้งหมดที่เป็นที่นิยมนั้นดีและควรนำมาใช้กับภาษาสมัยใหม่ทั้งหมด) แต่ผู้ดูแลระบบของภาษาสามารถตัดสินใจได้ว่าคุณลักษณะใหม่ไม่เหมาะกับภาษาที่เหลือ นอกจากนี้ให้พิจารณาว่ามีภาษาที่ได้มาตรฐานและมีความเสถียรซึ่งไม่ได้ล้าสมัยอย่างแน่นอน (เช่น Common LISP)
Giorgio

คำตอบ:


12

เมื่อ Java ถูกออกแบบครั้งแรกถือว่าเหมาะสมที่จะละทิ้งฟังก์ชันที่ไม่ระบุชื่อ ฉันคิดได้สองเหตุผล (แต่อาจแตกต่างจากของทางการ):

  1. Java ได้รับการออกแบบเป็นภาษาเชิงวัตถุโดยไม่มีฟังก์ชั่นดังนั้นจึงไม่เป็นธรรมชาติเลยที่จะมีฟังก์ชั่นนิรนามในภาษาที่ไม่มีฟังก์ชั่น หรืออย่างน้อยก็จะมีอิทธิพลต่อการออกแบบภาษามาก
  2. ฟังก์ชั่นนิรนามไม่ได้รับความนิยมในชุมชนโปรแกรมเมอร์ที่ Java ตั้งใจจะดึงดูด (C, C ++, Pascal?) แม้ตอนนี้โปรแกรมเมอร์ Java หลายคนดูเหมือนจะพิจารณาคุณสมบัติเหล่านี้ค่อนข้างแปลกใหม่ (แต่อาจจะเปลี่ยนอย่างรวดเร็วด้วย Java 8)

ในปีต่อ ๆ ไปดังที่ Robert Harvey ได้อธิบายไว้นโยบายของ Sun มักจะรักษาความเข้ากันได้ของ Java ย้อนหลังและมีความเสถียรมาก

ในขณะที่ภาษาการแข่งขันอื่น ๆ ได้เกิดขึ้น (ที่สำคัญที่สุดคือ C # ซึ่งเกิดเป็นโคลน Java แล้วทิศทางการพัฒนาของตัวเอง)

ภาษาที่ใช้ในการแข่งขันทำให้ Java ตกอยู่ภายใต้แรงกดดันด้วยเหตุผลสองประการ:

พลังการแสดงออก

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

อย่างไรก็ตามในช่วงไม่กี่ปีที่ผ่านมาคู่แข่งของ Java ได้เพิ่มคุณสมบัติใหม่ ๆ ที่ Java ไม่ได้มีและสิ่งนี้ถือเป็นข้อได้เปรียบ

hype

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

Hype อาจมีความสำคัญมากกว่าสำหรับคนที่ไม่ใช่ด้านเทคนิคเช่นผู้จัดการซึ่งอาจเป็นคนที่ตัดสินใจเลือกแพลตฟอร์มสำหรับโครงการบางโครงการ ผู้จัดการบางครั้งจำคำหลักบางคำเท่านั้นเช่นแลมบ์ดา, ขนาน, มัลติคอร์, การเขียนโปรแกรมการทำงาน, คลาวด์คอมพิวติ้ง, ... หากเทคโนโลยีที่เราเลือกมีเครื่องหมายสีเขียวในแต่ละรายการของรายการ

ดังนั้น IMO สำหรับบางครั้ง Java ถูกจับระหว่าง

  • นโยบายดั้งเดิมของความเสถียรทางภาษาและความเรียบง่ายในการออกแบบฐานของโค้ดขนาดใหญ่และชุมชนนักพัฒนาในมือเดียวและ
  • ความกดดันของภาษาที่แข่งขันกันซึ่งสามารถดึงดูดโปรแกรมเมอร์ Java, C # ในตอนแรกและจากนั้น Scala, Clojure, F # (ฉันชื่อคนที่ฉันรู้ว่าอาจมีคนอื่น)

ในที่สุด Oracle ตัดสินใจอัพเกรด Java เพื่อให้สามารถแข่งขันได้มากขึ้น ในความคิดของฉันคุณสมบัติใหม่ที่อยู่โดยเฉพาะอย่างยิ่งโปรแกรมเมอร์ Java ที่อาจถูกล่อลวงให้เปลี่ยนเป็น C # และผู้ที่เห็นภาษาอื่นเช่น Scala และ Clojure แตกต่างจาก Java มากเกินไป ในทางกลับกันนักพัฒนาซอฟต์แวร์ที่มีประสบการณ์เกี่ยวกับการเขียนโปรแกรมการทำงานและยังต้องการใช้ JVM ได้เปลี่ยนไปใช้ Scala, Clojure หรือภาษาอื่นแล้ว

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

ดังนั้นใช่คุณสมบัติ Java 8 (ทั้งหมด) เป็นที่รู้จักกันดีอยู่แล้ว แต่ทำไมและเมื่อมีการเพิ่มคุณสมบัติให้กับภาษาขึ้นอยู่กับปัจจัยหลายประการ: ผู้ชมเป้าหมายชุมชนที่มีอยู่

แก้ไข

บันทึกย่อเกี่ยวกับ "... ฉันได้อ่านเกี่ยวกับสตรีมใน SIC (1996)": คุณหมายถึงว่าคุณต้องการ Java 8 lambdas ในการติดตั้งสตรีมหรือไม่? ที่จริงคุณสามารถใช้พวกเขาโดยใช้คลาสภายในที่ไม่ระบุชื่อ


+1 และฉันหวังว่าฉันจะให้คะแนนคุณมากกว่านี้เพราะนี่เป็นคำตอบที่ดีที่สุดสำหรับคำถามนี้
edalorzo

จากคำตอบของคุณฉันได้ตรวจสอบเพิ่มเติมเกี่ยวกับสิ่งที่ Mark Reinhold กล่าวว่าฉันได้พบบทความที่น่าสนใจ ผมจะโพสต์ได้ที่นี่กับคำตอบของคุณสำหรับการอ้างอิงในอนาคต: ปิดสำหรับ Java มาร์คโฮลด์
edalorzo

และบทความที่จริงหมายถึงนี้อีกคนหนึ่งปิดสำหรับ Java
edalorzo

1
จากลิงก์ที่คุณส่งฉันพบibm.com/developerworks/java/library/j-jtp03048/index.html#4.0โดยบอกว่า Java สามารถใช้คลาสภายในที่ไม่ระบุชื่อได้ แต่สิ่งเหล่านี้มีความละเอียดมากเกินไป แต่การปิด Java 8 ไม่ได้เป็นเพียงแค่วากยสัมพันธ์สำหรับคลาสภายในที่ไม่ระบุชื่อ ดังนั้นตอนนี้ Java จะมีการปิดสองประเภท (เชิงความหมาย): คลาสภายในแบบไม่ระบุชื่อและการแสดงออกแลมบ์ดา
Giorgio

11

Java เปลี่ยนโฟกัสไปตามกาลเวลา ตอนแรกมันถูกออกแบบมาเป็นภาษาที่มีประสิทธิภาพอย่างง่ายเป็นปฏิกิริยาต่อ "พลังที่ซับซ้อน" C ++ คุณลักษณะบางอย่างที่อยู่ใน C ++ นั้นถูกปล่อยออกมาอย่างจงใจเช่นตัวดำเนินการโอเวอร์โหลดเทมเพลต enums ที่ถือว่าซับซ้อนเกินไปหรือเป็นที่ระลึกของยุค C และ OOP อยู่ในช่วงที่ความนิยมสูงสุดของมัน กระบวนทัศน์โลกทัศน์ Lambdas ในเวลานี้ได้รับการพิจารณาเพียง "ไม่จำเป็น" นับตั้งแต่เปิดตัวคลาสนิรนาม / ชั้นในใน Java 1.1 ความจริงที่ว่าไวยากรณ์ได้ไกลมากขึ้นได้รับการพิจารณาอย่างละเอียดเกือบคุณลักษณะ

Java พบว่าเป็นสาธารณะไม่มีแรงจูงใจในการเปลี่ยนแปลงจนกว่า Microsoft จะแนะนำ C # ซึ่งเรียนรู้จากบทเรียนเกี่ยวกับข้อผิดพลาดในการออกแบบ Java และเปิดตัวชุดคุณสมบัติภาษาใหม่ พวกเขาไม่ได้ถูก จำกัด ด้วยความเข้ากันได้ย้อนหลัง ฉันคิดว่า Java conceptors ตระหนักถึงอันตรายของการแข่งขัน C # และปล่อย Java 5 ด้วย generics, enums และอื่น ๆ

การรวมตัวของแลมบ์ดาใน Java ได้ถูกกล่าวถึงตั้งแต่เวลานั้นและมันถูกทำให้รุนแรงโดยแนวโน้มปัจจุบันสำหรับการตั้งโปรแกรมการทำงานเท่านั้น แต่สิ่งต่าง ๆ เช่นนี้ช้าที่จะทำให้ถูกต้องและมันจะต้องถูกต้องในครั้งแรก ในความคิดของฉัน Java ข้อมูลทั่วไปไม่เรียบร้อยที่มีการลบประเภทเพราะความเข้ากันได้ย้อนหลังได้รับการพิจารณาเหตุผลที่จะใช้มันไม่เกินน้ำตาล syntactic มีการไตร่ตรองอย่างถี่ถ้วนมากขึ้นปรากฏขึ้นและมันจะเป็นมากกว่าแค่น้ำตาลซินแทคติค

โดยสรุปหัวข้อหลักของ Java 8 คืออะไร ฉันไม่คิดว่ารุ่นภาษามีหัวข้อ ในฐานะที่เป็น C ++ 11, raison d'etre ของ Java 8 คือการติดตามการแข่งขันโดยการแนะนำในภาษาที่สิ่งต่าง ๆ ที่โปรแกรมเมอร์มากขึ้นกำลังได้รับอนุญาตในขณะนี้ เสียงกระเพื่อมอาจมีแลมบ์ดาตั้งแต่ปี 1958 ความนิยมของมันเพิ่มขึ้นอย่างต่อเนื่องเป็นเวลาหลายทศวรรษในขณะนี้และการเขียนโปรแกรมเชิงฟังก์ชั่นเมื่อไม่นานมานี้ได้รับการพิจารณาอย่างจริงจังสำหรับการเขียนโปรแกรม "กระแสหลัก"


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

1
เหตุผลที่ปิดไม่ได้ถูกรวมครั้งแรกใน Java ตาม: ทำความเข้าใจเกี่ยวกับการปิดอภิปราย ที่นั่น James Gossling กล่าวว่า: "การถูกปิดจาก Java ในขั้นต้นมีสาเหตุมาจากแรงกดดันด้านเวลามากกว่าสิ่งอื่นใดในช่วงแรกของ Java การขาดการปิดนั้นค่อนข้างเจ็บปวดและชั้นในเกิดขึ้น จำนวนของปัญหาที่ยาก แต่ตามปกติในปัญหาการออกแบบจำนวนมากการทำให้เข้าใจง่ายไม่ได้แก้ปัญหาใด ๆ
edalorzo

"การรวม lambdas ใน Java ถูกกล่าวถึงตั้งแต่เวลานั้นและมันก็ยิ่งเลวร้ายลงโดยกระแสปัจจุบันสำหรับการเขียนโปรแกรมการทำงาน": ฉันคิดว่ามันน่าสนใจที่ในบางชุมชน (C ++, Java, ... ) "การใช้ lambdas" มักจะหมายถึง " ทำโปรแกรมฟังก์ชั่น "
Giorgio

8

เห็นได้ชัดว่าไม่มีคุณสมบัติเหล่านี้ใหม่ในโลกการเขียนโปรแกรมและทำให้สงสัยว่าทำไมสิ่งเหล่านี้ได้รับใน Java จนถึงปัจจุบัน

เนื่องจาก Java ต้องผ่านกระบวนการอนุมัติที่เกี่ยวข้องกับผู้มีส่วนได้ส่วนเสียที่มองเห็นได้สูงในกระบวนการคล้ายกับ "การออกแบบโดยคณะกรรมการ" และกระบวนการนั้นต้องใช้เวลานั่นคือทั้งหมด

เปรียบเทียบกับภาษาอื่นและคุณจะพบว่ามีเผด็จการใจดีหรือคณะนักออกแบบภาษาเล็ก ๆ ที่ทำงานอย่างใกล้ชิดและไม่เชื่อมโยงกับผลประโยชน์ขององค์กร

รวมเข้ากับฐานรหัสที่กำหนดขึ้นของโค้ด Java จำนวนหลายล้านบรรทัดที่จะต้องใช้งานร่วมกับระบบย้อนหลังได้และคุณมีส่วนผสมทั้งหมดสำหรับการเปลี่ยนแปลงอย่างรวดเร็ว


1
OTOH คุณมีส่วนผสมสำหรับมาตรฐานที่แข็งแกร่งและได้รับการยอมรับอย่างกว้างขวาง ความคมชัดเช่น JPA กับสถานการณ์ของ PHP ซึ่งเฟรมเวิร์กของเว็บทุกๆคนมี ORM แบบครึ่งทางของตัวเอง
Michael Borgwardt

ฉันอาจจะผิด แต่ความเข้าใจของฉันก็คือ Haskell ก็เป็นภาษา "ออกแบบโดยคณะกรรมการ" และเป็นภาษาที่ทันสมัย ดังนั้นบางทีนั่นอาจไม่ใช่สิ่งที่ขัดขวาง Java
Andres F.

@AndresF ใช่ แต่ฉันคิดว่าคุณไม่มี บริษัท ขนาดใหญ่เสาหินนั่งอยู่ในคณะกรรมการ Haskell ดูเพิ่มเติมสนทนาในความคิดเห็นที่นี่
Robert Harvey

1

ฉันจะบอกว่าวัตถุประสงค์ที่สำคัญที่สุดของภาษาการเขียนโปรแกรมคือการใช้; ปัจจุบัน C และ Java ไม่มีแลมบ์ดานิพจน์และเป็นภาษาที่ใช้มากที่สุด (ตามตัวอย่างของ TIOBE)

และเพื่อตอบคำถามฉันเชื่อว่า Java ถูกส่งไปยังองค์กร สิ่งที่อยู่ในโดเมนนี้จะต้องมีเสถียรภาพและเชื่อถือได้มาก ตัวอย่างเช่น Java 7 ปรากฏตัวมาเกือบ 2 ปีแล้ว แต่ฉันไม่รู้โดยตรงเลยว่ามีโปรเจ็กต์ใด ๆ ใน Java 7 และสิ่งสำคัญอีกอย่างก็คือความเข้ากันได้แบบย้อนหลังซึ่งมีความสำคัญมากสำหรับองค์กร


ฉันเห็นด้วยกับคุณ (+1): ฉันให้คุณค่ากับ Java เป็นอย่างมาก (เป็นภาษาและสำหรับระบบนิเวศขนาดใหญ่) แต่ฉันจะพบว่ามันเหมาะสมกว่าที่จะหยุดภาษาที่ Java 6 ฉันจะไม่ใช้ความพยายามใด ๆ ในการเรียนรู้ Java 7 หรือ 8 ยกเว้นว่าฉันถูกบังคับให้ (บางโครงการที่น่าสนใจมากซึ่ง Java 7 หรือ 8 เป็นสิ่งที่จำเป็น) ฉันควรใช้เวลาในการเรียนรู้ Scala และ Clojure
Giorgio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.