We may earn an affiliate commission when you visit our partners.
Course image
Shimon Schocken

In this project-centered course you will build a modern software hierarchy, designed to enable the translation and execution of object-based, high-level languages on a bare-bone computer hardware platform. In particular, you will implement a virtual machine and a compiler for a simple, Java-like programming language, and you will develop a basic operating system that closes gaps between the high-level language and the underlying hardware platform. In the process, you will gain a deep, hands-on understanding of numerous topics in applied computer science, e.g. stack processing, parsing, code generation, and classical algorithms and data structures for memory management, vector graphics, input-output handling, and various other topics that lie at the very core of every modern computer system.

Read more

In this project-centered course you will build a modern software hierarchy, designed to enable the translation and execution of object-based, high-level languages on a bare-bone computer hardware platform. In particular, you will implement a virtual machine and a compiler for a simple, Java-like programming language, and you will develop a basic operating system that closes gaps between the high-level language and the underlying hardware platform. In the process, you will gain a deep, hands-on understanding of numerous topics in applied computer science, e.g. stack processing, parsing, code generation, and classical algorithms and data structures for memory management, vector graphics, input-output handling, and various other topics that lie at the very core of every modern computer system.

This is a self-contained course: all the knowledge necessary to succeed in the course and build the various systems will be given as part of the learning experience. The only prerequisite is knowledge of programming at the level acquired in introduction to computer science courses. All the software tools and materials that are necessary to complete the course will be supplied freely after you enrol in the course.

This course is accompanied by the textbook "The Elements of Computing Systems" (Nisan and Schocken, MIT Press). While not required for taking the course, the book provides a convenient coverage of all the course topics. The book is available in either hardcopy or ebook form, and MIT Press is offering a 30% discount off the cover price by using the discount code MNTT30 at https://mitpress.mit.edu/books/elements-computing-systems.

The course consists of six modules, each comprising a series of video lectures, and a project. You will need about 2-3 hours to watch each module's lectures, and about 15 hours to complete each one of the six projects. The course can be completed in six weeks, but you are welcome to take it at your own pace. You can watch a TED talk about this course by Googling "nand2tetris TED talk".

*About Project-Centered Courses: Project-centered courses are designed to help you complete a personally meaningful real-world project, with your instructor and a community of learners with similar goals providing guidance and suggestions along the way. By actively applying new concepts as you learn, you’ll master the course content more efficiently; you’ll also get a head start on using the skills you gain to make positive changes in your life and career. When you complete the course, you’ll have a finished project that you’ll be proud to use and share.

Enroll now

What's inside

Syllabus

Getting Started
Machine Language
Virtual Machine I: Stack Arithmetic
Read more
Virtual Machine II: Program Control
High-Level Language
Compiler I: Syntax Analysis
Compiler II: Code Generation
Operating System
Postscript: More Fun to Go

Good to know

Know what's good
, what to watch for
, and possible dealbreakers
Teaches machine code, which is the foundation of modern software and computer systems
Develops software engineering skills, including stack processing, parsing, code generation, and memory management
Covers computer science fundamentals, such as classical algorithms and data structures
Provides a unique opportunity to build a modern software hierarchy from scratch
Can be taken at your own pace, making it accessible to learners with varying schedules
May require additional time and effort to complete the projects

Save this course

Save Build a Modern Computer from First Principles: Nand to Tetris Part II (project-centered course) to your list so you can find it easily later:
Save

Reviews summary

Understand computers from binary to os: nand to tetris part two

Learners say this project-based course expands their foundational knowledge of computers. Although challenging, students highly value what they learn. Students particularly appreciate the insights gained from creating a compiler and operating system. Note that this course is most appropriate for those with a programming background.
Dive deep into hands-on projects building a computer from scratch.
"The course is project-centered."
"It makes it a lot more hands-on and interactive than just reading about how computers work."
"This course puts the understanding of how computers work, from low-level hardware to high-level software, into the grasp of anyone who is curious enough and willing to do the work."
Build a simple operating system to support your custom hardware and compiler.
"Learning about virtual machines, translators, parsing, syntax analysis, building a high level language compiler, building operating system libraries."
Learn the ins and outs of building a complete compiler for a programming language.
"This course is for the avid programmers that want to understand compilers and languages and how they interact with a computer (preumable the one you build in Part 1 of the course)."
"It really deepened my understanding of computers and helped me to be a better programmer. It is more challenging than the first part."
Gain a deep understanding of how a computer works, including its hardware, software, and architecture.
"You often ask yourself how computers really work, even if you have a computer science education. You usually learn individual aspects of technology. This course teaches everything. You get the full picture."
"Along with Part I, this course fills all the knowledge gaps among the distinct computer science courses."
"This is a great course to a great amount of knowledge about the compiler and programming language, and get some knowledge about the operating system."
Prepare for a high level of difficulty and time commitment.
"The difficulty design of coursework is unreasonable, and the difficulty span is large, which is unacceptable"
"Extremely challenging, but well-worth the time and effort!"
"This entire course honors what it claims. It has the ability to demystify computers and how they work."

