summaryrefslogtreecommitdiff
path: root/comp/lucas-standen-NEA/writeup2/coverpage.ms
diff options
context:
space:
mode:
Diffstat (limited to 'comp/lucas-standen-NEA/writeup2/coverpage.ms')
-rw-r--r--comp/lucas-standen-NEA/writeup2/coverpage.ms1208
1 files changed, 0 insertions, 1208 deletions
diff --git a/comp/lucas-standen-NEA/writeup2/coverpage.ms b/comp/lucas-standen-NEA/writeup2/coverpage.ms
deleted file mode 100644
index e18f9c0..0000000
--- a/comp/lucas-standen-NEA/writeup2/coverpage.ms
+++ /dev/null
@@ -1,1208 +0,0 @@
-.TL
-The solution To bad code
-.AU
-Lucas Standen
-.AI
-7949
-.AB
-
-.NH 1
-Reading this document
-.LP
-This document is writen in roff and can be found online at:
-
-https://github.com/standenboy/school/tree/master/comp/lucas-standen-NEA/writeup
-
-It is using the ms macro of troff. It can be compiled using the Makefile,
-or make.sh. A table of
-contents has been generated using pdftocgen, it is embedded into the pdf,
-most pdf readers have
-a button to open it (firefox has it in the top left, in zathura press tab
-to view it).
-
-A note on formating of the roff, the text is limited to 80 characters per
-line and is writen in
-plain ascii, no utf8 emojis and the like. Code snippets are left in plain
-text, while full files
-are converted to a ps file via https://carbon.now.sh/ they should be 150mm ^
-2 (as ps is a vector
-format this wont lower quality, you might need to zoom in though) and then
-have there source linked
-above them; assuming they are from a file and not a small example.
-
-.NH 1
-Analysis
-.NH 2
-The current problem
-.LP
-For general small and simple projects, I write in C. However this leads to
-hours of debugging due to
-segfaults, and memory leaks. Due to the languages manual memory management
-the programmer is
-required to know so much information about the hardware they write for,
-and the second anything goes
-wrong, it is vague on how to fix things.
-
-.B "I need a language that stops me from shooting myself in the foot"
-
-C has been standard for many decades now and its age is showing, it lacks
-many modern features like
-OOP, or higher level functional abstractions, that have become common in
-modern years due to there
-helpfulness. This is not to fault C's achievements either, the language is
-my personal choice for
-most projects for a reason, it's fast and powerful; any solution I make
-should not cut that away.
-
-.NH 2
-A solution
-.LP
-.BI "Zippy LANG"
-
-A next generation language, for general use. Designed for keeping code simple,
-neat and readable.
-It will be similar to functional languages, known for there strict ability
-to keep code safe and
-practical. The language should be interpreted like python, perl and lisp,
-to allow for easy
-debugging tools.
-
-The goal of Zippy is to make codding easier, while remaining fast, with a
-interpreter writen in C.
-
-.NH 2
-What is a programming language
-.NH 3
-A very simple explanation
-.LP
-At its lowest definition a PL is a set of specific words, that when given
-to a computer in the
-right order have a reproducible behaviour. A more human way of saying that,
-would be its how we
-control computers.
-.NH 3
-Why are there so many
-.LP
-When someone is looking at code it can often be seen as just that, however
-there are hundreds of
-languages that all take the idea of "code" in very different ways. Some are
-designed for specific
-hardware, some are designed for making general use programs while others
-are highly specialized.
-It is important to see "code", as more than just one overarching term and
-instead see where the code
-is being used, and evaluate it from that.
-
-
-.NH 2
-Researching, and getting a scope of the project
-.LP
-Before I start to design a language i should first find examples of others
-and find what i want my
-language to be like.
-
-I'd like my language to feel modern so i should take inspiration from what
-other modern languages
-do, however on the backed i want my language to be stable and fast, for that
-i should look at
-older projects.
-
-.NH 3
-Examples of older similar projects, that are a good base for my language
-.NH 4
-Python
-.LP
-Python is a high level OOP language that was designed in 1991. It was made
-to make programming easy
-while still being able to use some of C's functions. Although it has become
-standard for many use
-cases, it is slow and inefficient, and very bloated.
-
-https://www.python.org/
-
-Zippy should take pythons high level abstractions, as they make programming
-very easy and it should
-try and take notes from its libraries as they are mostly well written,
-and well documented.
-.NH 4
-Lisp
-.LP
-Lisp is the second ever programming language, developed at MiT, it is the
-first functional language,
-creating many common features like higher order functions, recursion, and
-garbage collection. It is
-generally not used any more as it feels old compared to other functional
-languages, like Ocaml or
-Haskell.
-
-https://lisp-lang.org/
-
-Zippy should try to take alot from the syntax of lisp, () make it easy to
-see what parts of code
-will effect what, and make things easy to parse.
-.NH 4
-Perl
-.LP
-Perl is scripting language designed for use in linux, when bash is too slow,
-or not suited for the
-job. Perl is often described as the glue of the universe (see xkcd
-https://3d.xkcd.com/224/).
-Its syntax is quite strange however and it is slow. Making it poorly suited
-towards general use.
-
-https://www.perl.org/
-
-Zippy should take from perls minimalism, it is a small language that is of
-a similar size to bash
-or zsh, while feeling closer to python. If Zippy can achieve a similar small
-size, while remaining
-powerful I will be happy.
-
-.NH 3
-Examples of new similar projects that are also a good base
-.NH 4
-Gleam
-.LP
-Gleam is a modern language releasing in the past 5 years. It is highly
-functional, with no mutable
-data, no traditional loops. Instead recursion can be used to replace alot
-of these features.
-Gleam compiles to erlang/Beam bytecode, much like java to the jvm, and doing
-this has made Gleam
-a highly scalable language with good library support out the box.
-
-https://gleam.run/
-
-Zippy should take from the functional elements of Gleam, as they keep programs
-safer, however Zippy
-should not remove all procedural elements, as for loops are very helpful
-.NH 4
-Haskell
-.LP
-Haskell is another modern functional language known for being very complicated,
-however incredibly
-powerful. Its syntax feels very mathematical, and incredibly terse.
-
-https://www.haskell.org/
-
-Perhaps Zippy could learn from Haskell, as it provides functional and
-procedural elements, making it
-a well rounded language
-.NH 4
-Hare
-.LP
-Hare was designed to be a 100 year language, and thus stability is its main
-goal, it is not set to
-have a syntax change any time soon, and it has strong emphasis on memory
-safety. It fits into the
-same part of the tech stack as C, and thus it can be used for some very low
-level work.
-
-https://harelang.org/
-
-I think Zippy should have a strong emphasis on stability, much like Hare,
-to many times have I segfaulted due to a
-tiny mistake. Zippy should also look to Hare's small size, you can buy a
-copy of Hare on a
-
-.B "SINGLE 3 1/2'' FLOLPY"
-
-.LP
-This is something I too should try to achieve.
-
-.NH 3
-What should be taken away from these languages?
-.LP
-I was already leaning towards functional programming when I started this
-project however now I
-believe it's the only option for producing safe applications. Zippy will be
-a functional language
-with a strong emphasis on recursion.
-
-I also believe that I should take size of the interpreter into account,
-as this is important for
-keeping the project manageable and consistent.
-
-And finally I think that syntax should be inspired by Lisp, although Lisp
-itself can be a messy
-language, with the right changes I am confident that I can make a attractive
-language for the 21st
-century.
-
-.NH 2
-Clients
-.LP
-In a project of this nature, the Client is every programmer alive; which is
-a pretty large scope.
-To narrow this down as much as possible, I will interview a small handful
-of people throughout the
-project, of different skill levels.
-
-.NH 3
-Client 1, Amy C
-.LP
-My first client is a friend of mine, Amy C, she is a confident programmer
-who has completed many
-complicated projects. I am choosing her as a client as she can give me
-technical feed back on my
-project and its function/utility.
-.NH 3
-Client 2, Rayn M
-.LP
-Another friend of mine, Rayn M, is a technical computer user, however he
-does not know how to
-program at a high level. He will be a good client as he can show me how my
-language looks to
-some one who doesn't understand the inside workings, helping me design the
-structure of the code.
-.NH 3
-Client 3, a normie
-.LP
-some stuff about how the normie finds the completed project.
-.NH 3
-Client 4, myself
-.LP
-I've wanted to take out a project like this for a long long time, and this
-is the perfect
-opportunity to do so, I will be assessing myself along the way of this,
-building the project to my
-personal specification.
-
-.NH 2
-Questionnaires
-.LP
-It is important to get feedback from end users, so I will take multiple
-questionnaires throughout
-the project. I will then use them to slightly edit the requirements of my
-project this should make
-the final outcome more helpful and what people want.
-
-In the section bellow you will find questionnaires from the analyses stage
-of my project.
-.NH 3
-Questionnaire 1 for Amy C
-
-.BI "[30th April 2024]"
-.BI "answered by Amy, see pull request she left"
-.NH 4
-What do you find the most important in a language? (eg: speed, readability)
-.LP
-Speed, readability, debugging ease and disk space efficiency.
-.NH 4
-What tools are important for a language to have? (eg: pkg-manager, IDE
-integration)
-.LP
-IDE integration (things like tab complete and debugging tools), a package
-manager, and the ability
-to interact with the user through the command line easily.
-.NH 4
-What features do you like from other languages (eg: C's advanced memory
-management, haskell's terse
-syntax)
-.LP
-The ability to pass the memory reference of an object or function and a
-collection of built-in or
-standard functions like "print", "split", or "sort".
-.NH 4
-What do you want to program in this language (eg: websites, low level systems)
-.LP
-Lightweight command line tools and web back ends.
-.NH 4
-Do you intend to use graphics in the programs you write?
-.LP
-No.
-.NH 4
-Would you prefer a language that focuses on ease of use, or power of the code?
-.LP
-I like a good balance between the two.
-.NH 4
-What were your last 3 projects? (could they have been written in Zippy?)
-.LP
-A website, a small command-line tool and a midi keyboard (program runs on
-a Raspberry Pi Pico).
-.NH 4
-How many languages would you use on a single project? (could Zippy be used
-in your codebase?)
-.LP
-I try to use as little languages in a project as possible, so likely not in
-an existing project.
-.NH 4
-Do you care for low level control, or would you prefer high level abstractions?
-.LP
-I think low-level control is very important, but high-level abstractions
-are convenient, so a good
-balance between the two is best.
-.NH 4
-Would you be happy to develop libraries for things that aren't already
-implemented
-(eg: an SQL library)
-.LP
-Potentially if it is simple enough to implement new things.
-
-.NH 3
-Notes from questionnaire 1
-.LP
-Some of the key things that I'm taking away from this first questionnaire,
-are my client/users
-initial needs and use cases. I think it's clear my language can be of
-assistance to my client, Zippy
-will be a good language for web back ends and small command line tools,
-which my client expressed
-interested in.
-
-I find the fact my client is worried by executable size interesting, however
-I doubt it will be an
-issue; a ballooning code-base is unlikely as only one person is writing
-the project.
-
-I am also taking on the fact that my client wants good command line tools,
-so a pkg-manager and
-bundler should be a priority, perhaps they could be written in Zippy after
-the interpreter is done.
-
-.NH 2
-The first elements of the project
-.LP
-At this stage I can say that I'm confident in my project and its scope. I
-have a goal in mind for
-it.
-
-.B "The key things to take away from this section are:"
-
-.B ----
-Make a high level language with a useable set of features, to replace C in
-many situations.
-
-.B ----
-Keep the language readable and easy, with powerful tools available.
-
-.B ----
-Ensure the language is well supported with tools like a pkg-manager.
-
-.NH 2
-Moddeling
-.LP
-In larger projects, when a programmer needs a data structure that the language
-they are writing in
-doesn't provide, they will need to make their own.
-
-Bellow are a few examples of these data structures that C doesn't already
-provide.
-.NH 3
-Linked lists
-.LP
-this is an alternative implementation of a list, where you store some data,
-and the memory address
-to the next node. Then you can move through the list by reading the data
-then reading the data of
-the next node, and then repeating until the 'next' part of the node is empty.
-
-A diagram showing this can be seen here:
-
-.PSPIC linkedlist.ps
-
-.LP
-In C this is easy to implement as you can find a memory address very easily
-with '&' to find where
-a bit of data is stored. I will need to use a 'struct', which is a bit like
-a class in C (however
-you can't attach a function to it). A simple implementation looks like this:
-
-typedef struct ll {
- void *data; // the data of the node
- ll *next; // the next node
-
-} ll;
-
-.LP
-The pro's of a linked list are the fact that they can have data appended to
-the start or end easily
-by changing the root node, or the next node.
-
-Linked lists have a few downsides, for example you can't move through them
-backwards, and unless you
-store it on its own, you cant find the length of it in a fast way.
-
-In my project I would like to use linked list in the AST (see later sections
-for info), and to store
-lists in the language.
-.NH 3
-Dictionaries
-.LP
-A dictionary is a simple data structure that just stores, a bit of data,
-and a number or string to
-identify it.
-A dictionary like a linked list can be implemented with a struct in c like so:
-
-typedef struct dict {
- void *data;
- int id;
-
-} dict;
-
-.LP
-In my project I think I could use a linked list represent a Zippy variable
-and an ID that i can use
-to identify it, this could make execution faster as i can compare ID's
-rather than string values
-
-.NH 2
-Prototyping hard features
-.NH 3
-Abstract Syntax Trees (AST) theory
-.LP
-In a programming language many abstract data types will be used to allow
-the code to execute,
-however I think the hardest part of this is an abstract syntax tree. This
-is a data structure that
-holds the code in an ordered form that can be analysed and executed in a
-simple way. It is a tree
-structure, with the top node being a root and all lower nodes being things
-needed to calculate the
-root. It can be used not only for code but also for mathematical expressions. I
-think the easiest
-way to show it is via a mathematical example
-
-Take the follow expression for example:
-
-.BX "(1 + (10 * (3 - (2 * 4))))"
-
-We know that this is equal to -49
-
-However for a computer this is far harder to understand. This is because it
-has no understanding of
-order of operation
-
-To solve this we use an AST (abstract syntax tree)
-
-When you solve that expression you know to start with (2 * 4), then 3 -
-the answer to that and so on
-
-We can represent the steps as a tree like so:
-
-.PSPIC ast.ps
-
-.I "[Evalutates to 2 * (2 + 2)]"
-
-As you can see, you need to evaluate the expression in the most brackets
-first, then the next, and
-so on, working you way up
-
-You can evaluate code in a similar way, treating each operation (such as +-*/)
-as functions, doing
-the most deeply nested function first, then working up. Each expression can
-be represented in this
-tree, then to show a whole program you can create a list of trees
-
-.NH 3
-Implementing AST's
-.LP
-As a prototype i will make a program that can take mathematical expressions
-and evaluate them, and
-allowing for functions (in the form f(x)).
-It will do this via AST's
-
-This prototype takes 173 lines of code, it takes a string as a cmd line
-argument then converts it
-into an abstract syntax tree, and finally it executes it. This is just a
-simple prototype and thus
-it is small in scope. It can only do simple operators (+-*/) and requires
-literal values to be
-surrounded by [] so it knows its not another expression to evaluate.
-
-https://github.com/standenboy/school/tree/master/comp/lucas-standen-NEA/code/proto/ast
-
-.PSPIC astg.ps
-
-.LP
-Above is the code for the AST, it stores an operation (which is just an
-integer), and it stores
-a real left and real right value, along side two other nodes. The real values
-are integers, this
-would be the 2 numbers in reference in the expression. The 2 nodes are a
-recursive data structure,
-much like putting an object of a class inside the definition of that class
-itself. They are used to
-store values that may still be expressions, for example (+ [1] (+ [1] [1]))
-the second part of this
-expression would be in the "right" variable. When code is executed I can
-check if "left", or "right"
-are null and if they are i know that i am at the lowest expression that is
-only literal values.
-Then I can execute that node and work my way up the tree.
-
-
-The exec function will execute the operation, unless there is a deeper node,
-if there is a deeper
-node, then it executes it, and places the result in the right or left spot
-respectively.
-
-Expressions are taken as input with the following code, and converted into
-the AST:
-
-https://github.com/standenboy/school/tree/master/comp/lucas-standen-NEA/code/proto/ast
-
-.PSPIC ast.c.ps
-
-Here is an example input and output:
-
- ./ast "(+ (- [3] [1]) (- [3] [1]))"
-
-.BX 4
-
-Note the [] used to tell the program where the literal values are.
-
-Overall this was a relatively successful prototype, however it isn't fully
-functional as a language
-it has fit the design.
-
-The rest of the code is the process of converting the string input to literal
-values and inserting
-them into the AST
-
-.NH 3
-Feedback
-.LP
-From my first Client (Amy C), she said that putting the numbers inside square
-brackets was
-inconvenient and annoying and it would be better if the numbers were separated
-by spaces instead of
-separate square bracket surrounded literals.
-
-As this is a prototype I won't fix this issue, however in the actual language
-this is a needed
-feature that I will be implementing.
-
-.NH 3
-Mixing linked lists and AST's
-.LP
-Mixing these 2 data structures together you can repressent an entire program. A
-linked list of
-AST's is how Zippy will repressent all code the user writes
-
-Here is an example of this:
-
-.PSPIC AST+LL.ps
-
-.LP
-In this example the linked list is represented by the numbers seen at the top,
-and the AST's are the
-tree's moving down.
-
-As you can see when a value is referenced that is from a different AST the
-tree will link to another
-one. This will work the same for function calls, however instead of linking
-to value definitions it
-will link to function definitions.
-
-.NH 2
-Objectives
-.NH 3
-An interpreter for the Zippy language
-.NH 4
-Linked list of AST's
-.LP
-All of a loaded program should be represented as a linked list of individual
-AST's, The developer
-should be able to access the AST for easy hacking. Functions can be represented
-as a pointer to
-another part of the list.
-.NH 4
-A lisp like syntax
-.LP
-This is to ensure the language can be parsed quickly, and is easy to write.
-.NH 4
-Functional language
-.LP
-This language should lean into the functional programming paradigm, taking
-inspiration from other
-functional languages such as lisp, and gleam.
-.NH 5
-Recursion
-.LP
-Zippy must support recursive algorithms being implemented into it, this will
-make the AST, have
-nodes linking back to parent nodes in a linked list.
-.NH 5
-Higher order functions
-.LP
-Zippy must support the usage of higher order functions, this will mean the
-AST needs to have an
-unlimited depth as otherwise the limit would be quickly reached, it can't
-be hard-coded, it must be
-dynamic.
-.NH 4
-Performance
-.LP
-The interpreter must be fast and memory efficient, the language is designed
-to work as an
-alternative to C, one of the fastest languages of all time, the interpreter
-must be fast, however
-memory footprint is not as much of a requirement.
-.NH 4
-Safe
-.LP
-Code that the user writes must be safe, and not prone to errors. This can
-be handeled via the strong
-syntax checker and type safety.
-
-.NH 3
-Standard library for Zippy
-.NH 4
-io
-.LP
-The language must have a simple to use I/O library to make outputs easy.
-.NH 4
-string
-.LP
-The language should have a sting library that provides a string type, and
-many complex algorithms
-that can be applied to them (concatenation, insertion, appending, splitting,
-stripping).
-.NH 4
-sorts
-.LP
-The language should have a sorting library that provides algorithms used
-for sorting (like merge
-sort).
-.NH 4
-graphs
-.LP
-the language must have a graph library, that allows for easy creation and
-working with graphs, it
-should provide many algorithms to help traverse these graphs
-
-.NH 3
-Tooling for the Zippy language
-.NH 4
-zpypkg
-.LP
-Zippy must provide a package manager, that allows code to be shared between
-multiple users, easily.
-It should sync projects via git and allow them to be stored on any git host
-the user likes.
-.NH 4
-Syntax checker
-.LP
-Zippy shouldn't have a built in syntax checker, instead it should be something
-that can be run
-independently of the interpreter, this means that a lot of the checking that
-interpreted languages
-do, can be done once by the developer, before shipping the app, as opposed
-to every time the program
-is run, which brings down performance.
-.NH 3
-Integration with C, via a C API
-.NH 4
-C API
-.LP
-You should be able to execute a string of Zippy code in C using a library
-that is linked with
-interpreter. This could allow Zippy to be used as a configuration language
-like Lua.
-
-.NH 2
-Desirable features
-.LP
-If time allows I'd like to add some of the following features to flesh out
-the language:
-.NH 3
-Raylib support
-.LP
-Raylib is a powerful game engine for C, however it has been ported to most
-languages under the
-sun due to how simple it is. If I have time, porting Raylib to Zippy would
-make the language
-far more useable, as it can be use for graphics programming.
-
-https://www.Raylib.com/
-
-.NH 3
-Vim integration.
-.LP
-Zippy should have integration with the Vim editor for syntax highlighting,
-this can be done via
-generating a linked list of AST's then colouring function calls a specific
-colour, and variables
-another, etc, etc.
-.NH 3
-LSP
-.LP
-A LSP (language server protocol), is used in code IDE's to auto complete
-code for you, I'd
-like one for Zippy. Although I am unsure as to how to tackle this. I believe
-a program called
-treesitter can be helpful for this.
-.NH 3
-Networking sockets
-.LP
-If possible I'd also like to provide bindings for unix network sockets,
-however this would be
-very difficult, as I would need to allow Zippy stucts to be directly converted
-to C stucts,
-when executing ELF symbols (Parts of an execuable file).
-
-.NH 1
-Design
-.NH 2
-Language specification
-.LP
-Like any other programming language Zippy needs to have a defined syntax,
-as mentioned in the
-objectives section of Analysis, I want the language to follow a lisp like
-syntax.
-
-I also believe higher order functions should be taken as standard and many
-core functions will use
-them.
-
-.NH 3
-Data types
-.NH 4
-Basic types
-.LP
-i32 - signed integer of size 32 bits
-
-u32 - unsigned integer of size 32 bits
-
-i64 - signed integer of size 64 bits
-
-u64 - unsigned integer of size 64 bits
-
-char - single ascii code
-
-float - standard C float
-
-.NH 4
-Advanced types
-.LP
-function - a function that can be used
-
-generic - should be avoided, removes checks for data types when inputting
-values to functions
-will cause many runtime errors, however when absolutely needed it is useful.
-
-.NH 4
-Arrays
-.LP
-Arrays can be show like so:
-
-x:type[]
-
-With x being the variable name, type being the type of variable, and []
-showing its an array
-
-All arrays are dynamic, represented by a linked list on the back end.
-.NH 5
-Strings
-.LP
-Strings, like in C are arrays of chars
-
-.NH 3
-Built in functions
-.NH 4
-defun
-.LP
-(defun a:type b:type returntype
- ...
- ...
-
-)
-
-Returns a function that take A and B as an argument (fixed types), and
-returns a value of
-returntype.
-
-.NH 4
-let
-.LP
-(let x:type value)
-
-Creates constant x of type type to value.
-
-.NH 4
-set
-.LP
-(set x:type value)
-
-Creates/recreates the variable value of x to value.
-
-.NH 4
-if/elif/else
-.LP
-(if condition function)
-
-(elif condition function)
-
-(else function)
-
-
-Executes the function provided if the condition is true.
-
-Elif works the same, except only if the previous if statement is false.
-
-Else executes only if all previous statements were false.
-
-.NH 4
-for
-.LP
-(for i (condition) function)
-
-Runs the function while the condition is true, and increments i every time
-the function
-is called.
-
-.NH 4
-while
-.LP
-(while condition function)
-
-Runs the function if the condition is true, keeps running until it is false.
-
-.NH 4
-symbol
-.LP
-(symbol a:type b:type c:type returntype name:char[] elf:char[])
-
-Returns a function that takes arguments A, B, C (of fixed types), the name
-of the function,
-and the file path of the elf.
-.NH 5
-
-.NH 4
-Arithmetic operations
-.LP
-Simple operations
-
-(+ a b) returns a + b
-
-(- a b) returns a - b
-
-(* a b) returns a * b
-
-(/ a b) returns a / b
-
-.NH 4
-Comparison
-.LP
-All return true or false
-
-(= a b) returns if a = b
-
-(!= a b) returns if a != b
-
-(> a b) returns if a > b
-
-(< a b) returns if a < b
-
-(=> a b) returns if a => b
-
-(=< a b) returns if a =< b
-
-.NH 4
-cast
-.LP
-(cast a:generic type:char[])
-
-returns a but cast to data type type, which is a string.
-
-.NH 4
-typeof
-.LP
-(typeof a:generic)
-
-returns in a string the type that variable A is.
-
-.NH 4
-terminate
-.LP
-(terminate error:error)
-
-Kills the program at the current point, frees all related memory, prints
-error info stored in error.
-
-.NH 4
-return
-.LP
-(return a:type)
-
-Must be used in defun, returns "a" from the function, "a" must be of the
-functions return type.
-
-.NH 3
-List of keywords
-.LP
-defun
-
-for
-
-while
-
-if
-
-elif
-
-else
-
-exit
-
-return
-
-symbol
-
-set
-
-let
-
-.NH 2
-Memory management
-.LP
-Memory will be allocated when a variable is initialized, and freed when the
-program stops.
-Although this isn't the fastest method, it is simple and has less runtime
-overhead.
-
-.NH 2
-Questionnaire 2 for Rayn M
-.NH 3
-How do you find this layout of the language?
-.LP
-.I "(5-6 points)"
-- I like the immutable nature of the language
-- I like the simplicity
-- I like the low level performance this will have
-- I dislike the word terminate
-- I like the procedural approach, with the function robustness
-- I dislike the brackets!
-.NH 3
-Response
-.LP
-Although he does dislike some of my features I believe them to be core parts
-of the language so
-I will keep them. I will also keep his points in mind though, I don't want
-to discourage learning
-the language due to its abstract syntax.
-
-However as per his request I will change the terminate keyword to the more
-normal exit.
-
-An updated keyword list is as flows:
-
-defun
-
-for
-
-while
-
-if
-
-elif
-
-else
-
-exit
-
-return
-
-symbol
-
-set
-
-let
-
-.NH 2
-What language do you use to make a programming language
-.LP
-As mentioned before Zippy will be written in C, with some parts being written
-in Zippy itself.
-I will try and keep most dependencies/libraries to a minimal to make the
-project easier to manage.
-
-.NH 3
-What is C?
-.LP
-C was made by Dennis Ritchie, in 1972 at AT&T's bell labs. It was designed
-to make programming low
-level systems far easier than it had been before. It was used to create the
-unix operating system
-which would go on to inspire most modern operating systems in some way. (macos
-still has code from
-the original release of C+unix).
-
-The language quickly caught on outside of bell labs after more available
-releases of unix arrived
-such as bsd 4.4, sun os and GNU. It was found to be able to do all the things
-that you could do in
-ASM however with far less a headache.
-
-.NH 3
-Why is C?
-.LP
-As mentioned C can do anything that ASM can do, meaning it is lightning fast
-and can take advantage
-of direct memory access. This allows you to make very fast lightweight
-executables that can rival
-the performance of handwritten ASM (often beating it if you enable compiler
-optimisations). It is
-this that makes C the perfect language for any and all programming languages,
-where speed is key,
-and allfeatures need to be available are present.
-
-.NH 3
-How is C?
-.LP
-C is compiled to ASM, the main compilers available are clang, gcc and MSVC,
-I will be using gcc
-as it is generally standard in linux environments.
-
-Many build systems are available for C, the main ones being cmake and gnu
-make. Both of them have
-the goal of putting the compiling process in one command. Cmake is cross
-platform (sorta windows
-doesn't work well but it does work).
-
-.NH 3
-Libraries
-.LP
-The libraries I will use are the following:
-
-C stdlib
-
-C unistd
-
-C errno
-
-Unix device files
-
-Zippy strings
-
-Zippy graphs
-
-Zippy sorts
-
-Addition libraries (may not be implemented):
-
-Raylib
-
-C sockets + Zippy sockets
-
-.NH 3
-Modularization
-.LP
-To make the project more manageable I will split it into many C files,
-this is to keep it from
-becoming impossible to edit code.
-
-The file layout looks as follows:
-
-PLACE HERE
-
-As you can see this is split up over around 40 files and 16 folders, each
-file should not go over
-~500 lines of code. This is to keep everything as easy to manage as possible.
-
-This level of modularization in needed for the development of Zippy as
-without it, files will become
-a mess that can't be worked with.
-
-All .c files will be compiled into .o files, then the .o files can be linked
-with the final zpy.c
-to generate the final executable.
-
-
-.NH 4
-Build system
-.LP
-The entire project is being build with GNU make files, each folder that
-builds something will have
-its own makefile. This will mean the entire project can be compiled with a
-single make in the root
-folder of the project.
-
-Example of make:
-
-make -j2
-
-This will build all files specified by 'Makefile' with 2 threads.
-
-The project should be build with gcc, and ld. It should be build with the
--O3 build flag to ensure
-the program runs as fast as possible. -O3 forces the compiler to build with
-optimizations.
-
-When the project is finished, I will try compiling with clang and tcc,
-to compare performance.
-
-.NH 2
-Time table
-.LP
-The first step is to tackle the interpreter, so the zpy.c file needs to be
-finished. The tokenizer,
-execution, and libs folders need to be finished, after this point you should
-be able to execute
-Zippy code however not syntax check it or get error handling.
-
-The next step is zpycheck, the syntax and error handler, this should be ran
-before code is shipped
-to the user. It can reuse a lot of code from the tokenizer and execution steps.
-
-Finally I need to make zpypkg, this should be easy as most of it can be
-written in Zippy, and a few
-bits can be written in bash. It should be a good test to how Zippy can
-be written.
-
-If time allows it is at this point that I will write a Raylib library and
-a unix/C sockets library.
-
-.NH 2
-Flow through the system
-.LP
-The alogrithum to run code is quite complex however it can be boiled down
-to a few simple steps:
-
-.B "read the text file (strip line breaks and tabs)"
-.LP
-.B "create an empty linked list"
-.LP
-.B "get the first expression from the text file (with be encapsulated with
-"()""
-.B "get the function call and its args into a token"
-.LP
-.B "if the arguments of the function are there own function call, then
-convert them into a token"
-.LP
-.B "set that token as the argument in the first token"
-.LP
-.B "append the root token to the linked list"
-.LP
-.B "repeat until the text file string is empty"
-.LP
-.B "allocate memory for the program and prepare the exection step"
-.LP
-.B "at the start of the linked list traverse to the bottem of the tree
-(made of tokens)"
-.LP
-.B "execute the lowest token"
-.LP
-.B "repeat until all tokens including the root have been executed"
-.LP
-.B "move to the next node of the linked list"
-.LP
-.B "repeat until the linked list is empty"
-
-.LP
-Within each of these steps is many smaller steps. The hardest part will be
-making the tokens, as
-this requires alot of string manipultation. The execution will be a recursive
-alogrithum. All trees
-will be represented via structs (see section on AST's).
-
-PUT SOME FLOW CHARTS HERE
-
-.NH 1
-Technical Solution
-.NH 1
-Testing
-.NH 1
-Evaluation
-.AE