2017-02-15 13 views
11

तो मैं एफ # सीखने की कोशिश कर रहा हूं और जैसे ही मैं नई चीजें सीखता हूं, मैं कवर के तहत क्या हो रहा है यह देखने के लिए आईएल को देखना पसंद करता हूं। मैंने हाल ही में करी के बारे में पढ़ा है, जो भाषा का एक स्पष्ट मौलिक है।क्यों एफ # संकलित अलग कार्यों में संकलन नहीं करता है?

F# for fun and Profit जब आप नीचे समारोह बनाने के अनुसार:

let addItems x y = x + y 

क्या वास्तव में हो रहा है वहाँ दो एकल तर्क कार्यों बनाया जा रहा है।

let addItems x = 
    let subFunction y = 
      x + y 
    subFunction 

और जब आप addItems 5 6 आपरेशन के आदेश के साथ समारोह आह्वान के रूप में

  1. addItems इस प्रकार तर्क 5

  2. addItems साथ कहा जाता है देता है subFunction

  3. subFunction तर्क के साथ कहा जाता है 6
  4. उपखंड में दायरे में तर्क 5 है o यह 5 और 6

की योग जोड़ता है और यह सब सतह पर ठीक लगता है। हालांकि, जब आप इसके लिए आईएल देखते हैं तो यह एक अलग कहानी बताता है।

.method public static int32 testCurry(int32 x, 
             int32 y) cil managed 
{ 
    .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationArgumentCountsAttribute::.ctor(int32[]) = (01 00 02 00 00 00 01 00 00 00 01 00 00 00 00 00) 
    // Code size  5 (0x5) 
    .maxstack 8 
    IL_0000: nop 
    IL_0001: ldarg.0 
    IL_0002: ldarg.1 
    IL_0003: add 
    IL_0004: ret 
} // end of method Sandbox::testCurry 

हम स्पष्ट रूप से आईएल कि एक स्थिर समारोह है कि दो तर्क लेता है और रिटर्न कोई Int32 बनाई गई है में देख सकते हैं।

तो मेरा सवाल है, विसंगति क्यों? यह पहली बार नहीं है जब मैंने आईएल देखा है जो दस्तावेज के साथ जैव नहीं करता है ...

उत्तर

18

तो मेरा सवाल है, विसंगति क्यों?

वास्तविक संकलित आईएल को व्यवहार अनुबंध के संदर्भ में, और वास्तव में नहीं करना चाहिए, मामले की आवश्यकता नहीं है। एक समारोह में संकलन करके, कॉल को जेआईटी/रनटाइम स्तर पर काफी बेहतर अनुकूलन मिलता है।

"वास्तव में क्या हो रहा है ..." वास्तव में यह नहीं है कि वास्तव में क्या हो रहा है, यह और भी है "यह लिखने और एफ # कोड का उपयोग करने के बारे में तर्क क्यों होना चाहिए ..."। रनटाइम पर्यावरण का सबसे अच्छा उपयोग करने के लिए अंतर्निहित कार्यान्वयन को आवश्यकतानुसार बदलने के लिए स्वतंत्र होना चाहिए।

+0

मैं मानता हूं कि इसे यथासंभव अनुकूलित किया जाना चाहिए। हालांकि, जब आप मुझे एक बात बताते हैं और कुछ और हो रहा है, तो क्या यह बड़े कोड अड्डों में प्रदर्शन समस्याओं के लिए एक बड़ा अवसर नहीं छोड़ता है, या बग खोजने में मुश्किल नहीं है? –

+7

@ एंथनी रसेल आपको व्यवहारिक अनुबंध बताया जाता है - जो नहीं बदला जा सकता है। यदि कंपाइलर व्यवहार में भिन्न होने के कारण बग का कारण बनता है, तो यह एक कंपाइलर बग है (और तय किया जाना चाहिए)। इसी तरह की चीजें सबसे अधिक (सभी उत्पादन गुणवत्ता?) संकलित भाषाओं में होती हैं - संकलक आम तौर पर "बेहतर" तरीके से बहुत सारे कोड को फिर से लिखता है लेकिन समान रनटाइम व्यवहारिक गारंटी और उपयोग विशेषताओं को रखता है। –

+0

ठीक है, सब ठीक लगता है। त्वरित प्रतिक्रिया के लिए धन्यवाद! –

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