18

आइए कहें कि मैं एक नई प्रोग्रामिंग भाषा बनाना चाहता हूं या एमएस (हास्केल, जावा ... जो कुछ भी) द्वारा समर्थित नहीं है, लेकिन विंडोज 8 मेट्रो/winRT के खिलाफ कोड करने में सक्षम होना चाहता हूं।विंडोज 8 मेट्रो/winRT में नई जेआईटी-एड प्रोग्रामिंग भाषा संभव है?

मुझे पता है कि मेट्रो यूआई में सभी ऐप्स sandboxed हैं।
मुझे पता है कि मैं देशी सी ++ में प्रोग्राम कर सकता हूं, इसलिए मुझे लगता है कि मैं इसे सी या असेंबली में भी कर सकता हूं।
लेकिन:

  1. यह एक JIT कि मक्खी पर विधानसभा कोड का उत्पादन करेगा बनाने के लिए संभव है - सैंडबॉक्स प्रतिबंध को तोड़ने के बिना CLR JIT- की तरह?
  2. मान लीजिए कि मैं केवल API allowed in Metro sandbox का उपयोग करूंगा क्या एक्सएएमएल को UI इंटरफ़ेस के रूप में उपयोग करना संभव नहीं है? - क्या मैं सीधे डायरेक्ट 2 डी/डायरेक्टएक्स का उपयोग कर सकता हूं?

उत्तर

13

जैसा कि मैं कह सकता हूं, यह इस पर कॉल करने के लिए बहुत जल्दी तरीका है। मैं व्यक्तिगत रूप से नहीं जानता कि वर्चुअलप्रोटेक्ट(), कोर विनैपी फ़ंक्शन का उपयोग किए बिना एक जिटर कैसे लिखना है जो आपको जिटर द्वारा निष्पादन योग्य कोड में जेनरेट किए गए मशीन कोड के साथ मेमोरी का एक हिस्सा बदल देता है।

WinRT ऐप के लिए कई देशी winapi फ़ंक्शन उपलब्ध हैं। धन्य सिस्टम फ़ंक्शंस की सूची available here है। स्मृति से संबंधित एपिस बहुत सीमित हैं, वर्चुअलक्वियर सूची में केवल एक ही है जो करीब आता है।

तो वर्तमान भाषा अनुमान कैसे करते हैं? चलो देखते हैं। सीएलआर का एक प्रक्षेपण है, यह किसी भी मेट्रो ऐप में लोड हो जाता है जिसे आप प्रबंधित भाषा में लिखते हैं जैसे सी #। C: \ windows \ microsoft.net \ framework \ v4.0.30319 \ clr.dll पर dumpbin.exe/imports चलाना Windows DLL पर निर्भरताओं की एक बहुत बड़ी सूची उत्पन्न करता है। कि डंप से एक टुकड़ा:

Dump of file clr.dll 

File Type: DLL 

    Section contains the following imports: 

    KERNEL32.dll 
... 

       430 RaiseException 
       581 VirtualAlloc 
       584 VirtualFree 
       589 VirtualQuery 
       587 VirtualProtect   <=== here! 
       339 HeapDestroy 
       336 HeapAlloc 
       342 HeapValidate 
       540 SleepEx 
       547 SwitchToThread 
       ... etc 

एक और भाषा प्रक्षेपण "चक्र" इंजन में लागू, जावास्क्रिप्ट के लिए है। यह पता लगाने में मुश्किल है कि डीएलएल उस इंजन को लागू करता है, यह सिर्फ एक कोड नाम है। अप्रबंधित डीबगिंग सक्षम के साथ एक नमूना जावास्क्रिप्ट प्रोजेक्ट चला रहा है "jscript9.dll" लोड किया गया है। आइए इस पर dumpbin.exe/आयात करें:

.... 
    6898F4D5 10D DebugBreak 
    6891FDA1 55E TerminateProcess 
    6898EF9E 57E UnhandledExceptionFilter 
    6891FD58 43C RaiseException 
    68903BB7 59E VirtualProtect     <=== here! 
    6A218590 366 InterlockedPushEntrySList 
    6A2185A9 365 InterlockedPopEntrySList 
    6A2195AA 35C InitializeSListHead 
    689026F9 598 VirtualAlloc 
    68902852 59B VirtualFree 
    6890603E 4A2 ResetWriteWatch 
    ...etc 

