เหตุใด WinRT จึงไม่มีการจัดการ [ปิด]


164

Windows 8 แนะนำ WinRT ซึ่งเหมือนกับ. NET แต่ไม่มีการจัดการ ทำไมถึงไม่มีการจัดการ มันเป็นปัญหาด้านประสิทธิภาพหรือไม่? หมายความว่าการรวบรวมขยะไม่เหมาะสำหรับ API ระดับล่างหรือไม่


56
นี่เป็นการโทรที่ไม่ดีเท่าการปิด ตอนนี้คุณยืนยันในการอ้างอิงและแหล่งที่มาคุณตัดออกก่อนหน้านี้โดยการปิดคำถาม ตอนนี้คุณลบแหล่งข้อมูลที่ยอดเยี่ยมออกจากโปรแกรมเมอร์ที่ทำงานกับมันแล้ว
Hans Passant

9
ฉันลงคะแนนเป็นหัวข้อนอกเนื่องจากไม่ได้ตอบคำถามการเขียนโปรแกรมเชิงปฏิบัติ มันเป็นเพียงความอยากรู้ ไม่มีโปรแกรมเมอร์คนใดที่จะเปลี่ยนรหัสของพวกเขาอันเป็นผลมาจากคำถามนี้
Raymond Chen

17
@Kev ด้วยเหตุผลนั้นคำถามเช่น "โลกเกิดมาได้อย่างไร" คงจะแย่มากในวงการวิทยาศาสตร์เพราะมันดึงดูดการเก็งกำไรทางศาสนามากมาย มีคำตอบที่ดีสำหรับคำถามนี้ - เพียงเพราะมันดึงดูดคำตอบที่ไม่ดีจำนวนมากไม่ได้หมายความว่ามันเป็นคำถามที่ไม่ดี จริงๆแล้วทำไมไม่เพียงแค่ย้ายคำถามนี้ไปที่ P.SE?
Rei Miyasaka

22
@casperOne มันเป็นคำถาม "ไวท์บอร์ด" ที่ถูกกฎหมายสำหรับนักพัฒนาจำนวนมาก - เราต้องการทราบเหตุผลทางเทคนิคที่น่าจะเป็นไปได้สำหรับการตัดสินใจเพื่อที่เราจะได้ใช้เหตุผลเดียวกันกับที่อื่น เป็นเพราะตัวรวบรวมขยะยากที่จะโพรไฟล์หรือไม่ เป็นเพราะมันให้การเข้าถึง abstractions ฮาร์ดแวร์ระดับล่างได้ง่ายขึ้นหรือไม่ หากไม่มีเหตุผลทางเทคนิคนั่นเป็นเรื่องที่น่าเสียดาย แต่ก็ไม่มีอะไรเกี่ยวข้องกับคุณภาพของคำถาม
Rei Miyasaka

7
ฉันเห็นด้วยกับ @HansPassant; คำถามนี้จะต้องเปิดใหม่และถือว่าถูกต้อง "ทำไมมันถึงไม่มีการจัดการ" เป็นคำถามที่ดีมากเกี่ยวกับพื้นฐานของ WinRT
Rob Perkins

คำตอบ:


190

WinRT เป็นสิ่งทดแทนสำหรับ Winapi ที่ใช้ C รุ่นเก่า เป็น API ที่ต้องใช้งานได้ในหลายสภาวะแวดล้อมรันไทม์ ย้อนกลับไปเมื่อ 20 ปีที่แล้ว C api ค่อนข้างง่ายที่จะเชื่อมโยงกับ ตั้งแต่นั้นมา COM ก็กลายเป็นกาวสากลในช่วงครึ่งหลังของปี 1990 รันไทม์ภาษาใด ๆ ในการใช้งานทั่วไปใน Windows รองรับ COM

ตัวรวบรวมขยะคือรายละเอียดการใช้งานภาษา ตัวรวบรวมสำหรับ. NET นั้นแตกต่างจากตัวรวบรวมสำหรับ Javascript อย่างมาก วัตถุพื้นเมืองที่สร้างขึ้นในทั้งสองจะต้องปฏิบัติตามกฎที่เข้มงวดมากของนักสะสม ซึ่งหมายความว่าพวกเขาจะต้องสร้างรุ่น WinRT ที่เฉพาะเจาะจงสำหรับแต่ละภาษารันไทม์ สิ่งนั้นจะไม่เกิดขึ้นแม้แต่ บริษัท ใหญ่อย่าง Microsoft ก็ไม่สามารถสร้างและสนับสนุนรุ่น WinRT ที่เฉพาะเจาะจงสำหรับการผูกทุกภาษา หรือไม่จำเป็นเนื่องจากภาษาเหล่านี้รองรับ COM แล้ว

ตอนนี้การผูกมัดที่ดีที่สุดสำหรับ WinRT คือ C ++ เนื่องจาก COM ทำงานได้อย่างมีประสิทธิภาพยิ่งขึ้นด้วยการจัดการหน่วยความจำที่ชัดเจน ด้วยความช่วยเหลือที่เพียงพอจากส่วนขยายคอมไพเลอร์ C ++ ใหม่ที่ทำให้มันเป็นไปโดยอัตโนมัติคล้ายกับ _com_ptr_t ของเก่าที่มีไวยากรณ์คล้าย C ++ / CLI เพื่อหลีกเลี่ยง การเชื่อมโยงกับภาษาที่ได้รับการจัดการนั้นค่อนข้างง่ายเนื่องจาก CLR มีการรองรับ COM interop ที่ยอดเยี่ยมอยู่แล้ว WinRT ยังนำรูปแบบข้อมูลเมตาของ. NET Afaik ยังไม่มีการดำเนินการใด ๆ เลยสำหรับคอมไพเลอร์ที่มีการจัดการ ณ วันนี้

