Quiz: is this a programming language?

stereobooster - Jan 17 '21 - - Dev Community

Definition

I would say that something is programming language (PL) if:

  • 1: there is a machine that can do some actions (computations) based on the text written in the language (program)
  • 2: or this language can be mechanically translated (compiled) to a programming language

Now let's see if we can tell based on this rule if something a PL or not.

  • Machine code? Yes, it can be interpreted by CPU
  • Assembly? Yes, it can be compiled to machine code.
  • C? Yes, it can be compiled to an assembly.
  • JavaScript? Yes, it can be interpreted by nodejs.
  • Postscript? Yes, it can be interpreted by Ghostcript.
  • HTML? Yes, it can be interpreted by a browser.

Wait a second ... is HTML a programming language?

Yes according to my definition of PL (if you disagree provide your definition). There is a grammar, which specifies how to parse it. There is an interpreter - in response to instruction in the program it renders different things on the screen.

But is it Turing complete?

Irrelevant question.

  • Brainfuck is Turing complete, but do you want to program with it?
  • Agda and Coq are not Turing complete, but nobody seems to doubt that those are programming languages
Turing Complete Not Turing complete
Practical JavaScript, Haskell, Go HTML, CSS, Regex
Not practical "Turing tar-pit"
  1. Beware of the Turing tar-pit in which everything is possible but nothing of interest is easy.

-- Alan Perlis

Turing tarpit examples: Brainfuck, C++ templates.

Related: "Pacman complete" (a term coined by Edwin Brady?) - how is it easy to implement Pacman game in the programming language (as an alternative to Turing completeness).

General-purpose vs special-purpose

Or maybe you want to ask: is it a general-purpose PL? No, it's not - it has a special purpose to denote markup for hypertext. Postscript is Turing complete, but it is used for the same purpose as HTML - to denote markup.

Turing Complete Not Turing complete
general-purpose JavaScript, Haskell, Go
special-purpose Postscript, Bash, Make HTML, CSS, Regex

Another name for special-purpose PL is a domain-specific language (DSL).

Declarative vs imperative

Declarative programming is when you write your code in such a way that it describes what you want to do, and not how you want to do it.

From my point of view, this is a very "sketchy" definition. For example, in CSS (before flexbox) to center div you would do something like this:

.container {
  ...
  position: relative;
}
.child {
  width: 50px;
  /* Center vertically */
  position: absolute;
  top: 50%;
  margin-top: -25px; /* half this element's height */
}
Enter fullscreen mode Exit fullscreen mode

Is it fair to say that I'm expressing "what" instead of "how"? Effectively I say move 50% from top and half of height back.

Turing Complete Not Turing complete
Declarative Haskell HTML, CSS, Regex
Imperative JS, Go

Let's continue with the quiz

  • XML? In general case no, in special cases yes.
    • XHTML? Yes
    • Apache ant? Yes
    • SVG? Yes

XML itself has no meaning, it describes the structure. But as soon as you declare an application that can interpret XML you "define a meaning" for it.

PS

If you don't know how compilers work, then you don't know how computers work.

-- Steve Yegge

I would change it a bit: "if you don't know how compilers and interpreters...".

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .