Windows 8 แนะนำ WinRT ซึ่งเหมือนกับ. NET แต่ไม่มีการจัดการ ทำไมถึงไม่มีการจัดการ มันเป็นปัญหาด้านประสิทธิภาพหรือไม่? หมายความว่าการรวบรวมขยะไม่เหมาะสำหรับ API ระดับล่างหรือไม่
Windows 8 แนะนำ WinRT ซึ่งเหมือนกับ. NET แต่ไม่มีการจัดการ ทำไมถึงไม่มีการจัดการ มันเป็นปัญหาด้านประสิทธิภาพหรือไม่? หมายความว่าการรวบรวมขยะไม่เหมาะสำหรับ API ระดับล่างหรือไม่
คำตอบ:
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 มันคงยากมาก
IInspectable
ให้คุณทำสิ่งต่าง ๆ เช่นสืบค้นวัตถุสำหรับประเภทคลาสจริงหรือรายการอินเตอร์เฟสที่รองรับทั้งหมดและด้วยไฟล์ winmd เราสามารถฉายข้อมูลเมตาของ WinRT สำหรับทุกสิ่ง ) และไฟล์ winmd ไม่สามารถใช้งานได้ทันทีเนื่องจากชุดประกอบ interop เช่นกัน CLR ต้องจัดการเป็นพิเศษ
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/