Activities

Be better prepared before your course. Deepen your understanding during and after it. Supplement your coursework and achieve mastery of the topics covered in Build a Modern Computer from First Principles: Nand to Tetris Part II (project-centered course) with these activities:
Review foundational programming knowledge
Refresh your understanding of programming concepts such as variables, data types, control flow, and functions to strengthen your foundation for this course.
Show steps
  • Recall concepts of variables, data types, and operators
  • Revisit fundamental control flow structures like if-else and loops
  • Practice writing and debugging simple functions
Explore virtual machine concepts
Enhance your understanding of virtual machines by following guided tutorials that delve into their architecture, operation, and advantages.
Browse courses on Virtual Machine
Show steps
  • Find tutorials on virtual machine concepts and architecture
  • Follow along with the tutorials, taking notes and experimenting with examples
  • Create a simple virtual machine to gain hands-on experience
Review 'Operating System Concepts' by Abraham Silberschatz
Supplement your understanding of operating systems by reviewing a classic textbook in the field, providing a comprehensive overview of key concepts and principles.
Show steps
  • Obtain a copy of 'Operating System Concepts' by Abraham Silberschatz
  • Read and take notes on the chapters relevant to the course
Five other activities
Expand to see all activities and additional details
Show all eight activities
Design and implement a stack data structure
Solidify your understanding of stacks by designing and implementing a stack data structure in a programming language of your choice.
Browse courses on Stack Data Structure
Show steps
  • Research and understand the concept and operations of a stack
  • Design the interface and implementation of your stack data structure
  • Code and test your stack implementation thoroughly
Practice parsing techniques
Refine your parsing skills by working through practice drills that involve parsing expressions, statements, or code snippets.
Browse courses on Parsing
Show steps
  • Find online or textbook exercises on parsing
  • Solve the parsing exercises, paying attention to syntax rules and grammar
  • Review your solutions and identify areas for improvement
Gather resources on software engineering best practices
Bolster your software engineering knowledge by compiling a collection of articles, tutorials, and documentation on best practices in software design, testing, and maintenance.
Show steps
  • Search for reputable sources on software engineering best practices
  • Organize and categorize the gathered resources into a structured compilation
  • Review the compilation periodically to refresh your understanding and stay updated
Attend a workshop on compiler optimization
Expand your knowledge of compiler optimization techniques by attending a workshop led by experts in the field.
Browse courses on Compiler Optimization
Show steps
  • Research and identify relevant compiler optimization workshops
  • Register and attend the workshop, actively participating and asking questions
  • Apply the learned techniques to your own compiler projects or code optimizations
Mentor a junior developer on operating system concepts
Enhance your understanding of operating system concepts by mentoring a junior developer, providing guidance and support on topics such as process management, memory management, and file systems.
Browse courses on Operating Systems
Show steps
  • Identify a junior developer seeking mentorship on operating system concepts
  • Schedule regular meetings to discuss concepts, answer questions, and provide feedback
  • Assign practical exercises and projects to reinforce learning

Career center

