Was ist '@_silgen_name' in der Swift-Sprache?

8

Beim Lesen der Darwin-Bibliothek in Swift 2.2 habe ich die folgenden Codes gefunden.

%Vor%

Was ist '@_silgen_name' in der zweiten Zeile?

Ich habe unten eine Information von hier gefunden, aber Ich möchte mehr Detailinformationen, wie die Apple Developer Library.

  

Wenn es sich nur um eine bestimmte Gruppe von Swift-Funktionen handelt, die Sie aus C aufrufen möchten, können Sie das Attribut @_silgen_name verwenden, um den fehlenden Namen zu überschreiben, und / oder @convention (c) verwenden, um die C-Aufrufkonvention zu verwenden / p>

    
SeungHyun Lee 27.01.2016, 07:18
quelle

2 Antworten

11

@_silgen_name wurde erst vor Kurzem von @asmname ( siehe folgenden Commit ) mit der neuen Version umbenannt folgende Commit-Nachricht:

  

Dies spiegelt die Tatsache wider, dass das Attribut nur für   Compiler-interne Verwendung und ist nicht wirklich äquivalent zu C asm   Attribut, da es die Aufrufkonvention nicht ändert   C-kompatibel.

Als allgemeiner Swift-Entwickler würde man also nicht auf dieses Attribut stoßen, es sei denn, es würde beispielsweise Swift auf eine andere Plattform portieren.

Nun ist @_silgen_name ein Attribut (Makro) für die Klasse SILGenNameAttr mit bestimmten Optionen, wobei letztere Teil von Swifts ist abstrakter Syntaxbaum (AST) . Aus dem swift/AST/Attr.def Quellcode (siehe auch swift/lib/AST/Attr.cpp )

%Vor%

Wir finden die Deklaration von SILGeneNameAttr in swift / AST / Attr. h :

%Vor%

Zusammenfassend; Es bezieht sich auf eine Swift-Schnittstelle für C-Funktionen. Sie werden sehr wahrscheinlich Schwierigkeiten haben, Details zu SILGenNameAttr in der Entwicklerbibliothek zu finden, und können dies als nicht dokumentierte Funktion betrachten.

Schließlich könnte das folgende Gespräch mit Russ Bishop für Sie von Interesse sein:

  

Die Toolbox: Hier sind Drachen (34:20)

     

Ich würde das nicht in einer Produktionsanwendung unter irgendwelchen schicken   Umstände. Aber wenn du dich abenteuerlustig fühlst, sind sie hier.

     

@asmname ist ein Attribut zum Verzieren einer Funktion. Du brauchst es auf jeden Fall   um den ABI zu verstehen, diesen zu benutzen. Swift wird dir nicht helfen   Marshall die Parameter sehr. Der Compiler wird nicht sein   sehr nachsichtig, also musst du sicherstellen, dass du deine manipuliert hast   Parameter in ein Format, mit dem es kompatibel ist. Der folgende Code   zeigt, wie man es deklariert. Geben Sie das Funktionsattribut @asmname und   das Zeichenkettensymbol; dann funktionieren seine Argumente im Rückgabetyp. Das   Compiler wird sich nicht beschweren, wenn Sie die Argumente falsch erhalten oder zurückgeben   falsch eingeben. Es erwartet nur, dass dieses Symbol existiert und wann es   springt zu ihm, es besser nehmen diese Argumente und haben diesen Rückgabetyp.

%Vor%      

Q & A (37:08)

     

Q : Offensichtlich sind nicht alle diese von Apple dokumentiert. Was ist also Ihr Prozess, all diese Verhaltensweisen zu entdecken?

     

Russ : Ich schaue mir zuerst die Dokumentation an, aber Sie haben recht, dass es viele Sachen gibt, die nicht drin sind. Wenn du zum Swift gehst   REPL und benutze die Flagge - ich denke es ist so etwas wie    -deprecated-integrated-repl - Sie können es anfordern, das Swift-Modul und alle Bits zu drucken, die Xcode Ihnen nicht anzeigt. Wenn du dich in den   toolchain Verzeichnis Xcode, finden Sie auch Sachen in libswiftCore und   libswiftRuntime.

     

JP : Wenn Sie mit Swift unsicherere Dinge tun möchten, können Sie in GitHub eine Codesuche für @asmname und Sprache durchführen   "Swift", und du wirst eine Menge wirklich schlechter, aber interessanter Sachen sehen.

Ein etwas älterer Beitrag aus dem Blog der Bischöfe:

  

...

     

Beachten Sie zuerst das Attribut @asmname . Dies ist das Äquivalent von    DllImport oder extern . Es sagt Swift, dass wir uns eingliedern werden   eine Bibliothek, die eine Funktion mit dem angegebenen Namen und der Übereinstimmung definiert   die gegebenen Argumente. "Vertrau mir einfach Swift, ich weiß, was ich tue" .   Tipp: Du solltest besser wissen, was du tust.

    
dfri 27.01.2016, 10:42
quelle
0

Um kurz zu sagen, @_silgen_name definiert einen Namen der Funktion, die in der gemeinsam genutzten Bibliothek angezeigt wird.

Glibc.swift sagt, dass _swift_Glibc_open definiert ist.

Sie können dies durch nm /usr/lib/swift/linux/libswiftGlibc.so so sehen.

%Vor%     
A.N 09.03.2016 04:39
quelle

Tags und Links