Computational Foundations II

Aim of this Lecture

This lecture introduces computers from the lowest sensible level by introducing some theory and practice of electronic digital circuits including the basic building blocks of digital computers (clocks, flip-flops, half- and full-adder). On this basement, very simple computers are discussed in some detail based on the Atmel family of micro controllers (Arduino and others) and basic bus systems (I2C, SPI, etc.) are sketched. On this basement, we explore the field of low-level programming including applications such as real-time software, embedded software, distributed systems, and edge computing using FPGAs and GPUs switching to higher level programming languages (Arduino C, C++11 for NVIDIA GPUs, C++20 for cooperative multitasking) where appropriate. Finally, we show how concepts from distributed systems (client-server, publish-subscribe, etc.), object orientation (inheritance), garbage collection (reference counting), and software engineering can help structuring programs even in those environments where language support is infeasible. The lecture closes with a short overview on software quality aspects including performance optimization, resource sharing, security, safety and proof of correctness, error tolerance and others.

By completing this module, students will have had a detailed exposition to special programming environments including both realtime and embedded domains and specialized hardware such as GPUs or FPGAs. In addition, advanced patterns of software development and software design are introduced in order to help students planning and writing high-quality software even when language support structures such as constructors, exceptions, user interface, debuggers, and IDEs are unavailable.

This module builds on Knowledge of theory and practice as is available from the module Computational Foundations I.


© 2020 M. Werner