
Show HN: Bic – a C interpreter and API explorer - hexagonal-sun
https://github.com/hexagonal-sun/bic
======
wrp
Interactive C environments were popular for a while. I have collected
information on several at the Computer History Museum. I actually have even
more stuff that I never got around to uploading.

You unfortunately need to make an account to see the pages. It was heavily
attacked at one time and that was the admin's solution.

Interactive C Environments
[http://www.softwarepreservation.org/projects/interactive_c](http://www.softwarepreservation.org/projects/interactive_c)

------
sshb
Reminds me of CERN’s ROOT which has C/C++ interpreter
[https://root.cern.ch/](https://root.cern.ch/)

~~~
amirmasoudabdol
One of the biggest problem with these repl for complied languages is that they
panic as soon as you rerun a command. `cling` integrates with Jupyter notebook
too but as soon as you rerun a declaration of a variable, everything collapse
and you have to reset the kernel. Maybe I didn’t dig deep enough and there is
a way around this but if not, this is quite painful to deal with and a deal
breaker.

~~~
sigjuice
So repeating something like 'int i = 42;' causes problems?

------
jart
One cool trick for C REPLs is to grep the man page directory to automate those
pesky #include lines, e.g.
[https://gist.github.com/jart/5d0934d26b52f38cad36](https://gist.github.com/jart/5d0934d26b52f38cad36)
Another trick is to build with STABS and use objdump -g.

------
smhenderson
This is really cool, nice work. I especially like the bit about putting a REPL
statement in a source file to have it drop into bic. Seems like a quick and
dirty way to debug without having to fire up gdb and such. Somewhere in
between print statements and full on debugging.

Thanks for sharing.

------
scandox
I often looked for this and failed to find something that I could easily use.
So I'm delighted to see this as a on/off C amateur and learner.

~~~
hexagonal-sun
Thanks! It's still a work in progress but should hopefully help people to get
to grips with C.

------
fortran77
In the late 80s there was a product called C-Terp, which I loved!

Here's a link to a brief description:

[https://books.google.com/books?id=fHghpJa3va4C&lpg=PA167&ots...](https://books.google.com/books?id=fHghpJa3va4C&lpg=PA167&ots=Tq9xCXDt76&dq=C-Terp%20c%20interpreter&pg=PA167#v=onepage&q=C-Terp%20c%20interpreter&f=false)

And, yes, I paid the $295 for it.

------
xvilka
It lacks the syntax highlight. They could have used tree-sitter[1] for
parsing, then the online highlight would be easier to implement.

[1] [https://github.com/tree-sitter/tree-sitter](https://github.com/tree-
sitter/tree-sitter)

~~~
johnisgood
> Dependency-free so that the runtime library (which is written in pure C) can
> be embedded in any application

What does dependency-free mean? I mean, it does depend on 128 crates. Do we
typically not count those?

By the way, I did `cargo build` and it failed at `#include "utf8proc.c"`. I
have `libutf8proc` installed. Changing `.c` to `.h` solved it. It went past
that part, only to get:

\- error: couldn't read cli/src/../../lib/binding_web/tree-sitter.js: No such
file or directory (os error 2)

\- error: couldn't read cli/src/../../lib/binding_web/tree-sitter.wasm: No
such file or directory (os error 2)

~~~
TkTech
The generator isn't dependency free, the parser it generates is.

------
agumonkey
I love that you have to #include how to exit :)

~~~
huhtenberg
Technically, you should be able to just call exit(1) because of the C's
support for "implicit function declarations".

With no prior exit() declaration, the C compiler would assume that "exit" is
"int exit()", spit out the code to push whatever arguments are passed to it
down the stack and then just call the damn thing. So, magically, it will all
just work. Requires an older compiler though, C89 the latest.

~~~
jart
Modern GCC and Clang still support implicit functions. They just complain
about it by default. (Mostly for reasons that shouldn't be entirely relevant
to modern x86.)

------
emilfihlman
Why is fputs returning 1?

~~~
fit2rule
1 is a non-negative number. fputs() return nonnegative numbers on success...

~~~
emilfihlman
Ah yeah true, looked at the wrong part of a man page.

------
israrkhan
an integration with jupyter would be nice.

------
forpace
One of the biggest problem with these repl for complied languages is that they
panic as soon as you rerun a command. `cling` integrates with Jupyter notebook
too but as soon as you rerun a declaration of a variable, everything collapse
and you have to reset the kernel. Maybe I didn’t dig deep enough and there is
a way around this but if not, this is quite painful to deal with and a deal
breaker.

