Interventi e pubblicazioni

Relazioni e conferenze

Nobody Can Program Correctly. A Practical and Interactive Guide to Debugging C++ Code
Sebastian Theophil

Ci piace scrivere codice ma, nonostante ci impegniamo al massimo, commettiamo errori. Il nostro programma conterrà dei bug. A volte non scriviamo ciò che intendiamo scrivere, a volte non comprendiamo un aspetto del nostro linguaggio di programmazione e altre volte ci mancano, o non riusciamo a considerare, alcune informazioni critiche sull’ambiente di sistema del nostro programma. Di conseguenza, il nostro programma non si comporterà correttamente. Qual è il passo successivo? In questo seminario vorrei guidarti attraverso l'intero processo di debug, iniziando con un programma che si blocca. Qual è il passo successivo? Quali domande dobbiamo farci? Di quali informazioni abbiamo bisogno? Cosa possiamo fare per scoprire la causa del crash? Quali strumenti ci sono di aiuto in questa ricerca e, ultimo ma non meno importante, cosa possiamo fare per assicurarci che non accada di nuovo? Grazie agli esempi reali che abbiamo riscontrato (e di cui abbiamo eseguito il debug) in think-cell nel corso degli anni, imparerai come riprodurre, individuare, comprendere e correggere anche i bug più difficili.


Typescripten - Generating type-safe JavaScript bindings for emscripten
Sebastian Theophil

WebAssembly è diventata una piattaforma target molto diffusa tra gli sviluppatori C++. Grazie a emscripten, il porting delle applicazioni native su WebAssembly è semplice, purché l'applicazione utilizzi il browser solo come dispositivo di visualizzazione e input. Tuttavia, emscripten non fornisce wrapper indipendenti dai tipi per le API JavaScript standard come l'API di manipolazione DOM, per non parlare di qualsiasi altra API JavaScript fornita dalle applicazioni web esistenti. Il nostro strumento open source “typescripten” è stato creato sulla base di tre potenti tecnologie per colmare questa lacuna. Utilizza i file di definizione dell'interfaccia TypeScript e l'API del compilatore TypeScript per creare wrapper C++ indipendenti dai tipi basati su emscripten. TypeScript dispone già di file di definizione dell'interfaccia per più di 7.000 librerie JavaScript che ora puoi utilizzare in sicurezza da C++. Ci impegniamo a progettare i nostri wrapper C++ in modo tale che il codice C++ che li utilizza sia simile al codice TypeScript o JavaScript equivalente. Tuttavia, la peculiare semantica di Javascript e Typescript basati su prototipi è spesso difficile da tradurre in un linguaggio basato sui tipi come C++. Parlerò delle sfide che abbiamo dovuto affrontare e delle scelte che abbiamo fatto durante la progettazione di questa struttura.


“Windows, macOS and the Web: Lessons from cross-platform development at think-cell
Sebastian Theophil

Per dodici anni, think-cell è stata un'azienda di software esclusivamente Windows e il nostro codice base di circa 700.000 righe di codice aveva accumulato molte dipendenze involontarie dalla piattaforma. Sei anni fa abbiamo deciso di portare la nostra applicazione su Mac. Questo cambiamento ha influenzato ogni parte del nostro processo di sviluppo: l'organizzazione del progetto, il sistema di creazione e le modalità con cui oggi programmiamo in C++. Le librerie multipiattaforma comunemente utilizzate, come Qt e boost, erano validi strumenti per la creazione, ma da sole non erano sufficienti. Per molti concetti, come mutex, semafori o memoria condivisa, offrono solo un'interfaccia comune a oggetti specifici della piattaforma con semantica e durata molto diverse. Desideravamo creare astrazioni C++ leggere e indipendenti dalla piattaforma con la stessa semantica per il rendering, l'internazionalizzazione, l'I/O dei file, la gestione degli eventi del mouse, le chiamate RPC e la segnalazione errori. Svilupparle è stato impegnativo, in primo luogo, perché dovevamo definire di quale semantica aveva bisogno la nostra applicazione e, in secondo luogo, dovevamo implementarli su ciascuna piattaforma. Non è stato un processo facile, ma posso affermare che il risultato ha migliorato moltissimo la qualità del nostro codice. Oggi siamo passati alla sfida successiva e abbiamo iniziato a spostare alcune funzionalità nelle applicazioni web. Volevamo ovviamente riutilizzare la nostra base di codice esistente, e ciò significava scrivere applicazioni web in C++ espressivo e indipendente dai tipi. Sicuramente un vantaggio nella nostra libreria! Abbiamo creato le nostre applicazioni web utilizzando emscripten, ma generiamo collegamenti C++ indipendenti dai tipi da qualsiasi definizione di interfaccia TypeScript. Nel mio seminario, fornirò una panoramica sulle astrazioni C++ che abbiamo implementato, concentrandomi sulle aree di problema relative alla multi-piattaforma, in cui le semantiche comuni sono difficili da definire a causa delle limitazioni di almeno uno dei sistemi operativi e, ovviamente, presenterò gli strumenti che ci consentono di scrivere un’applicazione web in C++.


