Skip to main content

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

CircleCI Binder Documentation Status

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:

  1. Support for compiled languages like C and C++.
  2. Control Flow Graph (CFG) generation from compiled code.
  3. Easy support for varying build-time and run-time paremeters.
  4. Easy, unified parameter and data gathering across building and running code.
  5. 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'

CFG Example

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

This version

0.1

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nvsl-fiddle-0.1.tar.gz (30.6 kB view details)

Uploaded Source

Built Distribution

nvsl_fiddle-0.1-py3-none-any.whl (508.9 kB view details)

Uploaded Python 3

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

Hashes for nvsl-fiddle-0.1.tar.gz
Algorithm Hash digest
SHA256 d0c55074cc4326e47e2f4df96ac01fe5d1373cefae8ac597606dae9f92477c3e
MD5 9b3b3501a0376adaf16ea7975aafc013
BLAKE2b-256 53ef63fee4ba3b4e6ed87fd800ce5c41b8cb5bf437e7543d9c239a8e7e3dcb0e

See more details on using hashes here.

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

Hashes for nvsl_fiddle-0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ce521870ad0822eb94655372570e081ca26f9f2f35c09351c5f51daaa17e64d4
MD5 57f8683762997b16a5cf0ed1a96bfb9e
BLAKE2b-256 8cbebd91fa3a6960daa6dea562d50f3dbad2a04c9c73393e40a3e9da3bf12d00

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page