Skip to content

A compiler that converts C language to Java bytecode or can directly interpret execution(将C源码编译成Java字节码的编译器,也可以选择直接解释执行)

Notifications You must be signed in to change notification settings

dejavudwh/C2j-Compiler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

56 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

C2j-Complier

A compiler that converts C language to Java bytecode or can directly interpret execution

  • As a learning project
  • Can be interpreted to execute most C or compiled into Java bytecode
  • Toy level, with many features not added, and no optimization

Supported

  • Support for all basic statements

  • Interpreter:supports pointers, arrays, structs, and struct arrays

  • Complier: Pointer not supported

How to use

1. Go to releases and download the jar

2. Go to the command line to start

java -jar C2j-Complier.jar -m interpreter -f test.c
java -jar C2j-Complier.jar -m codegen -d true -f test.c
parameter detailed
-m codegen interpreter Start mode, default to interpreter
-d true false Whether debug information is turned on, the default is false (recommended not to turn on)
-f Specifies the path to run the file

An example

The source file

void swap(int arr[10], int i, int j) {
    int temp;
    temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

void quickSort(int a[10], int p, int r) {
    int x;
    int i;
    i = p - 1;
    int j;
    int t;
    int v;
    v = r - 1;
    if (p < r) {
        x = a[r];
        for (j = p; j <= v; j++) {
            if (a[j] <= x) {
                i++;
                swap(a, i, j);
            }
        }
        v = i + 1;
        swap(a, v, r);
        t = v - 1;
        quickSort(a, p, t);
        t = v + 1;
        quickSort(a, t, r);
    }
}


void main () {
    int a[10];
    int i;
    int t;

    printf("Array before quicksort:");
    for(i = 0; i < 10; i++) {
        t = (10 - i);
        a[i] = t;
        printf("value of a[%d] is %d", i, a[i]);
    }

    quickSort(a, 0, 9);

    printf("Array after quicksort:");
    for (i = 0; i < 10; i++) {
        printf("value of a[%d] is %d", i, a[i]);
    }
}

Interpreted

The first run generates lrStateTable.sb under the folder, which is the parse table

Complier

java -jar C2j-Complier.jar -m codegen -f test.c

Generate C2Bytecode.j under the folder,Use a third-party bytecode compiler to generate class files

Part of the generated bytecode:

.class public C2Bytecode
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
	sipush	10
	newarray	int
	astore	0
	sipush	0
	istore	1
	sipush	0
	istore	2
	getstatic	java/lang/System/out Ljava/io/PrintStream;
	ldc	"Array before quicksort:"
	invokevirtual	java/io/PrintStream/print(Ljava/lang/String;)V
	getstatic	java/lang/System/out Ljava/io/PrintStream;
	ldc	"
"
	invokevirtual	java/io/PrintStream/print(Ljava/lang/String;)V
	sipush	0
	istore	1

loop0:
	iload	1
	sipush	10
if_icmpge branch0
	sipush	10
	iload	1
	isub
	istore	2
	aload	0
	iload	1
	iload	2
	iastore
	aload	0
	iload	1
	iaload
	istore	3
	iload	1
	istore	4
	getstatic	java/lang/System/out Ljava/io/PrintStream;
	ldc	"value of a["
	invokevirtual	java/io/PrintStream/print(Ljava/lang/String;)V
	getstatic	java/lang/System/out Ljava/io/PrintStream;
	iload	4
	invokevirtual	java/io/PrintStream/print(I)V
	getstatic	java/lang/System/out Ljava/io/PrintStream;
	ldc	"] is "
	invokevirtual	java/io/PrintStream/print(Ljava/lang/String;)V
	getstatic	java/lang/System/out Ljava/io/PrintStream;
	iload	3
	invokevirtual	java/io/PrintStream/print(I)V
	getstatic	java/lang/System/out Ljava/io/PrintStream;
	ldc	"
"
	invokevirtual	java/io/PrintStream/print(Ljava/lang/String;)V
	iload	1
	sipush	1
	iadd
	istore	1
goto loop0

C language source program test

Code generation does not support Pointers

void quicksort(int A[10], int p, int r) {
    int x;
    int i;
    i = p - 1;
    int j;
    int t;
    int v;
    v = r - 1;
    if (p < r) {
        x = A[r];
        for (j = p; j <= v; j++) {
            if (A[j] <= x) {
                i++;
                t = A[i];
                A[i] = A[j];
                A[j] = t;
            }
        }
        v = i + 1;
        t = A[v];
        A[v] = A[r];
        A[r] = t;
        t = v - 1;
        quicksort(A, p, t);
        t = v + 1;
        quicksort(A, t, r);
    }
}

void main () {
    int a[10];
    int i;
    int t;
    printf("before quick sort:");
    for(i = 0; i < 10; i++) {
        t = (10 - i);
        a[i] = t;
        printf("value of a[%d] is %d", i, a[i]);
    }
    quicksort(a, 0, 9);
    printf("after quick sort:");
    for (i = 0; i < 10; i++) {
        printf("value of a[%d] is %d", i, a[i]);
    }
}
void main() {
    struct s1 {
        int a1;
    };

    struct s2 {
        struct s1 s;
        int a2;
    };

    struct s2 tag;
    tag.s.a1 = 1;
    tag.a2 = 2;
    printf("set filed a1 of struct s1 to value : %d, and a2 of tag to value : %d", tag.s.a1, tag.a2);
}
void main() {
    char *p;
    p = malloc(2);
    *(p+0) = 1;
    *(p+1) = 2;
    printf("p[0] is : %d, p[1] is : %d", *(p+0), *(p+1));
}
void main() {
    struct TAG {
        char c;
        char b[3];
        int p;
    } tag;
    struct TAG* pTag;
    int sz;
    sz = sizeof(tag);
    pTag = malloc(sz + 8);
    pTag[0] = 5;
    pTag[1] = 10;
    pTag[2] = 12;
    printf("c is %d, b[0] is %d, b[2] is %d ", pTag->c, pTag->b[0],  pTag->b[1]);
}
struct Body {
    int a;
    char c;
};

void main() {
    struct Body body;
    body.a = 66;
    printf("The value of a of this structure is %d", body.a);
}
struct Body {
    int a;
    char c;
};

void main() {
    struct Body bodys[5];
    bodys[2].a = 66;
    printf("The value of a of this structure is %d", bodys[2].a);
}

doc

Some notes

About

A compiler that converts C language to Java bytecode or can directly interpret execution(将C源码编译成Java字节码的编译器,也可以选择直接解释执行)

Topics

Resources

Stars

Watchers

Forks

Packages

No packages published
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy