Repository files navigation

CMake m

m (mlang)

Mlang, also known as M, is a versatile, statically-typed programming language enhanced with type inference, specifically crafted for compiling to WebAssembly. It natively supports the WebAssembly Component Model and Canonical ABI, aiming to streamline development for this platform. While Mlang's syntax shares similarities with Python, offering a familiar and user-friendly experience, it is not entirely aligned with Python's syntax. The design philosophy of Mlang centers around merging C-level performance with Python's simplicity, striking a balance between efficiency and ease of use. This approach positions Mlang as a compelling option for developers seeking high-performance capabilities coupled with a straightforward, Python-esque coding experience for WebAssembly applications.

Mlang is designed to manage memory ownership and borrow lifetimes at compile time, similar to Rust. This approach eliminates the need for a garbage collector, leading to more predictable and stable performance. By doing so, Mlang achieves zero-cost abstraction, where its safety and efficiency features do not impose any runtime overhead, ensuring both performance optimization and memory safety.

m code plotting mandelbrot set

You can try mlang to run the following m code in the browser. The code will yield the following image:

mandelbrot set

You can zoom in to see more details at https://mlang.dev.

# color function returns (r, g, b) tuple based on iteration count and distance
def color(iter_count:int, iter_max:int, sq_dist:f64):
let mut v = 0.0, r = 0.0, g = 0.0, b = 0.0
if iter_count < iter_max:
v = (log(iter_count+1.5-(log2((log(sq_dist))/2.0))))/3.4
if v < 1.0:
r = v ** 4;g = v ** 2.5;b = v
else:
v = v < 2.0 ? 2.0 - v : 0.0
r = v;g = v ** 1.5;b = v ** 3.0
((u8)(r * 255), (u8)(g * 255), (u8)(b * 255))
/* main plot function
x0, y0: coordinate value of top left
x1, y1: coordinate value of bottom right
*/
def plot_mandelbrot_set(x0:f64, y0:f64, x1:f64, y1:f64):
print("plot area: x0:%f y0:%f x1:%f y1:%f\n", x0, y0, x1, y1)
let width = 400, height = 300
let mut img:u8[height][width * 4]
let scalex = (x1-x0)/width, scaley = (y1-y0)/height, max_iter = 510
for x in 0..width:
for y in 0..height:
let cx = x0 + scalex*x
let cy = y0 + scaley*y
let mut zx = 0.0, zy = 0.0
let mut zx2 = 0.0, zy2 = 0.0
let mut n = 0
while n<max_iter and (zx2 + zy2) < 4.0:
zy = 2.0 * zx * zy + cy
zx = zx2 - zy2 + cx
zx2 = zx * zx
zy2 = zy * zy
n++
let cr, cg, cb = color(n, max_iter, zx2 + zy2)
img[y][4*x] = cr
img[y][4*x+1] = cg
img[y][4*x+2] = cb
img[y][4*x+3] = 255
setImageData(img, width, height) /*call js to set img data on canvas*/
// call main plot function
plot_mandelbrot_set(-2.0, -1.2, 1.0, 1.2)

Development: vscode dev container (no manual installation)

vscode-devcon.mp4

or manually install tool-chains on Ubuntu-22.04

prerequisites to build m

  • Source code version control: git
  • Build system generator: cmake
  • Build system: GNU make (Unix-like system)
  • Compiler: c/c++ compilers: clang/llvm 18, nodejs v18.15

install cmake/clang/llvm/lld

sudo apt update
sudo apt install cmake
sudo apt install clang lld llvm

install nodejs v18.15 and typescript

install nvm first

sudo apt install curl -y
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash source ~/.profile

use nvm to install node with version

nvm install v18.15.0
npm install -g typescript

build m from source code

get m source code

git clone https://github.com/mlang-dev/m
cd m
git submodule init
git submodule update
npm install

build & install wasi-libc

(cd ./extern/wasi-libc && make)

build mlang

cmake -B build -S .
cmake --build build

The build system will build m and m.wasm under ./apps and run all unit tests.

useful clang commands to compile to wasm/wasi target

compile c code to wasm target

clang --target=wasm32 --no-standard-libraries test.c -o test.wasm -mmultivalue -Xclang -target-abi -Xclang experimental-mv

compile c into wasi target

clang --target=wasm32-wasi --sysroot=../extern/wasi-libc/sysroot hello.c -o hello.wasm -nodefaultlibs -lc -v

or manually invoke clang front-end and back-end as two steps:

use front-end clang to produce wasm object file

clang -cc1 -triple wasm32-unknown-wasi -emit-obj -internal-isystem /usr/lib/llvm-18/lib/clang/18.1.3/include -internal-isystem ./extern/wasi-libc/sysroot/include -o hello.o -x c hello.c

then use back-end wasm-ld to produce wasm module

wasm-ld -m wasm32 -L./extern/wasi-libc/sysroot/lib/wasm32-wasi ./extern/wasi-libc/sysroot/lib/wasm32-wasi/crt1-command.o hello.o -lc -o hello.wasm

About

an expressive and efficient programming language for WebAssembly

Topics

Resources

Code of conduct