ठीक है, यह वहां है। यह होना होगा। समस्या है, अभी आप इस फ़ंक्शन को कॉल नहीं कर सकते हैं। यह निश्चित रूप से स्टोर सत्यापनकर्ता से जांच पास नहीं करेगा।

इसे कम से कम वास्तविक WinRT उपलब्ध हो जाता है, जो एआरएम कोर पर चलता है।Win32 के शीर्ष पर चलने वाला कोई भी नहीं जो अब आप Windows 8 उपभोक्ता पूर्वावलोकन में चल रहे हैं। और आसानी से छंटनी सूची न केवल मौजूदा winapi कार्यों का लाभ ले सकते हैं। यह शायद साल के अंत में होने वाला है, शायद। अगले वर्ष की गर्मियों तक असली हार्डवेयर आपके हाथों में नहीं होगा।

+1

WinRT लगभग एक सैंडबॉक्स के रूप में कार्य कर रहा है, इसलिए वर्चुअलअलोक/वर्चुअलप्रोटेक्ट को एपीआई एक्सेस नहीं बदला जा रहा है, क्योंकि एपीआई OEM के लिए लगभग तैयार है। असल में, एनईटी सीएलआर/जेआईटी (और सभी गतिशील .NET भाषाओं के लिए जो भी जा सकते हैं) के अलावा, एक जेआईटी लागू करने का कोई तरीका नहीं होगा। – xoofx

+1

जब मैं विनआरटी के बारे में बात करता हूं, तो मैं पूरे "विनरेट पारिस्थितिक तंत्र" के बारे में बात कर रहा था जिसका मतलब शुद्ध "विनआरटी" + विन 32/COM अधिकृत एपीआई है। विंडोज 8 मेट्रो ऐप के लिए प्रतिबंधित Win32/COM API लगभग सैंडबॉक्स के रूप में कार्य कर रहा है। तो पीई सेक्शन को पढ़ने के लिए कोई रास्ता नहीं होगा + लिखना + निष्पादन योग्य, इसलिए कोई भी जेआईटी नहीं। यह अब तक विंडोज 8 मेट्रो में डिज़ाइन द्वारा है, और मुझे अत्यधिक संदेह है कि यह डिज़ाइन रिलीज पूर्वावलोकन से 1 महीने पहले बदल जाएगा। – xoofx

+0

'HEAP_CREATE_ENABLE_EXECUTE' के साथ 'हेपक्रेट'? –

7

हां, अन्य प्रोग्रामिंग भाषाओं के लिए WinRT पर एक प्रक्षेपण लिखना संभव है। यह भी प्रोत्साहित किया जाता है। Lang.Next नामक एक सम्मेलन इस महीने के शुरू में माइक्रोसॉफ्ट परिसर में आयोजित किया गया था, और यह भाषा डिजाइन के बारे में था। सत्रों में से एक विशेष रूप से इस विषय पर था, और आप इसे देखना चाहते हैं (मेरे पास है): http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2012/The-Windows-Runtime और पृष्ठ पर भी टिप्पणियां पढ़ें। मुझे एक बोली करते हैं:

मार्टिन यह स्पष्ट कर दिया है कि हम न केवल भाषा डिजाइनरों और इसको लागू करने के लिए अपने भाषा और toolchains के लिए लक्ष्य प्लेटफार्मों की अपनी सूची को WinRT जोड़ना चाहते हैं, लेकिन हम मदद और सलाह देंगे।

तो शुरू करें! :-)

5

1) उन ब्राउज़रों के अलावा जो कुछ प्रतिबंधित एपीआई तक पहुंच सकते हैं (और उनके जेआईटी को एकीकृत करने में सक्षम हो सकते हैं, लेकिन afaik, ब्राउज़र के लिए अधिकृत एपीआई अभी तक प्रकाशित नहीं हैं), मानक Win8 मेट्रो ऐप तक कोई पहुंच नहीं होगी "वर्चुअलअलोक/वर्चुअलप्रोटेक्ट" जैसे कार्यों (पढ़ने/लिखने/निष्पादन योग्य मेमोरी पेज बनाने/बदलने के लिए उपयोग किया जाता है): इसका मतलब है कि विंडोज 8 मेट्रो ऐप के तहत सी ++ में विकसित जेआईटी प्रमाणीकरण पास नहीं करेगा। आप विजुअल स्टूडियो 11 बीटा के साथ उपलब्ध प्रमाणीकरण टूलकिट के साथ पहले से ही अपने आवेदन की जांच कर सकते हैं।

