nl en

Concepts of Programming Languages


Admission requirements

Not applicable.


Computer programming is the activity of specifying what computers do, and programming languages are the main tool to achieve that. This course offers a kaleidoscopic view on the many concepts of programming languages, focusing on object-oriented programming and functional programming. Some concepts will be merely introduced, thereby providing an overview of directions for further study.

This course comprises both theoretical and practical aspects of programming languages. Theoretical topics include: methods to describe language syntax, denotational and operational semantics, the lambda calculus, parameter passing mechanisms, variable binding, types and type systems, polymorphism, higher-order functions, object-orientation and generics, concurrency, and theorem proving. Practical topics include: lexical analysis and parsing of strings, advanced imperative and object-oriented programming, and basic functional programming.

Having followed the courses Foundations of Computer Science (4031FDCS6), Introduction to Logic (4031ILOGI) and Programming Techniques (4031PRGTE) is highly recommended, but not mandatory. Basic programming ability (e.g. in Python, Java, C++, etc.) is necessary in order to be able to follow the course. Knowledge of any other programming language is a plus but not mandatory.

Course objectives

The main goal of the course is to provide insights into why there is a need for high-level programming languages, the relationship between concepts of programming languages, and practice with how they are implemented. This enables the student to learn new programming languages (or related techniques employed in the programming context) faster, and make more informed decisions about what to use when.

At the end of the course the student has acquired:

  • basic knowledge of programming language theory

  • practical experience with advanced imperative and object-oriented programming features (such as designing class hierarchies and defining and using abstract data types)

  • practical experience with basic functional programming concepts (such as algebraic data types and recursion)

  • basic knowledge of operational and denotational programming language semantics (needed for an advanced course in program correctness and computational models)

  • hands-on experience with implementing the (simply typed) lambda calculus, type checking and type inference (needed for an advanced course in type theory)

  • basic knowledge of distributed and concurrent programming (needed for an advanced course in concurrency and computer networks)

  • basic knowledge of automated and interactive theorem proving (needed for an advanced course in logical verification)


Het meest recente rooster is te vinden op de Studenten-website:

Mode of instruction

Lectures are digital and pre-recorded, 2 hours per week.
Exercise classes (theory), 2 hours per week.
Lab sessions (practice), 2 hours per week.
Both exercise classes and lab sessions are organized on location.

For lab sessions, students are expected to bring their own device.
Self study and group work is necessary to finish the assignments,
the labs are rather for getting started and obtaining feedback.

Assessment method

The final grade is calculated from the following:

Assignments (50%)
Written exam (50%)

Assignments will be mixed single work and group work in groups of a maximum of 3 people. The number of assignments will be around 4. It is required to achieve at least 5.5 points on average for the assignments, and also for the written exam in order to pass the course. The teacher will inform the students how the inspection of and follow-up discussion of the exams will take place.

Reading list

The lecturer provides students with relevant pointers to literature, some of which is open access. A selection of snippets from closed access books and articles will be provided by the lecturer for a more detailed study of the programming concepts introduced. A list of recommended (but optional) books is also provided.


Aanmelding voor vakken verloopt via uSis. Hiervoor is de uSis-code van het vak nodig, die te vinden zijn in de Studiegids. Meer info over het inschrijven voor vakken of tentamens is hier te vinden.


In MyTimetable kun je alle vak- en opleidingsroosters vinden, waarmee jij je persoonlijke rooster kunt samenstellen. Onderwijsactiviteiten waarvoor je in uSis staat ingeschreven, worden automatisch in je rooster getoond. Daarnaast kun je My Timetable gemakkelijk koppelen aan een agenda-app op je telefoon en worden roosterwijzigingen automatisch in je agenda doorgevoerd; bovendien ontvang je desgewenst per e-mail een notificatie van de wijziging.

Vragen? Bekijk de video-instructie, lees de instructie of neem contact op met de ISSC helpdesk.


Inschrijving voor vakken verloopt via uSis. Wanneer je je hier inschrijft voor een bepaald vak krijg je automatisch ook toegang tot de omgeving van dit vak via Brightspace.

Voor meer informatie over Brightspace kun je op deze link klikken om de handleidingen van de universiteit te bekijken. Bij overige vragen of problemen kan contact opgenomen worden met de helpdesk van de universiteit Leiden.


Docent Hans-Dieter Hiep
Onderwijscoördinator Informatica, Riet Derogee