344 lines
17 KiB
TeX
Executable File
344 lines
17 KiB
TeX
Executable File
\documentclass[11pt]{article}
|
|
|
|
\usepackage{setspace}
|
|
\usepackage[margin=1.75in]{geometry}
|
|
|
|
% Make table of contents look better
|
|
\usepackage{tabularx}
|
|
\usepackage{tocloft}
|
|
\renewcommand{\cftsecleader}{\cftdotfill{\cftdotsep}}
|
|
|
|
\usepackage{graphicx}
|
|
\usepackage{pdfpages}
|
|
\usepackage{hyperref}
|
|
|
|
% \usepackage[ngerman]{babel}
|
|
% \usepackage[T1]{fontenc}
|
|
% \usepackage[ansinew]{inputenc}
|
|
% \usepackage{lmodern}
|
|
|
|
% Times New Roman font
|
|
\usepackage{txfonts}
|
|
|
|
\begin{document}
|
|
|
|
\setlength{\parindent}{2em}
|
|
|
|
\includepdf[pages={1}]{letter.pdf}
|
|
|
|
\begin{titlepage}
|
|
\clearpage
|
|
\thispagestyle{empty}
|
|
|
|
\begin{center}
|
|
{\Huge Final Report}\\
|
|
\vspace{10 mm}
|
|
{\Huge {\tt c0db}\\[.4em]
|
|
The {\tt C0} Debugger}\\
|
|
\vspace{10 mm}
|
|
|
|
Submitted to\\
|
|
Mr. Thomas M. Keating\\
|
|
Assistant Teaching Professor\\
|
|
School of Computer Science\\
|
|
Carnegie Mellon University\\
|
|
Pittsbugh, PA 15289
|
|
|
|
\vspace{10 mm}
|
|
|
|
Prepared by:\\
|
|
{\bf Aaron Gutierrez}\\
|
|
{\bf Shyam Raghavan}\\
|
|
Mitchell Plamann\\
|
|
Suhaas Reddy
|
|
|
|
\vspace{10 mm}
|
|
|
|
School of Computer Science\\
|
|
Carnegie Mellon University\\
|
|
\today
|
|
|
|
\vspace{10 mm}
|
|
|
|
{\bf Abstract}
|
|
\end{center}
|
|
\par
|
|
Finding problems in code is a difficult and time consuming task, one especially
|
|
difficult for programmers learning a new language. To help students more quickly
|
|
find bugs and understand how their programs run, we created an online debugger
|
|
for the {\tt C0} programming language. The {\tt C0} debugger, {\tt c0db},
|
|
enables users to run programs in their browser and break apart the execution
|
|
when they don't run correctly.
|
|
\end{titlepage}
|
|
|
|
\pagenumbering{roman}
|
|
\tableofcontents
|
|
\newpage
|
|
|
|
\pagenumbering{arabic}
|
|
|
|
\section{Introduction}
|
|
We discuss the problems we hoped to resolve, give an overview of the project,
|
|
and show how the project solves the problems outlined. We also analyze the
|
|
effectiveness of the literature reviewed and the final accomplishments compared
|
|
to our original goals.
|
|
\subsection{Background}
|
|
One of Carnegie Mellon University's most widely attended class is 15-122,
|
|
Principles of Imperative Computation. 15-122 contains a capstone assignment
|
|
called the {\tt C0} Virtual Machine, which involves implementing a program that
|
|
allows the user to run arbitrary code in the language in which 15-122 is
|
|
taught, {\tt C0}. The implementation of the virtual machine (C0VM) is not an
|
|
easy task - it involves higher level thinking and a deep understanding of the
|
|
abstractions associated with running arbitrary code.
|
|
\par
|
|
Because it is difficult, the {\tt c0db} ({\tt C0} Debugger) hoped to improve
|
|
the learning process by making visualization and interaction with a working
|
|
implementation of the C0VM more accessible to 15-122 students. This involved
|
|
creating a working Javascript version of the C0VM, implementing visualizers for
|
|
relevant parts of the assignment, and developing the interface for
|
|
student-based interaction with the application.
|
|
\par
|
|
In order to begin learning using {\tt C0}, students must
|
|
become familiar with the Unix operating system environment. This overhead
|
|
causes a delay in the learning of students, and increases the barrier to entry
|
|
for many people.
|
|
\subsection{Project Overview}
|
|
By implementing the {\tt c0db}, we hoped to benefit students in 15-122 by
|
|
helping them create correct programs. The {\tt c0db} will enable students to
|
|
understand how their programs execute and find where problems originate more
|
|
easily than with existing tools. In addition to debugging, students will have a
|
|
more familiar understanding of the underlying computational model represented
|
|
in the debugger through the use of our application.
|
|
\par
|
|
The {\tt C0} Debugger will also enable students to test simple programs with
|
|
little setup, using only a web browser. They will no longer have to set up and
|
|
become familiar with a Unix environment before they can program, making {\tt
|
|
C0} accessible to more people.
|
|
\par
|
|
The project manifested itself in what is now \url{http://c0db.herokuapp.com}.
|
|
The application provides an input field for students to enter {\tt C0} code,
|
|
outputs intermediate bytecode, and has the ability to run said bytecode. The
|
|
application also has functionality that allows for breakpoints, stepping
|
|
through code, and continuing the code from the current breakpoint. With this
|
|
application, we were able to effectively meet the goals of improving coding
|
|
accessibility, creating familiarity with the underlying computational model of
|
|
computers, and being able to more easily debug programs. We were unable to
|
|
effectively meet the goals of visualization and interactivity with respect to
|
|
the debugger and {\tt C0}.
|
|
\subsection{Analysis of Literature Review}
|
|
There was very little relevant literature to the subject at hand. The
|
|
documentation found involved implementing Javascript virtual machines and
|
|
debuggers, and while this was of some use (detailed below), the disconnect
|
|
between implementing a Javascript virtual machine and a {\tt C0} virtual
|
|
machine was apparent. This was also felt in the literature associated with
|
|
processing user-input code.
|
|
\par
|
|
The literature that was discovered during development became very helpful as
|
|
the project evolved. Of particular importance was unit testing and the original
|
|
handout given to students implementing the virtual machine in C.
|
|
\par
|
|
The greatest difficulties faced by the lack of information pertaining to
|
|
creating a virtual machine for a language that was not Javascript involved
|
|
developing the framework to parse through the intermediate bytecode given
|
|
by the compiler of {\tt C0}. The information about building an in-browser
|
|
Javascript VM and debugger\footnote{http://amasad.me/2014/01/06/building-an-in-browser-javascript-vm-and-debugger-using-generators/}
|
|
was a particular example of this. We hoped to design our debugger's architecture
|
|
based on this virtual machine's architecture. The literature mentioned being
|
|
designed in two parts. Specifically, the application was designed around a
|
|
virtual machine and a debugger. Unfortunately, because of the way {\tt C0} is
|
|
designed and the way the bytecode intermediate is evaluated, we found it very
|
|
difficult to follow this modularized approach, and had to combine the two.
|
|
\par
|
|
The second piece of literature we believed would be helpful when proposing this
|
|
project\footnote{http://www.aosabook.org/en/pjs.html} was not helpful at all.
|
|
While it did give us issues to consider such as the lack of threading and the
|
|
presence of asynchronous calls in Javascript, we felt as though it did not
|
|
provide any information about the transferral of information from the webpage
|
|
to the back-end virtual machine and debugger. This was what we hoped we would
|
|
be able to use from it, and while it was helpful in giving ideas about possible
|
|
approaches to this problem, it did not give any insight into the development of
|
|
a script to compile code and receive intermediate bytecode (the solution that
|
|
we eventually employed).
|
|
\par
|
|
The other pieces of literature we reviewed (the Node.js
|
|
documentation\footnote{http://nodejs.org/documentation/}, the Nodeunit
|
|
documentation\footnote{https://github.com/caolan/nodeunit}, and the handout
|
|
given to students to complete the {\tt C0} virtual
|
|
machine\footnote{https://www.cs.cmu.edu/~rjsimmon/15122-f14/prog/c0vm-writeup.pdf})
|
|
were all very helpful. The handout helped us design an architecture that
|
|
allowed for easy implementation in the browser and in Javascript. This
|
|
architecture was very similar to that of the architecture that students are
|
|
given when first completing the virtual machine in C. The Node.js documentation
|
|
and Nodeunit documentation proved very useful when developing the application
|
|
and creating unit tests to test the framework and the application. The
|
|
documentation provided easy answers to questions that arose with implementation.
|
|
\subsection{Successes}
|
|
The final product was successful at completing three of the four goals we set
|
|
out to accomplish. We were successful at improving accessibility of coding and
|
|
programming to students and beginners. The application allows for a simple
|
|
interface to enter code, compile it, and run it. We were successful at
|
|
creating familiarity with the underlying computation model represented in a
|
|
virtual machine. The application gives information about the current state
|
|
of the model at each point in execution, and allows the user to examine the
|
|
internals of the computational model. Finally, we were also successful at
|
|
creating a tool that allows for debugging {\tt C0} code. This is represented
|
|
in the ability of the application to step through the code.
|
|
\par
|
|
We were not successful at developing a visualization component to help
|
|
beginners learn about the computational model. This is something we hope to
|
|
be able to do and, in the future, we hope will help the students of 15-122
|
|
learn more about computer science.
|
|
|
|
\section{Approach}
|
|
In this section, we outline the various phases of our development cycle. We
|
|
also make note of the technologies used to implement the application.
|
|
|
|
\begin{figure}[h]
|
|
\includegraphics[width=\linewidth]{new-gantt}
|
|
\caption{Revised project Gantt chart}
|
|
\label{gantt}
|
|
\end{figure}
|
|
\subsection{Phase 1}
|
|
Phase 1 was centered around the design of the application, and didn't involve
|
|
very much actual programming. This phase was completed a bit later than hoped.
|
|
However, due to its short nature, it did not put us far behind our ideal
|
|
schedule. During Phase 1, we realized that the best option for architecture
|
|
of our application was to structure it similarly to the structure that students
|
|
in 15-122 use and that is provided by the course staff.
|
|
\par
|
|
While the infrastructure could have been designed in a more efficient way, we
|
|
feel as though Phase 1 was effective at creating a base layer from which to
|
|
implement both the front-end and the back-end of the application. At the end
|
|
of Phase 1, we had a framework upon which the successful web application was
|
|
developed, and we were able to coordinate and delegate tasks between team
|
|
members.
|
|
\subsection{Phase 2}
|
|
Phase 2 was focused on the back-end of the application. Phase 2 involved
|
|
actually implementing the framework described in Phase 1, developing the script
|
|
to transform uncompiled {\tt C0} code into bytecode intermediate, developing
|
|
the virtual machine in which the bytecode was executed, implementing a
|
|
state-based breakpoint system that allows for inserting breakpoints into the
|
|
code, and implementing step-based functionality that allows for users to step
|
|
through the running code.
|
|
\par
|
|
In this phase, we used the Node.js framework to implement the application. This
|
|
framework is a commonly-used web application framework in Javascript that is
|
|
used to easily get a running website. We also found Nodeunit, a unit testing
|
|
framework designed for use with the Node.js framework. Nodeunit allowed us to
|
|
write over 50 test files to check for correctness and safety of our virtual
|
|
machine.
|
|
\par
|
|
This phase finished on time after the revision of the Gantt chart (\ref{gantt}).
|
|
There are still some features that we would like to implement before declaring
|
|
the back-end finished, but these involve going further than the stated goals.
|
|
The back-end created an effective interface from which the front-end team was
|
|
able to develop the front-end.
|
|
\subsection{Phase 3}
|
|
Phase 3 was focused on the front-end of the application. Phase 3 involved
|
|
implementing the front-end side of the framework described in Phase 1. This
|
|
includes implementing the user interface for inputting {\tt C0} code, creating
|
|
the design and implementing the design for outputting the intermediate
|
|
bytecode, creating an effective medium of outputting runtime output, and
|
|
developing an interactive suite of tools for debugging such as adding
|
|
breakpoints, stepping through code, and viewing the internal computational
|
|
model.
|
|
\par
|
|
In this phase, we used LESS, a CSS preprocessor, as opposed to plain CSS. LESS
|
|
is a widely used styling language that is compiled into CSS because it is easier
|
|
to write than CSS. We also used JQuery, a front-end framework that is used to
|
|
connect elements of the front-end design to back-end Javascript. These were
|
|
chosen because they allow for fast, correct development, and make it easier
|
|
to focus on development and design, not rewriting existing code.
|
|
\par
|
|
This phase also finished on time after the revision of the Gantt chart
|
|
(\ref{gantt}). We did not quite finish all features we hoped we would be able
|
|
to complete originally. The features not completed involved more intuitive
|
|
interactivity and a better visualization tool for viewing the internals of the
|
|
computational model. The front-end, however, was successful at developing the
|
|
front-end such that most desired goals were achieved.
|
|
\subsection{Phases 4 and 5}
|
|
Phases 4 and 5 were centered around user testing and revision. These phases
|
|
are still in process, and will continue to be in process until the tool is
|
|
developed to the point at which it is used in the 15-122 course curriculum.
|
|
Phase 4 involved showing the product to the 15-122 course staff and getting
|
|
opinions from the teaching assistants that would be using the tool in a
|
|
teaching setting, showing the product to the 15-122 professors, and showing
|
|
the product to 15-122 students. Each of these groups was given an opportunity
|
|
to interact with the product, and was asked to provide feedback on usability,
|
|
learnability, and overall usefulness. Phase 5 involves revising the product
|
|
based on this feedback. Phase 4 is still in process, and as a result, Phase 5
|
|
has not begun yet.
|
|
|
|
\section{Results}
|
|
We originally aimed to evaluate our performance against user feedback from both
|
|
current and past students. However, due to setbacks in the early stages of
|
|
development we were unable to receive significant use feedback from students.
|
|
That said, we were able to gather feedback and support from current 15-122
|
|
course staff.
|
|
\par
|
|
In terms of our original vision, {\tt c0db} includes almost every feature we
|
|
planned to implement. Users can input code and either run the program straight
|
|
through or step through execution instruction by instruction. The only
|
|
significant feature that is not currently implemented completely is breakpoints.
|
|
Implementing breakpoints turned out to be significantly more difficult than we
|
|
anticipated, and given our limited time frame, we were unable to come up with an
|
|
adequate solution. We are currently working with Rob Simmons, 15-122 instructor
|
|
and maintainer for the {\tt C0} language standard, to extend the language to
|
|
support breakpoints more easily going forward.
|
|
|
|
\begin{figure}[h]
|
|
\includegraphics[width=\linewidth]{new-gantt}
|
|
\caption{Revised project Gantt chart (copied from above for convenience)}
|
|
\label{gantt}
|
|
\end{figure}
|
|
Relative to our revised Gantt Chart (Figure \ref{gantt}) we hit every milestone
|
|
on time. Both the front-end and back-end teams completed their tasks by the end
|
|
of April, at which point we transitioned everyone to user testing, revisions,
|
|
and polishing. Both teams were able to recover from the lag reported in our
|
|
progress report to complete {\tt c0db}.
|
|
|
|
\section{Discussion}
|
|
\subsection{Reflection}
|
|
Our team learned several useful skills while working on this project, ranging
|
|
from technical tricks to communication insights. For several of us, this project
|
|
represents the most collaboration on a single code base. We effectively employed
|
|
the git version control system to manage our code to lesson the work needed to
|
|
integrate each person's features. Additionally, several members of our team had
|
|
never worked with node.js or JavaScript extensively before this project.
|
|
Everyone quickly picked up the new framework and started producing useful
|
|
output.
|
|
\par
|
|
We did face some issues communicating early on, but fortunately we were able to
|
|
learn from our problems. Communicating strictly online was not sufficient and
|
|
resulted in a lack of ownership and drive that put us behind schedule early on.
|
|
We overcame our communication problems by holding brief but regular meetings
|
|
face to face to cover what has been accomplished and what tasks come next.
|
|
|
|
\subsection{Future}
|
|
{\tt C0db} is most of what we imagined, but not all. Our overall goal, to make a
|
|
tool useful for 15-122 students, may be realized in the fall, but we have more
|
|
work to ensure that we present them with the best tool possible. Before the next
|
|
semester starts we aim to complete the remaining features we originally planned
|
|
to implement: source-level breakpoints, multi-file support, and a refined
|
|
interface. If we can implement these three features, {\tt c0db} could see proper
|
|
adoption by 15-122 in the fall, where it would be used by over 300 students from
|
|
across Carnegie Mellon. If {\tt c0db} is adopted by 15-122, we would truly have
|
|
achieved the goal for our project: create a tool to better the CMU community.
|
|
|
|
\section{Sources Cited}
|
|
\begin{enumerate}
|
|
\item Amjad Masad,
|
|
``Building an In-Browser JavaScript VM and Debugger Using Generators'',
|
|
http://amasad.me/2014/01/06/building-an-in-browser-javascript-vm-and-debugger-using-generators/
|
|
\item Mike Kamermans, ``The Architecture of Open Source Applications (Volume 2)'',
|
|
http://www.aosabook.org/en/pjs.html
|
|
\item Joyent, Inc., ``Node.js Documentation'',
|
|
http://nodejs.org/documentation
|
|
\item ``Nodeunit documentation'',
|
|
https://github.com/caolan/nodeunit
|
|
\item ``c0vm Assignment Handout'',\\
|
|
https://www.cs.cmu.edu/~rjsimmon/15122-f14/prog/c0vm-writeup.pdf
|
|
\end{enumerate}
|
|
|
|
\end{document}
|