Stars

46 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

CMake m

m (mlang)

Mlang, also known as M, is a versatile, statically-typed programming language enhanced with type inference, specifically crafted for compiling to WebAssembly. It natively supports the WebAssembly Component Model and Canonical ABI, aiming to streamline development for this platform. While Mlang's syntax shares similarities with Python, offering a familiar and user-friendly experience, it is not entirely aligned with Python's syntax. The design philosophy of Mlang centers around merging C-level performance with Python's simplicity, striking a balance between efficiency and ease of use. This approach positions Mlang as a compelling option for developers seeking high-performance capabilities coupled with a straightforward, Python-esque coding experience for WebAssembly applications.

Mlang is designed to manage memory ownership and borrow lifetimes at compile time, similar to Rust. This approach eliminates the need for a garbage collector, leading to more predictable and stable performance. By doing so, Mlang achieves zero-cost abstraction, where its safety and efficiency features do not impose any runtime overhead, ensuring both performance optimization and memory safety.

m code plotting mandelbrot set

You can try mlang to run the following m code in the browser. The code will yield the following image:

mandelbrot set

You can zoom in to see more details at https://mlang.dev.

# color function returns (r, g, b) tuple based on iteration count and distance
def color(iter_count:int, iter_max:int, sq_dist:f64):
let mut v = 0.0, r = 0.0, g = 0.0, b = 0.0
if iter_count < iter_max:
v = (log(iter_count+1.5-(log2((log(sq_dist))/2.0))))/3.4
if v < 1.0:
r = v ** 4;g = v ** 2.5;b = v
else:
v = v < 2.0 ? 2.0 - v : 0.0
r = v;g = v ** 1.5;b = v ** 3.0
((u8)(r * 255), (u8)(g * 255), (u8)(b * 255))
/* main plot function
x0, y0: coordinate value of top left
x1, y1: coordinate value of bottom right
*/
def plot_mandelbrot_set(x0:f64, y0:f64, x1:f64, y1:f64):
print("plot area: x0:%f y0:%f x1:%f y1:%f\n", x0, y0, x1, y1)
let width = 400, height = 300
let mut img:u8[height][width * 4]
let scalex = (x1-x0)/width, scaley = (y1-y0)/height, max_iter = 510
for x in 0..width:
for y in 0..height:
let cx = x0 + scalex*x
let cy = y0 + scaley*y
let mut zx = 0.0, zy = 0.0
let mut zx2 = 0.0, zy2 = 0.0
let mut n = 0
while n<max_iter and (zx2 + zy2) < 4.0:
zy = 2.0 * zx * zy + cy
zx = zx2 - zy2 + cx
zx2 = zx * zx
zy2 = zy * zy
n++
let cr, cg, cb = color(n, max_iter, zx2 + zy2)
img[y][4*x] = cr
img[y][4*x+1] = cg
img[y][4*x+2] = cb
img[y][4*x+3] = 255
setImageData(img, width, height) /*call js to set img data on canvas*/
// call main plot function
plot_mandelbrot_set(-2.0, -1.2, 1.0, 1.2)

Development: vscode dev container (no manual installation)

vscode-devcon.mp4

or manually install tool-chains on Ubuntu-22.04

prerequisites to build m

  • Source code version control: git
  • Build system generator: cmake
  • Build system: GNU make (Unix-like system)
  • Compiler: c/c++ compilers: clang/llvm 18, nodejs v18.15

install cmake/clang/llvm/lld

sudo apt update
sudo apt install cmake
sudo apt install clang lld llvm

install nodejs v18.15 and typescript

install nvm first

sudo apt install curl -y
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash source ~/.profile

use nvm to install node with version

nvm install v18.15.0
npm install -g typescript

build m from source code

get m source code

git clone https://github.com/mlang-dev/m
cd m
git submodule init
git submodule update
npm install

build & install wasi-libc

(cd ./extern/wasi-libc && make)

build mlang

cmake -B build -S .
cmake --build build

The build system will build m and m.wasm under ./apps and run all unit tests.

useful clang commands to compile to wasm/wasi target

compile c code to wasm target

clang --target=wasm32 --no-standard-libraries test.c -o test.wasm -mmultivalue -Xclang -target-abi -Xclang experimental-mv

compile c into wasi target

clang --target=wasm32-wasi --sysroot=../extern/wasi-libc/sysroot hello.c -o hello.wasm -nodefaultlibs -lc -v

or manually invoke clang front-end and back-end as two steps:

use front-end clang to produce wasm object file

clang -cc1 -triple wasm32-unknown-wasi -emit-obj -internal-isystem /usr/lib/llvm-18/lib/clang/18.1.3/include -internal-isystem ./extern/wasi-libc/sysroot/include -o hello.o -x c hello.c

then use back-end wasm-ld to produce wasm module

wasm-ld -m wasm32 -L./extern/wasi-libc/sysroot/lib/wasm32-wasi ./extern/wasi-libc/sysroot/lib/wasm32-wasi/crt1-command.o hello.o -lc -o hello.wasm

About

an expressive and efficient programming language for WebAssembly

Topics

Resources

Code of conduct