The C++ rvalue lifetime disaster
Arno Schödl

Utilizziamo i riferimenti a Rvalue da C++11. Sono stati originariamente introdotti per rendere più efficiente lo spostamento degli oggetti: si presuppone che l'oggetto a cui si riferisce un riferimento rvalue esca presto dall'ambito e quindi le sue risorse potrebbero essere recuperate senza danni. La libreria standard C++, ad esempio std::cref o std::ranges, utilizza un altro aspetto dei riferimenti rvalue: poiché escono presto dall'ambito, si presume non sicuro mantenerli oltre l'ambito dell'attuale funzione, mentre i riferimenti lvalue sono considerati sicuri. Anche noi abbiamo trovato questo presupposto molto utile per la gestione intelligente della memoria, in particolare nel codice generico.
Sfortunatamente, il linguaggio C++ stesso viola questo presupposto. Gli Rvalue si legano a const&. Ciò significa che le funzioni dall'aspetto innocente convertono silenziosamente gli rvalue in riferimenti lvalue, nascondendo qualsiasi limitazione della durata degli rvalue. L'estensione temporanea della durata ha lo scopo di rendere sicuro il legame di un temporaneo con un riferimento estendendo la durata del temporaneo. Ma questo funziona solo finché il temporaneo è un prvalue e si interrompe già con i riferimenti a rvalue, lasciando soli gli lvalue generati in modo spurio. Questi problemi non sono meramente teorici. A causa di questi problemi abbiamo riscontrato danneggiamenti della memoria difficili da individuare nel nostro codice. In questo seminario, Arno descriverà dettagliatamente i problemi, presenterà il nostro approccio basato solo sulla libreria per mitigare i problemi e, infine, farà una proposta “impossibile-utilizzare-sempre-gli-standard” su come correggere i problemi.


Better C++ Ranges
Arno Schödl

I range sono presenti nello standard C++ già da un po' e trovano la loro strada nelle basi di codice moderne. Noi di think-cell sviluppiamo e utilizziamo da 20 anni la nostra libreria di range, che si basa sullo standard migliore ed è compatibile con esso, ma lo supera sotto molti aspetti. I range adaptor sono spesso impilati, un filtro sopra una trasformazione sopra, ecc. Per rendere efficiente uno stack di questo tipo, gli iteratori non sono sufficienti. Utilizziamo un nuovo concetto che è più efficiente e allo stesso tempo compatibile con gli iteratori in modo che gli utenti della libreria possano continuare a utilizzare gli iteratori come in precedenza. La libreria standard è molto rigida riguardo alla distinzione tra contenitori e viste e i range adapter sono viste che devono mantenere un riferimento ai dati da adattare. Al contrario, consentiamo ai range adapter di conservare i dati stessi per renderli autonomi e valutati lentamente allo stesso tempo. Il modello di iteratore standard consente solo l'iterazione esterna. Tuttavia, l'iterazione interna è spesso molto più semplice da implementare rispetto all'iterazione esterna. Per molte applicazioni, l'iterazione interna è completamente adeguata e più efficiente dell'iterazione esterna. Pertanto, inseriamo l'iterazione interna nella famiglia di range, al punto che l'utente della libreria potrebbe non sapere o non preoccuparsi del tipo di iterazione utilizzata. Gli algoritmi standard restituiscono iterazioni e utilizzano l'iteratore finale per segnalare alcuni stati singleton. Personalizzando i valori restituiti, possiamo rendere il nostro codice più conciso ed espressivo, ad esempio eliminando questi temuti controlli di fine iteratore. Queste funzionalità combinate rendono i range uno strumento eccellente per la formattazione del testo. Possiamo utilizzare questi range per rappresentare i valori da formattare, trasformandoli concettualmente in stringhe valutate lentamente. Ciò può essere utilizzato proprio come sono utilizzate oggi le stringhe regolari: in restituzione della funzione, come inserimento dell’algoritmo standard, nidificate all’interno di altre, stringhe valutate lentamente allo stesso modo e così via, prima che vengano infine espanse per la visualizzazione. Scegliendo le giuste interfacce, possiamo ottimizzare questa espansione in fase di compilazione, consentendo sia una bella sintassi che prestazioni molto vicine al codice ottimizzato manualmente.