แก้ไข: Larry Osterman โปรแกรมเมอร์ไมโครซอฟท์ที่รู้จักกันดีและทิ้งความคิดเห็นที่ค่อนข้างดีในคำตอบที่ถูกลบตอนนี้ ฉันจะพูดที่นี่เพื่อรักษามัน:

WinRT ไม่มีการจัดการเนื่องจากระบบปฏิบัติการไม่ได้รับการจัดการ และด้วยการออกแบบ WinRT ในแบบที่มันออกแบบมามันจะเพิ่มความสามารถในการแสดงออกในหลาย ๆ ภาษาไม่ใช่แค่ C ++, C # และ JS ตัวอย่างเช่นฉันสามารถเห็นชุดของโมดูล Perl ที่ใช้ WinRT API ซึ่งทำงานบนเดสก์ท็อปได้อย่างง่ายดาย ถ้าเรานำมันมาใช้ใน. Net มันคงยากมาก


14
ฉันไม่รู้เกี่ยวกับคอมไพเลอร์ แต่ฉันค่อนข้างแน่ใจว่าการฉาย WinRT .NET มีงานจำนวนมากใน CLR พวกเขาอาจนำรหัส COM Interop กลับมาใช้ใหม่ แต่ก็มีความแตกต่างด้วย (เช่นIInspectableให้คุณทำสิ่งต่าง ๆ เช่นสืบค้นวัตถุสำหรับประเภทคลาสจริงหรือรายการอินเตอร์เฟสที่รองรับทั้งหมดและด้วยไฟล์ winmd เราสามารถฉายข้อมูลเมตาของ WinRT สำหรับทุกสิ่ง ) และไฟล์ winmd ไม่สามารถใช้งานได้ทันทีเนื่องจากชุดประกอบ interop เช่นกัน CLR ต้องจัดการเป็นพิเศษ
Pavel Minaev

5
ไม่แน่ใจว่าคุณไม่สนใจช้าง IInspectable จะเปลี่ยนสำหรับ IDispatch ซึ่งได้ติดอยู่ในปี 1997 คุณทำงานให้กับไมโครซอฟท์ให้ความรู้สึกอิสระที่จะให้ออกไปบางส่วนของความลับที่นี่ :)
ฮันส์ Passant

13
มีการทำงานในทั้ง 3 ภาษาเพื่อรองรับการคาดการณ์ภาษา
ReinstateMonica Larry Osterman

14
ฉันอ้างว่าตอนนี้ 'ความผูกพันที่ดีที่สุดสำหรับ WinRT' คือ C # การรวม CLR นั้นได้รับการปรับให้เหมาะสมยิ่งกว่าการเชื่อมต่อ COM ที่รวดเร็วและภาษา. NET ในการพรีวิว dev ใช้การสนับสนุนที่ยอดเยี่ยมสำหรับฟังก์ชัน async ที่แพร่หลายด้วย 'คอย' ในการสาธิตไม่กี่รหัส C # ทำมากกว่าตัวอย่าง C ++ และทำงานได้ง่ายขึ้น บางทีภายหลัง C ++ จะได้รับส่วนขยาย async helper แต่ในรุ่นนี้ C ++ async ดูแย่มาก และคุณมีโอกาสน้อยที่จะรั่วไหลหน่วยความจำระยะยาวจากการรวบรวมขยะ CLR กว่าการใช้งาน C ++ ที่เป็นปัญหา C # FTW!
Govert

13
@Hans: การฉายภาพที่ 3 คือ CLR สำหรับภาษา CLR ทั้งหมด (โดยหลักคือ C # และ VB) WinJS ยังไม่ใช่ภาพรวมเป็นชุดของห้องสมุดสนับสนุน การฉายภาพถูกสร้างขึ้นโดยตรงในเครื่องยนต์ Chakra JS
ReinstateMonica Larry Osterman

25

WinRT ไม่ได้รับการจัดการเพราะมีวัตถุประสงค์เพื่อทดแทน Win32 ซึ่งเป็น API ระดับต่ำสุดที่นักพัฒนาสามารถเข้าถึงได้สำหรับ Windows API ที่ไม่ได้รับการจัดการยังคงเป็นสิ่งที่มีประสิทธิภาพมากที่สุดที่สามารถเปิดเผยต่อนักพัฒนาได้และเหตุผลก็เป็นไปได้ที่จะห่อ API ที่มีการจัดการไว้ด้านบนซึ่งเป็นสิ่งที่ 'การคาดการณ์' ทำ

นอกจากนี้ยังหมายความว่าผู้พัฒนา C ++ สามารถใช้ WinRT ได้โดยไม่ต้องผ่านห่วงที่ C ++ / CLI แนะนำ (ดูhttp://www2.research.att.com/~bs/bs_faq.html#CppCLI ) ซึ่งหมายความว่าคุณจะยัง ต้องศึกษา COM ถ้าคุณต้องการใช้ WinRT

คำถามที่แท้จริงคือ 'เหตุใดจึงจำเป็น COM? ทำไม Microsoft ต้องประดิษฐ์มันขึ้นมา? ' เนื่องจาก C ++ ธรรมดาที่ไม่มีสิ่งอำนวยความสะดวกทั้งหมดของ COM นั้นไม่เพียงพอสำหรับงาน OOP จริงและการอ้างสิทธิ์ของ C ++ ของ Stroustrup ที่ทำให้คุณ 'พกพา' นั้นมีความไม่พอใจในความเป็นจริงของการทำงาน ดูhttp://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/


อัปเดตลิงก์สำหรับความคิดของ Bjarne ใน C ++ / CLI: stroustrup.com/bs_faq.html#CppCLI
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.