Stars

46 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CMake m

m (mlang)

Mlang, also known as M, is a versatile, statically-typed programming language enhanced with type inference, specifically crafted for compiling to WebAssembly. It natively supports the WebAssembly Component Model and Canonical ABI, aiming to streamline development for this platform. While Mlang's syntax shares similarities with Python, offering a familiar and user-friendly experience, it is not entirely aligned with Python's syntax. The design philosophy of Mlang centers around merging C-level performance with Python's simplicity, striking a balance between efficiency and ease of use. This approach positions Mlang as a compelling option for developers seeking high-performance capabilities coupled with a straightforward, Python-esque coding experience for WebAssembly applications.

Mlang is designed to manage memory ownership and borrow lifetimes at compile time, similar to Rust. This approach eliminates the need for a garbage collector, leading to more predictable and stable performance. By doing so, Mlang achieves zero-cost abstraction, where its safety and efficiency features do not impose any runtime overhead, ensuring both performance optimization and memory safety.

m code plotting mandelbrot set

You can try mlang to run the following m code in the browser. The code will yield the following image:

mandelbrot set

You can zoom in to see more details at https://mlang.dev.

# color function returns (r, g, b) tuple based on iteration count and distance
def color(iter_count:int, iter_max:int, sq_dist:f64):
let mut v = 0.0, r = 0.0, g = 0.0, b = 0.0
if iter_count < iter_max:
v = (log(iter_count+1.5-(log2((log(sq_dist))/2.0))))/3.4
if v < 1.0:
r = v ** 4;g = v ** 2.5;b = v
else:
v = v < 2.0 ? 2.0 - v : 0.0
r = v;g = v ** 1.5;b = v ** 3.0
((u8)(r * 255), (u8)(g * 255), (u8)(b * 255))
/* main plot function
x0, y0: coordinate value of top left
x1, y1: coordinate value of bottom right
*/
def plot_mandelbrot_set(x0:f64, y0:f64, x1:f64, y1:f64):
print("plot area: x0:%f y0:%f x1:%f y1:%f\n", x0, y0, x1, y1)
let width = 400, height = 300
let mut img:u8[height][width * 4]
let scalex = (x1-x0)/width, scaley = (y1-y0)/height, max_iter = 510
for x in 0..width:
for y in 0..height:
let cx = x0 + scalex*x
let cy = y0 + scaley*y
let mut zx = 0.0, zy = 0.0
let mut zx2 = 0.0, zy2 = 0.0
let mut n = 0
while n<max_iter and (zx2 + zy2) < 4.0:
zy = 2.0 * zx * zy + cy
zx = zx2 - zy2 + cx
zx2 = zx * zx
zy2 = zy * zy
n++
let cr, cg, cb = color(n, max_iter, zx2 + zy2)
img[y][4*x] = cr
img[y][4*x+1] = cg
img[y][4*x+2] = cb
img[y][4*x+3] = 255
setImageData(img, width, height) /*call js to set img data on canvas*/
// call main plot function
plot_mandelbrot_set(-2.0, -1.2, 1.0, 1.2)

Development: vscode dev container (no manual installation)

vscode-devcon.mp4

or manually install tool-chains on Ubuntu-22.04

prerequisites to build m

  • Source code version control: git
  • Build system generator: cmake
  • Build system: GNU make (Unix-like system)
  • Compiler: c/c++ compilers: clang/llvm 18, nodejs v18.15

install cmake/clang/llvm/lld

sudo apt update
sudo apt install cmake
sudo apt install clang lld llvm

install nodejs v18.15 and typescript

install nvm first

sudo apt install curl -y
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash source ~/.profile

use nvm to install node with version

nvm install v18.15.0
npm install -g typescript

build m from source code

get m source code

git clone https://github.com/mlang-dev/m
cd m
git submodule init
git submodule update
npm install

build & install wasi-libc

(cd ./extern/wasi-libc && make)

build mlang

cmake -B build -S .
cmake --build build

The build system will build m and m.wasm under ./apps and run all unit tests.

useful clang commands to compile to wasm/wasi target

compile c code to wasm target

clang --target=wasm32 --no-standard-libraries test.c -o test.wasm -mmultivalue -Xclang -target-abi -Xclang experimental-mv

compile c into wasi target

clang --target=wasm32-wasi --sysroot=../extern/wasi-libc/sysroot hello.c -o hello.wasm -nodefaultlibs -lc -v

or manually invoke clang front-end and back-end as two steps:

use front-end clang to produce wasm object file

clang -cc1 -triple wasm32-unknown-wasi -emit-obj -internal-isystem /usr/lib/llvm-18/lib/clang/18.1.3/include -internal-isystem ./extern/wasi-libc/sysroot/include -o hello.o -x c hello.c

then use back-end wasm-ld to produce wasm module

wasm-ld -m wasm32 -L./extern/wasi-libc/sysroot/lib/wasm32-wasi ./extern/wasi-libc/sysroot/lib/wasm32-wasi/crt1-command.o hello.o -lc -o hello.wasm

About

an expressive and efficient programming language for WebAssembly

Topics

Resources

Code of conduct

Stars

