81
\$\begingroup\$

Language-creation has become a popular activity on PPCG. A decent portion of answers, especially answers, are written in languages invented by the community. These are also languages that might be unfamiliar to this site's wider viewing audience.

What languages (esoteric, golfing, or not) have been created by our users? For each language, please include some of the following details:

  • Language name and creator
  • Links to resources, like documentation and interpreter
  • A brief description of the language, some of its main concepts and features, and its history

List of languages

function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=meta.codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=meta.codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var a=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(a="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var r=a.match(SCORE_REG);r?e.push({user:getAuthorName(s),size:+r[2],language:r[1],link:s.share_link}):console.log(a)}),e.sort(function(e,s){var a=e.size,r=s.size;return a-r});var s={},a=1,r=null,n=1;e.forEach(function(e){e.size!=r&&(n=a),r=e.size,++a;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;o=jQuery("<a>"+o+"</a>").text(),s[o]=s[o]||{lang:e.language,lang_raw:o,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang_raw.toLowerCase()>s.lang_raw.toLowerCase()?1:e.lang_raw.toLowerCase()<s.lang_raw.toLowerCase()?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var QUESTION_ID=6918,ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",OVERRIDE_USER=2867,answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n]+)\s*<\/h\d>/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=language-list><h2>Languages by PPCG Users</h2><table class=language-list><thead><tr><td>Language<td>User<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}<td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td><a href={{LINK}}>Link</a></table>

| |
\$\endgroup\$
  • 20
    \$\begingroup\$ Todo: Add 2D matching languages and every language Calvin makes up for golf questions \$\endgroup\$ – Sp3000 Sep 9 '15 at 2:45
  • \$\begingroup\$ Do languages whose only non-proprietary interpreters were created by PPCG users count? \$\endgroup\$ – bmarks Sep 12 '15 at 17:01
  • \$\begingroup\$ The title is somewhat misleading. Do general purpose languages not related to golfing still count when they have been created by PPCG users? The title suggests yes, but mostly (and naturally) the answers relate to golfing. \$\endgroup\$ – mınxomaτ Sep 12 '15 at 21:59
  • 1
    \$\begingroup\$ @minxomat This question is open to all languages created by PPCG users. \$\endgroup\$ – PhiNotPi Sep 13 '15 at 4:36
  • \$\begingroup\$ @bmarks I say you could go ahead and post it, specifically mentioning the interpreter. \$\endgroup\$ – PhiNotPi Sep 13 '15 at 4:42
  • 2
    \$\begingroup\$ @PhiNotPi A suggestion: Implement a snippet in your question to list the languages. This site is quite long. \$\endgroup\$ – mınxomaτ Sep 14 '15 at 6:27
  • 2
    \$\begingroup\$ @minxomat Done. \$\endgroup\$ – Alex A. Sep 21 '15 at 19:05
  • \$\begingroup\$ A quick note about the snippet: User means the person who posted about it here, not necessarily the user who created the language. Example: I did not create Ostrich, I merely posted it here. \$\endgroup\$ – Alex A. Sep 21 '15 at 19:12
  • 2
    \$\begingroup\$ @AlexA. Maybe we could add a formatting guide, and suggest that the inventor be added in the header? \$\endgroup\$ – Beta Decay Sep 25 '15 at 17:33
  • 1
    \$\begingroup\$ @BetaDecay Yeah I had thought about that. Language name, creator, and year. Up to Phi though. \$\endgroup\$ – Alex A. Sep 25 '15 at 18:32
  • \$\begingroup\$ @Adnan 05AB1E should be on here. \$\endgroup\$ – Magic Octopus Urn Jan 19 '17 at 21:19

95 Answers 95

1 2 3
4
0
\$\begingroup\$

Noether

Noether is stack-based, semi-golfing language designed by myself.

Based mainly on Fourier, Noether is stack-based and uses reverse polish notation. These two facts make Noether a lot more powerful than Fourier, mainly because it means that strings and integers can be stored and manipulated alike.

Similarly, Noether's functions are overloaded based on the type of the arguments. For example, the function L has two functions:

  • When passed a string, L returns the length of the string.
  • When passed a number, L returns the base 10 logarithm of the number

As a result, Noether can be used more widely and is wholly more usable language whilst still being quite similar to Fourier.

Links:

| |
\$\endgroup\$
0
\$\begingroup\$

TLDCode

Created by The_Lone_Devil (Me) and is a (WIP) stack based language.

The name is likely to change one day when I think of a good one.

I created it as something to work on during some downtime at work, and to learn Kotlin a bit better (the language the interpreter is written in).

There is some documentation, as well as a Kotlin based interpreter over on the Github page

Some features include

  • User functions, by pushing a string containing code onto the top of the stack, and then storing the top of the stack into a named variable, you can push the variable onto the stack and eval it to execute.
  • Immutable variables, once a variable is set, only a copy can be pushed onto the stack, they can never change.
