Skip to content

Commit

Permalink
Initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
patrykstefanski committed Jun 28, 2018
0 parents commit 51fe881
Show file tree
Hide file tree
Showing 30 changed files with 3,878 additions and 0 deletions.
89 changes: 89 additions & 0 deletions .clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
---
Language: Cpp
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Left
AlignOperands: true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: true
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterStruct: false
AfterUnion: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakStringLiterals: true
ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IndentCaseLabels: false
IndentWidth: 2
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Left
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Cpp11
TabWidth: 8
UseTab: Never
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "lib/capstone"]
path = lib/capstone
url = https://github.com/aquynh/capstone
41 changes: 41 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
cmake_minimum_required(VERSION 3.8)
project(dc-lang)

option(LINK_TIME_OPTIMIZATION "Link Time Optimization" OFF)

find_package(LLVM REQUIRED CONFIG)
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
include_directories(${LLVM_INCLUDE_DIRS})
add_definitions(${LLVM_DEFINITIONS})
llvm_map_components_to_libnames(LLVM_LIBS core native orcjit)
list(APPEND LIBS ${LLVM_LIBS})

add_subdirectory(lib/capstone)
include_directories(lib/capstone/include)
list(APPEND LIBS capstone-static)

set(SOURCES
src/code_gen.cpp
src/instruction.cpp
src/interpreter.cpp
src/lexer.cpp
src/main.cpp
src/parser.cpp
src/utilities.cpp)

add_executable(${PROJECT_NAME} ${SOURCES})
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 17)
target_link_libraries(${PROJECT_NAME} ${LIBS})

if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCXX)
target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -fno-exceptions -fno-rtti -fno-stack-protector -fomit-frame-pointer)

if(LINK_TIME_OPTIMIZATION)
target_compile_options(${PROJECT_NAME} PRIVATE -flto)
set_property(TARGET ${PROJECT_NAME} APPEND_STRING PROPERTY LINK_FLAGS " -flto")
endif()
endif()

if(UNIX)
set_property(TARGET ${PROJECT_NAME} APPEND_STRING PROPERTY LINK_FLAGS " -rdynamic")
endif()
91 changes: 91 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# dc-lang
A toy imperative programming language with a tracing JIT.
FASTER THAN C!

## Requirements
* C++17 compiler
* CMake >= 3.8
* LLVM 6

## Benchmarks
Wall-clock time, average of 10 runs.

Environment:
\
os: Linux x86\_64 4.17.2
\
cpu: Intel Core i7-8700K
\
clang: 6.0.0
\
gcc: 8.1.1
\
java: openjdk 1.8.0\_172

### Prime

| Language | Time [s] |
| ------------- | --------- |
| dc-lang | 64.02 |
| dc-lang --jit | 29.06 |
| clang6 -O3 | **26.95** |
| gcc8.1 -O3 | 29.15 |
| java8 | 31.43 |

Used commands:
```
cd benchmarks
time dc-lang prime.dc
time dc-lang --jit prime.dc
clang -O3 prime.c -oprime && time ./prime
gcc -O3 prime.c -oprime && time ./prime
javac prime.java && time java prime
```

### Matrix multiplication

| Language | Time [s] |
| ------------- | --------- |
| dc-lang | 105.53 |
| dc-lang --jit | 10.47 |
| clang6 -O3 | **10.08** |
| gcc8.1 -O3 | 10.27 |
| java8 | 13.71 |

Used commands:
```
cd benchmarks
python3 ../scripts/gen_matrix.py 1600 666 > matrix
time dc-lang matrix_mul.dc <matrix 1>/dev/null
time dc-lang --jit matrix_mul.dc <matrix 1>/dev/null
clang -O3 matrix_mul.c -omatrix_mul && time ./matrix_mul <matrix 1>/dev/null
gcc -O3 matrix_mul.c -omatrix_mul && time ./matrix_mul <matrix 1>/dev/null
javac matrix_mul.java && time java matrix_mul <matrix 1>/dev/null
```

