
Swift bukan hanya bahasa pemrograman. Ini adalah proyek yang, selain kompiler, mencakup banyak komponen lainnya. Dan kompiler itu sendiri bukan kotak besar dan mengerikan, yang dengan bantuan sulap mengubah kode Anda menjadi seperangkat instruksi yang dapat dimengerti untuk mesin. Itu juga dapat dipecah menjadi komponen. Jika Anda tertarik yang mana, selamat datang di kucing.
Saya bukan spesialis dalam kompiler dan tidak memiliki pengalaman di bidang ini. Tetapi saya bertanya-tanya bagaimana cara kerjanya, dan saya mulai mempelajari kompiler Swift. Karena artikel itu ternyata terlalu besar, saya harus membaginya menjadi 4 bagian:
- gambaran umum komponen
- parsing file sumber,
- Bahasa perantara cepat,
- LLVM IR dan pembuatan kode.
Cepat
Swift telah menjadi proyek open source selama lebih dari dua tahun sekarang. Selama waktu ini, banyak perbaikan dari komunitas ditambahkan ke dalamnya. Anda dapat mengikuti mereka di situs khusus, serta di forum . Di sana Anda dapat mendiskusikan saran untuk meningkatkan bahasa atau menjabarkan ide-ide Anda. Tetapi untuk melakukan ini, pertama-tama Anda harus mencari tahu bagaimana proyek ini bekerja.
Perpustakaan standar cepat

Bagian utama dari Swift, tentu saja, adalah kompiler dan pustaka fungsi standar. Mereka berkembang secara paralel dan praktis tidak dapat dipisahkan satu sama lain.
Compiler ditulis dalam C ++, dan bagian utama stdlib adalah di Swift. Namun, bahasa yang digunakan di dalamnya memiliki beberapa fitur:
- Pustaka standar melalui modul Builtin memiliki akses langsung ke fungsi kompiler. Ini memungkinkannya untuk mengakses representasi bahasa tingkat rendah dan petunjuk mentah.
- Perpustakaan standar tidak menggunakan pengubah akses pribadi. Sebaliknya, nama entitas non-publik dimulai dengan garis bawah. Baca lebih lanjut di sini .
- Ini menggunakan pembuatan kode menggunakan utilitas Generate Your Boilerplate (GYB) untuk mengurangi pengulangan dalam kode perpustakaan standar.
Pustaka standar biasanya dikaitkan dengan wadah dan fungsi berguna yang menyederhanakan kehidupan pengembang, tetapi ini hanya satu bagian. Secara total, 3 komponen paling menarik dapat dibedakan:
- Inti Kernel dengan semua protokol, tipe data, dan fungsinya. Sumber .
- Runtime Lapisan perantara antara pustaka standar dan kompiler. Ia bertanggung jawab untuk casting tipe, bekerja dengan memori, refleksi dan fitur dinamis lainnya dari bahasa tersebut. Ditulis dalam C ++ dan Objective-C. Sumber .
- Hamparan SDK. Wrappers over Foundation dan kerangka kerja sistem lainnya yang membuat mengaksesnya dari Swift lebih mudah. Sumber .
Sub proyek lainnya

Selain kompiler dan pustaka standar, ada banyak subproyek lain dalam domain publik. Beberapa dari mereka tercantum di bawah ini.
Sourcekit
Kerangka dukungan IDE : pengindeksan, penyorotan sintaksis, penyelesaian kode dan sebagainya.
SourceKit-LSP
Implementasi LSP untuk Swift , berdasarkan pada SourceKit. Anda dapat membaca apa yang ada di sini .
Manajer paket cepat
Manajer paket untuk proyek di Swift.
Yayasan
Pustaka Port of the Foundation , yang merupakan salah satu inti untuk OS Apple untuk platform pihak ketiga.
libdispatch (gcd)
GCD untuk platform pihak ketiga.
XCTest
XCTest untuk platform pihak ketiga.
LLDB
LLDB dengan dukungan Swift dan REPL.
Dukungan taman bermain
Proyek ini mencakup dua kerangka kerja - PlaygroundSupport dan PlaygroundLogger. Mereka menyediakan interaksi dengan Xcode dan tampilan data yang indah, masing-masing.
llbuild
Membangun sistem .
gyb
Utilitas untuk pembuatan kode.
libcxx
Penerapan pustaka C ++ standar.
Kompiler cepat

Kompiler dalam arti luas adalah program yang mengubah kode dari satu bahasa ke bahasa lain. Tetapi lebih sering daripada tidak, kompilasi mengacu pada konversi kode sumber menjadi kode mesin (atau ke representasi tingkat rendah lainnya), yang kemudian dapat digunakan untuk membuat file yang dapat dieksekusi.
Kompiler sering dibagi menjadi tiga bagian: frontend, middlend, backend. Yang pertama bertanggung jawab untuk mengubah kode sumber menjadi representasi perantara, yang nyaman bagi kompilator untuk bekerja dengannya. Middlend melakukan optimasi, dan backend menghasilkan kode mesin dari representasi perantara yang dioptimalkan.
Namun, di Swift, optimasi dilakukan di frontend dan (sebagian besar) di backend. Oleh karena itu, langkah perantara dalam diagram tidak diperlihatkan.
LLVM

Kompiler Swift menggunakan LLVM sebagai backend. LLVM adalah proyek besar yang mencakup banyak teknologi. Ini didasarkan pada representasi perantara (IR). Ini adalah representasi kode perantara universal yang dapat dikonversi ke kode yang dapat dieksekusi pada platform apa pun yang didukung oleh LLVM.
Jika arsitektur baru muncul, itu akan cukup untuk menambahkan LLVM generasi kode mesin dari IR untuk platform ini. Setelah itu, semua bahasa yang ada kompilernya dengan generasi IR akan mendukung arsitektur ini.
Di sisi lain, untuk membuat kompiler untuk bahasa pemrograman baru, cukup menulis terjemahan kode sumber dalam IR, dan LLVM akan menangani berbagai arsitektur.
Keuntungan lain dari sistem tersebut adalah LLVM dapat mengoptimalkan presentasi perantara, dan front-end mungkin tidak terlibat dalam optimasi. Ini sangat menyederhanakan pengembangan kompiler.
IR memiliki tiga jenis tampilan:
- Pohon objek dalam memori. Setiap objek berhubungan dengan entitas tertentu dalam kode sumber: fungsi, operator, baris, pointer, dan sebagainya. Pohon ini dibuat oleh frontend pada tahap generasi IR.
- Tampilan teks. IR dapat disimpulkan sebagai kode sumber level rendah. Itu dapat disimpan ke file dan dieksekusi menggunakan interpreter.
- Format bit serial βbitcodeβ (jangan bingung dengan bytecode, yang digunakan, misalnya, di Jawa). Ini dapat digunakan sebagai hasil akhir dari backend dan ditransfer ke linker untuk optimasi di level tautan. Konversi ke kode mesin dalam hal ini akan dilakukan oleh tautan.
Linker adalah program yang menghasilkan file yang dapat dieksekusi. Uraiannya berada di luar cakupan artikel.
Kode sumber untuk versi LLVM yang digunakan di Swift dapat ditemukan di sini , dan dokumentasi di situs web resmi.
Seperti yang Anda lihat, Apple memposting banyak proyek menarik pada akses terbuka. Pada bagian selanjutnya saya akan berbicara tentang parsing file sumber dan menghasilkan AST.