Cheerp 3.0, C/C++ na JavaScript kompajler, migriran na Apache 2.0 i LLVM licence

Predstavljen je kompajler Cheerp 3.0 koji vam omogućava da prevedete bilo koji C/C++ kod u WebAssembly ili JavaScript. Nova grana je značajna po premeštanju kompajlera i pratećih biblioteka da koriste dozvoljene Apache 2.0 i LLVM licence, umesto ranije primenjene politike ograničenog licenciranja, nudeći opciju GPLv2 licence za nekomercijalne projekte i vlasničke licence za komercijalne. Kod kompajlera je baziran na razvoju LLVM-a i Clanga, i uključuje dodatne optimizacije za poboljšanje performansi i smanjenje veličine prevedenog rezultata.

Cheerp se može koristiti i za prenošenje postojećih C/C++ biblioteka i aplikacija za pokretanje u pretraživaču, kao i za kreiranje web aplikacija visokih performansi i WebAssembly komponenti od nule. Projekat vam omogućava da kombinujete kod u C/C++ i JavaScript u jednoj web aplikaciji sa mogućnošću pristupa iz JavaScript koda funkcijama koje su prvobitno razvijene u C/C++, i od C/C++ koda do JavaScript objekata, JavaScript biblioteka, Web API i sve karakteristike DOM. Moguće je kreirati kombinovane sklopove, dio koda u kojem se kompajlira u JavaScript, a dio u WebAssembly. Podržava projekte izgradnje koji koriste standardne biblioteke libc i libc++.

U poređenju sa Emscripten kompajlerom, Cheerp generiše optimizovaniji i kompaktniji WebAssembly međukod (u proseku 7% manje rezultujuće datoteke). Konceptualno, razlike su u tome što se Emscripten koristi kao WebAssembly objektni format i vrši povezivanje i optimizaciju u fazi post-procesiranja WebAssembly-a (wasm-opt). Cheerp koristi LLVM bajt kod kao posredni prikaz za biblioteke i objektne datoteke, omogućavajući šire optimizacije koje obuhvataju cijeli projekat i koriste metapodatke na nivou LLVM bez potrebe za naknadnom obradom.

Dodatno, Cheerp koristi PreExecuter optimizator, koji osigurava preventivno izvršavanje koda u fazi kompilacije, na primjer, za pretvaranje konstruktora koji se koriste za inicijalizaciju globalnih objekata u konstante. Takođe, tokom kompilacije se koristi PartialExecuter, koji na osnovu analize parametara funkcije uklanja kod za koji se garantuje da se neće koristiti tokom izvršavanja.

Cheer također može generirati JavaScript kod za dinamičku manipulaciju memorijom pokrivenom sakupljačem smeća. Konkretno, umjesto emulacije tradicionalnog adresnog prostora korištenjem tipovanih nizova, Cheerp obezbjeđuje direktno mapiranje C++ objekata u JavaScript objekte, što smanjuje potrošnju memorije jer JavaScript sakupljač smeća ima mogućnost uklanjanja neiskorištenih objekata. Za poboljšanje performansi, generirani WebAssembly međukod koristi SIMD ekstenzije koje omogućavaju paralelizaciju operacija podataka.

Cheerp se može koristiti kao platforma za kreiranje integrisanih klijent/server web aplikacija u C++. U trenutnoj praksi, uobičajeno je da se razvije poseban front end u pretraživaču, napisan u JavaScript-u, i zaseban back end, napisan u PHP-u, Python-u, Ruby-u ili JavaScript/Node.js. Cheerp pruža alate za kreiranje kompletnih web aplikacija u C++, u kojima su backend i frontend podržani u jednoj bazi koda. Tokom procesa kompilacije, serverska strana se kompajlira u izvorni kod, a interfejs se pretvara u JavaScript reprezentaciju. Otklanjanje grešaka svih komponenti projekta, uključujući one konvertovane u JavaScript, vrši se korišćenjem izvornih tekstova u C++ koristeći Source Map tehnologiju (ako dođe do greške, možete videti deo C++ koda; podržava postavljanje tačaka prekida u C++ kodu i po redovima -izvođenje korak-po-korak C++ koda).

izvor: opennet.ru

Dodajte komentar