Micro Operations - A Python C extension that brings semantics from other languages to Python through composable low-level C operations.
microps is an experimental Python library that lets you write Python code with the semantics of other programming languages. It achieves this through:
- 110+ atomic C operations - Low-level micro-operations for all basic programming tasks
- Language wrappers - Python modules that compose these C operations to emulate language-specific behavior
- Polyglot scope - A shared memory space where different language semantics can interact
Think of it as a universal semantic adapter for Python - write JavaScript, Lua, Ruby, PHP, or even C-style code, all within Python!
- JavaScript (
microps.js) - JS type coercion, truthy/falsy, Array/String methods - Lua (
microps.lua) - Metatables, 1-based indexing, table operations - Ruby (
microps.ruby) - Everything-is-an-object, predicate methods (empty?,nil?) - PHP (
microps.php) - Type juggling, loose equality, array/string functions - Python (
microps.py) - Native Python semantics via C operations - C (
microps.c) - Explicit type casting, pointer-style operations, bitwise ops
# Clone the repository
git clone https://github.com/holyarahippo06/microps.git
cd microps
# Build and install
python setup.py build
python setup.py install
# Or install in development mode
pip install -e .from microps import js, lua, ruby, php
# JavaScript-style code
@js.decorator
def javascript_example():
text = js.String("hello")
print(text.toUpperCase()) # "HELLO"
print(text.length) # 5
# JS type coercion
result = js.Number(5) + js.String("10")
print(result) # "510" (string concatenation)
# Lua-style code with metatables
@lua.decorator
def lua_example():
t = lua.Table()
t[1] = "first" # 1-based indexing!
t[2] = "second"
# Add metatable
mt = lua.Table()
mt['__add'] = lambda a, b: lua.Number(100)
lua.setmetatable(t, mt)
result = t + t
print(result) # 100
# Ruby-style code
@ruby.decorator
def ruby_example():
arr = ruby.Array()
arr.push(1)
arr.push(2)
arr.push(3)
print(arr.empty?()) # False
print(arr.length()) # 3
arr.reverse()
print(arr.first()) # 3
# PHP-style code with type juggling
@php.decorator
def php_example():
val = php.intval("42")
result = val + php.String("8")
print(result) # 50.0 (type juggling!)βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Language Wrappers (Python) β
β js.py | lua.py | ruby.py | php.py | py.py | c.py β
β (Compose C operations into language semantics) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Wrapper Framework (Python) β
β BaseValue | create_decorator | lie_lookup β
β (Infrastructure for building language wrappers) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 110+ Micro Operations (C) β
β _core.c + 110+ individual .c files β
β (Atomic operations: add, str_upper, obj_get, etc.) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
All operations are implemented in individual C files under microps/microops/:
Arithmetic (16 ops): add, sub, mul, div, mod, pow, floor_div, neg, abs, divmod, min, max, clamp, sign
Comparison (6 ops): eq, ne, lt, le, gt, ge
Bitwise (9 ops): bit_and, bit_or, bit_xor, bit_not, lshift, rshift, rotl, rotr, popcount
Logical (2 ops): not, truthy
Type Conversion (4 ops): to_int, to_float, to_str, to_bool
Type Checking (9 ops): is_int, is_float, is_str, is_list, is_dict, is_tuple, is_bool, is_none, is_callable
Containers (7 ops): obj_new, obj_get, obj_set, del, keys, values, len
Lists (7 ops): list_new, append, pop, reverse, insert, extend, clear
Sequences (8 ops): contains, slice, concat, find, rfind, swap, count, is_sorted
Strings (21 ops): str_upper, str_lower, str_split, str_join, str_replace, str_startswith, str_endswith, str_contains, str_count, str_find, str_rfind, str_strip, str_lstrip, str_rstrip, str_capitalize, str_title, str_swapcase, str_repeat, str_pad_left, str_pad_right, str_center
Dictionaries (5 ops): dict_merge, dict_update, dict_pop, dict_setdefault, dict_items
Functional (3 ops): map_func, filter_func, reduce_func
Hash & Identity (3 ops): hash_val, id_val, is_identical
Special (2 ops): type, inc_get
microps uses a technique called "scope lying" to intercept variable access:
- The decorator (
@js.decorator,@lua.decorator, etc.) wraps your function - It replaces the function's global dictionary with a custom
Scopeclass - Variable reads/writes are redirected through
__getitem__and__setitem__ - Values are automatically wrapped in language-specific value classes
- C operations are called under the hood
# When you write this:
@js.decorator
def my_func():
x = js.Number(5) # Stored in C scope "js"
return x + 10
# microps does this internally:
# 1. Wraps 5 in JSValue
# 2. Stores in C via _core.set_var("js", "x", 5)
# 3. On read: retrieves via _core.get_var("js", "x")
# 4. Wraps result in JSValue
# 5. Calls _core.add(5, 10) for the additionShare data between different language semantics using the shared object:
from microps import js, lua, php, shared
@js.decorator
def step1():
arr = js.Array(1, 2, 3)
shared.data = arr # Store in global scope
@lua.decorator
def step2():
# Access JS array from Lua
print(shared.data[1]) # 1 (Lua's 1-based indexing!)
# Add Lua metatable
mt = lua.Table()
mt['__add'] = lambda a, b: lua.Number(1000)
lua.setmetatable(shared.data, mt)
@php.decorator
def step3():
# PHP sees the Lua metatable!
result = shared.data + 1
print(result) # 1000.0 (Lua's __add metamethod)
step1()
step2()
step3()Each language has its own truthiness rules:
from microps import js, lua, ruby, php
# JavaScript: 0, "", null, undefined, NaN, false are falsy
@js.decorator
def js_truthy():
print(bool(js.Number(0))) # False
print(bool(js.String(""))) # False
print(bool(js.Array())) # True (empty array is truthy!)
# Lua: Only nil and false are falsy
@lua.decorator
def lua_truthy():
print(bool(lua.Number(0))) # True! (0 is truthy in Lua)
print(bool(lua.String(""))) # True! (empty string is truthy)
print(bool(lua.nil)) # False
# Ruby: Only nil and false are falsy (like Lua)
@ruby.decorator
def ruby_truthy():
print(bool(ruby.Integer(0))) # True!
print(bool(ruby.nil)) # False
# PHP: 0, 0.0, "", "0", [], null, false are falsy
@php.decorator
def php_truthy():
print(bool(php.intval(0))) # False
print(bool(php.strval("0"))) # False!
print(bool(php.array())) # False (empty array!)Lua's metatable system is fully supported and works across languages:
from microps import lua, php
@lua.decorator
def create_custom_behavior():
t = lua.Table()
t['value'] = 10
# Create metatable with custom operators
mt = lua.Table()
mt['__add'] = lambda a, b: lua.Number(a.value() * b.value())
mt['__sub'] = lambda a, b: lua.Number(1000)
mt['__mul'] = lambda a, b: lua.String("BOOM!")
lua.setmetatable(t, mt)
return t
@php.decorator
def use_from_php():
obj = create_custom_behavior()
shared.obj = obj
# PHP can use Lua metatables!
print(shared.obj + shared.obj) # Custom multiplication
print(shared.obj - 1) # Returns 1000
print(shared.obj * 2) # Returns "BOOM!"Variables prefixed with ghost_ auto-increment on each read:
from microps import js
@js.decorator
def counter_without_state():
print(js.ghost_count) # 0
print(js.ghost_count) # 1
print(js.ghost_count) # 2
print(js.ghost_count) # 3
# Each read increments the value!
counter_without_state()
counter_without_state() # Continues from 4Bypass language wrappers and use C operations directly:
from microps import _core
# Create objects
obj = _core.obj_new()
_core.obj_set(obj, "name", "microps")
_core.obj_set(obj, "version", 1.1)
# Arithmetic
result = _core.add(5, 10) # 15
result = _core.mul(3, 4) # 12
result = _core.pow(2, 8) # 256
# String operations
text = _core.to_str(42) # "42"
upper = _core.str_upper("hello") # "HELLO"
words = _core.str_split("a,b,c", ",") # ["a", "b", "c"]
# Type checking
print(_core.is_int(42)) # True
print(_core.is_str("hello")) # True
print(_core.type(3.14)) # "float"from microps import js
@js.decorator
def demo():
# Type coercion
print(js.Number(5) + js.String("10")) # "510"
# Array methods
arr = js.Array(1, 2, 3)
arr.push(4)
print(arr.pop()) # 4
print(arr.slice(0, 2)) # [1, 2]
print(arr.includes(2)) # True
# String methods
text = js.String("hello world")
print(text.toUpperCase()) # "HELLO WORLD"
print(text.split(" ")) # ["hello", "world"]
print(text.charAt(0)) # "h"
# Object
obj = js.Object.create()
obj['key'] = 'value'
print(js.Object.keys(obj)) # ["key"]
# Math
print(js.Math.pow(2, 3)) # 8
print(js.Math.floor(3.7)) # 3
# Console
js.console.log("Hello from JS!")from microps import lua
@lua.decorator
def demo():
# 1-based indexing
t = lua.Table()
t[1] = "first"
t[2] = "second"
print(t[1]) # "first"
# Metatables
mt = lua.Table()
mt['__add'] = lambda a, b: lua.Number(42)
lua.setmetatable(t, mt)
print(t + t) # 42
# Table library
lua.table.insert(t, "third")
print(lua.table.concat(t, ", ")) # "first, second, third"
# String library
s = lua.String("hello")
print(lua.string.upper(s)) # "HELLO"
print(lua.string.rep(s, 3)) # "hellohellohello"
# Math library
print(lua.math.sqrt(16)) # 4.0
print(lua.math.floor(3.7)) # 3from microps import ruby
@ruby.decorator
def demo():
# Everything is an object
arr = ruby.Array()
arr.push(1).push(2).push(3) # Chaining!
# Predicate methods
print(arr.empty?()) # False
print(arr.include?(2)) # True
# Bang methods (mutating)
arr.reverse!()
print(arr) # [3, 2, 1]
# String methods
text = ruby.String("hello")
print(text.upcase()) # "HELLO"
print(text.chars()) # ["h", "e", "l", "l", "o"]
# Numeric predicates
num = ruby.Integer(42)
print(num.even?()) # True
print(num.positive?()) # True
print(num.zero?()) # False
# Hash
h = ruby.Hash()
h['name'] = 'Ruby'
print(h.keys()) # ["name"]
print(h.has_key?('name')) # Truefrom microps import php
@php.decorator
def demo():
# Type juggling
result = php.intval("42") + php.String("8")
print(result) # 50.0 (automatic conversion!)
# Array functions
arr = php.array(1, 2, 3)
php.array_push(arr, 4)
print(php.count(arr)) # 4
print(php.in_array(2, arr)) # True
# String functions
text = php.strval("hello world")
print(php.strtoupper(text)) # "HELLO WORLD"
print(php.strlen(text)) # 11
# Method syntax (as if methods)
print(text.strtoupper()) # "HELLO WORLD"
print(text.strlen()) # 11
# Type checking
print(php.is_numeric(42)) # True
print(php.is_string("hi")) # True
# Output
php.echo("Hello", " ", "World") # Hello Worldfrom microps import c
@c.decorator
def demo():
# Type casting
x = c.int_cast(3.7) # 3
y = c.float_cast(5) # 5.0
# Arrays
arr = c.array_new(5)
c.array_set(arr, 0, 42)
c.array_set(arr, 1, 100)
print(c.array_get(arr, 0)) # 42
# String operations
s = c.strval("hello")
print(c.strlen(s)) # 5
# Bitwise operations
a = c.int_cast(15) # 0b1111
b = c.left_shift(a, 2) # 0b111100 = 60
print(c.bit_and(b, 12)) # 12
# Math
print(c.abs(-5)) # 5
print(c.pow(2, 3)) # 8
print(c.sqrt(16)) # 4.0
# Memory operations (simulated)
ptr = c.malloc(10)
c.memset(ptr, 0, 10)
c.free(ptr)The modular design makes it easy to add new languages:
# wrappers/kotlin.py
from .. import _core
from .wrapper import unwrap, create_decorator, BaseValue
class KotlinValue(BaseValue):
def __bool__(self):
# Kotlin: only null is falsy
return self._val is not None
def __getattr__(self, n):
# Map Kotlin methods to C operations
if n == 'uppercase':
return lambda: KotlinValue(_core.str_upper(self._val), self._engine)
if n == 'lowercase':
return lambda: KotlinValue(_core.str_lower(self._val), self._engine)
# ... more Kotlin semantics
return KotlinValue(_core.obj_get(self._val, n), self._engine)
class KotlinEngine:
def __init__(self):
self.__dict__['_scope'] = "kotlin"
self.__dict__['_builtins'] = {
'String': lambda x: KotlinValue(_core.to_str(unwrap(x)), self),
'Int': lambda x: KotlinValue(_core.to_int(unwrap(x)), self),
'println': lambda *args: print(*(str(unwrap(a)) for a in args)),
# ... more Kotlin built-ins
}
self.__dict__['decorator'] = create_decorator(self, KotlinValue)
def __getattr__(self, n):
from .wrapper import lie_lookup
return KotlinValue(lie_lookup(self, None, n), self)
kotlin = KotlinEngine()Then add to __init__.py:
from .wrappers.kotlin import kotlin, KotlinValue, KotlinEnginefrom microps import js
js.debug = True
@js.decorator
def test():
x = js.Number(42)
print(x) # Output: JS(42.0) - shows internal representationRun the multi-language test suite:
python tests/multi_language_method_test.pyExpected output:
============================================================
POLYGLOT TEST: Ruby -> Lua -> PHP
============================================================
[Ruby] Initializing shared packet...
[Ruby] Created object of type: list
[Ruby] Packet length: 1
[Lua] Injecting metatable logic...
[Lua] Item 1 (1-based indexing): Microps
[PHP] Testing polyglot math...
[PHP] Result: 1000.0
[PHP] Metatable __add worked! Got 1000.0 instead of error!
============================================================
- Python 3.10+
- C compiler (GCC, Clang, or MSVC)
- setuptools, wheel
# Clone repository
git clone https://github.com/holyarahippo06/microps.git
cd microps
# Build C extension
python setup.py build_ext --inplace
# Install
pip install -e .
# Verify installation
python -c "from microps import js; print('microps installed!')"Linux/macOS:
# Install Python dev headers (if not already installed)
sudo apt-get install python3-dev # Debian/Ubuntu
# or
brew install python # macOSWindows:
# Install Visual C++ Build Tools
# Download from: https://visualstudio.microsoft.com/visual-cpp-build-tools/- Education: Teach language design and type system differences side-by-side
- Experimentation: Test language features without building a full compiler/interpreter
- Polyglot Programming: Mix semantics from multiple languages in one codebase
- Research: Study how different languages handle the same operations
- Prototyping: Quickly mock up language behavior for design discussions
- Comparative Analysis: Run identical logic across multiple language semantics
- Fun: Because making Python act like PHP is hilarious πͺ
All core operations run at native C speed:
- Direct Python C API calls
- Minimal Python object overhead
- No intermediate Python wrappers for primitives
- Efficient C-level scope management
Benchmark (1 million operations):
Pure Python: ~200ms
microps C ops: ~50ms (4x faster)
- Not Production-Ready: This is an experimental/educational project
- Incomplete Semantics: Not all language features are fully implemented
- Edge Cases: Type coercion may differ from actual language implementations
- Ghost Variables: Persist across function calls (cursed but intentional)
- Introspection: Scope lying may interfere with some Python introspection tools
- No Real VMs: These are semantic emulators, not actual language virtual machines
Contributions are highly encouraged! The modular architecture makes it easy:
- Add new language wrappers using existing C operations
- Improve existing language semantics
- Write documentation and examples
- Report bugs and edge cases
- Add new micro operations in C
- Optimize existing operations
- Improve scope management
- Fork the repository
- Create a feature branch (
git checkout -b feature/scala-wrapper) - Make your changes
- Add tests for new functionality
- Submit a pull request
Check out existing wrappers (js.py, lua.py, ruby.py) as templates!
[Add your license here - MIT recommended]
Built with:
- Love for language design quirks
- The Python C API
- 110+ individually crafted C micro-operations
- A sense of humor about programming languages
- Author: @holyarahippo06
- Repository: github.com/holyarahippo06/microps
- Issues: GitHub Issues
Remember: Just because you can make Python behave like PHP doesn't mean you should... but it sure is educational! πͺ
If you find this project interesting, give it a β and consider contributing a language wrapper!