46 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CMake m

m (mlang)

Mlang, also known as M, is a versatile, statically-typed programming language enhanced with type inference, specifically crafted for compiling to WebAssembly. It natively supports the WebAssembly Component Model and Canonical ABI, aiming to streamline development for this platform. While Mlang's syntax shares similarities with Python, offering a familiar and user-friendly experience, it is not entirely aligned with Python's syntax. The design philosophy of Mlang centers around merging C-level performance with Python's simplicity, striking a balance between efficiency and ease of use. This approach positions Mlang as a compelling option for developers seeking high-performance capabilities coupled with a straightforward, Python-esque coding experience for WebAssembly applications.

Mlang is designed to manage memory ownership and borrow lifetimes at compile time, similar to Rust. This approach eliminates the need for a garbage collector, leading to more predictable and stable performance. By doing so, Mlang achieves zero-cost abstraction, where its safety and efficiency features do not impose any runtime overhead, ensuring both performance optimization and memory safety.

m code plotting mandelbrot set

You can try mlang to run the following m code in the browser. The code will yield the following image:

mandelbrot set

You can zoom in to see more details at https://mlang.dev.

# color function returns (r, g, b) tuple based on iteration count and distance
def color(iter_count:int, iter_max:int, sq_dist:f64):
let mut v = 0.0, r = 0.0, g = 0.0, b = 0.0
if iter_count < iter_max:
v = (log(iter_count+1.5-(log2((log(sq_dist))/2.0))))/3.4
if v < 1.0:
r = v ** 4;g = v ** 2.5;b = v
else:
v = v < 2.0 ? 2.0 - v : 0.0
r = v;g = v ** 1.5;b = v ** 3.0
((u8)(r * 255), (u8)(g * 255), (u8)(b * 255))
/* main plot function
x0, y0: coordinate value of top left
x1, y1: coordinate value of bottom right
*/
def plot_mandelbrot_set(x0:f64, y0:f64, x1:f64, y1:f64):
print("plot area: x0:%f y0:%f x1:%f y1:%f\n", x0, y0, x1, y1)
let width = 400, height = 300
let mut img:u8[height][width * 4]
let scalex = (x1-x0)/width, scaley = (y1-y0)/height, max_iter = 510
for x in 0..width:
for y in 0..height:
let cx = x0 + scalex*x
let cy = y0 + scaley*y
let mut zx = 0.0, zy = 0.0
let mut zx2 = 0.0, zy2 = 0.0
let mut n = 0
while n<max_iter and (zx2 + zy2) < 4.0:
zy = 2.0 * zx * zy + cy
zx = zx2 - zy2 + cx
zx2 = zx * zx
zy2 = zy * zy
n++
let cr, cg, cb = color(n, max_iter, zx2 + zy2)
img[y][4*x] = cr
img[y][4*x+1] = cg
img[y][4*x+2] = cb
img[y][4*x+3] = 255
setImageData(img, width, height) /*call js to set img data on canvas*/
// call main plot function
plot_mandelbrot_set(-2.0, -1.2, 1.0, 1.2)

Development: vscode dev container (no manual installation)

vscode-devcon.mp4

or manually install tool-chains on Ubuntu-22.04

prerequisites to build m

  • Source code version control: git
  • Build system generator: cmake
  • Build system: GNU make (Unix-like system)
  • Compiler: c/c++ compilers: clang/llvm 18, nodejs v18.15

install cmake/clang/llvm/lld

sudo apt update
sudo apt install cmake
sudo apt install clang lld llvm

install nodejs v18.15 and typescript

install nvm first

sudo apt install curl -y
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash source ~/.profile

use nvm to install node with version

nvm install v18.15.0
npm install -g typescript

build m from source code

get m source code

git clone https://github.com/mlang-dev/m
cd m
git submodule init
git submodule update
npm install

build & install wasi-libc

(cd ./extern/wasi-libc && make)

build mlang

cmake -B build -S .
cmake --build build

The build system will build m and m.wasm under ./apps and run all unit tests.

useful clang commands to compile to wasm/wasi target

compile c code to wasm target

clang --target=wasm32 --no-standard-libraries test.c -o test.wasm -mmultivalue -Xclang -target-abi -Xclang experimental-mv

compile c into wasi target

clang --target=wasm32-wasi --sysroot=../extern/wasi-libc/sysroot hello.c -o hello.wasm -nodefaultlibs -lc -v

or manually invoke clang front-end and back-end as two steps:

use front-end clang to produce wasm object file

clang -cc1 -triple wasm32-unknown-wasi -emit-obj -internal-isystem /usr/lib/llvm-18/lib/clang/18.1.3/include -internal-isystem ./extern/wasi-libc/sysroot/include -o hello.o -x c hello.c

then use back-end wasm-ld to produce wasm module

wasm-ld -m wasm32 -L./extern/wasi-libc/sysroot/lib/wasm32-wasi ./extern/wasi-libc/sysroot/lib/wasm32-wasi/crt1-command.o hello.o -lc -o hello.wasm

About

an expressive and efficient programming language for WebAssembly

Topics

Resources

Code of conduct

Stars

