2016-01-27 8 views
8

स्विफ्ट 2.2 में डार्विन लाइब्रेरी पढ़ने के दौरान, मुझे कोड नीचे मिले।स्विफ्ट भाषा में '@_silgen_name' क्या है?

@warn_unused_result 
@_silgen_name("_swift_Darwin_sem_open2") 
internal func _swift_Darwin_sem_open2(
    name: UnsafePointer<CChar>, 
    _ oflag: CInt 
) -> UnsafeMutablePointer<sem_t> 

दूसरी पंक्ति में '@_silgen_name' क्या है?

मुझे here से नीचे दी गई जानकारी मिली, लेकिन मुझे ऐप्पल डेवलपर लाइब्रेरी की तरह अधिक जानकारी जानकारी चाहिए।

यदि यह आप सी से कॉल करना चाहते हैं स्विफ्ट कार्यों का सिर्फ एक विशिष्ट सेट है, तो आप घायल नाम ओवरराइड करने के लिए @_silgen_name विशेषता का उपयोग कर सकते हैं, और/या उन्हें @convention (ग) बनाने सी कॉलिंग का उपयोग सम्मेलन।

+0

आपको बहुत धन्यवाद @ dfri! –

+0

मदद करने के लिए खुश :) – dfri

उत्तर

11

@_silgen_name अभी हाल ही में निम्नलिखित प्रतिबद्ध संदेश के साथ @asmname (see the following commit) से नाम दिया गया था:

इस तथ्य को दर्शाता है कि विशेषता के केवल संकलक आंतरिक उपयोग के के लिए, और वास्तव में नहीं है सी के एएसएम विशेषता के बराबर, क्योंकि यह कॉलिंग सम्मेलन को सी-संगत नहीं बदलता है।

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

अब, @_silgen_name कुछ विकल्पों के साथ कक्षा SILGenNameAttr के लिए एक विशेषता (मैक्रो) है, जहां बाद में स्विफ्ट abstract syntax tree (AST) का हिस्सा है। से swift/AST/Attr.def source code (भी swift/lib/AST/Attr.cpp देख)

// Schema for DECL_ATTR: 
// 
// - Attribute name. 
// - Class name without the 'Attr' suffix (ignored for 
// - Options for the attribute, including: 
// * the declarations the attribute can appear on 
// * whether duplicates are allowed 
// * whether the attribute is considered a decl modifier or not (no '@') 
// - Unique attribute identifier used for serialization. This 
// can never be changed. 
// 
// SIMPLE_DECL_ATTR is the same, but the class becomes 
// SimpleDeclAttr<DAK_##NAME>. 
// 

DECL_ATTR(_silgen_name, SILGenName, 
      OnFunc | OnConstructor | OnDestructor | LongAttribute | 
      UserInaccessible, 0) 

हम swift/AST/Attr.h में SILGeneNameAttr की घोषणा लगता है:

/// Defines the @_silgen_name attribute. 
class SILGenNameAttr : public DeclAttribute { 
public: 
    SILGenNameAttr(StringRef Name, SourceLoc AtLoc, SourceRange Range, bool Implicit) 
    : DeclAttribute(DAK_SILGenName, AtLoc, Range, Implicit), 
     Name(Name) {} 

    SILGenNameAttr(StringRef Name, bool Implicit) 
    : SILGenNameAttr(Name, SourceLoc(), SourceRange(), /*Implicit=*/true) {} 

    /// The symbol name. 
    const StringRef Name; 

    static bool classof(const DeclAttribute *DA) { 
    return DA->getKind() == DAK_SILGenName; 
    } 
}; 

सारांश में; यह सी कार्यों के लिए एक स्विफ्ट इंटरफ़ेस प्रदान करने से संबंधित है। आपको डेवलपर लाइब्रेरी में SILGenNameAttr से संबंधित किसी भी विवरण को खोजने में कठिनाई होगी, और इसे एक अनियंत्रित सुविधा पर विचार कर सकते हैं।


अंत में, रस बिशप के साथ निम्न बात आप के लिए ब्याज की हो सकती है:

टूलबॉक्स: ड्रेगन यहाँ वहाँ हो (34:20)