Learners who complete Build a Modern Computer from First Principles: Nand to Tetris Part II (project-centered course) will develop knowledge and skills that may be useful to these careers:
Computer Hardware Engineer
Computer Hardware Engineers research, design, develop, and test computer systems and components. They are often involved in the development of new technologies, such as microprocessors, memory chips, and circuit boards. This course would be particularly helpful for Computer Hardware Engineers who want to learn more about the inner workings of computers, as it covers topics such as machine language, virtual machines, and compilers. The understanding of computer science topics from this course can be especially beneficial in the field of computer hardware engineering, which would ultimately provide you with a better foundation for your career.
Computer Software Engineer
Computer Software Engineers design, develop, and maintain software systems. They work on a variety of projects, from small business applications to large-scale enterprise systems. This course would be helpful for Computer Software Engineers who want to learn more about the fundamentals of computer science, as it covers topics such as programming languages, data structures, and algorithms. This course is designed to build a strong foundation for software engineers who are looking to develop their career by understanding the software hierarchy, as well as gaining experience in compiler design.
Software Developer
Software Developers are responsible for writing and maintaining the code that powers computer systems. They work on a variety of projects, from developing new features for existing software to creating entirely new applications. This course is project-centered, which provides the perfect opportunity for Software Developers to build a portfolio of projects that they can use to showcase their skills to potential employers. Additionally, the curriculum aligns directly with the areas that Software Developers need to know, such as object-based programming, memory management, input-output handling, and program control.
Computer Programmer
Computer Programmers write and maintain the code that runs on computers. They work on a variety of projects, from developing new software to updating existing systems. This course would be helpful for Computer Programmers who want to learn more about the fundamentals of programming and computer science, including topics like classical algorithms, data structures, and computer system design. This course is designed to help Programmers build a foundation in these areas, and provides projects that can help build a portfolio.
Computer Systems Analyst
Computer Systems Analysts study the needs of an organization and develop computer systems to meet those needs. They work with users to gather requirements, design systems, and implement and test solutions. This course would be helpful for Computer Systems Analysts who want to learn more about the fundamentals of computer science, as it covers topics such as operating systems, computer architecture, and networking. With a project-centered learning approach, this course can help Computer Systems Analysts apply their new knowledge and build out their portfolios.
Database Administrator
Database Administrators are responsible for managing and maintaining databases. They work with users to gather requirements, design databases, and implement and test solutions. This course would be helpful for Database Administrators who want to learn more about the fundamentals of computer science, as it covers topics such as data structures, algorithms, and database design. The course is project-centered, and would allow for the development of a portfolio that demonstrates proficiency.
Information Security Analyst
Information Security Analysts protect computer systems and networks from unauthorized access, use, disclosure, disruption, modification, or destruction. They work with users to gather requirements, design security systems, and implement and test solutions. This course would be helpful for Information Security Analysts who want to learn more about the fundamentals of computer security, as it covers topics such as cryptography, network security, and operating system security. This course is project-centered, and gives Information Security Analysts the chance to work on projects that they can add to their portfolios, demonstrating their ability to apply what they have learned.
Network Engineer
Network Engineers design, install, and maintain computer networks. They work with users to gather requirements, design networks, and implement and test solutions. This course would be helpful for Network Engineers who want to learn more about the fundamentals of computer networking, as it covers topics such as network protocols, network topologies, and network security. This course is project-centered, giving Network Engineers the ability to build a portfolio that showcases their skills in network design and implementation.
Computer and Information Research Scientist
Computer and Information Research Scientists research and develop new computer and information technologies. They work on a variety of projects, from developing new programming languages to creating new ways to store and process data. This course would be helpful for Computer and Information Research Scientists who want to learn more about the fundamentals of computer science, as it covers topics such as algorithms, data structures, and programming languages. The project-centered nature of this course gives you the opportunity to create something that can be used to showcase your skills and knowledge.
Operations Research Analyst
Operations Research Analysts use mathematical and statistical techniques to solve business problems. They work on a variety of projects, from developing new inventory management systems to optimizing production schedules. This course would be helpful for Operations Research Analysts who want to learn more about the fundamentals of computer science, as it covers topics such as algorithms, data structures, and probability. The project-centered approach to this course allows you to apply your new skills to real-world problems, and this completed work can be added to your portfolio.
Statistician
Statisticians collect, analyze, and interpret data. They work on a variety of projects, from developing new statistical methods to applying statistical techniques to real-world problems. This course would be helpful for Statisticians who want to learn more about the fundamentals of computer science, as it covers topics such as data structures, algorithms, and probability. With the projects in this course, Statisticians can develop a portfolio of work to showcase their skills, including their ability to analyze and interpret data.
Data Scientist
Data Scientists use data to solve business problems. They work on a variety of projects, from developing new machine learning algorithms to creating new data visualization tools. This course would be helpful for Data Scientists who want to learn more about the fundamentals of computer science, as it covers topics such as machine learning, data mining, and data visualization. The hands-on projects in this course provide the opportunity to develop a portfolio of work that showcases Data Science skills, including the ability to collect, analyze, and visualize data.
Web Developer
Web Developers design and develop websites. They work on a variety of projects, from creating simple websites to developing complex web applications. This course would be helpful for Web Developers who want to learn more about the fundamentals of web development, as it covers topics such as HTML, CSS, and JavaScript. The project-centered approach to this course gives you the opportunity to create a portfolio of work that showcases your web development skills.
User Experience Designer
User Experience Designers research and design user interfaces for websites and software applications. They work with users to gather requirements, design interfaces, and test solutions. This course would be helpful for User Experience Designers who want to learn more about the fundamentals of user experience design, as it covers topics such as human-computer interaction, usability testing, and information architecture. The project-centered approach to this course allows you to apply your new skills to real-world problems, giving you the ability to build a portfolio that showcases your work.
Technical Writer
Technical Writers create documentation for software and hardware products. They work with engineers and other technical experts to gather information, write documentation, and test solutions. This course would be helpful for Technical Writers who want to learn more about the fundamentals of technical writing, as it covers topics such as technical writing principles, documentation standards, and user interface design. By taking this course, Technical Writers can build a portfolio that demonstrates their ability to write high-quality technical documentation.