46 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

CMake m

m (mlang)

Mlang, also known as M, is a versatile, statically-typed programming language enhanced with type inference, specifically crafted for compiling to WebAssembly. It natively supports the WebAssembly Component Model and Canonical ABI, aiming to streamline development for this platform. While Mlang's syntax shares similarities with Python, offering a familiar and user-friendly experience, it is not entirely aligned with Python's syntax. The design philosophy of Mlang centers around merging C-level performance with Python's simplicity, striking a balance between efficiency and ease of use. This approach positions Mlang as a compelling option for developers seeking high-performance capabilities coupled with a straightforward, Python-esque coding experience for WebAssembly applications.

Mlang is designed to manage memory ownership and borrow lifetimes at compile time, similar to Rust. This approach eliminates the need for a garbage collector, leading to more predictable and stable performance. By doing so, Mlang achieves zero-cost abstraction, where its safety and efficiency features do not impose any runtime overhead, ensuring both performance optimization and memory safety.

m code plotting mandelbrot set

You can try mlang to run the following m code in the browser. The code will yield the following image:

mandelbrot set

You can zoom in to see more details at https://mlang.dev.

# color function returns (r, g, b) tuple based on iteration count and distance
def color(iter_count:int, iter_max:int, sq_dist:f64):
let mut v = 0.0, r = 0.0, g = 0.0, b = 0.0
if iter_count < iter_max:
v = (log(iter_count+1.5-(log2((log(sq_dist))/2.0))))/3.4
if v < 1.0:
r = v ** 4;g = v ** 2.5;b = v
else:
v = v < 2.0 ? 2.0 - v : 0.0
r = v;g = v ** 1.5;b = v ** 3.0
((u8)(r * 255), (u8)(g * 255), (u8)(b * 255))
/* main plot function
x0, y0: coordinate value of top left
x1, y1: coordinate value of bottom right
*/
def plot_mandelbrot_set(x0:f64, y0:f64, x1:f64, y1:f64):
print("plot area: x0:%f y0:%f x1:%f y1:%f\n", x0, y0, x1, y1)
let width = 400, height = 300
let mut img:u8[height][width * 4]
let scalex = (x1-x0)/width, scaley = (y1-y0)/height, max_iter = 510
for x in 0..width:
for y in 0..height:
let cx = x0 + scalex*x
let cy = y0 + scaley*y
let mut zx = 0.0, zy = 0.0
let mut zx2 = 0.0, zy2 = 0.0
let mut n = 0
while n<max_iter and (zx2 + zy2) < 4.0:
zy = 2.0 * zx * zy + cy
zx = zx2 - zy2 + cx
zx2 = zx * zx
zy2 = zy * zy
n++
let cr, cg, cb = color(n, max_iter, zx2 + zy2)
img[y][4*x] = cr
img[y][4*x+1] = cg
img[y][4*x+2] = cb
img[y][4*x+3] = 255
setImageData(img, width, height) /*call js to set img data on canvas*/
// call main plot function
plot_mandelbrot_set(-2.0, -1.2, 1.0, 1.2)

Development: vscode dev container (no manual installation)

vscode-devcon.mp4

or manually install tool-chains on Ubuntu-22.04

prerequisites to build m

  • Source code version control: git
  • Build system generator: cmake
  • Build system: GNU make (Unix-like system)
  • Compiler: c/c++ compilers: clang/llvm 18, nodejs v18.15

install cmake/clang/llvm/lld

sudo apt update
sudo apt install cmake
sudo apt install clang lld llvm

install nodejs v18.15 and typescript

install nvm first

sudo apt install curl -y
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash source ~/.profile

use nvm to install node with version

nvm install v18.15.0
npm install -g typescript

build m from source code

get m source code

git clone https://github.com/mlang-dev/m
cd m
git submodule init
git submodule update
npm install

build & install wasi-libc

(cd ./extern/wasi-libc && make)

build mlang

cmake -B build -S .
cmake --build build

The build system will build m and m.wasm under ./apps and run all unit tests.

useful clang commands to compile to wasm/wasi target

compile c code to wasm target

clang --target=wasm32 --no-standard-libraries test.c -o test.wasm -mmultivalue -Xclang -target-abi -Xclang experimental-mv

compile c into wasi target

clang --target=wasm32-wasi --sysroot=../extern/wasi-libc/sysroot hello.c -o hello.wasm -nodefaultlibs -lc -v

or manually invoke clang front-end and back-end as two steps:

use front-end clang to produce wasm object file

clang -cc1 -triple wasm32-unknown-wasi -emit-obj -internal-isystem /usr/lib/llvm-18/lib/clang/18.1.3/include -internal-isystem ./extern/wasi-libc/sysroot/include -o hello.o -x c hello.c

then use back-end wasm-ld to produce wasm module

wasm-ld -m wasm32 -L./extern/wasi-libc/sysroot/lib/wasm32-wasi ./extern/wasi-libc/sysroot/lib/wasm32-wasi/crt1-command.o hello.o -lc -o hello.wasm

About

an expressive and efficient programming language for WebAssembly

Topics

Resources

Code of conduct

Stars