मैं किसी भी परिस्थितियों में एक उत्पादन आवेदन में यह जहाज नहीं होगा। लेकिन अगर आप साहसी महसूस कर रहे हैं, तो वे यहां हैं।

@asmname एक समारोह को सजाने के लिए एक विशेषता है। एबीआई को इसका इस्तेमाल करने के लिए आपको निश्चित रूप से की आवश्यकता है। स्विफ्ट आपको मार्शल पैरामीटर में बहुत मदद नहीं करेगा।कंपाइलर बहुत क्षमाशील नहीं होने वाला है, इसलिए आपको यह सुनिश्चित करना होगा कि आपने अपने पैरामीटर को उस प्रारूप में छेड़छाड़ की है जो इसके अनुकूल है। निम्नलिखित कोड दिखाता है कि इसे कैसे घोषित किया जाए। फ़ंक्शन विशेषता दें, @asmname, और स्ट्रिंग प्रतीक दें; फिर रिटर्न प्रकार में अपने तर्क कार्य करें। कंपाइलर शिकायत नहीं करेगा अगर आपको तर्क गलत लगता है या गलत तरीके से टाइप करें। यह केवल उम्मीद करता है कि वह प्रतीक मौजूद है, और जब यह उस पर कूदता है, तो यह बेहतर है कि उन तर्कों को लें और उस वापसी प्रकार को प्राप्त करें।

@asmname("dispatch_get_current_queue") func _get_current_queue() -> dispatch_queue_t 

क्यू & एक (37:08)

क्यू: जाहिर है इन सब नहीं एप्पल द्वारा लिखित हैं, तो क्या इन सभी व्यवहार की खोज की अपनी प्रक्रिया है?

Russ: मैं पहले दस्तावेज़ीकरण को देखूंगा, लेकिन आप सही हैं कि वहां बहुत सी चीजें हैं जो वहां नहीं हैं। यदि आप स्विफ्ट आरईपीएल पर जाते हैं और ध्वज का उपयोग करते हैं - मुझे लगता है कि यह -deprecated-integrated-repl जैसा कुछ है - आप इसे स्विफ्ट मॉड्यूल और एक्सकोड को दिखाने वाले सभी बिट्स को प्रिंट करने के लिए कह सकते हैं। यदि आप टूलचैन निर्देशिका एक्सकोड में खोदते हैं, तो आप libswiftCore और libswiftRuntime में सामान भी पा सकते हैं।

जेपी: आप स्विफ्ट के साथ कुछ और असुरक्षित काम करने में रुचि रखते हैं, तो आप @asmname और भाषा "स्विफ्ट" के लिए GitHub में एक कोड खोज कर सकते हैं, और आप वास्तव में बुरा के एक झुंड दिखाई देंगे, लेकिन दिलचस्प सामान।

एक बिशप 'ब्लॉग से थोड़े से पुराने पोस्ट:

...

सबसे पहले नोटिस @asmname विशेषता। यह DllImport या extern के बराबर है। यह स्विफ्ट को बताता है कि हम में कुछ लाइब्रेरी में लिंक करने जा रहे हैं जो दिए गए नाम के साथ एक फ़ंक्शन को परिभाषित करता है और दिए गए तर्कों से मेल खाता है। "बस मुझे स्विफ्ट पर विश्वास करो, मुझे पता है कि मैं क्या कर रहा हूं"। संकेत: आप बेहतर जानते थे कि आप क्या कर रहे हैं।

0

कम कहना करने के लिए, @_silgen_name समारोह साझा लाइब्रेरी पर दिखाया के नाम को परिभाषित करता है।

Glibc.swift बताता है कि _swift_Glibc_open परिभाषित किया गया है।

आप इसे nm /usr/lib/swift/linux/libswiftGlibc.so द्वारा देख सकते हैं।

00000000000016f0 t _swift_Glibc_fcntl 
0000000000001700 t _swift_Glibc_fcntlPtr 
00000000000016b0 t _swift_Glibc_open 
00000000000016c0 t _swift_Glibc_openat 
00000000000016d0 t _swift_Glibc_sem_open2 
00000000000016e0 t _swift_Glibc_sem_open4 
संबंधित मुद्दे