https://github.com/speakez-llc/fsharp-mlir-hello
Proof of Concept using MLIR and LLVM to build binaries from F# code
https://github.com/speakez-llc/fsharp-mlir-hello
dotnet fsharp fsharp-console llvm mlir
Last synced: 11 months ago
JSON representation
Proof of Concept using MLIR and LLVM to build binaries from F# code
- Host: GitHub
- URL: https://github.com/speakez-llc/fsharp-mlir-hello
- Owner: speakez-llc
- License: mit
- Created: 2025-03-13T22:37:55.000Z (11 months ago)
- Default Branch: main
- Last Pushed: 2025-03-14T03:17:59.000Z (11 months ago)
- Last Synced: 2025-03-14T03:25:06.072Z (11 months ago)
- Topics: dotnet, fsharp, fsharp-console, llvm, mlir
- Language: F#
- Homepage:
- Size: 221 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# F# to Native Executable Compiler Pipeline

## Project Overview
### Toolchain Dependencies
- MLIR libraries
- LLVM infrastructure
- F# Compiler Service
- PowerShell (for build scripting)
- MSYS2 or equivalent MinGW development environment
This project represents an experimental proof-of-concept for compiling F# directly to native executables using MLIR (Multi-Level Intermediate Representation) and LLVM, bypassing traditional .NET compilation infrastructure.
![alt text]()
## MLIR and LLVM Toolchain Setup with MSYS2 Windows Installer
The MLIR and LLVM toolchain was acquired through the official MSYS2 Windows installer package, which provides a streamlined method for obtaining development tools and libraries for Windows.
### Packages
Utilized the MSYS2 package manager (pacman) to install necessary development tools and libraries:
```bash
pacman -Syu # Update package database and core system packages
pacman -S mingw-w64-x86_64-toolchain
pacman -S mingw-w64-x86_64-llvm
pacman -S mingw-w64-x86_64-clang
pacman -S mingw-w64-x86_64-cmake
pacman -S mingw-w64-x86_64-ninja
```
### General Project Structure
- `src/`: Source code for the compiler pipeline
- `Bindings/`: Native bindings for MLIR and LLVM
- `Conversion/`: AST conversion logic
- `Pipeline/`: Compilation pipeline implementation
- `Examples/`: Sample F# programs
- `tools/`: Build and development scripts
- `build/`: Compiled output directory
### Compilation Architecture
The compiler pipeline consists of several critical stages:
1. F# Source Parsing
2. Abstract Syntax Tree (AST) Conversion
3. MLIR Dialect Generation
4. LLVM IR Lowering
5. Native Code Generation
## Build Notes
Check path settings to match your project and dependency locations
### Compilation Caveats
#### F# Compiler Service Integration
The project uses a standalone F# Compiler Service instance, which is intentionally decoupled from the standard .NET ecosystem. This approach introduces several non-standard elements:
- The F# Compiler Service is compiled as a discrete library
- Build scripts use direct PowerShell orchestration to compile
- Type resolution and binding are hand-jammed in many cases
**Warning**: This implementation is inherently experimental and should be considered a research prototype.
## Build Process
Execute the compilation pipeline using the provided PowerShell script:
```powershell
.\tools\build.ps1
```
### Build Stages
1. Compile F# MLIR Bindings
2. Compile MLIR Wrapper Modules
3. Generate Conversion Modules
4. Build Compilation Pipeline
5. Create Example Executables
## Limitations and Future Work
Current limitations include:
- Minimal language feature support
- Experimental parsing mechanisms
- Limited optimization strategies
Potential future improvements:
- Enhanced type system mapping
- More comprehensive language construct support
- Advanced optimization passes
## Licensing and Contribution
This is an MIT licensed open-source research project. Contributions, discussions, and explorations are welcome.
## Disclaimer
This compiler pipeline is a proof-of-concept. It is not intended for production use and represents an experimental approach to functional language compilation.
## .NET 9 compilation sizes for the same functionality
### Standard Debug Build
![alt text]()
### Production build
![alt text]()
![alt text]()