46 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CMake m

m (mlang)

Mlang, also known as M, is a versatile, statically-typed programming language enhanced with type inference, specifically crafted for compiling to WebAssembly. It natively supports the WebAssembly Component Model and Canonical ABI, aiming to streamline development for this platform. While Mlang's syntax shares similarities with Python, offering a familiar and user-friendly experience, it is not entirely aligned with Python's syntax. The design philosophy of Mlang centers around merging C-level performance with Python's simplicity, striking a balance between efficiency and ease of use. This approach positions Mlang as a compelling option for developers seeking high-performance capabilities coupled with a straightforward, Python-esque coding experience for WebAssembly applications.

Mlang is designed to manage memory ownership and borrow lifetimes at compile time, similar to Rust. This approach eliminates the need for a garbage collector, leading to more predictable and stable performance. By doing so, Mlang achieves zero-cost abstraction, where its safety and efficiency features do not impose any runtime overhead, ensuring both performance optimization and memory safety.

m code plotting mandelbrot set

You can try mlang to run the following m code in the browser. The code will yield the following image:

mandelbrot set

You can zoom in to see more details at https://mlang.dev.

# color function returns (r, g, b) tuple based on iteration count and distance
def color(iter_count:int, iter_max:int, sq_dist:f64):
let mut v = 0.0, r = 0.0, g = 0.0, b = 0.0
if iter_count < iter_max:
v = (log(iter_count+1.5-(log2((log(sq_dist))/2.0))))/3.4
if v < 1.0:
r = v ** 4;g = v ** 2.5;b = v
else:
v = v < 2.0 ? 2.0 - v : 0.0
r = v;g = v ** 1.5;b = v ** 3.0
((u8)(r * 255), (u8)(g * 255), (u8)(b * 255))
/* main plot function
x0, y0: coordinate value of top left
x1, y1: coordinate value of bottom right
*/
def plot_mandelbrot_set(x0:f64, y0:f64, x1:f64, y1:f64):
print("plot area: x0:%f y0:%f x1:%f y1:%f\n", x0, y0, x1, y1)
let width = 400, height = 300
let mut img:u8[height][width * 4]
let scalex = (x1-x0)/width, scaley = (y1-y0)/height, max_iter = 510
for x in 0..width:
for y in 0..height:
let cx = x0 + scalex*x
let cy = y0 + scaley*y
let mut zx = 0.0, zy = 0.0
let mut zx2 = 0.0, zy2 = 0.0
let mut n = 0
while n<max_iter and (zx2 + zy2) < 4.0:
zy = 2.0 * zx * zy + cy
zx = zx2 - zy2 + cx
zx2 = zx * zx
zy2 = zy * zy
n++
let cr, cg, cb = color(n, max_iter, zx2 + zy2)
img[y][4*x] = cr
img[y][4*x+1] = cg
img[y][4*x+2] = cb
img[y][4*x+3] = 255
setImageData(img, width, height) /*call js to set img data on canvas*/
// call main plot function
plot_mandelbrot_set(-2.0, -1.2, 1.0, 1.2)

Development: vscode dev container (no manual installation)

vscode-devcon.mp4

or manually install tool-chains on Ubuntu-22.04

prerequisites to build m

  • Source code version control: git
  • Build system generator: cmake
  • Build system: GNU make (Unix-like system)
  • Compiler: c/c++ compilers: clang/llvm 18, nodejs v18.15

install cmake/clang/llvm/lld

sudo apt update
sudo apt install cmake
sudo apt install clang lld llvm

install nodejs v18.15 and typescript

install nvm first

sudo apt install curl -y
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash source ~/.profile

use nvm to install node with version

nvm install v18.15.0
npm install -g typescript

build m from source code

get m source code

git clone https://github.com/mlang-dev/m
cd m
git submodule init
git submodule update
npm install

build & install wasi-libc

(cd ./extern/wasi-libc && make)

build mlang

cmake -B build -S .
cmake --build build

The build system will build m and m.wasm under ./apps and run all unit tests.

useful clang commands to compile to wasm/wasi target

compile c code to wasm target

clang --target=wasm32 --no-standard-libraries test.c -o test.wasm -mmultivalue -Xclang -target-abi -Xclang experimental-mv

compile c into wasi target

clang --target=wasm32-wasi --sysroot=../extern/wasi-libc/sysroot hello.c -o hello.wasm -nodefaultlibs -lc -v

or manually invoke clang front-end and back-end as two steps:

use front-end clang to produce wasm object file

clang -cc1 -triple wasm32-unknown-wasi -emit-obj -internal-isystem /usr/lib/llvm-18/lib/clang/18.1.3/include -internal-isystem ./extern/wasi-libc/sysroot/include -o hello.o -x c hello.c

then use back-end wasm-ld to produce wasm module

wasm-ld -m wasm32 -L./extern/wasi-libc/sysroot/lib/wasm32-wasi ./extern/wasi-libc/sysroot/lib/wasm32-wasi/crt1-command.o hello.o -lc -o hello.wasm

About

an expressive and efficient programming language for WebAssembly

Topics

Resources

Code of conduct

Stars

46 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

