Fiddle makes it easy to ask and answers questions about the compilation and execution of smallish programs written in C or C++.
Project description
Fiddle: A Tool For Studying Small Compiled rograms
Fiddle is a tool for studying the compilation and execution of smallish programs written in C or C++. If you want to know what the compiler does to your code and why your code is slow, Fiddle can help.
It makes it easy to ask and answer interesting questions about what happens to programs as they go from source code to running program. Fiddle can run on its own, but it is built to work with Jupyter Notebook/Jupyter Lab to support interactive exploration.
It's features include:
- Support for compiled languages like C and C++.
- Control Flow Graph (CFG) generation from compiled code.
- Easy support for varying build-time and run-time paremeters.
- Easy, unified parameter and data gathering across building and running code.
- Works great with Pandas and Jupyter Notebook/Lab.
The best way to learn about Fiddle is to try it. You can run the examples (this can take a while to load).
Or run it locally with Docker:
docker run -it --publish published=8888,target=8888 stevenjswanson/fiddle:latest jupyter lab --LabApp.token=''
and then visit http://localhost:8888/lab/tree/README.ipynb.
You can also read the documentation.
Examples
What Does a for
loop look like in assembly?
>>> from fiddle import *
>>> sample = code(r"""
... extern "C"
... int loop() {
... int sum = 0;
... for(int i = 0; i < 10; i++) {
... sum += i;
... }
... return sum;
... }
... """)
>>> asm = build(sample)[0].asm("loop")
>>> print(asm) # doctest: +SKIP
loop:
.LFB0:
.cfi_startproc
endbr64
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $0, -8(%rbp)
movl $0, -4(%rbp)
.L3:
cmpl $9, -4(%rbp)
jg .L2
movl -4(%rbp), %eax
addl %eax, -8(%rbp)
addl $1, -4(%rbp)
jmp .L3
.L2:
movl -8(%rbp), %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
Or, if you prefer a CFG:
>>> build(sample)[0].cfg("loop", "readme_loop.png")
'readme_loop.png'
What Does -O3
Do To That Loop?
>>> asm = build(sample, build_parameters=dict(OPTIMIZE="-O3"))[0].asm("loop")
>>> print(asm) # doctest: +SKIP
loop:
.LFB0:
.cfi_startproc
endbr64
movl $45, %eax
ret
.cfi_endproc
Local Installation
Fiddle depends on some system packages and python's wheel
. Setup a virtual environment:
python -m venv fiddle-venv
Become root, so you can install the systetm packages with apt-get
with
sudo bash
. fiddle-venv/bin/activate
make install-prereqs
exit
Install fiddle:
. fiddle-venv/bin/activate
pip install .
Run the tests:
make test
Common Problems
Fiddle needs LD_LIBRARY_PATH
set properly to work, and it can't set it itself reliably. If you get
OSError: libfiddle.so: cannot open shared object file: No such file or directory
You can update LD_LIBRARY_PATH
with:
$(set-fiddle-ld-path)
Saving Your Work
If you want to save changes you make to any of the examples, you'll need to run docker something like this:
docker run -it --publish published=8888,target=8888 --mount type=bind,source=$HOME,dst=/home/jovyan -w /home/jovyan/fiddle_work/fiddle stevenjswanson/fiddle:latest jupyter lab --LabApp.token=''
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file nvsl-fiddle-0.1.tar.gz
.
File metadata
- Download URL: nvsl-fiddle-0.1.tar.gz
- Upload date:
- Size: 30.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d0c55074cc4326e47e2f4df96ac01fe5d1373cefae8ac597606dae9f92477c3e |
|
MD5 | 9b3b3501a0376adaf16ea7975aafc013 |
|
BLAKE2b-256 | 53ef63fee4ba3b4e6ed87fd800ce5c41b8cb5bf437e7543d9c239a8e7e3dcb0e |
File details
Details for the file nvsl_fiddle-0.1-py3-none-any.whl
.
File metadata
- Download URL: nvsl_fiddle-0.1-py3-none-any.whl
- Upload date:
- Size: 508.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.7.1 importlib_metadata/4.8.2 pkginfo/1.8.2 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | ce521870ad0822eb94655372570e081ca26f9f2f35c09351c5f51daaa17e64d4 |
|
MD5 | 57f8683762997b16a5cf0ed1a96bfb9e |
|
BLAKE2b-256 | 8cbebd91fa3a6960daa6dea562d50f3dbad2a04c9c73393e40a3e9da3bf12d00 |