\Section{Introduction} Computers are present in virtually every aspect of our lives: middle-schoolers and grandmothers alike use them at home, at school, and at work. Sadly, computers are mostly used for activities like word processing, web browsing, e-mail, and games. To truly take advantage the power of their computers, {\em end-users} must be able to write programs. This makes end-user programming languages and environments an important area of research. A number of end-user programing systems have been proposed. These systems have focused on various goals, and can be classified based on several criteria. One such criterion is the {\em steepness of the learning curve} --- in other words, how easy it is for a new user to become productive. In systems like Viscuit~\cite{yh03viscuit} and StageCast~\cite{dcs00stagecast}, for example, simple graphical pattern-matching and rewrite rules allow end-users to compose simple animations quickly and easily, with very little training required. Another criterion is the {\em ceiling height}, i.e., how well the language scales to more complex problems. A full-fledged programming language with many built-in features, where the user writes textual programs, will get the highest marks on this criterion. The tension between these criteria makes the task of designing an end-user programming system a difficult one. No system that we are aware of has both a gentle learning curve {\em and} a high ceiling. Existing systems tend to spread on the spectrum from gentle learning curve/low ceiling to steep learning curve/high ceiling. Viscuit, for example, has a very low learning curve, but expressions in Viscuit are represented solely iconically; Viscuit, in fact, does not even have the concept of numbers or arithmetic. In such systems, one quickly hits the rather low ceiling, after initially enjoying simple and easy programs. Systems like Scratch~\cite{mbkrsr04@scratch} offer graphical building blocks that the user can manipulate and combine with the mouse to construct programs. The blocks are symbolic representations of the elements of a program (such as numbers, symbols, and control structures) so the user has to learn what each block does and means, but as he learns more about these blocks, his productivity increases. Unfortunately, this gentle learning curve has some negative consequences; for example, Scratch intentionally omits the concept of inter-object reference to avoid confusion. This design choice makes it tricky to write a program where multiple objects work together. At the other end of the spectrum, there are languages and systems with fully textual code. Many educational and end-user development environments are based on Java, Python and other conventional languages, which makes them very expressive. Also, text-based programming tends to be more efficient than tiles as programs grow in complexity. {\em Processing}~\cite{rf07processing} and J0~\cite{j0} are based on simplified versions of Java, and provide end-user-oriented development environments. However, users have to deal with syntax errors, and face a steeper learning curve. \begin{figure}[tp] \centering \scalebox{0.4}{\includegraphics{turtle.eps}} \caption{A screenshot from the TileScript system. The smae code is shown as tiles and text-based code.} \label{fig:turtles} \end{figure} \SubSection{The Goal} Our goal is to create a new end-user scripting language with a gentle learning curve and a high ceiling. Our system should support both tile scripting and textual coding, and the transition between these two representations should be as smooth as possible. Specifically, we aim to make it possible for the user to: \begin{itemize} \item convert a tile script into equivalent textual code, and vice-versa; \item extend the system by creating new kinds of tiles (abstractions), and optionally customize their appearance. (The meaning of new tiles should be described using tiles or textual code.) \item ``pop the hood'' of any part of the system, so that he can learn about (and perhaps even modify) it. \end{itemize} Although users will most likely get started using the tile scripting interface, all of the knowledge they acquire with the tiles will still be valid once they make the transition to text-based programming. Our idea draws upon Squeak Etoys~\cite{ack97Etoys}\cite{bjkr03PowerfulIdeas}. Etoys, like Scratch, offers visual building blocks (called ``tiles'') which the user can combine by dragging-and-dropping to make a unit of program called a {\em script}. \begin{figure}[tp] \centering \scalebox{0.4}{\includegraphics{etoystiles.eps}} \caption{The same Etoys script in graphical representation and textual representation.} \label{fig:etoys tiles} \end{figure} Etoys tile scripts can be converted into textual code (represented in the system's base language, Squeak Smalltalk), as shown in Figure~\ref{fig:etoys tiles}. Unfortunately, this conversion is only ``one way''; once the user edits the code textually, there is no mechanism to convert the edited text back to tiles. This limitation exists because Smalltalk is a lot more expressive than the tile language, which makes it is possible for the user to type in code that does not have a corresponding graphical tile representation. Also, the Etoys object model is not the same as Smalltalk's, which means that the knowledge of the model the user acquires by using Etoys cannot be translated to Smalltalk programming. Lastly, because Etoys tiles are implemented in Smalltalk by the system's developers, the end-user is cannot extend the tile language with new tiles; he is limited to using the ones provided by the developers. \begin{figure}[tp] \centering \scalebox{0.7}{\includegraphics{spectrum.eps}} \caption{A classification of various end-user programming systems.} \label{fig:spectrum} \end{figure} %% \SubSection{Problems for Providing Extensibility and Openness} %% There is another axis in our classification of end-user programming %% systems; it is {\em extensibility} of the system. Most of the %% end-user systems typically provide pre-made, fixed features (such as %% the matching rules in Viscuit and StageCast, blocks and tiles in %% Scratch and Etoys, or the Java API in Java). The Etoys system lets %% the user create a new script, and the script can be used as a command %% tile similar to the built-in ones. However, this is as far as the user %% can go; the code behind creation of a script is written in Smalltalk %% by developers who have deep knowledge of the structure of classes. %% In visual pattern-matching languages, it is not even conceivable %% for the user to define new kinds of matching rules. In the environment %% for a textually-coded programming language, adding a method or defining %% a class (for example) is easy, but the system is not usually opened to %% the end-user, so that defining a new control structure, for example. is usually not %% possible. %% For better educational value, we contend that the entire system %% should be at least visible to the user. And it is also desirable that %% the user be allowed to modify the system, based on an easy to understand model. %% This almost implies that the entire system should be made of the same %% thing, and that on top of it we should simply provide good interfaces suited to various end-users for various purposes. Figure \ref{fig:spectrum} shows a comparison of the systems described in this section. In the figure, the vertical axis denotes the steepness of learning curve; the lower the oval is located, the easier to start using. The horizontal axis denotes the complexity of programs one can write {\em comfortably} in the system. Our proposed system in the middle has similar steepness of learning curve as Etoys but trys to cover wider kind of programs. \SubSection{Approach} We chose to use JavaScript~\cite{ecma99javascript} as the basis for {\em TileScript} both because of its simple object model and good reflective facilities, and because we had already produced our own implementation in Squeak. Building our system on top of Squeak gave us access to the Morphic graphics framework~\cite{jm02MorphicNuBlue}, which facilitated the creation of our tile-based user interface and gave us access to a rich library of graphical objects. We extended our JavaScript implementation with a simple macro system. TileScript's user-defined tiles are implemented as macros; since macros are also part of our base language, they can be written using tiles as well as textual code. TileScript programs are stored as parse trees. We implemented conversions from textual code and tiles to parse trees, and from parse trees to textual code and tiles. Thus, tiles and textual code are views of the same model. Lastly, we provided a mechanism that allows users to customize the visual appearance of new as well as existing tiles. Figure~\ref{fig:turtles} shows a screenshot from the system. The function that draws a triangle is shown in tiles on the right and in text at the bottom in a JavaScript object inspector. The rest of this paper is organized as follows. Section~\ref{sec:js} briefly describes our JavaScript implementation and our extensions to the language. Section~\ref{sec:tile implementation} describes our extensible tile-based programming interface. In section \ref{sec:discussion}, we discuss the findings from this experiment. Section~\ref{sec:related} discusses related work. Section~\ref{sec:conclusions} discusses future work and concludes.