CMake m

m (mlang)

Mlang, also known as M, is a versatile, statically-typed programming language enhanced with type inference, specifically crafted for compiling to WebAssembly. It natively supports the WebAssembly Component Model and Canonical ABI, aiming to streamline development for this platform. While Mlang's syntax shares similarities with Python, offering a familiar and user-friendly experience, it is not entirely aligned with Python's syntax. The design philosophy of Mlang centers around merging C-level performance with Python's simplicity, striking a balance between efficiency and ease of use. This approach positions Mlang as a compelling option for developers seeking high-performance capabilities coupled with a straightforward, Python-esque coding experience for WebAssembly applications.

Mlang is designed to manage memory ownership and borrow lifetimes at compile time, similar to Rust. This approach eliminates the need for a garbage collector, leading to more predictable and stable performance. By doing so, Mlang achieves zero-cost abstraction, where its safety and efficiency features do not impose any runtime overhead, ensuring both performance optimization and memory safety.

m code plotting mandelbrot set

You can try mlang to run the following m code in the browser. The code will yield the following image:

mandelbrot set

You can zoom in to see more details at https://mlang.dev.

# color function returns (r, g, b) tuple based on iteration count and distance
def color(iter_count:int, iter_max:int, sq_dist:f64):
let mut v = 0.0, r = 0.0, g = 0.0, b = 0.0
if iter_count < iter_max:
v = (log(iter_count+1.5-(log2((log(sq_dist))/2.0))))/3.4
if v < 1.0:
r = v ** 4;g = v ** 2.5;b = v
else:
v = v < 2.0 ? 2.0 - v : 0.0
r = v;g = v ** 1.5;b = v ** 3.0
((u8)(r * 255), (u8)(g * 255), (u8)(b * 255))
/* main plot function
x0, y0: coordinate value of top left
x1, y1: coordinate value of bottom right
*/
def plot_mandelbrot_set(x0:f64, y0:f64, x1:f64, y1:f64):
print("plot area: x0:%f y0:%f x1:%f y1:%f\n", x0, y0, x1, y1)
let width = 400, height = 300
let mut img:u8[height][width * 4]
let scalex = (x1-x0)/width, scaley = (y1-y0)/height, max_iter = 510
for x in 0..width:
for y in 0..height:
let cx = x0 + scalex*x
let cy = y0 + scaley*y
let mut zx = 0.0, zy = 0.0
let mut zx2 = 0.0, zy2 = 0.0
let mut n = 0
while n<max_iter and (zx2 + zy2) < 4.0:
zy = 2.0 * zx * zy + cy
zx = zx2 - zy2 + cx
zx2 = zx * zx
zy2 = zy * zy
n++
let cr, cg, cb = color(n, max_iter, zx2 + zy2)
img[y][4*x] = cr
img[y][4*x+1] = cg
img[y][4*x+2] = cb
img[y][4*x+3] = 255
setImageData(img, width, height) /*call js to set img data on canvas*/
// call main plot function
plot_mandelbrot_set(-2.0, -1.2, 1.0, 1.2)

Development: vscode dev container (no manual installation)

vscode-devcon.mp4

or manually install tool-chains on Ubuntu-22.04

prerequisites to build m

  • Source code version control: git
  • Build system generator: cmake
  • Build system: GNU make (Unix-like system)
  • Compiler: c/c++ compilers: clang/llvm 18, nodejs v18.15

install cmake/clang/llvm/lld

sudo apt update
sudo apt install cmake
sudo apt install clang lld llvm

install nodejs v18.15 and typescript

install nvm first

sudo apt install curl -y
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash source ~/.profile

use nvm to install node with version

nvm install v18.15.0
npm install -g typescript

build m from source code

get m source code

git clone https://github.com/mlang-dev/m
cd m
git submodule init
git submodule update
npm install

build & install wasi-libc

(cd ./extern/wasi-libc && make)

build mlang

cmake -B build -S .
cmake --build build

The build system will build m and m.wasm under ./apps and run all unit tests.

useful clang commands to compile to wasm/wasi target

compile c code to wasm target

clang --target=wasm32 --no-standard-libraries test.c -o test.wasm -mmultivalue -Xclang -target-abi -Xclang experimental-mv

compile c into wasi target

clang --target=wasm32-wasi --sysroot=../extern/wasi-libc/sysroot hello.c -o hello.wasm -nodefaultlibs -lc -v

or manually invoke clang front-end and back-end as two steps:

use front-end clang to produce wasm object file

clang -cc1 -triple wasm32-unknown-wasi -emit-obj -internal-isystem /usr/lib/llvm-18/lib/clang/18.1.3/include -internal-isystem ./extern/wasi-libc/sysroot/include -o hello.o -x c hello.c

then use back-end wasm-ld to produce wasm module

wasm-ld -m wasm32 -L./extern/wasi-libc/sysroot/lib/wasm32-wasi ./extern/wasi-libc/sysroot/lib/wasm32-wasi/crt1-command.o hello.o -lc -o hello.wasm

About

an expressive and efficient programming language for WebAssembly

Topics

Resources

Code of conduct

Stars

46 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

