No description
Find a file
Kakadu 43af0d24f0 Update .gitignore files
Signed-off-by: Kakadu <Kakadu@pm.me>
2021-02-12 22:27:52 +03:00
bench Improve pretty-printing of infixes 2020-12-11 18:06:33 +03:00
gdb GDB support draft 2020-09-10 22:15:57 +03:00
regression Update .gitignore files 2021-02-12 22:27:52 +03:00
runtime Length, string -> std functions 2021-01-31 22:57:12 +03:00
spec Abstract layer in spec started 2021-02-10 00:56:28 +03:00
src Update build for new GT 2021-02-12 20:21:16 +03:00
stdlib Update .gitignore files 2021-02-12 22:27:52 +03:00
tools README spelling 2020-12-31 11:31:55 +03:00
tutorial Update .gitignore files 2021-02-12 22:27:52 +03:00
.gitignore .gitignore files 2020-12-11 18:04:30 +03:00
.travis.yml Replace git-checkout with volume mounting from Travis sandbox 2018-03-06 17:41:06 +03:00
Changes Typos in Changes 2021-02-10 01:01:22 +03:00
lama-spec.pdf Abstract layer in spec started 2021-02-10 00:56:28 +03:00
Lama.opam Update README and opam files 2021-02-12 22:27:52 +03:00
lama.png Better md 2020-02-18 14:04:25 +03:00
Makefile src: Adding new switch and moving code from Driver to Language 2020-12-11 18:06:33 +03:00
README.md Update .gitignore files 2021-02-12 22:27:52 +03:00

Lama

lama is a programming language developed by JetBrains Research for educational purposes as an exemplary language to introduce the domain of programming languages, compilers and tools. Its general characteristics are:

  • procedural with first-class functions - functions can be passed as arguments, placed in data structures, returned and "constructed" at runtime via closure mechanism;
  • with lexical static scoping;
  • strict - all arguments of function application are evaluated before function body;
  • imperative - variables can be re-assigned, function calls can have side effects;
  • untyped - no static type checking is performed;
  • with S-expressions and pattern-matching;
  • with user-defined infix operators, including those defined in local scopes;
  • with automatic memory management (garbage collection).

The name lama is an acronym for Lambda-Algol since the language has borrowed the syntactic shape of operators from Algol-68; Haskell and OCaml can be mentioned as other languages of inspiration.

The main purpose of lama is to present a repertoire of constructs with certain runtime behavior and relevant implementation techniques. The lack of a type system (a vital feature for a real-word language for software engineering) is an intensional decision which allows to show the unchained diversity of runtime behaviors, including those which a typical type system is called to prevent. On the other hand the language can be used in future as a raw substrate to apply various ways of software verification (including type systems) on.

The current implementation contains a native code compiler for x86-32, written in OCaml, a runtime library with garbage-collection support, written in C, and a small standard library, written in lama itself. The native code compiler uses gcc as a toolchain.

In addition, a source-level reference interpreter is implemented as well as a compiler to a small stack machine. The stack machine code can in turn be either interpreted on a stack machine interpreter, or used as an intermediate representation by the native code compiler.

Language Specification

The language specification can be found here.

Installation

Windows users should get Windows Subsystem for Linux a.k.a WSL (recommended) or cygwin. Ubuntu-based variant of WSL is recommended.

  • System-wide prerequisites:

    • sudo apt install gcc-multilib (in Debian-based GNU/Linux)
    • opam (>= 2.0.4)
    • OCaml (>= 4.10.1). Optional because it can be easily installed through opam. Compiler variant with flambda switch is recommended
  • Check that opam is installed (using commands which opam or opam --version)

  • Install right switch for OCaml compiler

    opam switch create lama ocaml-variants.4.10.1+fp+flambda

    In above command:

    • opam switch create is a subcommand to create a new switch
    • ocaml-variants.4.10.1+fp+flambda is name of a standart template for the switch
    • lama is an alias for the switch being created; on success a directory $(HOME)/.opam/lama should be created
  • Update PATH variable for the fresh switch. (You can add these commands to your ~/.bashrc for convenience but they should be added by opam)

    export OPAMSWITCH=lama
    eval $(opam env)
    

    Check that OCaml compiler is now available in PATH: running which ocamlc should give /home/user/.opam/lama/bin/ocamlc (or similar) and ocamlc -v should give

    The OCaml compiler, version 4.10.1
    Standard library directory: /home/user/.opam/lama/lib/ocaml
    
  • Pin Lama package using opam and right URL (remember of "#" being a comment character in various shells)

    opam pin add Lama https://github.com/JetBrains-Research/Lama-devel.git\#1.10+ocaml4.10 -y

    The -y switch meands "reply always 'yes'".

  • Check that lamac exectuable was installed: which lamac should give

    /home/user/.opam/lama/bin/lamac
    

Smoke-testing:

Install lama system-wide, clone the repository and run make -C tutorial