Range-Based Text Formatting - For a Future Range-Based Standard Library
Arno Schödl

Per molto tempo, la formattazione del testo ha rappresentato il problema principale per gli autori della libreria C++. Con questa conferenza, vorrei convincervi che la combinazione di range con un po’ di metaprogrammazione offre una soluzione davvero elegante per risolvere il problema della formattazione del testo. Presentiamo una forma di range con iterazione interna, che generano i propri elementi uno ad uno, anziché esporli a iteratori esterni. Possiamo utilizzare questi range generatori per rappresentare i valori da formattare, trasformandoli concettualmente in stringhe valutate lentamente. Ciò può essere utilizzato proprio come sono utilizzate oggi le stringhe regolari: in restituzione della funzione, come inserimento dell’algoritmo standard, nidificate all’interno di altre, stringhe valutate lentamente allo stesso modo e così via, prima che vengano infine espanse in un contenitore. Scegliendo le giuste interfacce, possiamo ottimizzare questa espansione fino al punto in cui è più lenta solo del 15% rispetto alla creazione di stringhe equivalenti utilizzando un codice speciale ottimizzato a mano.


Why Iterators Got It All Wrong — and what we should use instead
Arno Schödl

Conoscete gli iteratori, giusto? Come li descrivereste? "Gli iteratori sono utilizzati per puntare all’interno di sequenze di elementi." È corretto? Recentemente, il concetto di range è stato introdotto per identificare qualsiasi cosa che espone gli iteratori. In particolare, i range includono adattatori per i range per una trasformazione lenta o per il filtraggio di sequenze di elementi e anche questi hanno iteratori.
Tutto bene? Sfortunatamente no. Il concetto di iteratore, che utilizziamo fin dall’inizio di C++, è fondamentalmente imperfetto. In particolare, alcuni iteratori devono comportarsi in modo differente a seconda che intendano puntare a un elemento o a un limite tra gli elementi. Quindi elementi e limiti sono due concetti proprio distinti. Con questa conferenza, vi convincerò che il problema è reale e ha implicazioni pratiche, proponendovi come risolverlo e mostrandovi come la soluzione non risolve solo il problema, ma crea un codice più chiaro ed evita gli errori.


From Iterators To Ranges - The Upcoming Evolution Of the Standard Library
Arno Schödl

Le coppie di iteratori sono presenti in tutta la libreria C++. Viene generalmente riconosciuto che la combinazione di questo tipo di coppia in una singola entità, denominata solitamente range, restituisce un codice più coinciso e leggibile. Tuttavia, la semantica esatta di un concetto come il range è particolarmente difficoltosa. Le considerazioni teoriche entrano in conflitto con quelle pratiche. Alcuni obiettivi di progettazione non sono affatto compatibili tra loro.


A Practical Approach to Error Handling
Arno Schödl