कोई कह सकता है, "मैं वर्चुअलअलोक/वर्चुअलप्रोटेक्ट फ़ंक्शंस का उपयोग किये बिना पढ़ने के लिए पीई सेक्शन को पढ़ने के लिए पीई अनुभाग को हैक करने जा रहा हूं, लेकिन दुर्भाग्यवश, यह हैक आपके साथ काम नहीं करेगा, जैसा कि आपको मजबूर किया गया है विकल्प/NXCOMPAT के साथ एक विंडोज 8 मेट्रो एक्सई संकलित करने के लिए: हाँ, जिसका अर्थ है कि यह "डेटा निष्पादन रोकथाम" (डीईपी) सक्षम कर रहा है।

एक और व्यक्ति को फ्लाई पर डीएलएल उत्पन्न करने के लिए प्रेरित किया जा सकता है और उन्हें "लोडपेकगेड लाइब्रेरी" का उपयोग करके डिस्क से लोड किया जा सकता है लेकिन यह फ़ंक्शन वास्तव में लॉक हो जाता है यदि डीएलएल मूल परिनियोजन का हिस्सा नहीं था (वास्तव में, मैं नहीं रहा हूं इसे ठीक से काम करने में सक्षम)

उपलब्ध एकमात्र जेआईटी .NET JIT है। आयरनपीथन/आयरन रूबी जैसी सभी .NET गतिशील भाषाएं (यदि वे Win8 मेट्रो के लिए अपडेट की गई हैं) जो डीएलआर (.NET में डायनामिक लैंग्वेज रनटाइम) का उपयोग कर रहे हैं या यहां तक ​​कि प्रतिबिंब एमिट भी लगाया जाएगा। तो यदि आप .NET CLR बाइटकोड को लक्षित करते हैं, तो आप अपना कोड लगा सकते हैं।

उदाहरण के लिए, IKVM.Net, जो .NET CLR के अंदर जावा कोड चलाने में सक्षम है, विंडोज 8 मेट्रो ऐप के तहत चलाने में सक्षम हो सकता है (फिर भी इस शर्त पर कि इसे केवल प्रमाणित Win8 मेट्रो API का उपयोग करने के लिए पुन: उपयोग किया जाएगा)।

2) हां, एक्सएएमएल का उपयोग किए बिना डायरेक्ट 2 डी/डायरेक्ट 3 डी 11 एप्लीकेशन लिखना संभव है।

विंडोज 8 मेट्रो नमूने http://code.msdn.microsoft.com/windowsapps/Windows-8-Modern-Style-App-Samples देखें। उदाहरण के लिए, अधिकांश डायरेक्ट 2 डी नमूने एक्सएएमएल का उपयोग नहीं कर रहे हैं।

मेट्रो विंडो सिस्टम के लिए निम्न स्तर एपीआई कोरविंडो क्लास शुद्ध डायरेक्ट 2 डी/डायरेक्ट 3 डी 11 एप्लिकेशन के लिए प्रवेश बिंदु है।

+0

क्या डीईपी वास्तव में स्मृति निष्पादन को स्मृति से रोकता है जिसे स्पष्ट रूप से निष्पादन योग्य के रूप में चिह्नित किया जाता है? सामान्य कोड अनुभाग अभी भी निष्पादन योग्य है AFAIK –

0

