emscripten

Difference between version 14 and 16 - Previous - Next
https://github.com/kripken/emscripten/wiki%|%emscripten%|% compiles "regular" C/C++ projects to JavaScript via LLVM. This is how marvels such as http://jamesfriend.com.au/pce-js/%|%PCE.js%|% (A Mac Plus/IBM PC emulator in the browser) can exist. This evening, I've made a few attempts at compiling a number of Tcl versions (from 8.6.1 back to 8.2, didn't get further) using emscripten. The steps for compiling are in theory https://github.com/kripken/emscripten/wiki/Building-Projects%|%easy and well-documented%|%. However, `emmake make` fails every time in the Network code. It fails once when trying to solve "services" to port number (something that can easily be commented away) but also later on in the platform implementation of the `socket` command. It got too late, so I gave up. Anybody who wants to continue? This should provide an alternative implementation of Tcl in the browser. [EF]

[TP] You might want to start smaller.  I have compiled and run [Picol] as an experiment back when emscripten was just getting started.  I know of other Tclers who have also compiled [Jim].  Jim is a good candidate for emscripten, since it is built as a core plus several modules that can be switched on or off with configure directives.  To compile Tcl, you will probably have to start with the ./unix/ directory, gut most of the C files in that directory, leaving the  internal interfaces but return TCL_ERROR or similar.

[EF] I am aware of those smaller alternatives. Thing is that I was impressed that the whole "generic" went without any real glitches (or almost). unix didn't seem that bad either... But I'll look into Jim again, as it's much closer to the "real thing" than picol is as far as I can remember.  

[stevel] I've done it to Jim Tcl (see Tcl 2011 paper) but it was slow, although it would be interesting to see how a more recent emscripten would perform. A better approach is Arnulf Wiedemann's [APWTCL] 

[TP] I was able to compile and run [Jim] with these steps.  You should already have emscripten installed and be able to compile a simple hello world or equivalent, and have the emscripten commands available on your PATH.  See https://github.com/kripken/emscripten/wiki/Emscripten-SDK%|%Emscripten-SDK%|%.  I cloned the jimtcl repository from https://github.com/msteveb/jimtcl%|%Github%|%.


======
cd jimtcl
emconfigure ./configure --without-ext="aio load signal" --disable-shared --disable-lineedit
emmake make
mv jimsh jimsh.bc
emcc jimsh.bc -o jimsh.html
======

Now load up the jimsh.html page in your browser (e.g., file:///home/user/jimtcl/jimsh.html).  This page has a rudimentary dialog box for standard input.  If you have time, you might try interfacing with one of the nicer [repl] webpages, see the 
https://github.com/kripken/emscripten/wiki#programming-languages%|%Emscripten wiki%|% for examples.

[aidanhs] I created http://aidanhs.github.io/emtcl/ a while ago. It shows both Tcl and JimTcl running in the browser. In addition, it comes with an extension to Tcl for manipulating the dom with inline JS - https://github.com/aidanhs/emtcl/blob/master/opt/dom.c

----https://fossil.e-lehmann.de/wacl/index%|%Wacl%|%  is a Tcl distribution for [WebAssembly]. It enables Web developers to embed a Tcl interpreter in the browser and integrate Tcl with JavaScript.

It is an extension of the Emtcl project. But Wacl takes things a few steps further: it integrates a fully featured Tcl interpreter into the webpage and adds the following features:


   * A main tclsh interpreter and capability to get it via JavaScript  
   * An event loop to process all Tcl events (timer events, fileevents, custom events)
   * Client sockets. The socket -async ... command connects to websocket servers with the binary protocol. Then the resulting handle can be used to transmit binary data as with normal TCP sockets.
   * The Tcl library: modules and packages in the Emscripten virtual filesystem. You can add your own packages!
   * Proper initialization via Tcl_Init()
   * An extension to call javascript functions from Tcl
[CGM] Wacl appears to have moved to https://github.com/ecky-l/wacl .
----

emscripten is an interesting idea, but the concept of compiling Tcl, a very high-level language, down to an "assembler" version, also implemented in a high level language, but not using most of the features of it, just seems wonky to me. Would it not make more sense to implement Tcl as a transpiler taking it's high-level lists, dicts, namespaces, and other such notions directly into javascript, which also implements all these features - albeit as ugly as hell. It seems to me that taking javascript libraries and implementing only a scanner, it shouldn't be hard to "compile" to js source. [Larry Smith]


<<categories>> Development | Tcl Implementations