# cexpl
Command-line tool to interact with [Compiler Explorer](https://godbolt.org/).
[](https://asciinema.org/a/525454)
## Overview
**cexpl** is able to query all available languages, compilers, build and execute your source code. You can also give some extra arguments, like compiler flags, command-line arguments and STDIN.
The Compiler Explorer API host can be specified with the `-H`/`--host` option.
### List available languages
The `--list-langs` option lists all languages and their IDs:
```text
$ cexpl --list-langs
ada - Ada
analysis - Analysis
assembly - Assembly
c - C
c++ - C++
carbon - Carbon
circle - C++ (Circle)
circt - CIRCT
clean - Clean
cpp2_cppfront - Cpp2-cppfront
...
```
The language ID can be used with the `-l`/`--lang` option.
### List available compilers
The `--list-compilers` option lists all compilers and their IDs:
```text
$ cexpl --list-compilers
386_gl114 - 386 gc 1.14
386_gl115 - 386 gc 1.15
386_gl116 - 386 gc 1.16
386_gl117 - 386 gc 1.17
386_gl118 - 386 gc 1.18
386_gl119 - 386 gc 1.19
386_gltip - 386 gc (tip)
6g141 - amd64 gc 1.4.1
aarchg54 - ARM64 gcc 5.4
arduinomega189 - Arduino Mega (1.8.9)
...
```
It is also possible to list the compilers for a specific language. For example, `cexpl --list-compilers python` will list all available Python compilers.
The compiler ID can be used with the `-c`/`--compiler` option.
### Compilation and execution
In order to compile, you need to pass the file containing the source code. **cexpl** will try to figure out the language and its default compiler based on the file extension. You can specify the language and/or the compiler with `--lang` and/or `--compiler` option, as said above.
```text
$ cexpl love.c
.LC0:
.string "<3"
main:
push rbp
mov rbp, rsp
mov edi, OFFSET FLAT:.LC0
call puts
mov eax, 0
pop rbp
ret
```
The source code:
```c
#include <stdio.h>
int main() {
printf("<3\n");
return 0;
}
```
You can pass options to the compiler with the `--cflags` option.
#### Comparing source code and assembly
Use the `-C`/`--compare` option to compare the source code with the assembly:
```text
$ cexpl --compare --cflags=-Ofast love.c
.LC0:
.string "<3"
main:
3 int main() {
sub rsp, 8
4 printf("<3\n");
mov edi, OFFSET FLAT:.LC0
call puts
6 }
xor eax, eax
add rsp, 8
ret
```
#### Execution
The `-e`/`--exec` option executes the code:
```text
$ cexpl --exec --skip-asm love.c
STDOUT:
<3
```
If you don't want to see the generated assembly, use the `-s`/`--skip-asm` option.
##### Arguments and input
You can pass a list of arguments with the `-a`/`--args` option. For example, `cexpl --args one two three --exec main.c`. The same applies to the `--stdin` option:
```text
$ cexpl --skip-asm --exec --stdin "Gustavo Costa" 20 -- hi.py
STDOUT:
Gustavo Costa, 20 years old
```
The source code:
```python
name = input()
age = input()
print(f'{name}, {age} years old')
```
#### Saving your results
You can generate a short link for the compilation with the `-L`/`--link` option.
## License
Copyright (c) 2022 Gustavo Costa. Distributed under the MIT license.