Improve LIGO intro page based on Sander's suggestions

This commit is contained in:
John David Pressman 2020-03-05 20:22:43 -08:00
parent 9791b993d2
commit 15b3dc02db

View File

@ -4,59 +4,46 @@ title: Introduction To LIGO
---
LIGO is a programming language for writing [Tezos](https://tezos.com/) smart contracts.
Smart contracts are a unique domain with extreme resource constraints and even
more extreme security risks. Unlike desktop, mobile, or web
application development smart contracts cannot rely on cheap CPU time and memory.
All resources used by contracts are expensive, and tracked as 'gas costs'. Smart
contracts often directly control money or assets, which if stolen could rack up to
a large financial loss to the contracts controllers and users. Tezos smart contracts
live on the blockchain forever, if there's a bug in them they can't be patched or
amended. Naturally under these conditions it's not possible to develop smart contracts
the way we're used to developing user facing applications.
The LIGO philosophy can be described in a few bullet points:
LIGO is designed with these problems in mind. The design philosophy can be
described in a few bullet points:
1. Design a clean, simple language with no unnecessary parts.
1. Make a clean, simple language with no unnecessary parts.
2. Give that language multiple syntaxes borrowed from other languages. Ideally
LIGO requires the user to learn almost no new syntax.
2. Offer multiple familiar syntaxes so users can get up and running quickly.
3. Have that simple language encourage people to write simple code, so that it's
easy to formally verify the compiled output using a project like [Mi-Cho-Coq](https://gitlab.com/nomadic-labs/mi-cho-coq/).
3. Encourage people to write simple code, so that it's easy to formally verify the
compiled output using a project like [Mi-Cho-Coq](https://gitlab.com/nomadic-labs/mi-cho-coq/).
4. Stop waking up in the morning to find that your smart contract lost all its money
to some [stupid exploit](https://www.wired.com/2016/06/50-million-hack-just-showed-dao-human/).
4. Significantly reduce the risk that your smart contract will lose its balance to an [avoidable exploit](https://www.wired.com/2016/06/50-million-hack-just-showed-dao-human/).
The current trend in language design is more, more, more, so this might seem
counterintuitive. However most useful smart contracts can express their core
functionality in under a thousand lines of code. The problem domain
necessitates that you get as close as possible to the minimal code size and
resource use. LIGO is a functional language designed to include the features
you need, while avoiding patterns that make formal verification hard.
LIGO is a functional language designed to include the features you need, while
avoiding patterns that make formal verification hard. Most useful smart contracts
can express their core functionality in under a thousand lines of code. This makes
them a good target for formal methods, and what can't be easily proven can at least
be extensively tested. The simplicity of LIGO also keeps its compiled output
unbloated. Our hope is to have a simple, strongly typed language with a low footprint.
For example LIGO doesn't use an object oriented paradigm, currently code is
organized using functions. While LIGO plans to have a module system in the
future, we don't want programs to have thousands of dependencies. Once a
contract is put on the blockchain, it's not possible to change it. A new
version can be uploaded, but the original contract remains available. Contracts
tend to control money. In that environment it's not responsible to encourage
users to incorporate lots of code from strangers. The immutability of contracts
make formal verification of contract logic attractive. The eventual goal is
to make it easy to compile a LIGO contract to a format that can be loaded into
the [Coq proof assistant](https://coq.inria.fr/).
LIGO currently offers three syntaxes:
## LIGO for Programming Smart Contracts on Tezos
- **PascaLIGO**, a syntax inspired by Pascal which provides an
imperative developer experience.
Perhaps the most striking feature of LIGO is that it comes in
different concrete syntaxes, and even different programming
paradigms. In other words, LIGO is not defined by one syntax and one
paradigm, like imperative versus functional.
- **CameLIGO**, an [OCaml]((https://ocaml.org/)) inspired
syntax that allows you to write in a functional style.
- There is **PascaLIGO**, which is inspired by Pascal, hence is an
imperative language with lots of keywords, where values can be
locally mutated after they have been annotated with their types
(declaration).
- There is **CameLIGO**, which is inspired by the pure subset of
[OCaml](https://ocaml.org/), hence is a functional language with
few keywords, where values cannot be mutated, but still require
type annotations (unlike OCaml, whose compiler performs almost
full type inference).
- There is **ReasonLIGO**, which is inspired by the pure subset of
[ReasonML](https://reasonml.github.io/), which is based upon
OCaml.
- **ReasonLIGO**, an [ReasonML]((https://reasonml.github.io/)) inspired syntax
that builds on the strong points of OCaml. It aims to be familiar for those
coming from JavaScript.
Let's define some LIGO contract in the three flavours above. Do
not worry if it is a little confusing at first; we will explain all