291 lines
11 KiB
Org Mode
291 lines
11 KiB
Org Mode
|
#+title: MagicNG
|
||
|
#&summary
|
||
|
The Next Generation Programming Language
|
||
|
#&
|
||
|
#+license: bysa
|
||
|
#&toc
|
||
|
|
||
|
* Chapter 1: The Future of Yesterday
|
||
|
|
||
|
/Software./
|
||
|
|
||
|
/Magic./
|
||
|
|
||
|
Two seemingly unrelated words. Yet together they form the essentials of the new
|
||
|
programming language which has already changed how computers and humans interact
|
||
|
with each other: *MagicNG* (short for Magic: The Next Generation).
|
||
|
|
||
|
*MagicNG* is not your common programming language; it is not biased towards one
|
||
|
or two paradigms, in fact it uses none of the existing ways of programming:
|
||
|
|
||
|
+ Functional programming is, naturally, much too functional for any magic-based
|
||
|
programming language, as magic is not /functional/, but
|
||
|
/magical/. Magic-based software does not require functionality as in something
|
||
|
being able to do something else, because it depends on magic which /does/
|
||
|
stuff instead of making sure that /stuff/ can be done; this makes using a
|
||
|
computer much faster.
|
||
|
+ Object-oriented programming does not fit very well with the ideas behind
|
||
|
*MagicNG* either. While the magic-oriented approach /is/ able to properly
|
||
|
emulate object-oriented ways of doing things, such emulations will often
|
||
|
require {CMU&abbr='Central Magical Unit'}-expensive conversions from spell
|
||
|
scrolls to object-based representations.
|
||
|
+ Procedural programming conflicts with the nature of magic; since in the case
|
||
|
of magic, advanced heuristics are used run a program, the simple approach of
|
||
|
procedurally executing commands pales in comparison to the magical
|
||
|
approach. The same is true for assembly programming and machine programming.
|
||
|
+ Logic programming is mute. Magic is always above logic. Logic is based on
|
||
|
magic. Everyone knows that.
|
||
|
+ Declarative programming is actually the only one of the existing widespread
|
||
|
paradigms which is even slightly like *magical programming*. Declarative
|
||
|
programming languages do, however, still base their entire existence on
|
||
|
deduction and knowledge, both of which are infinitely long below the
|
||
|
standards of magical programming languages. Deduction and knowledge are for
|
||
|
programming languages that do not /see/ how everything works, whose authors
|
||
|
do not understand the connectionabilities of everything.
|
||
|
|
||
|
In short, *MagicNG* employs the *magical programming* paradigm because it is
|
||
|
superior to non-magical approaches.
|
||
|
|
||
|
|
||
|
** But how do I program in it?
|
||
|
|
||
|
The reader should now be comfortable thinking about programming in terms of
|
||
|
magic and be able to see what a big mistake it was to learn all those outdated,
|
||
|
logic-based programming languages. The reader might also be a little
|
||
|
overwhelmed and perhaps confused; but fear not, we will soon take a look at an
|
||
|
example of MagicNG programming.
|
||
|
|
||
|
Before we get to that, we will go over a few (yes, there are many more) of the
|
||
|
applications of magical programming, to pique the reader's curiosity.
|
||
|
|
||
|
1. First, there is the temporal improvement. Since magic is independent of the
|
||
|
flow of time, a program can be run not just everywhere, but
|
||
|
every{/when/}. This is the sole reason MagicNG is already so popular ---
|
||
|
someone spread its use many years ago, through several temporal-offset
|
||
|
MagicNG runs.
|
||
|
2. Speed. The Central Magical Unit runs programs magically many times faster
|
||
|
than any CPU in existence. This is possible due both to the previously
|
||
|
explained effects of magic in programming /and/ what we will come to refer
|
||
|
as "magic downleveling" in later chapters (since magic cannot be optimized,
|
||
|
other approaches such as the downleveling approach have been developed).
|
||
|
3. Code maintenance also becomes much easier, as you will see in the examples
|
||
|
and excercises.
|
||
|
|
||
|
Now, to our first example. We wish to print to a computer console (on a magical
|
||
|
computer) the magical string "Hello, world!". This is often accomplished in
|
||
|
anything from 1 to 100 conventional lines in conventional programming
|
||
|
languages; in MagicNG, it is not /that/ simple. It's another kind of simple,
|
||
|
namely the /magic simple/ way, from now on referred to as the /magple/ way.
|
||
|
|
||
|
To write the magple MagicNG code for this example, we first fire up our MagicNG
|
||
|
interactive interpreter:
|
||
|
|
||
|
#+BEGIN_SRC text
|
||
|
MagicNG vX
|
||
|
?
|
||
|
#+END_SRC
|
||
|
|
||
|
(MagicNG is not being developed because it relies on magic for updates, hence
|
||
|
the 'X' version.)
|
||
|
|
||
|
(The correct way to program in MagicNG is to write on pergament scrolls, but
|
||
|
for the beginner it is often easier to write the magical expressions on one's
|
||
|
computer and then print afterwards.)
|
||
|
|
||
|
The =?= at the prompt means we can type something. Let us try typing the
|
||
|
following:
|
||
|
|
||
|
#+BEGIN_SRC text
|
||
|
? one frog eye
|
||
|
#+END_SRC
|
||
|
|
||
|
What this tells the MagicNG interpreter is that if /it is not the case/ that no
|
||
|
frog eyes exist in the programmer's vicinity, it will print "Hello,
|
||
|
world!". The frog-eye detection is only a formality, included in MagicNG to
|
||
|
make the proofs of magical truth be magically true, and so the sentence can be
|
||
|
excluded if the programmer wishes so. That is, you could write
|
||
|
|
||
|
#+BEGIN_SRC text
|
||
|
t
|
||
|
#+END_SRC
|
||
|
|
||
|
which is short for "one frog eye", and it would have the same effects.
|
||
|
|
||
|
MagicNG programs can be compiled (printed) to scrolls, which can then be used
|
||
|
independently of a running magical computer.
|
||
|
|
||
|
(Trivia: This was in fact one of the major reasons why the text-based nature of
|
||
|
MagicNG was chosen over the two other proposed ways of programming: speech and
|
||
|
jumping. While speech had the advantage that it worked well for people who had
|
||
|
difficulties writing, history had shown that the human memory was not a good
|
||
|
place to store information not meant to be changed. And while jumping was good
|
||
|
for people who were only good at jumping, it was too radical an approach for
|
||
|
many of the language designers.)
|
||
|
|
||
|
Now, it may not be obvious to the casual non-magician why and how both "one
|
||
|
frog eye" and "t" eventually prints "Hello, world!". In fact, these two
|
||
|
expressions are not at all the only ways to print "Hello, world!" --- one can
|
||
|
also write "traveller with seven legs", "spider queen", or something
|
||
|
similar. The thing to remember is that it is /the intention/ that counts. If
|
||
|
you /feel/ that the expression "bonsai of Norway" prints the sum of all
|
||
|
prime numbers below 4012, then /that is what it does/.
|
||
|
|
||
|
In essence, MagicNG is an *intention-based programming language*. This might at
|
||
|
first sound like all other programming languages: You have an intention on
|
||
|
which you base your programming. The difference here is that the intention /is/
|
||
|
the programming and not just part of it. Once you have figured out what you
|
||
|
want and written it down in your inner language, magic takes care of the boring
|
||
|
stuff.
|
||
|
|
||
|
This has the side-effect that all magic is somewhat personal; a scroll written
|
||
|
by an individual A might yield different results if used by an individual B
|
||
|
with different intentions than A.
|
||
|
|
||
|
This means that MagicNG has *built-in encryption*.
|
||
|
|
||
|
At this point some might note that this is not good for interoperability. At
|
||
|
the core of MagicNG, this is true. However, one extraordinary extension has
|
||
|
been made to MagicNG that makes interoperability both possible and easy:
|
||
|
MagicIS (short for Magic Intention Serializer).
|
||
|
|
||
|
MagicIS encodes your intention in a magical format, after which the intention
|
||
|
is compiled along with your program. With MagicIS, a compiled program that
|
||
|
prints "My name is Niels" might look like this (imagine it compiled on a
|
||
|
scroll):
|
||
|
|
||
|
#+BEGIN_SRC text
|
||
|
Holy oak of honey
|
||
|
,si:pmnin34_=UUe
|
||
|
#+END_SRC
|
||
|
|
||
|
where the =,si:= part denotes the start of the serialized intention.
|
||
|
|
||
|
The MagicIS extension can be enabled on most MagicNG compilers with a
|
||
|
command-line option. Note that it will need to be connected to your brain with
|
||
|
a special magical interface to work.
|
||
|
|
||
|
|
||
|
* Chapter 2: Real World Examples
|
||
|
|
||
|
"This is all very nice," you might think, "but what is it any good for?"
|
||
|
|
||
|
MagicNG can be used for everything a typical, non-magical language can be used
|
||
|
for, the major differences being that MagicNG is per definition faster, better
|
||
|
and easier to program in. This has been magically proven.
|
||
|
|
||
|
** cat
|
||
|
|
||
|
Consider the UNIX =cat= program. If written in C (even if you look at the Plan
|
||
|
9 version), there are many lines of source code. If written in Python 3, there
|
||
|
are 2 lines:
|
||
|
|
||
|
#+BEGIN_SRC python3
|
||
|
for line in open(filename):
|
||
|
print(line)
|
||
|
#+END_SRC
|
||
|
|
||
|
If written in MagicNG, there is _one_ line (/and/ it is magical):
|
||
|
|
||
|
#+BEGIN_SRC text
|
||
|
cauldron of candy
|
||
|
#+END_SRC
|
||
|
|
||
|
(without MagicIS enabled.)
|
||
|
|
||
|
|
||
|
** Finding a value when a key is known
|
||
|
|
||
|
In a non-magical programming language, you could use a hash map. Or you could
|
||
|
sort the elements by their keys and use binary search. Or you could look
|
||
|
through every element one by one.
|
||
|
|
||
|
In MagicNG, no such algorithms are used; /magic/ finds the value. In fact, this
|
||
|
reveals a large, fascinating and unavoidable part of MagicNG: it does not
|
||
|
support algorithms.
|
||
|
|
||
|
"No algorithms? But how, then, can I program?" you think. The answer is simple,
|
||
|
and it has been explained before, but to stress it one last time: /magic/.
|
||
|
|
||
|
This leads us to another important part of MagicNG: its use of the *black box
|
||
|
model*. The /black box model/ has been revered all over the known universe for
|
||
|
its unchangeability (it is absolute), unworsenability (since you cannot change
|
||
|
it, you cannot make it worse), high surprise factor ("who knew my program could
|
||
|
do /that/?!"), and lack of meaningful error messages (no errors, no worries).
|
||
|
|
||
|
|
||
|
** Calculating the sum of a list of numbers
|
||
|
|
||
|
In C:
|
||
|
|
||
|
#+BEGIN_SRC c
|
||
|
int sum(int xs[], int xs_len) {
|
||
|
int fin_sum = 0;
|
||
|
int i;
|
||
|
for (i = 0; i < xs_len; i++) {
|
||
|
fin_sum += xs[i];
|
||
|
}
|
||
|
return fin_sum;
|
||
|
}
|
||
|
|
||
|
[...]
|
||
|
|
||
|
sum({1, 3, -2, 9}, 4);
|
||
|
#+END_SRC
|
||
|
|
||
|
In Python:
|
||
|
|
||
|
#+BEGIN_SRC python3
|
||
|
sum([1, 3, -2, 9])
|
||
|
#+END_SRC
|
||
|
|
||
|
In MagicNG:
|
||
|
|
||
|
#+BEGIN_SRC text
|
||
|
head of Macbeth
|
||
|
#+END_SRC
|
||
|
|
||
|
|
||
|
** A flight simulator
|
||
|
|
||
|
Up until now, we have only looked at MagicNG programs spanning single
|
||
|
lines. One can create a very powerful MagicNG program in one line, but
|
||
|
sometimes it can be necessary to use two, or even three lines.
|
||
|
|
||
|
As a flight operator, you may wish to have a very durable and efficient 3D
|
||
|
flight simulator; in MagicNG such a system can be written concisely in just
|
||
|
three lines of magical code (four lines with MagicIS enabled).
|
||
|
|
||
|
#+BEGIN_SRC text
|
||
|
dragon claw polished with golden mead
|
||
|
mead in cauldron
|
||
|
tastebuds of 23 pigs
|
||
|
,si:3=)uUUn!2aa
|
||
|
#+END_SRC
|
||
|
|
||
|
(Notice the indentation and the explicit number.)
|
||
|
|
||
|
|
||
|
/[Chapters 3 through 88 have been excluded in this preview. Only members of
|
||
|
the Magically Magical Magic Community (MMMC) have access to these chapters.]/
|
||
|
|
||
|
|
||
|
* Chapter 89: How to Learn More
|
||
|
|
||
|
To recap: MagicNG is an easy language to learn, since not only does it not
|
||
|
require the user to learn about algorithms, data structures and related wastes
|
||
|
of time, but actually discourages that; MagicNG encourages its users to /not
|
||
|
think/ which /reduces errors/.
|
||
|
|
||
|
To expand your knowledge of MagicNG, both in theory and practice, do not look
|
||
|
at the examples of other MagicNG programmers, unless you are *absolutely sure*
|
||
|
that their intentions are the same as yours. You can of course deduce the
|
||
|
intention from a MagicIS line, but then, if you wish to base a new program on
|
||
|
the old program, you will have to convert that intention to your own along with
|
||
|
the actual program, which can be tedious and very difficult (MagicNG is
|
||
|
actually a very complex language).
|
||
|
|
||
|
What you should do is lean back in a comfy chair and look into nothingness and
|
||
|
not strain your mind. That way, everything you need to know will come to you
|
||
|
eventually. That's how this book was written.
|
||
|
|