Fantastic work!
And this will be super useful to the community.
I have used sqlite memory dbs  for unit tests in the past, and this always 
caused me portability pain.

Just one question. 
How will you track upstream changes in the original C sqlite?

On Thursday, 27 August 2020 14:24:23 UTC+1, Jan Mercl wrote:
>
> On Thu, Aug 27, 2020 at 2:46 PM Nick <golan...@njw.name <javascript:>> 
> wrote:
>
> > I took a little tour around the code, am I correct in thinking that
> > it's mostly a clever translation of the C code to Go, using
> > generator.go? What is 'ccgo' that seems to be doing all this?
>
> ccgo is a C compiler producing Go code. It's a work in progress and its 
> code is so far the only documentation available, sadly. The project is 
> modernc.org/ccgo/v3 hosted currently here: 
> https://gitlab.com/cznic/ccgo/-/tree/master/v3
>
> > I see
> > that lib/sqlite_linux_amd64.go is created by the makeSqlite()
> > function, but is the capi_linux_amd64.go file generated from the
> > same command? Sorry, but I don't yet understand this ccgo thing.
>
> ccgo produces a capi_$GOOS_$GOARC file automatically for non main C 
> programs. This file simply has a map of extern symbols the Go package 
> defines. ccgo uses this information for linking via, for example -
> lmodenrc.org/sqlite/lib. Similarly to a standard C compiler, libc is 
> "imported" automatically as if the last item to ccgo is -lmodernc.org/libc. 
> This can be overridden by the -ccgo-crt-pah flag. (The libc project is a 
> continuation of the earlier modernc.org/crt project.)
>
> > Am I correct in thinking that this implementation, now it passes all
> > the tests, should be essentially a drop-in replacement for something
> > like github.com/mattn/go-sqlite3, with similar performance as it's
> > just translated-from-C?
>
> Mattn's package exposes much more above the sql/database driver and adds 
> custom URL parameters for various options specific to that project. 
> However, it should be possible to create a drop-in replacement package as 
> everything in modernc.org/sqlite/lib is exported and "consumable". What 
> would be needed is to write manually a client Go <-> ccgo produced Go 
> bridges for the functions that mattn's package uses from sqlite3.c 
> (probably just a few dozens of them). The ccgo produced Go has an "ABI" 
> that's quite distinct from usual Go functions. And it's not documented yet. 
> But I can provide the info to anyone who would like to turn it into the 
> proper documentation in a series of questions and answers, held on the 
> issue tracker, for example.
>
> Wrt performance, I expect the Go port to be definitely slower on average. 
> It's a long story to explain why and there's a lot of different reasons. 
> However, the slow down depends on what C code is measured. On a set of 24 
> benchmarks from ComptCert, the average ratio was about 1.25 (times slower 
> than gcc -O) for the same C code in an earlier (still crt based) version. 
> But then you can find some other C code where addresses of local variables 
> are taken or where closures are used and it gets the highest performance 
> hit. Correctness and completeness is so far the priority. I hope some 
> performance improvements are still possible afterwards. For example, the 
> current libc does not yet buffer stdout. Here are the current numbers on a 
> rather old machine where you can see how it (I guess) hurts binarytrees.c:
>
> === RUN   TestCompCert
> === RUN   TestCompCert/gcc
> === RUN   TestCompCert/ccgo
> === CONT  TestCompCert
>     all_test.go:1165:   compiler           test    T         comp  exec 
> match    coef
>     all_test.go:1167:        gcc          aes.c    70.965ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc    almabench.c   253.403ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc  binarytrees.c    33.907ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc       bisect.c    81.671ms  true  true 
>  true   1.018
>     all_test.go:1167:        gcc        chomp.c   237.238ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc     fannkuch.c   174.135ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc          fft.c    67.835ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc        fftsp.c    40.645ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc         fftw.c    66.590ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc          fib.c    45.877ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc       integr.c    28.862ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc  knucleotide.c   130.633ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc        lists.c    60.898ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc   mandelbrot.c   106.127ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc        nbody.c   149.378ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc       nsieve.c   134.007ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc   nsievebits.c    99.903ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc       perlin.c    38.010ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc        qsort.c    91.263ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc         sha1.c    59.152ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc         sha3.c    29.127ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc    siphash24.c    87.284ms  true  true 
>  true   1.000 *
>     all_test.go:1167:        gcc     spectral.c   168.282ms  true  true 
>  true   1.022
>     all_test.go:1167:        gcc        vmach.c    59.304ms  true  true 
>  true   1.000 *
>     all_test.go:1167:       ccgo          aes.c    82.205ms  true  true 
>  true   1.158
>     all_test.go:1167:       ccgo    almabench.c   349.994ms  true  true 
>  true   1.381
>     all_test.go:1167:       ccgo  binarytrees.c   240.471ms  true  true 
>  true   7.092
>     all_test.go:1167:       ccgo       bisect.c    80.192ms  true  true 
>  true   1.000 *
>     all_test.go:1167:       ccgo        chomp.c   316.546ms  true  true 
>  true   1.334
>     all_test.go:1167:       ccgo     fannkuch.c   231.494ms  true  true 
>  true   1.329
>     all_test.go:1167:       ccgo          fft.c    79.481ms  true  true 
>  true   1.172
>     all_test.go:1167:       ccgo        fftsp.c   103.185ms  true  true 
>  true   2.539
>     all_test.go:1167:       ccgo         fftw.c    93.375ms  true  true 
>  true   1.402
>     all_test.go:1167:       ccgo          fib.c    73.022ms  true  true 
>  true   1.592
>     all_test.go:1167:       ccgo       integr.c    32.963ms  true  true 
>  true   1.142
>     all_test.go:1167:       ccgo  knucleotide.c   295.192ms  true  true 
>  true   2.260
>     all_test.go:1167:       ccgo        lists.c    72.562ms  true  true 
>  true   1.192
>     all_test.go:1167:       ccgo   mandelbrot.c   152.969ms  true  true 
>  true   1.441
>     all_test.go:1167:       ccgo        nbody.c   149.822ms  true  true 
>  true   1.003
>     all_test.go:1167:       ccgo       nsieve.c   157.365ms  true  true 
>  true   1.174
>     all_test.go:1167:       ccgo   nsievebits.c   113.934ms  true  true 
>  true   1.140
>     all_test.go:1167:       ccgo       perlin.c    67.065ms  true  true 
>  true   1.764
>     all_test.go:1167:       ccgo        qsort.c   105.136ms  true  true 
>  true   1.152
>     all_test.go:1167:       ccgo         sha1.c    82.178ms  true  true 
>  true   1.389
>     all_test.go:1167:       ccgo         sha3.c    70.727ms  true  true 
>  true   2.428
>     all_test.go:1167:       ccgo    siphash24.c   108.887ms  true  true 
>  true   1.248
>     all_test.go:1167:       ccgo     spectral.c   164.702ms  true  true 
>  true   1.000 *
>     all_test.go:1167:       ccgo        vmach.c    78.095ms  true  true 
>  true   1.317
>     all_test.go:1174: Considered tests: 24/24
>     all_test.go:1182:       ccgo   3.301562213s  1.426
>     all_test.go:1182:        gcc   2.314496632s  1.000
> --- PASS: TestCompCert (46.13s)
>     --- PASS: TestCompCert/gcc (16.60s)
>     --- PASS: TestCompCert/ccgo (29.48s)
>
> > What happens if one (erroneously) tries to
> > build a project that uses this library, using a non-supported
> > architecture? Will go complain?
>
> Yes, all of the os/arch specific code is by guarded like in 
> foo_$GOOS_$GOARCH.go, so the compiler targeting other GOOS/GOARCH should 
> definitely fail the build.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/eb5b35c8-0097-4ebd-b228-bff6b0d59d77o%40googlegroups.com.

Reply via email to