summaryrefslogtreecommitdiff
path: root/comp/lucas-standen-NEA/writeup/coverpage.ms
blob: e18f9c09afed148ba7daec2884ca39006736a41f (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
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
.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