Multiple levels of lisp

level 1: text

Lisp starts with text. Plain old ascii (or utf-8) text. Bytes in a file or string with characters. The lisp interpreter or compiler scans this text and builds the next level: s-expressions.

level 2: s-expressions

This is a lump of linked lists essentially. The lisp interpreter slurps in text and constructs this data structure in memory, but otherwise doesn't do anything with it. The doing comes later when evaluating the structure and applying semantic meaning:

level 3: semantics

Here the lisp interpreter scans the "raw" data (linked lists) and tries to extract some meaning from them. For example, if the first item in the list being evaluated is a "token" (a word) this is assumed to be a function call.

level 4: execution

Probably level 3 and 4 are mixed in interpreters, but in compilers they are separate. With compilers we have probably lost the original s-expression tree and are at this point it is byte code being executed by a real or virtual CPU.

C

In C we go from text file (level 1) directly to byte code (level 4) with generally no visibility on the intermediate steps. With special flags you can ask LLVM to dump the in-memory structure in step 2 to text.