### Calc

| Language | Time [s] |
| ------------- | --------- |
| dc-lang | 32.64 |
| dc-lang --jit | **2.36** |
| clang6 -O3 | 2.70 |
| gcc8.1 -O3 | 2.70 |
| java8 | 3.45 |

Used commands:
```
cd benchmarks
echo "1000000000 4" | time dc-lang calc.dc
echo "1000000000 4" | time dc-lang --jit calc.dc
clang -O3 calc.c -ocalc && echo "1000000000 4" | time ./calc
gcc -O3 calc.c -ocalc && echo "1000000000 4" | time ./calc
javac calc.java && echo "1000000000 4" | time java -Xmx12G calc
```

## License
This is free and unencumbered software released into the public domain.
For more information, see <https://unlicense.org/>.

## Acknowledgement
The design of the abstract machine and some implementation techniques were inspired by [The Programming Language Lua](https://www.lua.org/) and [The LuaJIT Project](https://luajit.org/).
48 changes: 48 additions & 0 deletions benchmarks/calc.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

static int64_t* init(int64_t n, int64_t op) {
int64_t* A = malloc(n * sizeof(*A));
int64_t i = 0;
while (i < n) {
A[i] = op;
i = i + 1;
}
return A;
}

static int64_t calc(int64_t* A, int64_t n) {
int64_t result = 1;
int64_t i = 0;
while (i < n) {
if (A[i] == 0) {
result = result + 1;
} else if (A[i] == 1) {
result = result - 1;
} else if (A[i] == 2) {
result = result * i;
} else if (A[i] == 3) {
result = result / i;
} else if (A[i] == 4) {
result = result + i;
} else if (A[i] == 5) {
result = result - i;
} else {
result = 0;
}
i = i + 1;
}
return result;
}

int main(void) {
int64_t n = 0;
scanf("%" PRId64, &n);
int64_t op = 0;
scanf("%" PRId64, &op);
int64_t* A = init(n, op);
int64_t result = calc(A, n);
printf("%" PRId64 "\n", result);
}
43 changes: 43 additions & 0 deletions benchmarks/calc.dc
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
fn init(n, op) {
array A[n];
let i = 0;
while i < n {
A[i] = op;
i = i + 1;
}
return A;
}

fn calc(A, n) {
let result = 1;
let i = 0;
while i < n {
if A[i] == 0 {
result = result + 1;
} else if A[i] == 1 {
result = result - 1;
} else if A[i] == 2 {
result = result * i;
} else if A[i] == 3 {
result = result / i;
} else if A[i] == 4 {
result = result + i;
} else if A[i] == 5 {
result = result - i;
} else {
result = 0;
}
i = i + 1;
}
return result;
}

fn main() {
let n = 0;
in n;
let op = 0;
in op;
let A = init(n, op);
let result = calc(A, n);
out result;
}
47 changes: 47 additions & 0 deletions benchmarks/calc.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import java.util.Scanner;

public class calc {
private static long[] init(int n, long op) {
long[] A = new long[n];
int i = 0;
while (i < n) {
A[i] = op;
i = i + 1;
}
return A;
}

private static long doCalc(long[] A, int n) {
long result = 1;
int i = 0;
while (i < n) {
if (A[i] == 0) {
result = result + 1;
} else if (A[i] == 1) {
result = result - 1;
} else if (A[i] == 2) {
result = result * i;
} else if (A[i] == 3) {
result = result / i;
} else if (A[i] == 4) {
result = result + i;
} else if (A[i] == 5) {
result = result - i;
} else {
result = 0;
}
i = i + 1;
}
return result;
}

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
long op = in.nextLong();
long[] A = init(n, op);
long result = doCalc(A, n);
System.out.println(result);
in.close();
}
}
Loading

0 comments on commit 51fe881

Please sign in to comment.