Ogni programma può contenere degli errori, alcuni derivati dai bug interni al programma stesso e altri causati dall’ambiente operativo in cui viene eseguito. Se da un lato ignorare tutti gli errori potrebbe rendere il programma estremamente instabile, dall’altro gestire ogni possibile errore potrebbe rivelarsi molto complicato senza portare veri e propri vantaggi. Noi di think-cell abbiamo utilizzato e affinato un esclusivo approccio basato sui principi per la gestione degli errori. Questo seminario descrive il nostro metodo, e ti consentirà di scrivere in modo più semplice e meno impegnativo software più affidabili per i tuoi progetti futuri.


Episodio settimanale di C++ Intervista su CppCast
Arno Schödl

Durante il CppCast del 24 gennaio 2018, Rob Irving e Jason Turner hanno intervistato Arno riguardo alla libreria dei range think-cell e, in generale, sullo sviluppo di C++ in think-cell.


Sviluppare un semplice componente aggiuntivo di PowerPoint, quanto può essere difficile?
Valentin Ziegler

Lo sviluppo di Office è ampiamente associato a noiose macro VBA o JavaScript non eleganti. Molti sviluppatori con cui Valentin ha parlato sono rimasti sorpresi nell'apprendere che il codice base di think-cell contiene un milione di righe di codice C++ e che abbiamo dovuto creare alcune librerie generiche lungo il percorso per mantenerlo così breve. Ci impegniamo a implementare l'interfaccia utente più semplice su PowerPoint che consenta agli utenti di creare fantastiche diapositive in poco tempo e per questo abbiamo bisogno di utilizzare strumenti molto potenti. Desideriamo spiegare come applichiamo algoritmi all'avanguardia per risolvere problemi di layout e posizionamento e quali sfide abbiamo dovuto superare per una perfetta integrazione con l'applicazione host.


Industrial Strength Software Hacking
Simon McPartlin

Il rilascio di patch è un metodo efficace, anche se potenzialmente rischioso, per correggere bug, aggiungere funzionalità e migliorare l’usabilità o le prestazioni del software. Durante questa conferenza analizzeremo le patch il cui codice sorgente non è disponibile, un’attività comunemente nota come “hacking”. Discuteremo delle ragioni e delle situazioni che potrebbero rendere necessaria questa attività prima di esaminare nei dettagli la progettazione e l’implementazione di patch solide. Concluderemo con la descrizione di strumenti e tecniche che possono essere utilizzati per individuare le posizioni più adatte per le patch.


std::cout is out - Why iostreams must go
Sebastian Theophil

Recentemente abbiamo iniziato a portare il nostro software su altre piattaforme. Durante questo processo abbiamo scoperto le tante mancanze di iostreams e C-style I/O. Durante questa conferenza, spiegheremo brevemente perché abbiamo eliminato iostreams dal nostro code base e con cosa lo abbiamo sostituito.


C++ Memory Model
Valentin Ziegler e Fabio Fracassi

Il modello di memoria C++ definisce come thread multipli interagiscano con la memoria e i dati condivisi, permettendo agli sviluppatori di ragionare sul codice concorrente in modo indipendente dalla piattaforma. Il seminario spiega le esecuzioni di multi-thread e i data race in C++, come le ottimizzazioni dell’hardware e del compilatore influiscano sul codice concorrente e come evitare un comportamento non definito utilizzando blocchi e operazioni atomiche. Si concentra poi sui vari ordini di memoria per operazioni atomiche, le loro garanzie e le implicazioni sulla performance.


C++ vs. Java
Valentin Ziegler e Fabio Fracassi

Amiamo C++ e lo utilizziamo tutti i giorni. In questo seminario spiegheremo perché, nonostante la sua reputazione di complessità, C++ è concettualmente un linguaggio molto migliore rispetto a Java. Perché? Perché C++ conosce il valore della semantica. Perché C++ ha un comportamento indefinito. Perché C++ non forza la raccolta di dati senza senso. Perché con C++ possiamo scrivere un codice che è sia astratto che efficiente.


Pubblicazioni scientifiche

An Efficient Algorithm for Scatter Chart Labeling
Sebastian Theophil and Arno Schödl
Proceedings of AAAI 2006

