summaryrefslogtreecommitdiff
path: root/comp/lucas-standen-NEA/writeup/coverpage.ms
blob: f99dd7f8e1fc20bb1ca8d0fd7faf8d6ac1c8d58c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
.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 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. 

.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)"
.B "create an empty linked list"
.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"
.B "set that token as the argument in the first token"
.B "append the root token to the linked list"
.B "repeat until the text file string is empty"
.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)"
.B "execute the lowest token"
.B "repeat until all tokens including the root have been executed"
.B "move to the next node of the linked list"
.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
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