• Stars
    star
    176
  • Rank 209,322 (Top 5 %)
  • Language
    C++
  • Created about 12 years ago
  • Updated almost 9 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Experimental VM for a `Candor` language

Candor Build Status

Candor is a language inspired by javascript, but with less features and, therefore, less complexity. So no semicolons, no exceptions and simplified anonymous function syntax (dart-like).

Main goal of Candor is to provide a powerful and developer-friendly language that can be easily optimized by compiler.

Description

Experimental implementation of Candor language VM. Join #candor channel on irc.freenode.net and official google group to discuss language features.

Danger! This whole project is not stable at all, many things are broken and may/will change in future

Example

// Defining a recursive function
factorial(x) {
  if (x == 1) return 1
  return x * factorial(x - 1)
}

factorial(10)

// Implementing a forEach function
forEach(array, callback) {
  if (typeof array != "array") return
  length = sizeof array
  i = 0
  while (i < length) {
    callback(i, array[i])
    i++
  }
}

// Implementing switch with chained if..else
type = typeof value
if      (type == "nil")     handleNil(value)
else if (type == "boolean") handleBoolean(value)
else if (type == "number")  handleNumber(value)
else if (type == "string")  handleString(value)
else handleObject(value)

// Implementing switch using objects
handlers = {
  "nil":     handleNil,
  "boolean": handleBoolean,
  "number":  handleNumber,
  "string":  handleString
}
handler = handlers[typeof value]
if (handler) handler(value)
else handleObject(value)

As you can see, there're no semicolons, statements are separated by newline symbols (whitespace is ignored).

Language basics

Candor is essentially inspired by the ECMA-script, but has much less features and complexity (for compiler).