Questo articolo presenta un algoritmo efficiente per una variante del problema relativo alla creazione di etichette punti. L'algoritmo ha lo scopo di posizionare il maggior numero possibile di etichette punti in maniera tale che non intersechino altri punti. In primo luogo, viene presentato l'algoritmo utilizzando un algoritmo greedy con lookahead limitato. Poi viene presentato un algoritmo in grado di raggruppare le etichette in maniera iterativa, applicando il primo algoritmo a ciascun gruppo per individuare un ordine di etichettatura pressoché ottimale. L'algoritmo presentato è attualmente utilizzato in un prodotto commerciale per etichettare i grafici e la nostra valutazione dimostra che i suoi risultati sono decisamente superiori rispetto ad altri algoritmi di questo genere.


A Smart Algorithm for Column Chart Labeling
Sebastian Müller and Arno Schödl
Proceedings of SMART GRAPHICS 2005

Questo articolo presenta un algoritmo intelligente per l'etichettatura degli istogrammi e dei loro derivati. Per trovare una soluzione efficiente, il problema dell'etichettatura è stato scomposto in due sotto-problemi. Innanzi tutto viene presentato un algoritmo geometrico che consente di trovare una buona etichettatura per le etichette di una sola colonna, partendo dal presupposto che alcune altre colonne siano già state etichettate. Successivamente, si presenta una strategia che consente di trovare il giusto ordine nel quale le colonne devono essere etichettate. In questo approccio, il primo algoritmo viene utilizzato ripetutamente per alcuni lookahead limitati. L'algoritmo presentato è attualmente utilizzato in un prodotto commerciale per etichettare i grafici e nella pratica produce risultati soddisfacenti.


Graphcut Textures: Image and Video Synthesis Using Graph Cuts
Vivek Kwatra, Arno Schödl, Irfan Essa, Greg Turk and Aaron Bobick
Proceedings of SIGGRAPH 2003

In questo articolo si presenta un nuovo algoritmo per la sintesi della struttura di immagini e video. Secondo il nostro approccio, alcuni patch di un'immagine o di un video campione sono trasformati e copiati nell'immagine/video risultante e allineati lungo linee di collegamento ottimali per generare una nuova immagine/video, solitamente più grande. A differenza delle altre tecniche, le dimensioni del patch non sono scelte a priori, ma viene utilizzata una tecnica di taglio che consente di determinare il patch ottimale in base al divario esistente tra la struttura di input e quella di output. A differenza della programmazione dinamica, la nostra tecnica di taglio ottimizzata è applicabile a qualunque dimensione. Si esplorano specificamente elementi 2D e 3D per effettuare la sintesi della struttura video oltre alla normale sintesi delle immagini.


Controlled Animation of Video Sprites
Arno Schödl e Irfan Essa
Proceedings of SCA 2002

In questo articolo viene presentato un nuovo approccio alla generazione di animazioni controllate di video sprite. I video sprite sono delle animazioni create riorganizzando i fotogrammi relativi a un oggetto in movimento. Grazie a questa tecnica, l'utente può specificare delle animazioni che utilizzano una funzione di costo flessibile, che viene automaticamente ottimizzata sostituendo ripetutamente le sequenze del video sprite.


Video Textures
Arno Schödl, Richard Szeliski, David H. Salesin e Irfan Essa
Proceedings of SIGGRAPH 2000

Questo articolo presenta un nuovo supporto, chiamato video texture, le cui qualità sono a metà tra quelle di un video e quelle di una foto. Un video texture fornisce un flusso di immagini continuo che varia infinitamente. Anche se i singoli fotogrammi di un video texture possano ripetersi di tanto in tanto, la sequenza video nel suo complesso non si ripete mai esattamente. I video texture possono sostituire le immagini digitali per fornire un'immagine statica con qualità dinamiche e un'azione esplicita.

Vuoi saperne di più?

In caso di domande sul lavoro in think-cell, sulle nostre opportunità di lavoro o i nostri eventi, ti invitiamo a contattare la nostra collega Julia Zhachuk.

hr@think-cell.com
+49 30 6664731-81

rappresentante HR di think-cell.


Condividi