Skip to content

Commit

Permalink
Merge pull request #469 from nevalang/tmp
Browse files Browse the repository at this point in the history
- fix(runtime): examples 0 to 4 work
- refactor(std): port names
- update readme
  • Loading branch information
emil14 authored Feb 24, 2024
2 parents 56f272f + a9f5d01 commit d36db1a
Show file tree
Hide file tree
Showing 78 changed files with 514 additions and 779 deletions.
16 changes: 8 additions & 8 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"mode": "auto",
"program": "${workspaceFolder}/cmd/cli",
"cwd": "${workspaceFolder}/examples",
"args": ["build", "1_echo"]
"args": ["run", "1_echo"]
},
{
"name": "Neva CLI 20",
Expand All @@ -27,7 +27,7 @@
"mode": "auto",
"program": "${workspaceFolder}/cmd/cli",
"cwd": "${workspaceFolder}/examples",
"args": ["build", "2_hello_world/0_verbose"]
"args": ["run", "2_hello_world/0_verbose"]
},
{
"name": "Neva CLI 21",
Expand All @@ -36,7 +36,7 @@
"mode": "auto",
"program": "${workspaceFolder}/cmd/cli",
"cwd": "${workspaceFolder}/examples",
"args": ["build", "2_hello_world/1_with_const_sender"]
"args": ["run", "2_hello_world/1_with_const_sender"]
},
{
"name": "Neva CLI 22",
Expand All @@ -45,7 +45,7 @@
"mode": "auto",
"program": "${workspaceFolder}/cmd/cli",
"cwd": "${workspaceFolder}/examples",
"args": ["build", "2_hello_world/2_with_then_connection"]
"args": ["run", "2_hello_world/2_with_then_connection"]
},
{
"name": "Neva CLI 23",
Expand All @@ -54,7 +54,7 @@
"mode": "auto",
"program": "${workspaceFolder}/cmd/cli",
"cwd": "${workspaceFolder}/examples",
"args": ["build", "2_hello_world/3_with_literal_sender"]
"args": ["run", "2_hello_world/3_with_literal_sender"]
},
{
"name": "Neva CLI 30",
Expand All @@ -63,7 +63,7 @@
"mode": "auto",
"program": "${workspaceFolder}/cmd/cli",
"cwd": "${workspaceFolder}/examples",
"args": ["build", "3_interfaces"]
"args": ["run", "3_interfaces"]
},
{
"name": "Neva CLI 40",
Expand All @@ -72,7 +72,7 @@
"mode": "auto",
"program": "${workspaceFolder}/cmd/cli",
"cwd": "${workspaceFolder}/examples",
"args": ["build", "4_add_numbers/verbose"]
"args": ["run", "4_add_numbers/verbose"]
},
{
"name": "Neva CLI 41",
Expand All @@ -81,7 +81,7 @@
"mode": "auto",
"program": "${workspaceFolder}/cmd/cli",
"cwd": "${workspaceFolder}/examples",
"args": ["build", "4_add_numbers/with_bridge"]
"args": ["run", "4_add_numbers/with_bridge"]
},
{
"name": "Neva CLI 50",
Expand Down
45 changes: 32 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,46 +2,65 @@

**<p align="center">Flow Based Programming Language</p>**

# Neva
# Neva (Proof of Concept)

A general-purpose, flow-based programming language with static typing and implicit parallelism, designed with visual programming in mind, that compiles to machine code and Go.
A general-purpose flow-based programming language with static types and implicit parallelism. Compiles to machine code and Go.

WebSite: https://nevalang.org/
Website: https://nevalang.org/

## Hello World

```neva
component Main(start any) (stop any) {
nodes { printer Printer<string> }
net {
:start -> ('Hello, World!' -> printer:msg)
printer:msg -> :stop
:start -> ('Hello, World!' -> printer:data)
printer:sig -> :stop
}
}
```

## Features
When `Main` receives a `start` signal, it sends a `'Hello, World!'` message to `data` inport of the node `printer`, which is an instance of a `Printer` component. Then `printer` sends a signal to it's `sig` outport, we use it as a signal to our `stop` outport.

## How it works?

Program starts with the single `start` message and ends after first `stop` message. This is our only way to control execution flow. For everything else we control flow of the data.

We create networks of components that are then executed inside a special asynchronous message passing runtime where everything happens in parallel. The compiler analyzes these networks for various semantic errors, including type-safety.

The command line interface can execute such source code directly using an interpreter, which is handy for development and debugging. For production use, it emits either machine code, Golang, or WASM.

[Read more about the language](https://nevalang.org/docs/about)

## Features 🚀

- Flow-Based Programming
- Effortless Concurrency
- Strong Static Typing
- Multi-Target Compilation
- Multi-Target Compilation (PoC)
- Clean C-like Syntax
- Interpreter Mode
- First-Class Dependency Injection
- Builtin Observability
- Garbage Collection

### WIP
### Roadmap (🚧 WIP)

> ⚠️ WARNING: This project is under heavy development and **not production ready** yet.
- Visual Programming
- Go Interop
- No Runtime Exceptions

[Read more about the language](https://nevalang.org/docs/about)
- Visual Programming

## Contributing

Nevalang needs your help, it has only one maintainer. Join community. Together we can change programming for the best.

- [Discord](https://discord.gg/8fhETxQR)
- [Reddit](https://www.reddit.com/r/nevalang/)
- [Telegram group](https://t.me/+H1kRClL8ppI1MWJi)
- [Telegram channel](https://t.me/+H1kRClL8ppI1MWJi)

See [CONTRIBUTING.md](./CONTRIBUTING.md) and [ARCHITECTURE.md](./ARCHITECTURE.md)

---

> ⚠️ WARNING: This project is under heavy development and **not production ready** yet.
9 changes: 5 additions & 4 deletions cmd/cli/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"
"os"

"github.com/nevalang/neva/internal/builder"
"github.com/nevalang/neva/internal/compiler"
"github.com/nevalang/neva/internal/compiler/analyzer"
"github.com/nevalang/neva/internal/compiler/backend/golang"
Expand All @@ -13,8 +14,8 @@ import (
"github.com/nevalang/neva/internal/compiler/irgen"
"github.com/nevalang/neva/internal/compiler/parser"
"github.com/nevalang/neva/internal/interpreter"
"github.com/nevalang/neva/internal/pkgmanager"
"github.com/nevalang/neva/internal/runtime"
"github.com/nevalang/neva/internal/runtime/adapter"
"github.com/nevalang/neva/internal/runtime/funcs"
"github.com/nevalang/neva/pkg"
"github.com/nevalang/neva/pkg/typesystem"
Expand All @@ -36,7 +37,7 @@ func main() { //nolint:funlen
prsr := parser.New(false)

// pkg manager
pkgMngr := pkgmanager.New(
pkgMngr := builder.New(
"/Users/emil/projects/neva/std",
"/Users/emil/projects/neva/thirdparty",
prsr,
Expand Down Expand Up @@ -105,11 +106,11 @@ func main() { //nolint:funlen

func newInterpreter(
c compiler.Compiler,
pkg pkgmanager.Manager,
pkg builder.Builder,
) interpreter.Interpreter {
return interpreter.New(
c,
interpreter.NewAdapter(),
adapter.NewAdapter(),
runtime.New(
runtime.NewDefaultConnector(),
runtime.MustNewFuncRunner(
Expand Down
22 changes: 11 additions & 11 deletions cmd/lsp/indexer/indexer.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,23 @@ import (
"context"
"fmt"

"github.com/nevalang/neva/internal/builder"
"github.com/nevalang/neva/internal/compiler"
"github.com/nevalang/neva/internal/compiler/analyzer"
"github.com/nevalang/neva/internal/compiler/desugarer"
"github.com/nevalang/neva/internal/compiler/parser"
"github.com/nevalang/neva/internal/pkgmanager"
src "github.com/nevalang/neva/pkg/sourcecode"
)

type Indexer struct {
pkgManager pkgmanager.Manager
parser parser.Parser
desugarer desugarer.Desugarer
analyzer analyzer.Analyzer
builder builder.Builder
parser parser.Parser
desugarer desugarer.Desugarer
analyzer analyzer.Analyzer
}

func (i Indexer) FullIndex(ctx context.Context, path string) (src.Build, *compiler.Error, error) {
rawBuild, err := i.pkgManager.Build(ctx, path)
rawBuild, err := i.builder.Build(ctx, path)
if err != nil {
return src.Build{}, nil, fmt.Errorf("builder: %w", err)
}
Expand All @@ -44,15 +44,15 @@ func (i Indexer) FullIndex(ctx context.Context, path string) (src.Build, *compil
}

func New(
builder pkgmanager.Manager,
builder builder.Builder,
parser parser.Parser,
desugarer desugarer.Desugarer,
analyzer analyzer.Analyzer,
) Indexer {
return Indexer{
pkgManager: builder,
parser: parser,
desugarer: desugarer,
analyzer: analyzer,
builder: builder,
parser: parser,
desugarer: desugarer,
analyzer: analyzer,
}
}
2 changes: 1 addition & 1 deletion cmd/lsp/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ import (

"github.com/nevalang/neva/cmd/lsp/indexer"
lspServer "github.com/nevalang/neva/cmd/lsp/server"
builder "github.com/nevalang/neva/internal/builder"
"github.com/nevalang/neva/internal/compiler/analyzer"
"github.com/nevalang/neva/internal/compiler/desugarer"
"github.com/nevalang/neva/internal/compiler/parser"
builder "github.com/nevalang/neva/internal/pkgmanager"
"github.com/nevalang/neva/pkg"
"github.com/nevalang/neva/pkg/typesystem"
)
Expand Down
8 changes: 5 additions & 3 deletions examples/1_echo/main.neva
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import { std/x }

component Main(start any) (stop any) {
nodes {
reader Scanner
scanner x.LineScanner
printer Printer<string>
}
net {
:start -> reader:sig
reader:data -> printer:data
:start -> scanner:sig
scanner:data -> printer:data
printer:sig -> :stop
}
}
6 changes: 3 additions & 3 deletions examples/4_add_numbers/verbose/main.neva
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ component Main(start any) (stop any) {
}
net {
:start -> (
1 -> streamer:p[0],
2 -> streamer:p[1]
1 -> streamer:ports[0],
2 -> streamer:ports[1]
)
streamer:seq -> adder:seq
streamer:stream -> adder:stream
adder:res -> printer:data
printer:sig -> :stop
}
Expand Down
4 changes: 2 additions & 2 deletions examples/4_add_numbers/with_bridge/main.neva
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ component Main(start any) (stop any) {
}
net {
:start -> (
1 -> adder:p[0],
2 -> adder:p[1]
1 -> adder:ports[0],
2 -> adder:ports[1]
)
adder:res -> printer:data
printer:sig -> :stop
Expand Down
18 changes: 9 additions & 9 deletions examples/5_add_real_numbers/naive/main.neva
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
import {
std/strconv
std/x
}

component Main(start any) (stop any) {
nodes {
reader1 Scanner
reader2 Scanner
parser1 strconv.NumParser<int>
parser2 strconv.NumParser<int>
reader1 x.LineScanner
reader2 x.LineScanner
parser1 x.NumParser<int>
parser2 x.NumParser<int>
adder PortBridge<int> { handler Adder<int> }
printer Printer<int>
}
net {
:start -> reader1:sig
reader1:data-> parser1:s
parser1:res -> [adder:p[0], reader2:sig]
reader2:data -> parser2:s
parser2:res -> adder:p[1]
reader1:data-> parser1:data
parser1:res -> [adder:ports[0], reader2:sig]
reader2:data -> parser2:data
parser2:res -> adder:ports[1]
adder:res -> printer:data
printer:sig -> :stop
}
Expand Down
18 changes: 9 additions & 9 deletions examples/5_add_real_numbers/with_err_handling/main.neva
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
// Here we learn how to handle errors by fixing this simple program

import {
std/strconv
std/x
}

component Main(start any) (stop any) {
nodes {
reader1 Scanner
reader2 Scanner
parser1 strconv.NumParser<int>
parser2 strconv.NumParser<int>
reader1 x.LineScanner
reader2 x.LineScanner
parser1 x.NumParser<int>
parser2 x.NumParser<int>
adder PortBridge<int> { handler Adder<int> }
printer Printer<any>
}
net {
:start -> reader1:sig
reader1:data -> parser1:s
reader1:data -> parser1:data
parser1:err -> printer:data
parser1:res -> [adder:p[0], reader2:sig]
reader2:data -> parser2:s
parser1:res -> [adder:ports[0], reader2:sig]
reader2:data -> parser2:data
parser2:err -> printer:data
parser2:res -> adder:p[1]
parser2:res -> adder:ports[1]
adder:res -> printer:data
printer:sig -> :stop
}
Expand Down
Loading

0 comments on commit d36db1a

Please sign in to comment.