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 (BNF), semantics of programming languages (denotational and operational semantics), variables and expressions, imperative languages, parameter passing mechanisms (call-by-value, call-by-name, and others), the lambda calculus, types and type systems, polymorphism, higher-order functions, object-orientation and generics, concurrency, and theorem proving. Practical topics include: language generators and string rewriting, 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 a modern programming language such as Python, C++, Java, etc.) is necessary in order to be able to follow the course. Knowledge of any other programming language is a plus but not mandatory.
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 some concepts 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 and when.
At the end of the course the student has acquired:
basic knowledge of programming language theory
basic knowledge of imperative programming concepts (such as structured programming)
basic knowledge of functional programming concepts (such as algebraic data types and recursion)
basic knowledge of concurrent programming (needed for an advanced course in concurrency)
basic knowledge of automated and interactive theorem proving (needed for an advanced course in logical verification)
basic knowledge of operational and denotational semantics (needed for an advanced course in program correctness and computational models)
practical experience with advanced imperative and object-oriented programming features (such as designing class hierarchies and defining and using abstract data types)
hands-on experience with implementing the (simply typed) lambda calculus, type checking and type inference (needed for an advanced course in type theory)
You will find the timetables for all courses and degree programmes of Leiden University in the tool MyTimetable (login). Any teaching activities that you have sucessfully registered for in MyStudymap will automatically be displayed in MyTimetable. Any timetables that you add manually, will be saved and automatically displayed the next time you sign in.
MyTimetable allows you to integrate your timetable with your calendar apps such as Outlook, Google Calendar, Apple Calendar and other calendar apps on your smartphone. Any timetable changes will be automatically synced with your calendar. If you wish, you can also receive an email notification of the change. You can turn notifications on in ‘Settings’ (after login).
For more information, watch the video or go the the 'help-page' in MyTimetable. Pleas note: Joint Degree students Leiden/Delft have to merge their two different timetables into one. This video explains how to do this.
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 exercise classes, students use pen and paper.
For lab sessions, students may be asked to bring their own device.
Self-study and group work is necessary to finish the assignments.
The labs are for getting started, collaboration, and requesting/obtaining feedback.
The final grade is calculated from the following:
Final exam (50%)
Assignments will be mixed individual 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 final exam in order to pass the course.
The teacher will inform the students how the inspection of the graded assignments and final exam will take place.
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 may 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.