Swift写的是什么语言?

时间:2015-07-09 18:27:07

标签: swift

好吧,就像标题所说的那样,用SwiftApple的语言,而不是其他Swift的东西)编写的语言是什么?更具体地说,编写的编译器是什么。它是用C(像其他语言一样)还是用其他一些神奇的,未知的直到超级语言编写的?或者它是一些奇怪的递归,引导式版本的Swift?在这个问题上,网络非常安静。

3 个答案:

答案 0 :(得分:36)

源代码有just been made available on Github,看来Swift本身主要用C++编写,其标准库是用Swift编写的。

有关详细信息,请参阅this press release from Apple和新的Swift.org web site

答案 1 :(得分:7)

Swift在C中实现。您可以在此处查看一个人的分析概述:https://github.com/rodionovd/SWRoute/wiki/Function-hooking-in-Swift

随着Swift开源,我想这个问题将在那时得到更全面的回答。

我将在下面添加一部分,但如果您有兴趣,请务必阅读整个分析:

func call_function(f : () -> Int) {
    let b = f()
}

func someFunction() -> Int {
    return 0
}

在Swift中我们只写call_function(someFunction)。 但是,不是将调用作为call_function(& someFunction)执行,而是Swift编译器生成代码:

struct swift_func_wrapper *wrapper =  ... /* configure wrapper for someFunction() */
struct swift_func_type_metadata *type_metadata = ... /* information about function's arguments and return type */
call_function(wrapper->trampoline, type_metadata);

包装器具有以下结构:

struct swift_func_wrapper {
    uint64_t **trampoline_ptr_ptr; // = &trampoline_ptr
    uint64_t *trampoline_ptr;
    struct swift_func_object *object;
}

什么是swift_func_object类型?要创建此对象,Swift运行时使用名为metadata [N]的全局常量(对于每个函数调用都是唯一的,它将您的func作为泛型类型的参数,因此对于此代码:

func callf(f: () -> ()) {
    f();
}
callf(someFunction);
callf(someFunction);

将创建两个常量元数据和metadata2。

元数据[N]的结构有点:

struct metadata {
    uint64_t *destructor_func;
    uint64_t *unknown0;
    const char type:1; // I'm not sure about this and padding,
    char padding[7];   // maybe it's just a uint64_t too...
    uint64_t *self; 
}

最初,metadataN只设置了两个字段:destructor_func和type。第一个是指向函数的指针,该函数将用于释放使用swift_allocObject()创建的对象的所有内存。而后者是对象的类型标识符(函数/方法的0x40或'@'),并且(以某种方式)由swift_allocObject()用来为我们的func创建一个正确的对象:

swift_allocObject(&metadata2->type, 0x20, 0x7);

创建func对象后,它具有以下结构:

struct swift_func_object {
    uint64_t *original_type_ptr;
    uint64_t *unknown0;
    uint64_t function_address;
    uint64_t *self;
}

第一个字段是指向相应元数据[N] - >类型值的指针,第二个字段似乎是0x4 | 1<< 24(0x100000004),这表明可能是什么(不知道是什么)。 function_address是我们实际感兴趣的钩子,而self(突然)是指向self的指针(如果我们的对象代表一个普通函数,则该字段为NULL)。

答案 2 :(得分:-11)

它使用Xcode 6中包含的LLVM编译器框架构建,并使用Objective-C运行时,允许C,Objective-C,C ++和Swift代码在单个程序中运行。

来自swift wikipedia