Functions are declared in dart-like style, variables are implicitly scoped (i.e. if variable has no use in outer scopes, it'll be allocated in one where you declared it).

// Keywords: nil, true, false, typeof, sizeof, keysof, if, else, while,
// for, break, continue, return, new

// Primitives
nil
true
false
NaN
1
'abc'
"abc"
[1, 2, 3]
{ a: 1, 'b': 2, "c": 3 }

// Variables and objects
a = 1
a.b = "abc"
a.b.c = a
a[b()][c] = x

delete a[b] // removes key and value from object

// While object literals are restricted to declaring strings as keys, any value
// can be used as a key. This allows for all kinds of interesting data
// structures like efficient sets and unique unguessable keys.
a = { "5": "five" }
a[5] = 5
a["5"]         // -> "five"
a[5]           // -> 5
a[{ hello: "World" }] = "key is object, value is string!"

// Functions
a() {
  return 1
}
a()
// Functions are also objects and can have properties
a.b = "foo"

// Arrays are also objects, except they internally keep track of the largest
// integer index so that sizeof works with them.
a = [1,2,3]
a.foo = true
sizeof a       // -> 3
a.foo          // -> true

// typeof.  Sometimes it's useful to know what type a variable is

typeof nil     // -> "nil"
typeof true    // -> "boolean"
typeof false   // -> "boolean"
typeof 42      // -> "number"
typeof "Hello" // -> "string"
typeof [1,2,3] // -> "array"
typeof {a: 5}  // -> "object"
typeof (){}    // -> "function"

// sizeof gives the size of an array (max integer key + 1) or string (number of bytes)
// gives nil for other types

sizeof "Hello" // -> 5
sizeof [1,2,3] // -> 3
sizeof {}      // -> 0

// keysof returns an array of all the keys in an object
keys = keysof { name: "Tim", age: 29 }
keys           // -> ["name", "age"]

// Control flow

// The variables in the condition head are scoped with the condition, not the
// optional body block.

// Conditionals
person = { age: 29, name: "Tim" }

// With block
if (person.age > 18) {
  person.name  // -> "Tim"
}

// Without block
if (person.age > 18) person.name

// using else
if (person.age > 18) {
  // do something with `person`
} else {
  // do something else
}

if (person.age > 18) action(person)
else otherAction()

// While loops
i = 0
sum = 0
while (i < 10) {
  sum = sum + i
  i++
}

// break and continue. `while` loop can have `break` and `continue`
// break exits a loop immediately, continue, skips to the next iteration

// Object Oriented Programming

// There are no dynamic prototypes in candor, but there is a fast-clone
// operation and special method calling syntax to make OOP style programming
// possible if you prefer that style.

// Create a prototype object
Rectangle = {
  getArea: (self) {
    return self.w * self.h
  },
  initialize: (self, w, h) {
    self.w = w
    self.h = h
  }
}

// First create a fast shallow clone of the Rectangle prototype
rect = clone Rectangle

// Then initialize it using a one of the functions
rect.initialize(rect, 3, 5)

// Now we can use this object
rect.getArea(rect) // -> 15

// To make calling methods easier, there is special syntax sugar using `:`
// instead of `.` for function calls. It means to call the function with
// whatever is left of the `:` as the first argument.

// The previous two calls can be written as:
rect:initialize(3, 5)
rect:getArea() // -> 15

Building

git clone git://github.com/indutny/candor.git
cd candor
make test

Status of project

Things that are implemented currently:

  • Language lexer and parser
  • Assigning on-stack and context variables
  • Binary and unary operations
  • Unboxing of heap numbers
  • Floating point operations
  • Function calls, passing arguments and using returned value
  • Stop-the-world copying two-space garbage collector
  • Hash-maps (objects), numeric and string keys
  • Arrays
  • Typeof, Sizeof, Keysof
  • String concatenation
  • Parser/lexer/compiler errors
  • Break/Continue statements
  • C++/C bindings support for candor
  • C++/C bindings documentation
  • Dense arrays
  • Cons strings
  • HIR/LIR Compiler!!!

Things to come:

  • On-stack replacement and profile-based optimizations
  • Incremental GC
  • Usage in multiple-threads (aka isolates)
  • See TODO for more up-to-date tasks

Contributing

Any bug-fixes or feature implementations are always welcome! Only one restriction is applied to the code - it should follow Google C++ Style Guide.

Want to get in, but don't feel like you know a lot about designing compilers? No problem at all - I prepared a list of papers that may help you understand things going in Candor better: Compiler-papers.

Credits

Special thanks to:

  • creationix for suggesting the name for this project!
  • hij1nx for contributing awesome logo!

LICENSE

Copyright (c) 2012, Fedor Indutny.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

More Repositories

1

elliptic

Fast Elliptic Curve Cryptography in plain javascript
JavaScript
1,583
star
2

node-ip

IP address tools for node.js
JavaScript
1,457
star
3

bn.js

BigNum in pure javascript
JavaScript
1,171
star
4

sticky-session

Sticky session balancer based on a `cluster` module
JavaScript
965
star
5

webpack-common-shake

CommonJS Tree Shaker plugin for WebPack
JavaScript
914
star
6

bud

**NOT MAINTAINED** Bud - The TLS Terminator
C
454
star
7

heartbleed

Extracting server private key using Heartbleed OpenSSL vulnerability.
C++
391
star
8

hash.js

Hash functions in pure javascript
JavaScript
312
star
9

fft.js

The fastest JS Radix-4/Radix-2 FFT implementation
JavaScript
228
star
10

dht.js

True bittorrent DHT in javascript
JavaScript
215
star
11

vock

VoIP on node.js
C++
182
star
12

asn1.js

ASN.1 Decoder/Encoder/DSL
JavaScript
174
star
13

gyp.js

Feature-reduced port of GYP to JavaScript
JavaScript
160
star
14

common-shake

CommonJS Tree Shaker API
JavaScript
149
star
15

node-nat-upnp

NAT port mapping via UPnP
JavaScript
147
star
16

caine

Friendly butler
JavaScript
139
star
17

proof-of-work

Proof of Work with SHA256 and Bloom filter
JavaScript
112
star
18

node-index

Append-only B+ Tree index for node.js
CoffeeScript
85
star
19

wasm-jit

WebAssembly JIT
JavaScript
84
star
20

ocsp

OCSP Stapling/Checking for node.js
JavaScript
83
star
21

gradtype

WIP
Python
67
star
22

keychair

Chair and the Key
JavaScript
65
star
23

uv_link_t

Chainable libuv streams
C
63
star
24

vock-server

Server for Vock VoIP
JavaScript
58
star
25

tlsnappy

TLS, but faster!
C++
57
star
26

uv_ssl_t

Chainable SSL implementation for libuv
C
57
star
27

mmap.js

Working mmap bindings for node.js
C++
56
star
28

bitcode

Generate binary LLVM-compatible bitcode from JS
TypeScript
56
star
29

vote.wdgt

Free Proof-of-Work API for fancy Vote Counting widgets
JavaScript
54
star
30

deadbolt

Autoreleasing locks for node.js
JavaScript
54
star
31

node-netroute

Route table bindings for node.js
C++
48
star
32

wasm-ast

WebAssembly AST Parser
JavaScript
47
star
33

git-secure-tag

Secure git tag signing
JavaScript
46
star
34

heatline

Source-annotating profiler for node.js
JavaScript
46
star
35

home

My homepage
JavaScript
46
star
36

disasm

JS Disassembler
JavaScript
45
star
37

json-depth-stream

Streaming JSON parser with depth-limited auxiliary data
JavaScript
43
star
38

self-signed

Generate Self-Signed certificates in browser
JavaScript
41
star
39

hpack.js

HPACK implementation in pure JavaScript
JavaScript
39
star
40

tls.js

TLS Protocol implementation for node.js
JavaScript
39
star
41

spoon

CPS Style for JavaScript, JS->CFG->JS Transpiler
JavaScript
37
star
42

entropoetry

Entropic Poetry
JavaScript
36
star
43

dns.js

Plain javascript dns
JavaScript
36
star
44

bthread

BThread - Thread messaging and blog posting on bitcoin blockchain
JavaScript
33
star
45

bplus

Append-only B+ tree implemented in C
C
31
star
46

promise-waitlist

Promise-based Wait List for your apps
JavaScript
31
star
47

json-pipeline

JSON pipeline for a hypothetical compiler
JavaScript
30
star
48

satoshi

Satoshi Conspiracy
JavaScript
30
star
49

bar

Node.js framework for building large modular web applications.
JavaScript
29
star
50

breakdown

Trace outgoing http requests for an http server and track the time spent doing CPU intensive workload during each request.
JavaScript
29
star
51

isodrive

Isometric game engine
JavaScript
28
star
52

miller-rabin

JavaScript
28
star
53

des.js

DES algorithm
JavaScript
27
star
54

pripub

RSA encryption for node.js
C++
25
star
55

minimalistic-crypto-utils

Minimalistic utils for JS-only crypto
JavaScript
24
star
56

macho

Mach-O parser for node.js
JavaScript
23
star
57

wasm-cli

CLI for wasm-jit
JavaScript
23
star
58

node-balancer

Node load balancer
JavaScript
22
star
59

nTPL

node.js Templating system
JavaScript
22
star
60

node.gzip

!!!!!! Not-supported !!!!!!!
JavaScript
22
star
61

uv_http_t

Chainable HTTP Server implementation
C
21
star
62

hmac-drbg

JS-only Hmac DRBG implementation
JavaScript
20
star
63

hash-cracker

V8 Hash Seed timing attack
C
20
star
64

json-gpg

JSON GPG sign and verify
JavaScript
20
star
65

dukhttp

C
19
star
66

bulk-gcd

Bulk GCD in Rust
Rust
19
star
67

brorand

JavaScript
19
star
68

ninja.js

Naive `ninja` implementation
JavaScript
18
star
69

escape.js

Using escape analysis to enforce heap value lifetime in JS
18
star
70

bitcode-builder

API for building typed CFG for bitcode module
TypeScript
17
star
71

github-scan

Collecting public SSH keys using GitHub APIs
TypeScript
16
star
72

elfy

Dumb simple ELF parser
JavaScript
16
star
73

llvm-ir

LLVM IR Builder
JavaScript
16
star
74

redns

Fast and configurable DNS lookup cache
JavaScript
15
star
75

awesome64

WIP Awesome 64-bit integer implementation in JS
JavaScript
15
star
76

pyg

Not GYP
C
14
star
77

linearscan.rs

Linear scan register allocator written in Rust
Rust
14
star
78

crypto-deck

Cryptographically secure Mental Card Deck implementation
JavaScript
14
star
79

hypercorn

WIP
JavaScript
14
star
80

node-bplus

Node.js bindings for a bplus library
C++
13
star
81

mini-test.c

Minimalistic portable test runner for C projects
C
13
star
82

node-cf

Run CFRunLoop within libuv's eventloop
C++
13
star
83

assert-text

Assertion for multi-line texts when you need it
JavaScript
13
star
84

tokio-lock

Access an object from a single Tokio task
Rust
13
star
85

sneequals

Sneaky equality check between objects using proxies
TypeScript
13
star
86

huffin

Vanity ed25519 public keys, through Huffman Codes
JavaScript
12
star
87

core2dump

Core to dump
C
12
star
88

latetyper

Typing latency (OS X only)
C
11
star
89

file-shooter

File Shooter (uv_link_t, uv_ssl_t, uv_http_t)
C
11
star
90

spectrum-analyzer

FFT-based windowed spectrum analyzer
JavaScript
11
star
91

mean.engineer

An incomplete ActivityPub implementation in TypeScript
TypeScript
11
star
92

endian-reader

Small node.js helper for reading from Buffer with specified (ahead of time) endian
JavaScript
11
star
93

audio

Some realtime audio playback/recording for node.js
C++
11
star
94

stream-pair

Coupled Streams
JavaScript
11
star
95

json-pipeline-reducer

Reducer for json-pipeline
JavaScript
11
star
96

mitm.js

JavaScript
10
star
97

json-pipeline-scheduler

Scheduler for JSON-Pipeline project
JavaScript
10
star
98

wbuf

JavaScript
10
star
99

offset-buffer

JavaScript
10
star
100

reopen-tty

A small library to open /dev/tty in a cross-platform way
JavaScript
9
star