125 lines
3.0 KiB
Markdown
125 lines
3.0 KiB
Markdown
# Monaco Online Code Compiler
|
|
|
|
A full-featured online code compiler with a VS Code-like interface. This project allows users to write, edit, and execute code in multiple programming languages directly in the browser.
|
|
|
|
## Features
|
|
|
|
- **VS Code-like Interface**: Familiar editor experience with syntax highlighting, tabs, and file explorer
|
|
- **Multi-language Support**: Run code in Python, JavaScript, Go, Java, C, and C++
|
|
- **Input/Output Handling**: Enter input for your programs and see the output in real-time
|
|
- **Secure Execution**: Code runs in isolated Docker containers on the backend
|
|
- **File Management**: Create, edit, and organize files and folders
|
|
|
|
## Project Structure
|
|
|
|
- **Frontend**: React-based UI with Monaco Editor
|
|
- **Backend**: Go-based code execution service with Docker integration
|
|
- HTTP Handlers (internal/api/handlers): Processes API requests
|
|
- Execution Service (internal/executor): Manages code execution in containers
|
|
- Job Queue (internal/queue): Handles concurrent execution of code submissions
|
|
- Submission Model (internal/models): Defines the data structure for code submissions
|
|
|
|
## Getting Started
|
|
|
|
### Prerequisites
|
|
|
|
- Node.js 18+ for the frontend
|
|
- Go 1.22+ for the backend
|
|
- Docker for code execution
|
|
|
|
### Running the Frontend
|
|
|
|
```bash
|
|
cd Frontend
|
|
npm install
|
|
npm run dev
|
|
```
|
|
|
|
The frontend will be available at http://localhost:5173
|
|
|
|
### Running the Backend
|
|
|
|
```bash
|
|
cd backend
|
|
go build -o monaco ./cmd/server
|
|
./monaco
|
|
```
|
|
|
|
The backend API will be available at http://localhost:8080
|
|
|
|
## Using the Online Compiler
|
|
|
|
1. **Create a File**: Click the "+" button in the editor tabs or use the file explorer
|
|
2. **Write Code**: Use the Monaco editor to write your code
|
|
3. **Run Code**: Click the "Play" button in the top right corner
|
|
4. **Enter Input**: If your program requires input, enter it in the terminal panel
|
|
5. **View Output**: See the execution results in the terminal panel
|
|
|
|
## Supported Languages
|
|
|
|
- **Python** (.py)
|
|
- **JavaScript** (.js)
|
|
- **Go** (.go)
|
|
- **Java** (.java)
|
|
- **C** (.c)
|
|
- **C++** (.cpp)
|
|
|
|
## Examples
|
|
|
|
### Python
|
|
|
|
```python
|
|
name = input("Enter your name: ")
|
|
print(f"Hello, {name}!")
|
|
for i in range(5):
|
|
print(f"Count: {i}")
|
|
```
|
|
|
|
### JavaScript
|
|
|
|
```javascript
|
|
const readline = require('readline');
|
|
const rl = readline.createInterface({
|
|
input: process.stdin,
|
|
output: process.stdout
|
|
});
|
|
|
|
rl.question('Enter your name: ', (name) => {
|
|
console.log(`Hello, ${name}!`);
|
|
for (let i = 0; i < 5; i++) {
|
|
console.log(`Count: ${i}`);
|
|
}
|
|
rl.close();
|
|
});
|
|
```
|
|
|
|
### Go
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
func main() {
|
|
fmt.Print("Enter your name: ")
|
|
reader := bufio.NewReader(os.Stdin)
|
|
name, _ := reader.ReadString('\n')
|
|
name = strings.TrimSpace(name)
|
|
fmt.Printf("Hello, %s!\n", name)
|
|
for i := 0; i < 5; i++ {
|
|
fmt.Printf("Count: %d\n", i)
|
|
}
|
|
}
|
|
```
|
|
|
|
## Security Considerations
|
|
|
|
- All code is executed in isolated Docker containers
|
|
- Network access is disabled
|
|
- Memory and CPU limits are enforced
|
|
- Execution timeouts prevent infinite loops |