यह ध्यान देने योग्य है कि यदि आप एक जेआईटी काम करने में कामयाब रहे हैं, शायद मूल मशीन कोड के बजाय सीएलआर बाइटकोड उत्सर्जित करके, या यहां तक ​​कि यदि आपने अभी भी एक जेआईटी के बिना एक दुभाषिया लागू किया है, तो आप केवल उस कोड को चला सकते हैं आपके मूल ऐप पैकेज में शामिल है। यदि आपने एप्लिकेशन के बाहर से स्क्रिप्ट/बाइटकोड/आदि ... डाउनलोड किया है और उसे "स्थानीय संदर्भ" (यानि WinRT पुस्तकालयों तक सीधी पहुंच के साथ) में चलाने/चलाने के लिए प्रयास किया है, तो आप (संभव अपवाद के साथ - नीचे नोट देखें) एप्लिकेशन को प्रमाणीकरण आवश्यकताओं की धारा 3.9 के उल्लंघन में हो:

3,9 सभी एप्लिकेशन तर्क से ही शुरू करना चाहिए, और में रहते हैं, अपने अनुप्रयोग पैकेज आप एप्लिकेशन बदलने के लिए या किसी भी रूप के माध्यम से पैक सामग्री का विस्तार करने के प्रयास नहीं करना चाहिए कोड या डेटा के गतिशील समावेशन के बारे में जो यह बदलता है कि एप्लिकेशन विंडोज रनटाइम के साथ कैसे इंटरैक्ट करता है, या स्टोर नीति के संबंध में व्यवहार करता है। यह अनुमत नहीं है, उदाहरण के लिए, एक दूरस्थ स्क्रिप्ट डाउनलोड करने के लिए और बाद में उस ऐप को अपने ऐप पैकेज के स्थानीय संदर्भ में निष्पादित करें।

यहां पर मुश्किल शब्द इस "स्थानीय संदर्भ" वाक्य में है। यह स्पष्ट नहीं है कि इसका क्या मतलब है।उदाहरण के लिए, यदि आपके पास किसी वेबसाइट के लिए खुले पोर्टल के साथ एक वेब ब्राउज़र नियंत्रण है (या "वेब संदर्भ" में चलने वाले एचटीएमएल ऐप में आईफ्रेम), तो वह वेब ब्राउजर/आईफ्रेम जेआईटीड जावास्क्रिप्ट कोड "चल रहा है" है, लेकिन यह एक अलग "संदर्भ" में भाग लेंगे, और WinRT apis तक सीधे पहुंच नहीं है। यह स्पष्ट नहीं है कि यह अपवाद केवल एक्सएएमएल में आईई ब्राउज़र नियंत्रण या एचटीएमएल ऐप्स में आईफ्रेम डब्ल्यू/वेब संदर्भ के लिए है, या आप अपने दुभाषिया या गतिशील रनटाइम में अपना "वेब संदर्भ" लागू कर सकते हैं या नहीं।

कहा जा रहा है कि आपको किसी भी प्रकार के एप्लिकेशन कोड को ऐप में प्रमाणित करने और प्रमाणित करने के तरीके के रूप में पूर्व-संकलित करने की अनुमति है, इसके अलावा आईओएस पर यह कैसे किया जाता है, सिवाय इसके कि आपके पास प्री- .NET, मूल मशीन कोड, या जावास्क्रिप्ट को संकलित करना।

6

Here's a trick I found to gain access to these missing APIs (VirtualAlloc, VirtualProtect), which are required in order to implement a jitter (अस्वीकरण: यह मेरा ब्लॉग है)।

असुरक्षित सी # कोड के साथ खेलकर, आप .NET प्रतिबिंब पर लगाए गए प्रतिबंधों को बाईपास करके और आंतरिक पी/Invoke विधि Win32Native.GetProcAddress पर आक्रमण कर सकते हैं। एक बार आपके पास यह कार्य हो जाने के बाद, आप स्वचालित रूप से VirtualAlloc सहित किसी भी Win32 फ़ंक्शन तक पहुंच प्राप्त कर सकते हैं।

+0

आपका उत्तर पोस्ट करने के लिए धन्यवाद! कृपया सावधानीपूर्वक [स्व-संवर्धन पर अक्सर पूछे जाने वाले प्रश्न] (http://stackoverflow.com/faq#promotion) को पढ़ना सुनिश्चित करें। यह भी ध्यान रखें कि यह * आवश्यक * है कि जब भी आप अपनी साइट/उत्पाद से लिंक करते हैं तो आप एक अस्वीकरण पोस्ट करते हैं। –

+0

@AndrewBarber धन्यवाद, तय है – Andrea

संबंधित मुद्दे