Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,8 @@ Enabled via `processors` config:
| Objective-C | `objc-wasm`, `objc`, `wasm.m` | Clang WASM |
| Objective-C++ | `objcpp-wasm`, `objcpp`, `wasm.mm` | Clang WASM |
| COBOL (Wasm) | `cobol-wasm`, `cobol`, `cob`, `cbl`, `cpy`, `gnucobol`, `wasm.cobol` | GnuCOBOL (COBOL -> WASM) |
| Java | `java` | Java runtime |
| Java (Wasm) | `java-wasm`, `java` | TeaVM (Java -> WASM) |
| Java 8 | `java-8`, `java8` | DoppioJVM (Java -> JS) |
| C# | `csharp-wasm`, `cs`, `cs-wasm`, `wasm.cs` | C# WASM |
| Blazor (Wasm) | `blazor-wasm`, `blazor`, `razor`, `razor-wasm`, `wasm.razor` | Razor components rendered by Blazor (WASM) |
| VB.NET | `vb-wasm`, `vb`, `vbnet`, `wasm.vb` | VB.NET WASM |
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ A [feature-rich](https://livecodes.io/docs/features/), open-source, **client-sid
[![LiveCodes: npm version](https://img.shields.io/npm/v/livecodes)](https://www.npmjs.com/package/livecodes)
[![LiveCodes: npm downloads](https://img.shields.io/npm/dm/livecodes)](https://www.npmjs.com/package/livecodes)
[![LiveCodes: jsdelivr downloads](https://data.jsdelivr.com/v1/package/npm/livecodes/badge?style=rounded)](https://www.jsdelivr.com/package/npm/livecodes)
[![LiveCodes: languages](https://img.shields.io/badge/languages-125-blue)](https://livecodes.io/docs/languages/)
[![LiveCodes: languages](https://img.shields.io/badge/languages-126-blue)](https://livecodes.io/docs/languages/)
[![LiveCodes: docs](https://img.shields.io/badge/Documentation-575757?logo=gitbook&logoColor=white)](https://livecodes.io/docs/)
[![LiveCodes: llms.txt](https://img.shields.io/badge/llms.txt-575757?logo=googledocs&logoColor=white)](https://livecodes.io/docs/llms.txt)
[![LiveCodes: llms-full.txt](https://img.shields.io/badge/llms--full.txt-575757?logo=googledocs&logoColor=white)](https://livecodes.io/docs/llms-full.txt)
Expand Down
80 changes: 80 additions & 0 deletions docs/docs/languages/java-8.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
# Java 8

Java is a high-level, general-purpose, memory-safe, object-oriented programming language.

This is LiveCodes' Java 8 engine: source is compiled and run in the browser by a JDK 8 JVM
interpreter. It runs classic Java, but it cannot compile modern Java source (records, `var`, text
blocks, switch expressions).

The [`java-wasm`](./java.mdx) engine (also selected by `java`) compiles modern Java to WebAssembly in
the browser and is faster and much smaller. Use `java-8` only when you need Java 8 behavior for
language-level compatibility.

## Usage

Demo:

import LiveCodes from '../../src/components/LiveCodes.tsx';

export const java8Config = {
activeEditor: 'script',
script: {
language: 'java-8',
content: `public class Main {
public static void main(String[] args) {
System.out.println("Hello from Java 8");
}
}
`,
},
mode: 'simple',
editor: 'auto',
tools: {
status: 'full',
},
};

<LiveCodes config={java8Config}></LiveCodes>

### Communication with JavaScript

The Java code runs in the context of the [result page](../features/result.mdx).
A few helper properties and methods are available in the browser global `livecodes.java` object:

- `livecodes.java.input`: the initial standard input that is passed to the Java code.
- `livecodes.java.loaded`: A promise that resolves when the Java environment is loaded.
- `livecodes.java.output`: the standard output.
- `livecodes.java.error`: the standard error.
- `livecodes.java.exitCode`: the exit code.
- `livecodes.java.run`: a function that runs the Java code with new input.

## Language Info

### Name

`java-8` (alias: `java8`)

### Extension

`.java` (the language itself is selected by name)

### Editor

`script`

## Compiler

[DoppioJVM](https://github.com/plasma-umass/doppio)

### Version

`DoppioJVM`: v0.5.0, which runs Java 8 JDK.

## Code Formatting

Using [@wasm-fmt/clang-format](https://github.com/wasm-fmt/clang-format), applying [Google's Java style guide](https://google.github.io/styleguide/javaguide.html).

## Links

- [Java](https://www.java.com/)
- [DoppioJVM](https://github.com/plasma-umass/doppio)
23 changes: 16 additions & 7 deletions docs/docs/languages/java.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,13 @@

Java is a high-level, general-purpose, memory-safe, object-oriented programming language.

In LiveCodes, Java runs in the browser using [DoppioJVM](https://github.com/plasma-umass/doppio).
In LiveCodes, Java source is compiled to WebAssembly **in the browser**: a build of OpenJDK's `javac`
and the [TeaVM](https://teavm.org) AOT compiler run as a single WebAssembly module inside a Web
Worker. Nothing is sent to a server, and modern Java (records, `var`, text blocks, switch
expressions) is supported.

The language is named `java-wasm`; `java` is an alias for it (it used to select the Java 8 engine,
which is still available as [`java-8`](./java-8.mdx)).

## Usage

Expand All @@ -13,7 +19,7 @@ import LiveCodes from '../../src/components/LiveCodes.tsx';
export const javaConfig = {
activeEditor: 'script',
script: {
language: 'java',
language: 'java-wasm',
content: `public class BinarySearchSnippet {
/**
* Search an item with binarySearch algorithm.
Expand Down Expand Up @@ -58,7 +64,7 @@ export const javaConfig = {
editor: 'auto',
tools: {
status: 'full',
},
},
};

<LiveCodes config={javaConfig}></LiveCodes>
Expand All @@ -83,7 +89,7 @@ Example:

### Name

`java`
`java-wasm` (alias: `java`)

### Extension

Expand All @@ -95,11 +101,13 @@ Example:

## Compiler

[DoppioJVM](https://github.com/plasma-umass/doppio)
A [fork of teavm-javac](https://github.com/Vsprocessing/teavm-javac) packaging OpenJDK's `javac` and
the TeaVM AOT compiler as WebAssembly, run in a Web Worker by
[`@live-codes/java-wasm`](https://github.com/live-codes/java).

### Version

`DoppioJVM`: v0.5.0, which runs Java 8 JDK.
`teavm-javac` built on TeaVM `0.14.1`, with `javac` from OpenJDK 25.

## Code Formatting

Expand All @@ -119,4 +127,5 @@ https://livecodes.io/?template=java
## Links

- [Java](https://www.java.com/)
- [DoppioJVM](https://github.com/plasma-umass/doppio)
- [TeaVM](https://teavm.org/)
- [teavm-javac](https://github.com/Vsprocessing/teavm-javac)
27 changes: 27 additions & 0 deletions e2e/specs/compilers.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1650,6 +1650,33 @@
expect(resultText).toContain(`Hello, Python`);
});

test('Java (Wasm)', async ({ page, getTestUrl, editor }) => {

Check failure on line 1653 in e2e/specs/compilers.spec.ts

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Add at least one assertion to this test case.

See more on https://sonarcloud.io/project/issues?id=live-codes_livecodes&issues=AaFatTp5nKzhk_hTvmQX&open=AaFatTp5nKzhk_hTvmQX&pullRequest=1075
test.skip(editor === 'codejar', 'please fix');
test.slow(); // the engine downloads ~8 MB and generates WebAssembly

const code = `public class Main {
public static void main(String[] args) {
System.out.println("Hello from Java");
}
}
`;

// Code is passed in the URL (rather than typed) so the first run cannot race the editor.
await page.goto(getTestUrl({ tools: 'console|open', active: 'script', 'java-wasm': code }));

const { app, waitForResultUpdate } = await getLoadedApp(page);
await waitForResultUpdate();

await app.waitForFunction(
() =>
[...document.querySelectorAll('#console-container .luna-console-log-item')].some((item) =>
(item.textContent ?? '').includes('Hello from Java'),
),
undefined,
{ timeout: 120_000 },
);
});

test('Ruby', async ({ page, getTestUrl, editor }) => {
test.skip(editor === 'codejar', 'please fix');

Expand Down
3 changes: 2 additions & 1 deletion scripts/build.js
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,8 @@ const iifeBuild = () =>
'languages/astro/lang-astro-compiler.ts',
'languages/clio/lang-clio-compiler.ts',
'languages/commonlisp/lang-commonlisp-script.ts',
'languages/java/lang-java-script.ts',
'languages/java-8/lang-java-8-script.ts',
'languages/java-wasm/lang-java-wasm-script.ts',
'languages/cpp/lang-cpp-script.ts',
'languages/clang-wasm/lang-clang-wasm-script.ts',
'languages/nim/lang-nim-wasm-script.ts',
Expand Down
38 changes: 32 additions & 6 deletions src/livecodes/html/language-info.html
Original file line number Diff line number Diff line change
Expand Up @@ -1261,17 +1261,19 @@ <h3 data-i18n="language-info:janetWasm.name">Janet (Wasm)</h3>
</li>
</ul>
</section>
<section data-lang="java">
<h3 data-i18n="language-info:java.name">Java</h3>
<div data-i18n="language-info:java.desc" data-i18n-prop="innerHTML">
JVM running in the browser using DoppioJVM.
<section data-lang="java-wasm">
<h3 data-i18n="language-info:javaWasm.name">Java (Wasm)</h3>
<div data-i18n="language-info:javaWasm.desc" data-i18n-prop="innerHTML">
Java is compiled to WebAssembly in the browser by OpenJDK's javac and the TeaVM AOT compiler.
Modern Java (records, switch expressions, text blocks) is supported, and nothing is sent to a
server.
</div>
<ul data-i18n="language-info:java.link" data-i18n-prop="innerHTML">
<ul data-i18n="language-info:javaWasm.link" data-i18n-prop="innerHTML">
<li>
<a href="https://www.java.com/" target="_blank" rel="noopener">Java official website</a>
</li>
<li>
<a href="https://github.com/plasma-umass/doppio" target="_blank" rel="noopener">DoppioJVM</a>
<a href="https://teavm.org/" target="_blank" rel="noopener">TeaVM</a>
</li>
<li>
<a href="https://learnxinyminutes.com/java/" target="_blank" rel="noopener"
Expand All @@ -1290,6 +1292,30 @@ <h3 data-i18n="language-info:java.name">Java</h3>
</li>
</ul>
</section>
<section data-lang="java-8">
<h3 data-i18n="language-info:java8.name">Java 8</h3>
<div data-i18n="language-info:java8.desc" data-i18n-prop="innerHTML">
Java 8, compiled and run in the browser by a JVM interpreter written in JavaScript.
</div>
<ul data-i18n="language-info:java8.link" data-i18n-prop="innerHTML">
<li>
<a href="https://www.java.com/" target="_blank" rel="noopener">Java official website</a>
</li>
<li>
<a href="https://github.com/plasma-umass/doppio" target="_blank" rel="noopener">DoppioJVM</a>
</li>
<li>
<a href="https://learnxinyminutes.com/java/" target="_blank" rel="noopener"
>Learn X in Y minutes, where X=java</a
>
</li>
<li>
<a href="{{DOCS_BASE_URL}}languages/java-8" target="_blank" rel="noopener"
>LiveCodes Documentation</a
>
</li>
</ul>
</section>
<section data-lang="javascript">
<h3 data-i18n="language-info:javascript.name">JavaScript</h3>
<div data-i18n="language-info:javascript.desc" data-i18n-prop="innerHTML">
Expand Down
21 changes: 15 additions & 6 deletions src/livecodes/i18n/locales/ar/language-info.lokalise.json
Original file line number Diff line number Diff line change
Expand Up @@ -432,14 +432,23 @@
"janetWasm.name": {
"translation": "Janet (Wasm)"
},
"java.desc": {
"translation": "JVM يعمل في المتصفح باستخدام DoppioJVM."
"java8.desc": {
"translation": "JVM يعمل في المتصفح باستخدام DoppioJVM (JDK 8، يتم تفسيره بواسطة JavaScript)."
},
"java.link": {
"translation": "<tag-1> <tag-2>موقع جافا الرسمي</tag-2> </tag-1> <tag-3> <tag-4> DoppioJVM</tag-4> </tag-3> <tag-5> <tag-6> تعلم X في دقائق Y، حيث X = جافا</tag-6> </tag-5> <tag-7> <tag-8>وثائق LiveCodes</tag-8> </tag-7> <tag-9> <tag-10> تحميل قالب البدء</tag-10> </tag-9>"
"java8.link": {
"translation": "<tag-1> <tag-2>موقع جافا الرسمي</tag-2> </tag-1> <tag-3> <tag-4> DoppioJVM</tag-4> </tag-3> <tag-5> <tag-6> تعلم X في دقائق Y، حيث X = جافا</tag-6> </tag-5> <tag-7> <tag-8>وثائق LiveCodes</tag-8> </tag-7>"
},
"java.name": {
"translation": "Java"
"java8.name": {
"translation": "Java 8"
},
"javaWasm.desc": {
"translation": "يتم تجميع Java إلى WebAssembly في المتصفح بواسطة javac من OpenJDK ومترجم AOT من TeaVM. يتم دعم Java الحديثة (records، تعبيرات switch، كتل النصوص)، ولا يتم إرسال أي شيء إلى خادم."
},
"javaWasm.link": {
"translation": "<tag-1> <tag-2>موقع جافا الرسمي</tag-2> </tag-1> <tag-3> <tag-4> TeaVM</tag-4> </tag-3> <tag-5> <tag-6> تعلم X في دقائق Y، حيث X = جافا</tag-6> </tag-5> <tag-7> <tag-8>وثائق LiveCodes</tag-8> </tag-7> <tag-9> <tag-10> تحميل قالب البدء</tag-10> </tag-9>"
},
"javaWasm.name": {
"translation": "Java (Wasm)"
},
"javascript.desc": {
"translation": "لغة البرمجة النصية للويب."
Expand Down
13 changes: 9 additions & 4 deletions src/livecodes/i18n/locales/ar/language-info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -239,10 +239,15 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>الموقع الرسمي لـ Janet</2></1> <3> <4>وثائق Janet</4> </3> <5> <6>تعلم X في Y دقيقة، حيث X = Janet</6> </5> <7> <8>وثائق LiveCodes</8> </7> <9> <10>تحميل قالب البدء</10> </9>',
name: 'Janet (Wasm)',
},
java: {
desc: 'JVM يعمل في المتصفح باستخدام DoppioJVM.',
link: '<1> <2>موقع جافا الرسمي</2> </1> <3> <4> DoppioJVM</4> </3> <5> <6> تعلم X في دقائق Y، حيث X = جافا</6> </5> <7> <8>وثائق LiveCodes</8> </7> <9> <10> تحميل قالب البدء</10> </9>',
name: 'Java',
java8: {
desc: 'JVM يعمل في المتصفح باستخدام DoppioJVM (JDK 8، يتم تفسيره بواسطة JavaScript).',
link: '<1> <2>موقع جافا الرسمي</2> </1> <3> <4> DoppioJVM</4> </3> <5> <6> تعلم X في دقائق Y، حيث X = جافا</6> </5> <7> <8>وثائق LiveCodes</8> </7>',
name: 'Java 8',
},
javaWasm: {
desc: 'يتم تجميع Java إلى WebAssembly في المتصفح بواسطة javac من OpenJDK ومترجم AOT من TeaVM. يتم دعم Java الحديثة (records، تعبيرات switch، كتل النصوص)، ولا يتم إرسال أي شيء إلى خادم.',
link: '<1> <2>موقع جافا الرسمي</2> </1> <3> <4> TeaVM</4> </3> <5> <6> تعلم X في دقائق Y، حيث X = جافا</6> </5> <7> <8>وثائق LiveCodes</8> </7> <9> <10> تحميل قالب البدء</10> </9>',
name: 'Java (Wasm)',
},
javascript: {
desc: 'لغة البرمجة النصية للويب.',
Expand Down
21 changes: 15 additions & 6 deletions src/livecodes/i18n/locales/bn/language-info.lokalise.json
Original file line number Diff line number Diff line change
Expand Up @@ -432,14 +432,23 @@
"janetWasm.name": {
"translation": "Janet (Wasm)"
},
"java.desc": {
"translation": "DoppioJVM ব্যবহার করে ব্রাউজারে চলমান JVM।"
"java8.desc": {
"translation": "DoppioJVM ব্যবহার করে ব্রাউজারে চলমান JVM (JDK 8, JavaScript-এ ব্যাখ্যায়িত)।"
},
"java.link": {
"translation": "<tag-1> <tag-2>Java অফিসিয়াল ওয়েবসাইট</tag-2> </tag-1> <tag-3> <tag-4>DoppioJVM</tag-4> </tag-3> <tag-5> <tag-6>Y মিনিটে X শিখুন, যেখানে X=java</tag-6> </tag-5> <tag-7> <tag-8>LiveCodes ডকুমেন্টেশন</tag-8> </tag-7> <tag-9> <tag-10>স্টার্টার টেমপ্লেট লোড করুন</tag-10> </tag-9>"
"java8.link": {
"translation": "<tag-1> <tag-2>Java অফিসিয়াল ওয়েবসাইট</tag-2> </tag-1> <tag-3> <tag-4>DoppioJVM</tag-4> </tag-3> <tag-5> <tag-6>Y মিনিটে X শিখুন, যেখানে X=java</tag-6> </tag-5> <tag-7> <tag-8>LiveCodes ডকুমেন্টেশন</tag-8> </tag-7>"
},
"java.name": {
"translation": "Java"
"java8.name": {
"translation": "Java 8"
},
"javaWasm.desc": {
"translation": "Java ব্রাউজারে OpenJDK-এর javac এবং TeaVM AOT কম্পাইলার দ্বারা WebAssembly-তে কম্পাইল করা হয়। আধুনিক Java (রেকর্ড, switch এক্সপ্রেশন, টেক্সট ব্লক) সমর্থিত, এবং সার্ভারে কিছুই পাঠানো হয় না।"
},
"javaWasm.link": {
"translation": "<tag-1> <tag-2>Java অফিসিয়াল ওয়েবসাইট</tag-2> </tag-1> <tag-3> <tag-4>TeaVM</tag-4> </tag-3> <tag-5> <tag-6>Y মিনিটে X শিখুন, যেখানে X=java</tag-6> </tag-5> <tag-7> <tag-8>LiveCodes ডকুমেন্টেশন</tag-8> </tag-7> <tag-9> <tag-10>স্টার্টার টেমপ্লেট লোড করুন</tag-10> </tag-9>"
},
"javaWasm.name": {
"translation": "Java (Wasm)"
},
"javascript.desc": {
"translation": "ওয়েবের স্ক্রিপ্টিং ভাষা।"
Expand Down
13 changes: 9 additions & 4 deletions src/livecodes/i18n/locales/bn/language-info.ts
Original file line number Diff line number Diff line change
Expand Up @@ -240,10 +240,15 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1><2>Janet অফিসিয়াল ওয়েবসাইট</2></1> <3> <4>Janet ডকুমেন্টেশন</4> </3> <5> <6>Y মিনিটে X শিখুন, যেখানে X=Janet</6> </5> <7> <8>লাইভকোড ডকুমেন্টেশন</8> </7> <9> <10>স্টার্টার টেমপ্লেট লোড করুন</10> </9>',
name: 'Janet (Wasm)',
},
java: {
desc: 'DoppioJVM ব্যবহার করে ব্রাউজারে চলমান JVM।',
link: '<1> <2>Java অফিসিয়াল ওয়েবসাইট</2> </1> <3> <4>DoppioJVM</4> </3> <5> <6>Y মিনিটে X শিখুন, যেখানে X=java</6> </5> <7> <8>LiveCodes ডকুমেন্টেশন</8> </7> <9> <10>স্টার্টার টেমপ্লেট লোড করুন</10> </9>',
name: 'Java',
java8: {
desc: 'DoppioJVM ব্যবহার করে ব্রাউজারে চলমান JVM (JDK 8, JavaScript-এ ব্যাখ্যায়িত)।',
link: '<1> <2>Java অফিসিয়াল ওয়েবসাইট</2> </1> <3> <4>DoppioJVM</4> </3> <5> <6>Y মিনিটে X শিখুন, যেখানে X=java</6> </5> <7> <8>LiveCodes ডকুমেন্টেশন</8> </7>',
name: 'Java 8',
},
javaWasm: {
desc: 'Java ব্রাউজারে OpenJDK-এর javac এবং TeaVM AOT কম্পাইলার দ্বারা WebAssembly-তে কম্পাইল করা হয়। আধুনিক Java (রেকর্ড, switch এক্সপ্রেশন, টেক্সট ব্লক) সমর্থিত, এবং সার্ভারে কিছুই পাঠানো হয় না।',
link: '<1> <2>Java অফিসিয়াল ওয়েবসাইট</2> </1> <3> <4>TeaVM</4> </3> <5> <6>Y মিনিটে X শিখুন, যেখানে X=java</6> </5> <7> <8>LiveCodes ডকুমেন্টেশন</8> </7> <9> <10>স্টার্টার টেমপ্লেট লোড করুন</10> </9>',
name: 'Java (Wasm)',
},
javascript: {
desc: 'ওয়েবের স্ক্রিপ্টিং ভাষা।',
Expand Down
Loading
Loading