Reading list

We've selected 15 books that we think will supplement your learning. Use these to develop background knowledge, enrich your coursework, and gain a deeper understanding of the topics covered in Build a Modern Computer from First Principles: Nand to Tetris Part II (project-centered course).
Is the textbook for the course and provides an excellent overview of the topics covered in the course. The book valuable resource for anyone interested in learning more about computer science.
Provides an introduction to computer systems, covering topics such as computer architecture, operating systems, and computer networks. The book is an excellent reference for anyone interested in learning more about how computers work.
Provides an introduction to algorithms, covering topics such as sorting, searching, and graph algorithms. It is an excellent resource anyone interested in learning more about algorithms.
Provides an introduction to data structures and algorithms, covering topics such as linked lists, stacks, and queues. It valuable resource for anyone interested in learning more about data structures and algorithms.
Provides an introduction to computer graphics, covering topics such as 3D modeling, rendering, and animation. It valuable resource for anyone interested in learning more about computer graphics.
Provides an introduction to machine learning, covering topics such as supervised learning, unsupervised learning, and reinforcement learning. It is an excellent reference for anyone interested in learning more about machine learning.
Provides an introduction to deep learning, covering topics such as neural networks, convolutional neural networks, and recurrent neural networks. It valuable resource for anyone interested in learning more about deep learning.
Provides an introduction to natural language processing, covering topics such as text classification, text summarization, and machine translation. It valuable resource for anyone interested in learning more about natural language processing.
Provides an introduction to speech and language processing, covering topics such as speech recognition, language modeling, and machine translation. It valuable resource for anyone interested in learning more about speech and language processing.
Provides an introduction to information retrieval, covering topics such as text retrieval, web search, and social media mining. It valuable resource for anyone interested in learning more about information retrieval.
Provides an introduction to database systems, covering topics such as data modeling, query processing, and transaction management. It valuable resource for anyone interested in learning more about database systems.

Share

Help others find this course page by sharing it with your friends and followers:

Similar courses

Here are nine courses similar to Build a Modern Computer from First Principles: Nand to Tetris Part II (project-centered course).
Build a Modern Computer from First Principles: From Nand...
Most relevant
Build Your First Android App (Project-Centered Course)
Most relevant
How to Write a Resume (Project-Centered Course)
Most relevant
How To Create a Website in a Weekend! (Project-Centered...
Most relevant
How to Make a Comic Book (Project-Centered Course)
Business Model Canvas: A Tool for Entrepreneurs and...
How to Get Skilled: Introduction to Individual Skills...
Design and Make Infographics (Project-Centered Course)
How to Write and Publish a Scientific Paper (Project...
Our mission

OpenCourser helps millions of learners each year. People visit us to learn workspace skills, ace their exams, and nurture their curiosity.

Our extensive catalog contains over 50,000 courses and twice as many books. Browse by search, by topic, or even by career interests. We'll match you to the right resources quickly.

Find this site helpful? Tell a friend about us.

Affiliate disclosure

We're supported by our community of learners. When you purchase or subscribe to courses and programs or purchase books, we may earn a commission from our partners.

Your purchases help us maintain our catalog and keep our servers humming without ads.

Thank you for supporting OpenCourser.

© 2016 - 2024 OpenCourser