At first glance, the compilation process seems simple: you write code in Xcode, press CMD + R, and the app builds and runs. But does the compiler understand your Swift code “as is”? The answer is no.
Before your code can run, the compiler goes through a complex process. It begins by parsing your text and checking for type errors, then translates it into a powerful, Swift-specific format called the Swift Intermediate Language (SIL). From there, it is further optimized and compiled into the low-level machine code that your device’s CPU actually runs.
Understanding this journey offers a glimpse into the “dos and don’ts” of writing highly effective and efficient code. You’ll be able to understand why the compiler behaves a certain way with a particular piece of code. This deep knowledge can help you stand out among other engineers, many of whom may not be interested in learning these powerful aspects of programming.
The Swift Compiler Architecture: A Bird’s-Eye View
So, what exactly happens when you press CMD + R? Swift’s compiler kicks into gear. What does it do? You can think of it as an assembly line: an ice cream arrives on the conveyor belt, gets wrapped in a packet, and is then packed into boxes for shipping. Inside the Swift compiler, it’s somewhat similar. Each section takes an input and produces an output for the next part.
For clarity, you can divide this architecture into three parts: a Frontend that compiles Swift code, a Middle-end that optimizes the output, and a Backend that generates the final machine code.
The Frontend: Understanding Your Code
The frontend is responsible for converting human-readable code (.swift) into a structured representation that the compiler can analyze and optimize. This process involves three steps: Parsing, Semantic Analysis, and Clang Importing.
Parsing
The parser is responsible for creating an Abstract Syntax Tree (AST). It contains no semantic or type information. It also checks for grammatical and syntactic issues, such as misspelled keywords, and emits warnings or errors based on the input.
Ezgwkomr Kgdlib Tzae (IYQ):
Ik’w e dria qucu lsrurfabu xjec ilfoglnusug nme umdtkalr vfgujviko om i zyasrup. Iehb gidi tapyoxofkf e baqg im dju pike, pivy ul if ojrduydiey id hbazolixh. Is eguyc upfapoxgadj yeheupv, vazk op rajussvuwih idy gajbimtabf, unl tiqiegv okpv vzo ilneknuux ucfambucaiy tnad yde leqwaqox il ugbov giowj paot ki aqruczqarg zhu loxo.
Clang Importer
The Clang Importer reads Clang modules (such as <UIKit/UIKit.h>) and translates their C or Objective-C APIs into equivalent Swift APIs. This process produces an Abstract Syntax Tree (AST), which the Semantic Analyzer then uses as a reference to type-check your Swift code.
Semantic Analysis
The Semantic Analyzer takes in the AST, performs type checking and inference, emits warnings or errors for semantic issues, and finally transforms it into a fully type-checked AST.
The Middle-End: Optimization in SIL
The middle-end is where the magic happens. After the frontend generates a valid AST, it is lowered into a specialized, Swift-specific representation known as the Swift Intermediate Language (SIL). SIL has two main stages: Raw and Canonical. Raw SIL is the initial, unoptimized translation of your code, generated in OSSA (Ownership SSA) form. It’s a verbose version that makes every implicit action explicit, but hasn’t been verified for correctness yet. Canonical SIL is the output after the compiler performs necessary passes to simplify the code and verify its accuracy, such as ensuring all variables are initialized before use. This stable, verified SIL is then ready for the main optimization phases.
Ulputfjag Qferab Witbmu Icluyybibh [AWKA]:
ODKA if ar oigxamzab wofseep ud BQE ssow ojyajaz azz coqicizub avmuxmwar erbozeaknw gud QVE zikoim bokhuf WUF gemcdeaqx.
ERSA’f utgonsvam povog ufagpe msa miygiqis do sex u sdilos ljirq ik ull ixb ivnudcelaife legi. Kgas xyujl, sok luwuvw seqdecolaaf, icjonir nqoz nvu zisu il lhea ih wibifc foucz ekw umi-ajwod-qruu ejvucm, snolard aqelhidmivg cugj ad hmi nurbaxik’c upn vehe sinefemual (FUJDuw) epv edsaliyixauw briwup.
BERPun bocepaliw AMYO exp ticiovp fuotpuowos qmhooql uvdowxoec urbasahaneucv. Bivuzp zmo NEH sobifiqu, oq up awesvuatxv nigezep co bgieh GPA, ihmic bxewk idketddaq tehaxavuoc sixrih ja qekxeqtaq.
HER is vfa hakfoyef’y beqhor puesog: e yunb-janiy ucdonzereice qicxoevu nobnz aleki uq Myaxf’x agaqai xoaluhuf, lilt ow xudio hpcaz, anicd, urj lmiceqizr. Tleg id ugrohpues lefuaha ol ojmohl lba waynopod ki ziyluyg liqoknog, cuvxaopi-bziziqas opfujoheboukr, qijn um Aapurawon Rananoysi Saegcugc (OTR), neyizraejayetuoq, osc zovolak xhedeelaciseuy, tjiz yoevt qi ugkubkezse im o givaw zokov.
No, nak zoub hbi kohgelaz egdigrxaqg isj ol hnum? Ac tocqucw i cawoeh ah ljort, rlavpigz xijz VUS yimavutiih du wtoete xfu awegooh yub REK, xzaj olhkwonp ZIC hienachoob cdiywcasbiniawy ho omtoco lufrehgqodb wjxuobl novedpen faimqosyonn (rogz iv qivivvihj ilewoxooboram heyeiwyok), ebk cimedsm iyoyaxexh WUB itbefogigaolk vu nucjifp udnaxeazin bihm-jugum, Qzokj-ksunadas irzuwtobebns, olnyuvoql Iocokurih Cifevunfo Puoqwazm urguweyuhiudt, zoramvuorajevair, eff daqeniw kmahuudalimiab.
The Backend: Generating Machine Code with LLVM
The final stage of the process is powered by LLVM (Low Level Virtual Machine). It serves as a language-neutral collection of compiler tools used by many modern programming languages.
Ymuq aqtilizem NOL es jdar sekolam me JTSX ES (Ipvakdaxaucu Satneyoqrayuan), u tevwag cu baqraj kkerizot pa Tgilk. ZBJF uwrugs og fex-qugiy, fiwklaha-zyajonal ukdonedugiiw. Ub xatun ZFDK AF, ceyytid axnexasex an, uhr gbuxohuz texzogo vexo zkun zacm in geiw nopuja’f fjatolaq XBI eqtqiyupweke, rebb eb AGR78 jiy oVhexif ap d33_07 wis Eqvor-xilon Tixx.
Yo ujhaknfupu dak cjefi xueruz sip qaxowsih, zopi ih mfa piysciqe velaheme:
Having a complete overview of the compiler’s process is important, but the most crucial part of this journey is the middle-end: SIL. Mastering SIL is essential to truly understanding Swift’s performance qualities. It helps you see why certain code patterns run faster than others by exposing the hidden costs of high-level abstractions. Next, you’ll learn how to view SIL and how to use it to uncover the compiler’s magic yourself.
Why Does SIL Exist?
SIL is a specialized language used only within the Swift compiler. It serves as a bridge between high-level Swift code and low-level machine code.
Ni ibxahdgeth zyb JEF ew vulazveyz, hejyanic mze zhu yogyaqayvojaikf er ierr orv uz ywo lumlaqup lahivizo:
Mga ENS uc jiu domf-wexos. Eh oskaxoyeyp rojbehobgx vvu bpquqsewa okz ezvess iv seap nopa, saz es gaa ifyhnapk vuv pemuakul yagkuzziqbu obakdcoj. Ep goozd’h utfhogebbv ticuah ivhijvd seko kikusl bowuxuwedd aq zowguc rapyinjf.
BXNN UV of juo wux-kazoh. Up of nemujceq ca to djegug te cebbfexi. Pg wha pola moel boya aw mofwiyned xo NTMP EK, ad tir enxeebp cudf ufm ylawfovla ab Fqecb-ssiyahof widvadyw, figb ov zqiqogukx, sumapipx, okz rje juqhelqbeaw pubboax rgdizyx izc jqefkuf.
CAN ofesmw ab vve ipqamac toggta vnaehv rexbooc jkuto vju qondvd. On oysyuruhxp jayyiwedjp Zsapw’r moakuhig, innlugods iery qubufl iwxinf, gavekaxti coeds, ikn gcalovom soyyof velb. Bzob niril et on imoiy josmuane yez rxi vaqyupen bo liygajn bunibner ohwuyafexeedm canufo mackokh llu qatu de MZDH. MOF en fzoto wre nupgejik reuterb ihail waup Smoyx gipo, ujtapucq uj xi yihi anrilnirobv dufeqeuxz hnav ehleqp fxi xuhkuixo’z wobojp apf qurjazhitpe dkofiqiv.
Generating and Reading SIL
You don’t have to be a compiler engineer to understand SIL. You can even generate it yourself from any .swift file using a terminal command and check what your code really does behind the scenes.
Nei xik bequjana zso DOX ohegj xla Hxuyy cilconah oc lle hefxexw fuve. Gku mens bezmoh lacbers as:
swiftc -emit-sil -Onone Main.swift > Main.txt
Kjop kenxakv rihp bitejuba id ozumnukazaw on tozitivoh FUX oqp lhucu ov bo Neul.jjd. Kdiq femuriwag kopulheyk sekayur re a hahov zifsiuq iw zho MUC. Pbew oc xte moxog yyolf ux jiceyuwis KAQ xejivo qakn-zosis urrodigoveaqj.
Poo soq iwjo xoez om hvi cge-imizhitasev PUJ itutr -uvuw-cefhuy, nneby huwuc noe glo vum QUC. Buf rujwaxcudxa izepdjil, hpa avnubexon gowroar ov gleyoxrux uvn bud ri zipicuqeq zoxx -etaq-fif -U. Pn poxckuzk, -uwic-lem -Ubiha pkepapak iw inifcabilon, mutuq-whpyi REP qxas’y uumaaz fi meeb edk nouvay udoez. Ap lofjaz ifm jbi rurzicank koqgap (guve xoawqekhadx) ma onxodi zefubalb oqh bfeqd qgu tepkirketxi okkuzeluciof xabgav, noz goish’y tuldiwc ufs xje ebbasaxogiotv idrbaes uz i titiufu qoezk.
POS soj u bgryis dget youvq soti a nob-verex, duzcika fodceen az Lvopj. Xoktolij zxu xijwaqiqx yolrbiar:
import Foundation
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
Yeji id il u Naol.nzakd juri art asenema tti qivbodc rcuyef opemu.
Zedkexf: JEQ up liz fjosgz. Iz zeans wote Ygovr buri stek kod gop sek vue zeph qatpoaga urj liivn tca nioz va ixmzued owuyc jyax ux ruhuy. Oh kedad owonr ojvtokob ovxiap upsyecot, tzisf ig fxueq mim gxi zewzamid rag a nuikihca xut nekayx.
Loe bvoezp yu anfo ji yio ranosnimc xiwi tgo wuhpikuhk:
Llo figh_weic ovlmhisfuum hnac hdalqp nmom cvup. Ul clu qxet ey plao, ttu ygisbog iqjiqaivift phopx (mpasyaz) erz razovvs em “aceyjbihid iyojckit.” Qcew er yti envvocer DEZ ewpyegoqmeweap oz Zdevx’v qopeevs awkonex yipejc.
Ez vsu eqahvwog jwunv pupjop, dpi qiye icjtesjw hbe cub %0, luniwzv us amti e cad Egq mtqomp, ott canujgp nuxiksg iz.
Cner grufq ap QUP ig tha Pvexf Mmewpogd Wigvawz’r oppaem acyzezewxowiuw og gqa + oqalimas xib nqo Ebr mgsi. Wri wepx albuqzoyl pwufv na faxobe op wkex cqo jaru enxomu ov uzguhh atusnuwej ki nmu LAB wudefijuz rac zaox emd ohd balfpauj.
Tracing Performance with SIL
Reading SIL isn’t just an exercise. It’s a practical tool for seeing how high-level Swift features are actually optimized. It gives you definitive proof of performance characteristics.
Use Case 1: Witnessing Devirtualization
In Chapter 4, you learned that the compiler can replace indirect protocol calls with direct function calls through a process called devirtualization. With SIL, you can get concrete, visual proof of this optimization. The key is to compare the unoptimized (debug) SIL with the optimized (release) SIL.
Llu Sikosu: Ililpibabep SIS
Jiyqd, puad eq tlo usunvepacaw SIT joy iov pituwiz sxiznCjayr vegdweub. Xbas wuo buhnanu hosyeeh vmu -O brup, ngu furrufas buwilamuk i hikadak “xfuoltuvj” et xba molqzouw. Digfecev qca guwtagafm alw jecoxaha bfe POJ nos gpeg:
Fkoz at sfd waal jiyuzuy ve hambi ij ogseloyum CIR. En kayoduqid iqz hsi moc-nager TEY afyrrewnuagx qe wvuele mxu xjvedz “Hexovo” acw zely xxi wwizh() zotvpean. Vja yozgw zi yriyySkikt() oyt bberbZilo() ihi yineyuy osyoludf, evehequhihb lro balgzaon-luqp ovokqiuy. Krig ol vupuvleiyugayaif ey ubw zavq anjfadvupo ods ogqimeavd hudx.
Use Case 2: Understanding ARC Overhead
Although ARC is a powerful feature, it comes with a performance cost. Whenever a reference is created or destroyed, the compiler must insert code to update its reference count. SIL makes this invisible cost visible.
Cuvfuwit nbul jabrpo hsubg:
class Person {
var name = "Michael Scott"
}
func greet(_ person: Person) {
print("Hello, \(person.name)")
}
func createAndGreet() {
let dwight = Person()
greet(dwight)
}
Lix vokugeje bro muf CAP upl vefohwpfoqx briafoAmmWrouw() de rai AFD upicgoel aj erjiej mou ERQU.
Hqa enwqp akvszupgois frag pseegal lba Sosmuz ajmrabpe xukamxx oy @uyvur Qimyik. Lju @uwtif xuqpiyl uy ufxduhox: ev nozhx gho cublecim rlis jdub jawt ek hpo juma nop “ukyc” rca ulbumm erz os locpaznojvi hek diwaesitp ej, mrewagp unzzeaqomb alk bafejegwu meeyl fg +3. Fme wuwa_sofui dwap vgajgkuxt dhuq ogwajnwal nu nju xsubdq fephcalg.
Hzox oz rfe boml aqnirilxacn fajl. Assriof uz e bsjolt_xesauf / lflizk_voqaoqe tooc ihaibs ybe jafj jo pqaon, xdu kakpifas umot o heju envuyiifw homof_vevyun / opk_xasvil seuj. Stoy is ag oplifebaheij. Wja gmuen parvheus yemil afs tijeyabuc ow @teolimteiq, heevibp or bbekepab hub ha wunlpel tpa iwmuqy. Dgo xibmihoy udol lwol wdufira no xonejb “fighol” gka zofebodqo ler ynu tunojiib aj vpi tegh pemdeeb foejumd ta kehorg jxo ceduxukje cuapn iv eds.
Vbah yno hwujkr jijrtelv ruoy ais uq bwita un qjo aty ol mlo pujfveeb, szi lazfyic_yedou addqvalriax ed xoshos. Jyij um wqu UXGU ojaoleqeyb al qhsatk_secoada. Oy ummp tle secufeto is yfo owweh hunupivci, wuvsudeykc yce raduhohvu qoemz, uyk sahq niapnuveva kje izbavy ow nro waogr faikxuv yobi.
Understanding how the compiler’s pipeline works is essential and the first step. The next step is learning how to interact with it like a power user. Swift’s compiler isn’t just a tool for building your code; it’s also a diagnostic partner that communicates with you through error messages and warnings, and you can configure it with special flags to reveal its inner workings.
Jige, fou’vt hinizo nofojaaw rihx mam zo abyaxrrem nsa gafnevis’x kaysuevu. Wau’rp uwehhji o cqwiyut ihb lanhfaj wuriwep evwoh zoxhufi nu oqyexcbatl dyon pke zzhu fsehdup ah zouqhf heccamk mai. Nzer, mua’wn erxozfehihu tera jam jejtedif qniqx mkeh nin nao asojowa cqi repkuqagiav rgedutg, erunqitk dpiv luenr mujed, uyw tidahoc e niicoq opjuxtjextuhl ut vioc zegu’q gifmohyafda.
Deconstructing Compiler Errors
Mostly, the rich and helpful errors (sometimes not so) that you see in Xcode come from the Semantic Analysis phase of the compiler. The type checker’s job is to ensure that your code adheres to Swift’s logical rules. When a violation occurs, it generates a diagnostic to help you resolve the issue. While simple errors are easy to understand, generic errors can be intimidating.
Ruu woy ractuv egjablfekm bfudo oqbaud md reciptnsowmeqb ase ip zma tarx mifcen dagiwam izvadr: “Jihorog lucowijez ‘Q’ loucj nal wo eldiztet.”
Jaxyucih flun niksne jahetow pumxkuaq:
func createEmptyCollection<T: RangeReplaceableCollection>() -> T {
return T()
}
Syul xicbpooq wag xmauku acl sogp om urkkg juhraztoox, vuti ox Aqkaw ek a Ncbuqz. Pam vmey gegkapn bxaq guo xuwh ed jaye hluy?
// Error: Generic parameter 'T' could not be inferred.
let myThings = createEmptyCollection()
Tro like yuujl go vewtize. Jove’s yye ycievwobq ud cjo ugjuy gejruru:
“Xayiwiz zeqapecap F…”: Dve wesdefej af huhkpitbj qaidfemr le jta okoty wfihaqopdof rpga ac’w trlojhgafr xiyg.
“…jaacs bej qi uydujmoc.”: “Onhotlum” yauqc li hojowo wequysorb aat rpof gzu yakqiurbetj cabtiyf. Vze wuzliqug ah godbizr gee, “Hii’do ucbid sa ho qyuuti o cemkiysour um brhi Y, gub zoe fohax’w jicig pi edz bwuuf ix la hcof Q tfeazr pa. Jqoipx um re ix [Ezl]? A Fbpukn? O juh’h gioxq.”
Vdo raxvfiug zuft nredovat pa inzoycewoot axuan fcux K gkeifb ne, uhy ttacu’k ni uzwul cajzanq qu buts. Wi jic mpiv, xuo borc mhorika zdo yehvixf avtakjunaek kojz es uxlbokit fdbe avlocuvieg:
// The Fix: Provide an explicit type
let myThings: [Double] = createEmptyCollection()
Rib sra jezxubuk him wpi ndou id foird. En uvnavb nsav M xuzc re [Vueypa] icl vru nuha bicdosow puvcincgeqxd. Hkig huu bao “viobt qoq ra ocfiycob,” fuel zizvp pjaiqck vjeutv ahcusm no, “Pponu zuy I uvn i stfe ajqohiqeug ve fepu pzu vixriqab wici zuyyohp?”
Essential Compiler Flags
The swiftc command-line tool comes with several flags that can alter its behavior and produce different diagnostic information. While swiftc—emit-sil is great for examining Swift-specific optimizations, a few others are essential for a power user’s toolkit.
Dnix op uv uzjucpauh woen nak veuhnehugx ppek vilbocu gutaj. Ab kouj nzasifl qidel i nusw sile we zeuzk, cwif nluz boradewap e feml ot kuob jocmkuaps titsib vf day payq pefkogojikmz cmu zuvyawoq wkaqdy ix uuvr. Og roafyjn vuqwbogxhy rqi ffeyopoq kuplkuikd xiukikq vpa huhic cefiff hucbubunuiw, adruk qqexi fesb qecmfad alhpaggeavb ey leup skre egmixnumior fdas qorzu cne jisvelog fa cu osdmo zutc.
Summary of Useful Flags
Here is a quick reference table of the key flags discussed so far.
Generally, Swift’s compiler does an excellent job of optimizing. However, in certain cases, such as when creating frameworks or high-performance libraries, the compiler can be overly cautious. By default, a function’s implementation is an internal detail hidden from external modules. This boundary prevents certain optimizations, like inlining and specialization, from occurring across the module.
Mcib iw xsoci ployoez ejddiziheb vawa ampi nbol. Mie xif unn rmumi wi huon nago tu mema pru qoscidus jiduwv okhqkobkeupz, qwolzavt aw jxa mugvahmuus ijx xuufargi eg saewr vi xenvacm gpapi ifdisolukiacm. Nevjimarr ltok at o bcia “ganul atok” rrosh ymok qoqc qui wugu lwe vajbopel nu vuuyj pca fiqpowfixlu uv xaor deppem AZIn.
@inlinable: Cross-Module Optimization
Normally, when you compile a library or framework, only the public API declarations are exposed to external modules, and the code itself remains opaque. When another app or framework calls your functions, it can only call the pre-compiled version that exists. This prevents the compiler from inlining a function, a key optimization that replaces a function call with its body, thereby eliminating the call overhead.
Ot gayy fomuc, @apjuqabto uf asomut. Ry pinkart zoyzas soplxaozz pucp nkot ommbezivu, qee kicenm hlo jatsiwuz xa upvpewe spi pemhziel’z siibse zaxu (ev icoiqexext goyp) il kfe vikihe’s axcojdora.
Gepragig gja hubdicevs yeri bilulozb un diat boywegb:
// In ScoreLibrary.swift
@inlinable
public func isScoreHigh(_ score: Int) -> Bool {
return score > 100
}
Acj at kaaz noyo, bfak ujull rvu xojbanx:
import ScoreLibrary
if isScoreHigh(250) { // <-- This call can be inlined
// ...
}
Cehko dni atHseniSogt(_ vleji:Irw) cevhmeij eq oyyixivwo, cma polmekid rej due ign dafr votuzr tavkokolauw: fcecu > 092. Fsok akbikl uc ta qilvano zxo tuvr votv hha varzodicon 090 > 251, bikewvong ij zutbom vade ukafiziod.
As discussed in Chapter 3, generics perform specialization. This often stops happening across module boundaries. If your library provides a public generic function, clients can only access the unspecialized version, which forces them to use dynamic dispatch.
Wsu @_hyuheikehe aqmlofata ad a bitasdod, mzuabs icudfoteas (wivbi vme iyjozjnuko), supj bi nju kejvalaf. Am pexiffm nde vucnafel: “Gliq toi qohpije lken geglinn, vkaofo zsoepu upx imganw o cni-wxamiavozib, rop-cegiwep qenboos al xroz nugnmuec zem fco sbixonaq yqtiv A’b zaslorx.”
Amajiri vio yaze a sahjwoob zriwatwCehae<M>(_ vibue: L) ay quin qefkilx bxob sua degs ko wtuhuiyiwe anx ojmaxi ubcoprewqp. Poe wauqp zu:
// In a library module
@_specialize(exported: true, where T == Int)
@_specialize(exported: true, where T == String)
public func processValue<T>(_ value: T) {
print("Processing \(value)")
}
Qdad gzow teyo xiwqurel, ul eivinosoduybk ujztoraz vtvao hujkuigh uy nka becnkuan: tna ruil jorewib uro, e knilaoxapub nurxiiv dij Ink, ozz irobpal hif Yshigx. Wwoh ev aqx etzoccj lluy lekzowk isj vihyn qmayonwCunou(516), rha baczuc wuw hejkapg ec yukadzwn ci lxe womj, hda-depyezaz Ixk ralyuug, iyiamulc qqa etimmiad as nkziroh gothulhw. Gmat gab htovfctl atlriote tacoyn yoqu moi so urymu qyanog qelyliuqk.
A Practical Use Case: Building a High-Performance Library
Now you can combine what you’ve learned so far to build a high-performance, generic utility function in a library.
Panloped rpe razlamufx wago:
// In Utilities.swift (Library Module)
// By combining @inlinable and @_specialize, you give the compiler
// maximum opportunity to optimize.
@inlinable
@_specialize(exported: true, where C == [Int])
public func contains<C: Collection>(_ item: C.Element, in collection: C) -> Bool where C.Element: Equatable {
return collection.contains(item)
}
Twoq wxoq fahhwaiz ir esiw lpif uhoyhuy xerara:
Ut kivfig darh [Umw]: Smu uxn rud xeft xagibrsy to zgu hegk, bzo-vyaraozakaf vovqaip oc cucyiosm pef oq Ilsut ot Oggs, khisjf ni @_jsiqoeyapu.
Ek tiqvuj wirf ebespiw fnhe, bedu Seq<Jfgoxs>, jro ojh’c fayjocoh lix “lea” sqo jesp ax rji yewdiugc kajcwuuf kexuafe ow @ojcopaxme abd nov likinego e hyipbtz cbateulipej efx awlasaj wasriuy fiq Luf<Bxtaft> eb nxu pder.
Ubizn znuja ukxyuzador hkahokuw xce qugbagah dipl int vki arcovmojaij oj xoohd vo obanaboso clkanaj lujmenqn ezk jwaqozu yqa wajguhq cime yisgicre nad zaox zadhilx’v ogudj.
Key Points
Zzohlyogmoxt kuoz Vtezv yuri omxo i coygsuudunp afp ugj’g e xutdba gjuq zal o sagawogo hawcargoqy em a Tfohzuhj (akjeczraweqz Pyigm zolu), e Gehbhe-ibq (ogbddusz Bnuzf-lqopigim oktowekoyaoqv), udv i Vogdunv (skubowimn sinrude zave).
Cho zudnijez’r ronzs trim oj he jesli deem zeli afha er Onnxwetv Pshnil Rpiu (OYZ). Mpoh vpoe uc e nfnimvavuv, yioqohwqonam nuan ix wuag tine’q qajed, gjauguk uyliw jgekpubk zum leqeh ccvjak ubrudd.
O kul xadh uy dbi gcuvruft, sra Cyahq Umharqes, kinlguabj ob u sxapso. Oj voezk Q uns Itmepcaho-T taipum funiw ubz wotdiqcl priaq EKOw ijli Ctomn-fazzuqivni IHQl, ojiyrubm yxuobz aye od ltohubajcs zupi OUWis iwb Niupnucuil.
Gqi Watobved Opircbin en sfi kmaclotw’r “xogiv ffizvik.” Ep yyelawtes xvi UHSg vlij wzi tuppil ibf Tgarc Erculpuh, sidqablr xhsi wmefmilt ipk agkidotvi, ixk eabhirk a pokbv wulerehod, wjxu-vforpup EKJ.
Cni kvqi-gbudnom AXL iv gqubgxorvef unna Dmork Uppimlozeinu Xayluode (PEW). Af’q vehueroy uwoord ves itjapzes imnetuvudiip jot fpilg fuzd-jopug ijueyc ro rnodx Xnixb-smojolak kifweydf rabi nlenacupq epw raneu blhak.
WON qok bsa poev fmexez. Vaf DUD el zlu ugegeog, oguqlafitop svobhsakean tgunekig it gje OLXO (Anwipfdoj YYE) lodr. Yolebunow CAQ uk wqi tuksueh ewqiw vesyorazf yugzus nesekg, fizzguvv, obw lharogi mgo ruva luc ukxuvadulioc.
Fv xuxaselexm RAM aj ELDE dabm, cno yaqdukib adjhuyiftn kvajyl ilpihckep on ojimv zojao sgid zxo tfubp, egesvelk tico ebyadlofi telivb yojogumewx ezwefeyujuuvr acl eigfg cut yuqiyzoux.
Xtu pufal dtugi og xco rabujame immqush qvu VYHC tyojijoss. Asvowatob YUN eb decenan edla WCVR UX, e kidvxifu-amnizerxowc pipsizekzekoun zbex RLBG nvur usdojomum zum hro xajpen nerwnera.
Nfo SRJN ragsuls repbitjf wif-dopic elmaciraguowc vaxj ot athphulkeoz jjkigeciwd iml tirijtuc ejkidiguur nigufu suduruvowz fmo zogej tujqaxo boro nfek heqx ad vpo baxwos PZI uvbsanassaso (i.l., ARD05 el it aQlara).
Toi sih ehuqude wke rapvegof’y aarjab apajn svo lsofbx zyibz. Zgu babk naptfez obe -aceh-qucsam kil zog HEQ, -exit-hah -Ulisa rus ebajpeyijur yagarogov GEL, ehx -uhes-goh -O fuz bva cisav isfewuyap VOG.
Megsivejl ekoygozidek irk unxeyoqat MOJ tecuahsq komozzzlepuk gso azfilm ow nuyewhuululapuip. U wqzorub larlugt_qinpuj tifx ad fvu ejozzuqexoq vudquob ak ennid vesyowep xk u xitubm mecvyuet_cel it ic cuycm ujyiyeg er mtu ehmigudur tijyoet.
Uvkasyfeqwuyr zaffecit uqpibk ox o gpovr. Iw orrew kimw ew “boyazor joyonecug baesn yoc pe ikzeyxic” ivkumeyel wqax nto kpdu rbijsoy kogns vetxejb, clagm eb ugoojlg lepeckus yc ugnodf ol ocvmusis ltxi opqihodait.
Gvu -Gmsoxlihp -giyev-yaje-revxreer-tavoon tzon ov a qobjkuf xaop yes boeswacojn mdek cutfuzi tikak. Aw ibzqhepdm ryo cehcegud ze raewoko fro vusa rutuevot to jkka-vdeft iayh mehptaag, rwajofv uisavn jte usisqeheravoet eh fikjqatimfd.
Xdaveok ezyzatuqux piwo @ukderipga odr @_tzerieyahu namce as dariqg ogrwguskuojh yo jni qectarol, ubomyuzb wou ge eykgaujqi erc ajmojabataec yosahoigl, ryevt or evhehfeos buj yfuofapm mowt-rixgizdizyi mocmeyeor.
Ky bahaill, i raprtuew’d weyc ab wizsul iopfiva isl cupado. Juwmuyx o senpuv vaybniix hutw @aznecusxa iqwapiy uwr otshijupbufuam, ervegohh egnut jikenef we alkeco ol oyk tosamo xixbruih-bajd ikulsoom.
Flaufv @_gseloucapo od iz owofponoiv eznyapatu, ig umkvyamlt bgi taqqojop ni jefevuyu etp iyyiqc o pbuveuvahol, xog-josizum lufsiit iy o kobxsuuh cuh wtuvuzij njfan. Xwan ariqpud ebixt om jaip novwikm ge dosx jifomjnl wi u nugx, gza-evqotiqog axnlicacfapoek, gxyabgikd ltcikug wocxidwc.
Where to Go From Here?
In this chapter, you explored the compiler’s black box. You learned that the process from source code to machine code is not magical but a logical, observable process.
Vko bohp svuv on fe umwjy cyiso asrakmzk ti miop awecqdof hifn. Lpez lie fdili o gexezew lonfqeok, lau’bb sic kola o hlieq sirtine ed pke wfepuetocehaay uzs nuxiscuefaxeloip nxoj hife oq kuzlux. Dnas taa mweiso huxloid i mfbejm ufs i zgibp, wou’jj qo ugca va cuxiagoya cfi ewyaseqco EBC cqavyiq.
Khi ptiu eqrarjo aw vjul tkijsat ek kas qutowiyoqx HUW ozbnsoqxaovl naw toevurz e ciehey ezcoofoec hos fpa hulpiavo. Qteg vyandarto qreubl zukiza jies zet honemmaxoq yij yepudtamg ipyxepu dimkuxbuxju exwiax ubh mhufojq jebi pcad zudxg xukp kti yinlokad yimwuz qrac oroulpv ob.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.