| |
\$\endgroup\$
  • 2
    \$\begingroup\$ The name sounds like "Too long; didn't code" :p \$\endgroup\$ – RedClover Jan 25 '18 at 16:09
  • \$\begingroup\$ @RedClover TL;DR is the first thing I thought of when I saw the title. \$\endgroup\$ – MilkyWay90 Dec 31 '18 at 23:26
0
\$\begingroup\$

ALPHA

I made up this esoteric language by me, SnivyDroid, on the 27th of January, 2018 after reading about alphabetical-based esolangs like alphuck, it is just pseudo-code currently although I am working on structuring a interpreter with what little knowledge I have about parsing and interpreting code.

Basic Syntax

ALPHA Revolves around 1-character alphabetical mirrored commands, basically you start a command with the corresponding letter and you end it with the corresponding letter

Starting a line

KK

Printing a statement

KMSDFOODMK

Hello World

KMDHELLO WORLDDMK

Here is the entire command set I made up:

A=Not Equal
B=Subtract
C=If
D=String
E=Divide
F=Multiply
G=Equal
H=Add
I=For loop
J=Variable
K=Line
L=While loop
M=Print
N=Break
O=Not
P=Integer
Q=Take input
R=Do
S=Array
T=Join
U=Set
V=Pop
W=Then
X=Modulo
Y=Append
Z=Special

(Yes, I specifically shuffled the commands to make it painful)

Z would act as a way to access different sets of commands to extend into more specific functions.

Hopefully I should be able to write an interpreter one day, and if anyone has any advice on what I can use to make one that would be neat.

Here are some other examples I whipped up:

Wide text generator

KMHTD DQQTD DHMK
KK - Start line
KM - Start print
KMH - Start Add
KMHT - Start Join
KMHTD D - Add String arg
KMHTD DQQ - Add input arg
KMHTD DQQT - End Join
KMHTD DQQTD D - Add String arg
KMHTD DQQTD DH - End Add
KMHTD DQQTD DHM - End print
KMHTD DQQTD DHMK - End line

Generate a N-Length list of N

KUJAJSSUK
KMIUJCJUUJIJQQUIRYSSVIVYRMK

Any feedback?

| |
\$\endgroup\$
  • \$\begingroup\$ How does KMDHELLO WORLDDMK work? Since the string indicator is D, wouldn't the string truncate at HELLO WORL, then begin another string? \$\endgroup\$ – Scott Milner Mar 5 '18 at 21:12
  • \$\begingroup\$ I created a buffer called ZA that will escape strings. A single ZA will just act as a normal set of characters but ZA surrounding any characters will escape them from the string. \$\endgroup\$ – Mercury Platinum Mar 5 '18 at 21:32
0
\$\begingroup\$

BFZip

While not technically a programming language, I made this to help Brainfuck golfers to reduce their byte count.

Unfortunately, there are some glaring issues that make this unusable. I would appreciate any help with fixing them.

You can still calculate the bytes hypothetically if you use this formula, where n is the original byte count: ⌈3⋅n8

| |
\$\endgroup\$
  • 1
    \$\begingroup\$ This seems a bit like CompressedFuck (which also uses a 3-bit encoding, albeit a different one) and Spoon (which uses a variable-length Huffman encoding for maximum compression, and also has some extra commands) \$\endgroup\$ – Esolanging Fruit Feb 23 '18 at 20:48
  • \$\begingroup\$ @EsolangingFruit I didn't even know that CompressedFuck existed, now I feel like I did all that work for nothing :( \$\endgroup\$ – robbie Feb 23 '18 at 21:31
  • \$\begingroup\$ You could generalize your implementation into an arbitrary BF translator to handled BFZip, CompressedFuck, Spoon, etc. \$\endgroup\$ – Esolanging Fruit Feb 23 '18 at 22:38
0
\$\begingroup\$

Keg

I figured I might as well get around to writing up an answer to this question to show people a side of Keg they probably haven't seen before.

The Backstory

Let’s start off real simple. Keg is made by me, Jono2906, although on github and esolangs, I'm called JonoCode9374.

Anyhow, Keg was the second esolang I've ever made, with my first being a Minecraft based fungoid language. It's also the first golfing language I've ever made.

Back in 2018 when I was still new to esolangs, I was reading and learning about the ><> language. I absolutely loved the 2d layout as well as the simple stack manipulation abilities it contained. It was ><> that introduced me to stacks. And it was ><> that would influence the creation of Keg.

Starting from scratch, I didn't really know what to include in a golfing language. But I did know that I wanted to make the instruction set completely ascii, as I (at the time) found Unicode languages just too hard to understand (boy, how that's gone out the window!).

