È stato pubblicato il rilascio dell'insieme di strumenti Emscripten 4.0, che consente di compilare codice in C/C++ e in altri linguaggi che hanno front-end basati su LLVM, in un codice intermedio universale a basso livello chiamato WebAssembly. Il risultato ottenuto può essere utilizzato per l'integrazione con progetti JavaScript, per l'esecuzione in web browser, per l'uso in Node.js o per la creazione di applicazioni multipiattaforma isolate, eseguite tramite wasm runtime. Il codice del progetto è distribuito sotto licenza MIT. Nel compilatore sono utilizzati i risultati del progetto LLVM e per la generazione di WebAssembly e l'ottimizzazione è impiegata la libreria Binaryen.
L'obiettivo principale di Emscripten è dichiarato essere la creazione di uno strumento che consenta di eseguire codice Web indipendentemente dal linguaggio di programmazione in cui tale codice è inizialmente scritto. Nelle applicazioni compilate possono essere utilizzate chiamate a librerie standard C e C++ (libc, libcxx), estensioni C++, multithreading basato su pthreads, API POSIX e molte librerie multimediali. Sono forniti separatamente API per l'integrazione con API Web e codice JavaScript.
Emscripten supporta la traduzione dell'output della libreria SDL2 tramite Canvas e implementa anche il supporto per OpenGL e EGL tramite API WebGL, consentendo di convertire applicazioni grafiche e giochi in WebAssembly (ad esempio, è disponibile un porting del toolkit Qt, supporta i motori di gioco Unreal Engine e Unity, oltre al motore di simulazione dei processi fisici Bullet).
Oltre alla compilazione di codice in C/C++ si stanno sviluppando progetti separati per l'esecuzione in browser di interpreti e macchine virtuali per i linguaggi Lua, C#, Python, Ruby e Perl. Inoltre, è possibile utilizzare front-end per LLVM diversi da Clang, ad esempio front-end per linguaggi come Swift, Rust, D e Fortran.
L'assegnazione del numero di versione 4.0 è legata all'introduzione di modifiche che rompono la compatibilità a livello ABI (alla ricompilazione del progetto in Emscripten 4.0 sarà necessaria la ricompilazione di file oggetto e librerie compilati dalle versioni precedenti di Emscripten). Le principali modifiche in Emscripten 4.0:
- È stata aggiunta l'opzione "-sWASM_LEGACY_EXCEPTIONS" per scegliere tra il vecchio e il nuovo meccanismo di gestione delle eccezioni. Di default continua a essere utilizzato il vecchio meccanismo, poiché non tutti i browser hanno implementato le funzionalità di WebAssembly per lavorare con i nuovi gestori di eccezioni.
- I componenti compiler-rt, libcxx, libcxxabi e libunwind sono stati aggiornati alla branch LLVM 19.
- La versione minima supportata in compilazione per il browser Safari (impostazione MIN_SAFARI_VERSION) è stata aumentata da 14.1 a 15.0, consentendo di abilitare di default diverse funzionalità avanzate di WebAssembly:
- È stato incluso l'uso di nuove istruzioni per la conversione del tipo float in int (nontrapping-fptoint), che invece di generare un'eccezione in caso di overflow del risultato restituiscono il valore minimo o massimo possibile (necessario per SIMD).
- È stata abilitata l'opzione WASM_BIGINT, per cui per lo scambio di valori interi a 64 bit tra WebAssembly e codice JavaScript viene utilizzato il tipo BigInt.
- È stata attivata l'opzione BULK_MEMORY, in cui le funzioni C memcpy e memset utilizzano le istruzioni WebAssembly memory.copy e memory.fill.
- Nella funzione PATH.basename() è stata disabilitata la normalizzazione dei percorsi (PATH.normalize()), quindi la chiamata 'PATH.basename("a/.")' ora restituirà "." invece di "a", e 'PATH.basename("a/b/..")' restituirà ".." invece di "a".
- Con l'opzione «-sMODULARIZE», le factory functions che creano e restituiscono istanze di moduli WebAssembly e oggetti per JavaScript sono ora contrassegnate come «async» al momento della compilazione in modalità WASM_ASYNC_COMPILATION, attivata di default.
- È stata aggiunta la possibilità di specificare librerie JavaScript utilizzando l'opzione «-lfoo.js». A differenza dell'opzione «—js-library», la ricerca della libreria viene eseguita in tutti i percorsi specificati tramite l'opzione «-L».
- Durante il linking in modalità di debug (-O0 o -sASSERTIONS) viene utilizzata di default la variante di debug della funzione malloc con i controlli assert attivati, che rilevano errori come la doppia chiamata alla funzione free().
Fonte: opennet.ru
