diff options
author | thing1 <thing1@seacrossedlovers.xyz> | 2024-07-04 13:11:04 +0100 |
---|---|---|
committer | thing1 <thing1@seacrossedlovers.xyz> | 2024-07-04 13:11:04 +0100 |
commit | 3dad2f4c5ce7fd44015cbd921318b3512c36326e (patch) | |
tree | e43f3b1d0080e9de96c2866743e521ecbd2770f5 /comp/lucas-standen-NEA/writeup/coverpage.ms | |
parent | 478eed4ef9ece1b86b2fed7bfe57d62180b12c92 (diff) |
zippy supports arrays!
Diffstat (limited to 'comp/lucas-standen-NEA/writeup/coverpage.ms')
-rw-r--r-- | comp/lucas-standen-NEA/writeup/coverpage.ms | 693 |
1 files changed, 456 insertions, 237 deletions
diff --git a/comp/lucas-standen-NEA/writeup/coverpage.ms b/comp/lucas-standen-NEA/writeup/coverpage.ms index f99dd7f..e18f9c0 100644 --- a/comp/lucas-standen-NEA/writeup/coverpage.ms +++ b/comp/lucas-standen-NEA/writeup/coverpage.ms @@ -1,12 +1,9 @@ .TL -The solution - -To bad code +The solution To bad code .AU Lucas Standen .AI 7949 - .AB .NH 1 @@ -16,71 +13,98 @@ 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 100 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. +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 +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. +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 +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. +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 +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 +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 +.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 +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 @@ -88,37 +112,50 @@ 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 +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. +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 +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 +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. +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 +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 @@ -126,36 +163,47 @@ 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 +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 +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 +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 +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. +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 +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" @@ -165,36 +213,48 @@ 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 +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 +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 +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 +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 +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. +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 @@ -202,37 +262,46 @@ 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 +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 +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. +In the section bellow you will find questionnaires from the analyses stage +of my project. .NH 3 -Questionnaire 1 for Amy C +Questionnaire 1 for Amy C .BI "[30th April 2024]" .BI "answered by Amy, see pull request she left" -.NH 4 +.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) +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 +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 +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 +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) @@ -249,18 +318,23 @@ 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). +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?) +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. +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 +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 +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. @@ -268,46 +342,59 @@ 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 +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 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. +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 +.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 +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 ---- +Make a high level language with a useable set of features, to replace C in +many situations. -.B ---- +.B ---- Keep the language readable and easy, with powerful tools available. -.B ---- +.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 +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. +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 +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: @@ -315,8 +402,10 @@ 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 +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 { @@ -326,29 +415,34 @@ typedef struct ll { } ll; .LP -The pro's of a linked list are the fact that they can have data appended to the start or end easily +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 +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 +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 +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; + 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 +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 @@ -357,49 +451,63 @@ 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 +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 +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 +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 +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 +.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 +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 +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 +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 +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 @@ -407,20 +515,30 @@ https://github.com/standenboy/school/tree/master/comp/lucas-standen-NEA/code/pro .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. +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. +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: +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 @@ -434,26 +552,32 @@ Here is an example input and output: 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 +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 +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 +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 +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 +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: @@ -461,57 +585,69 @@ 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 +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 +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 +.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 +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 +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 +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 +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 +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 +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 +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 +Standard library for Zippy .NH 4 io .LP @@ -519,17 +655,21 @@ 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). +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 +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 +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 @@ -537,32 +677,42 @@ 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. +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 +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. +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: +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 +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/ @@ -570,20 +720,26 @@ 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 +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 +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, +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 @@ -591,10 +747,13 @@ 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. +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 +I also believe higher order functions should be taken as standard and many +core functions will use them. .NH 3 @@ -619,7 +778,8 @@ Advanced types .LP function - a function that can be used -generic - should be avoided, removes checks for data types when inputting values to functions +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 @@ -629,7 +789,8 @@ 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 +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 @@ -648,7 +809,8 @@ defun ) -Returns a function that take A and B as an argument (fixed types), and returns a value of +Returns a function that take A and B as an argument (fixed types), and +returns a value of returntype. .NH 4 @@ -686,7 +848,8 @@ for .LP (for i (condition) function) -Runs the function while the condition is true, and increments i every time the function +Runs the function while the condition is true, and increments i every time +the function is called. .NH 4 @@ -701,14 +864,15 @@ 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, +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 +Simple operations (+ a b) returns a + b @@ -737,7 +901,7 @@ All return true or false .NH 4 cast -.LP +.LP (cast a:generic type:char[]) returns a but cast to data type type, which is a string. @@ -754,14 +918,16 @@ terminate .LP (terminate error:error) -Kills the program at the current point, frees all related memory, prints error info stored in 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. +Must be used in defun, returns "a" from the function, "a" must be of the +functions return type. .NH 3 List of keywords @@ -791,13 +957,15 @@ 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. +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 +.NH 2 Questionnaire 2 for Rayn M .NH 3 -How do you find this layout of the language? +How do you find this layout of the language? .LP .I "(5-6 points)" - I like the immutable nature of the language @@ -809,11 +977,14 @@ How do you find this layout of the language? .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 +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. +However as per his request I will change the terminate keyword to the more +normal exit. An updated keyword list is as flows: @@ -842,38 +1013,52 @@ 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. +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 +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 +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, +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 +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 +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 @@ -904,29 +1089,35 @@ 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 +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 +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 +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 +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 +.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. +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: @@ -934,48 +1125,76 @@ 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. +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. +When the project is finished, I will try compiling with clang and tcc, +to compare performance. -.NH 2 +.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 +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 +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. +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. +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: +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" -.B "get the first expression from the text file (with be encapsulated with "()"" +.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" -.B "if the arguments of the function are there own function call, then convert them 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" -.B "at the start of the linked list traverse to the bottem of the tree (made of tokens)" +.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" -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 +.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 |