Touching on that point a bit more, I've had a kind of mindset of "if you don't understand it, make your own". Now, I know that people would say that such a perspective of life is ineffective, as one can't just create complex systems if they don't understand it. And I agree, generally I don't follow this way of thinking. But when it comes to something manageable like golfing language design, I believe it's fair game.

Also, I feel like I should mention I created Keg as a sort of protest against the big and established languages that seemed to always win... I kinda solved the issue of golfing langs sucking all the fun out of CGCC for myself.

Working my way through the process of language creation, I eventually finished the original interpreter, and, on the 5th of November, I created the github repo for Keg.

After doing so, I wrote a few answers here on CGCC and, after a few weeks of inactivity, I decided I'd move on from Keg.

Then, around 5 months later, I decided I would browse through esolangs.org to see what languages there were. Looking through the recent edits, I saw something that would drive the second phase of Keg development: Teg.

At first, I was kind of offended, as it seemed like a personal attack on the little language I had created. Wanting to prove whoever had created this page wrong that they had created something better than Keg, I started plotting out a brick ton of operators to add.

But then I learned that A__ (I'm on mobile, using an external markdown editor, whaddya expect?) was actually friendly and that they were just mucking around (I think), I was a bit more relaxed about Keg development. (I now view Teg as a kind of compliment ;p)

Needless to say, after ~2 months of extensive planning, ~30 pieces of paper with sketches of what aspects might look like, I finally started developing Keg's first major expansion.

Now, this expansion contained features such as strings, integer scanning, new register commands and variables. But the interpreter I had wasn't suited for such new things. So I had to rewrite everything. It was at this point I made Keg transpiled... one of the best decisions I've made in regards to Keg.

Later on, it came time to deal with finer aspects of the expansion. Such an example of this was string compression. Now, here's the thing... this was at a time when I thought all characters were a single byte each. Ha, what a silly idea. I was thinking of having a 400k word dictionary making good usage of the ~100k unicode characters. But then I learned about byte counts. So that's why there's only 60k words in the dictionary.

Why am I telling you all this? Well, I figured I would explain a little bit of the behind the scenes information about Keg. It may be fragmented, but it's the best I can do at the moment.

Main Features

The following is 'borrowed' from the esolangs page... Which i just happened to write ;P

The main inspiration for Keg comes from a want of an esolang where only symbols count as commands and everything else is pushed onto the stack as a literal. This is why there are only 12 functions, 7 ‘keywords’ and 8 operators. As such, this system allows for shorter programs where strings are involved (uncompressed strings in Keg are usually 1-2 bytes shorter than their counterparts in other languages).

Another design feature of Keg is the look of if statements, for loops and while loops. These structures take on the form of:

B...B

Where B is any of the three brackets ((/), [/] or {/}) and ... is any section of Keg code.

Some Basics

Most tutorials show how to print the string Hello, World! , so that’s what this tutorial will do as well. Here is a simple 21 byte program to achieve the goal.

Hello\, World\!^(!|,)

Hello #Push the characters "H", "e", "l", "l" and "o" to the stack \, #Escape the "," and push it to the stack World #Push the characters "W", "o", "r", "l" and "d" to the stack ! #Escape the "!" and push it to the stack ^ #Reverse the stack (!| #Start a for loop and set the count to the length of the stack , #Print the last item on the stack as a character )

In the above example, 6 new functions and keywords are introduced:

\ : Escapes the next command, and instead pushes it as a string (pushes its ASCII value) , : Prints the last item on the stack as a character ! : Pushes the length of the stack onto the stack ^ : Reverses the stack (...) : The for loop structure | : Used in structures to switch from one branch to the other.

One of the most important parts of Keg is the stack, which is where all operations are performed. A stack is a type of container (or list) where the last item in the container is the first item to be operated on (LIFO – Last In First Out). In the following examples, the stack will be investigated.

3# [3]
4# [3, 4]
+# [7]

In the above example, the numbers 3 and 4 are pushed onto the stack, and are then added using the + operator. The way it works is that the + pops what will be called x and y off the stack (the first and second last item) and pushes y + x back onto the stack. Note that the order of x and y are important when using the - and \ operators, as x - y doesn’t equal y - x most of the time (as is the same with x / y and y / x). This can be seen in the following example:

34-.#Outputs -1
43-.#Outputs 1 
34/.#Outputs 0.75 
43/.#Outputs 1.333333333333

Note that the . function prints the last item on the stack as an integer.

Keg has two output functions and one input function. When taking input from the user, the next line from the Standard Input and push the ASCII value of each character onto the stack. It will then push -1 onto the stack to sigify the end of input (input as integers will be coming in a later version of Keg). Input is taken using the ? command, as shown in the example program:

?(!|,) 
# > Example text 
# Example text

The two output functions (. – Print as integer and , – Print as string) have already been detailed in other sections

Links

| |
\$\endgroup\$
1 2 3
4

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .