2015-07-09 18 views
14

Vâng, giống như tiêu đề cho biết, ngôn ngữ nào là Swift (ngôn ngữ của Apple, không phải là điều Swift khác) được viết bằng? Cụ thể hơn, trình biên dịch được viết là gì. Có phải nó được viết bằng C (giống như mọi ngôn ngữ khác) hay một số ngôn ngữ siêu phép thuật, chưa biết-til-bây giờ khác không? Hay là một số phiên bản Swift, đệ quy, khởi động khó hiểu? Web là kỳ lạ yên tĩnh về vấn đề này.Swift được viết bằng ngôn ngữ nào?

+3

có thể giống như mọi thứ khác, nó bắt đầu bằng C hoặc C++, sau đó trở thành tự lưu trữ –

+0

Bạn có hỏi về ngôn ngữ được sử dụng để viết trình biên dịch Swift hay không ? – Aderis

+0

Apple nói rằng nó bị ảnh hưởng bởi Obj-C nhưng nó là ngôn ngữ sở hữu độc quyền của nó tại thời điểm này chia sẻ hỗ trợ trình biên dịch với các ngôn ngữ C/C++/Obj-C. –

Trả lời

-9

Nó được xây dựng với khung trình biên dịch LLVM bao gồm trong Xcode 6 và sử dụng thời gian chạy Objective-C, cho phép mã C, Objective-C, C++ và Swift chạy trong một chương trình.

từ swift wikipedia

8

Swift được thực hiện trong C. Bạn có thể xem tổng quan phân tích của một người ở đây: https://github.com/rodionovd/SWRoute/wiki/Function-hooking-in-Swift

Với Swift sẽ mã nguồn mở, tôi tưởng tượng câu hỏi này sẽ được giải đáp hoàn toàn hơn ở đó điểm.

tôi sẽ bao gồm một phần dưới đây, nhưng chắc chắn đọc toàn bộ phân tích nếu bạn quan tâm:

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

func someFunction() -> Int { 
    return 0 
} 

Trong Swift chúng ta chỉ cần viết call_function (someFunction). Nhưng thay vì thực hiện cuộc gọi như call_function (& someFunction), Swift trình biên dịch tạo ra các mã:

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); 

Một wrapper có cấu trúc sau:

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

Và loại swift_func_object là gì? Để tạo đối tượng này, thời gian chạy Swift sử dụng một hằng số toàn cầu mang tên siêu dữ liệu [N] (đó là duy nhất cho mỗi cuộc gọi chức năng mà mất func của bạn như là một cuộc tranh cãi của một loại chung chung, do mã này:

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

hai hằng số siêu dữ liệu và siêu dữ liệu 2 sẽ được tạo).

Một siêu dữ liệu [N] cấu trúc’s là kinda này:

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; 
} 

Ban đầu metadataN chỉ có hai lĩnh vực thiết lập: destructor_func và loại. Đầu tiên là một con trỏ trỏ tới một hàm sẽ được sử dụng để deallocate tất cả bộ nhớ cho một đối tượng được tạo bằng swift_allocObject(). Và sau này là số nhận dạng kiểu của đối tượng (0x40 hoặc '@' cho các chức năng/phương pháp), và (bằng cách nào đó) được sử dụng bởi swift_allocObject() để tạo một đối tượng phù hợp với func của chúng tôi:

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

Khi đối tượng func được tạo ra có cấu trúc sau:

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

Trường đầu tiên là con trỏ tới siêu dữ liệu tương ứng [N] -> giá trị loại, giá trị thứ hai có vẻ là 0x4 | 1 < < 24 (0x100000004) và điều đó cho biết điều gì đó có thể (dunno gì). function_address là những gì chúng ta thực sự quan tâm đến cho hooking, và self (đột nhiên) một con trỏ tới self (nếu đối tượng của chúng ta đại diện cho một hàm đơn giản là trường này là NULL).

+0

bạn có thể cung cấp cho tôi liên kết tới mã nguồn của swift không? – AbhimanyuAryan

+0

@ androidplusios.design Mã nguồn của Swift chỉ có sẵn hôm nay, 2015-12-03. Xem [thông cáo báo chí Apple này] (https://www.apple.com/pr/library/2015/12/03Apple-Releases-Swift-as-Open-Source.html). –

+0

yaa Tôi biết bây giờ. – AbhimanyuAryan

-3

Swift là ngôn ngữ riêng của táo. Dường như nó được thực hiện từ c và C++ và nó có các thư viện nhanh chóng

Các vấn đề liên quan