CMake m

m (mlang)

Mlang, also known as M, is a versatile, statically-typed programming language enhanced with type inference, specifically crafted for compiling to WebAssembly. It natively supports the WebAssembly Component Model and Canonical ABI, aiming to streamline development for this platform. While Mlang's syntax shares similarities with Python, offering a familiar and user-friendly experience, it is not entirely aligned with Python's syntax. The design philosophy of Mlang centers around merging C-level performance with Python's simplicity, striking a balance between efficiency and ease of use. This approach positions Mlang as a compelling option for developers seeking high-performance capabilities coupled with a straightforward, Python-esque coding experience for WebAssembly applications.

Mlang is designed to manage memory ownership and borrow lifetimes at compile time, similar to Rust. This approach eliminates the need for a garbage collector, leading to more predictable and stable performance. By doing so, Mlang achieves zero-cost abstraction, where its safety and efficiency features do not impose any runtime overhead, ensuring both performance optimization and memory safety.

m code plotting mandelbrot set

You can try mlang to run the following m code in the browser. The code will yield the following image:

mandelbrot set

You can zoom in to see more details at https://mlang.dev.

# color function returns (r, g, b) tuple based on iteration count and distance
def color(iter_count:int, iter_max:int, sq_dist:f64):
let mut v = 0.0, r = 0.0, g = 0.0, b = 0.0
if iter_count < iter_max:
v = (log(iter_count+1.5-(log2((log(sq_dist))/2.0))))/3.4
if v < 1.0:
r = v ** 4;g = v ** 2.5;b = v
else:
v = v < 2.0 ? 2.0 - v : 0.0
r = v;g = v ** 1.5;b = v ** 3.0
((u8)(r * 255), (u8)(g * 255), (u8)(b * 255))
/* main plot function
x0, y0: coordinate value of top left
x1, y1: coordinate value of bottom right
*/
def plot_mandelbrot_set(x0:f64, y0:f64, x1:f64, y1:f64):
print("plot area: x0:%f y0:%f x1:%f y1:%f\n", x0, y0, x1, y1)
let width = 400, height = 300
let mut img:u8[height][width * 4]
let scalex = (x1-x0)/width, scaley = (y1-y0)/height, max_iter = 510
for x in 0..width:
for y in 0..height:
let cx = x0 + scalex*x
let cy = y0 + scaley*y
let mut zx = 0.0, zy = 0.0
let mut zx2 = 0.0, zy2 = 0.0
let mut n = 0
while n<max_iter and (zx2 + zy2) < 4.0:
zy = 2.0 * zx * zy + cy
zx = zx2 - zy2 + cx
zx2 = zx * zx
zy2 = zy * zy
n++
let cr, cg, cb = color(n, max_iter, zx2 + zy2)
img[y][4*x] = cr
img[y][4*x+1] = cg
img[y][4*x+2] = cb
img[y][4*x+3] = 255
setImageData(img, width, height) /*call js to set img data on canvas*/
// call main plot function
plot_mandelbrot_set(-2.0, -1.2, 1.0, 1.2)

Development: vscode dev container (no manual installation)

vscode-devcon.mp4

or manually install tool-chains on Ubuntu-22.04

prerequisites to build m

  • Source code version control: git
  • Build system generator: cmake
  • Build system: GNU make (Unix-like system)
  • Compiler: c/c++ compilers: clang/llvm 18, nodejs v18.15

install cmake/clang/llvm/lld

sudo apt update
sudo apt install cmake
sudo apt install clang lld llvm

install nodejs v18.15 and typescript

install nvm first

sudo apt install curl -y
curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash source ~/.profile

use nvm to install node with version

nvm install v18.15.0
npm install -g typescript

build m from source code

get m source code

git clone https://github.com/mlang-dev/m
cd m
git submodule init
git submodule update
npm install

build & install wasi-libc

(cd ./extern/wasi-libc && make)

build mlang

cmake -B build -S .
cmake --build build

The build system will build m and m.wasm under ./apps and run all unit tests.

useful clang commands to compile to wasm/wasi target

compile c code to wasm target

clang --target=wasm32 --no-standard-libraries test.c -o test.wasm -mmultivalue -Xclang -target-abi -Xclang experimental-mv

compile c into wasi target

clang --target=wasm32-wasi --sysroot=../extern/wasi-libc/sysroot hello.c -o hello.wasm -nodefaultlibs -lc -v

or manually invoke clang front-end and back-end as two steps:

use front-end clang to produce wasm object file

clang -cc1 -triple wasm32-unknown-wasi -emit-obj -internal-isystem /usr/lib/llvm-18/lib/clang/18.1.3/include -internal-isystem ./extern/wasi-libc/sysroot/include -o hello.o -x c hello.c

then use back-end wasm-ld to produce wasm module

wasm-ld -m wasm32 -L./extern/wasi-libc/sysroot/lib/wasm32-wasi ./extern/wasi-libc/sysroot/lib/wasm32-wasi/crt1-command.o hello.o -lc -o hello.wasm

About

an expressive and efficient programming language for WebAssembly

Topics

Resources

Code of conduct

Stars

46 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages