STALIN(1)
๐ stalin(1) ๐
from the General Commands Manual (section 1, bestie, we're in the big leagues)
๐ธ NAME ๐ธ
stalin โ a global optimizing compiler for Scheme ๐ฆ
โจ SYNOPSIS โจ
okay so here's the whole vibe, in one block, no cap:
stalin [-version]
[-I include-directory]*
[[-s|-x|-q|-t]]
[[-treat-all-symbols-as-external|
-do-not-treat-all-symbols-as-external]]
[[-index-allocated-string-types-by-expression|
-do-not-index-allocated-string-types-by-expression]]
[[-index-constant-structure-types-by-slot-types|
-do-not-index-constant-structure-types-by-slot-types]]
[[-index-constant-structure-types-by-expression|
-do-not-index-constant-structure-types-by-expression]]
[[-index-allocated-structure-types-by-slot-types|
-do-not-index-allocated-structure-types-by-slot-types]]
[[-index-allocated-structure-types-by-expression|
-do-not-index-allocated-structure-types-by-expression]]
[[-index-constant-headed-vector-types-by-element-type|
-do-not-index-constant-headed-vector-types-by-element-type]]
[[-index-constant-headed-vector-types-by-expression|
-do-not-index-constant-headed-vector-types-by-expression]]
[[-index-allocated-headed-vector-types-by-element-type|
-do-not-index-allocated-headed-vector-types-by-element-type]]
[[-index-allocated-headed-vector-types-by-expression|
-do-not-index-allocated-headed-vector-types-by-expression]]
[[-index-constant-nonheaded-vector-types-by-element-type|
-do-not-index-constant-nonheaded-vector-types-by-element-type]]
[[-index-constant-nonheaded-vector-types-by-expression|
-do-not-index-constant-nonheaded-vector-types-by-expression]]
[[-index-allocated-nonheaded-vector-types-by-element-type|
-do-not-index-allocated-nonheaded-vector-types-by-element-
type]]
[[-index-allocated-nonheaded-vector-types-by-expression|
-do-not-index-allocated-nonheaded-vector-types-by-expression]]
[[-no-clone-size-limit|
-clone-size-limit number-of-expressions]]
[-split-even-if-no-widening]
[[-fully-convert-to-CPS|
-no-escaping-continuations]]
[-du]
[-Ob] [-Om] [-On] [-Or] [-Ot]
[-d0] [-d1] [-d2] [-d3] [-d4] [-d5] [-d6] [-d7]
[-closure-conversion-statistics]
[-dc] [-dC] [-dH] [-dg] [-dh]
[-d]
[-architecture name]
[[-baseline|
-conventional|
-lightweight]]
[[-immediate-flat|
-indirect-flat|
-immediate-display|
-indirect-display|
-linked]]
[[-align-strings|-do-not-align-strings]]
[-de] [-df] [-dG] [-di] [-dI] [-dp] [-dP]
[-ds] [-dS] [-Tmk]
[-no-tail-call-optimization]
[-db] [-c] [-k]
[-cc C-compiler]
[-copt C-compiler-option]*
[pathname]
and here's what it's actually doing, plain and simple: it compiles the Scheme source file pathname.sc โ first into a C file pathname.c, and then into an executable image pathname. it also produces a database file pathname.db. ๐ซถ and listen, the pathname argument is required unless you pass -version. so don't just run it bare and act surprised, okay?
๐ฆ DESCRIPTION ๐ฆ
okay so Stalin is an extremely efficient compiler for Scheme. like, the point of it is not to be your cozy little dev tool โ it's meant to be the thing you use to generate efficient executable images, either for shipping an application or for production research runs. ๐
in contrast to traditional Scheme implementations, Stalin is a batch-mode compiler. there is no interactive READ-EVAL-PRINT loop. nope. not one. Stalin compiles a single Scheme source file into an executable image (indirectly, via C, iykyk). running that image has equivalent semantics to loading the Scheme source file into a virgin Scheme interpreter and then terminating its execution.
the chief limitation, and I need you to hear me on this: it is not possible to LOAD or EVAL new expressions or procedure definitions into a running program after compilation. that's the trade. that's the whole deal. ๐ญ
in return for this limitation, Stalin does substantial global compile-time analysis of the source program under this closed-world assumption, and produces executable images that are small, stand-alone, and fast. periodt. ๐
Stalin incorporates numerous strategies for generating efficient code. among them:
- Stalin does global static type analysis using a soft type system that supports recursive union types.
- Stalin can determine a narrow or even monomorphic type for each source code expression in arbitrary Scheme programs with no type declarations. (the way that works is genuinely iconic.)
- this lets Stalin reduce, or often eliminate, run-time type checking and dispatching.
- Stalin also does low-level representation selection on a per-expression basis.
- this allows the use of unboxed base machine data representations for all monomorphic types, resulting in extremely high-performance numeric code. ๐ฅ
- Stalin also does global static life-time analysis for all allocated data.
- this allows much temporary allocated storage to be reclaimed without garbage collection.
- finally, Stalin has very efficient strategies for compiling closures.
together, these compilation techniques synergistically yield efficient object code. โจ
furthermore, the executable images created by Stalin do not contain:
- (user-defined or library) procedures that aren't called
- variables and parameters that aren't used
- expressions that cannot be reached
and this is the part I'm obsessed with: it encourages a programming style where you just create and use very general library procedures without any fear that your executable images will suffer from code bloat. go wild bestie, it's fine ๐
๐ OPTIONS ๐
โญ the loneliest option
-versionโ prints the version of Stalin and exits immediately.
๐ง the following options control preprocessing
-Iโ specifies the directories to search for Scheme include files. this option can be repeated to specify multiple directories. Stalin searches for include files in the current directory first, then each of the directories specified on the command line, and finally in the default installation include directory. ๐-sโ includes the macros from the Scheme->C compatibility library. currently, this defines theWHENandUNLESSsyntax.-xโ includes the macros from the Xlib and GL library. currently, this defines theFOREIGN-FUNCTIONandFOREIGN-DEFINEsyntax. this implies-s.-qโ includes the macros from the QobiScheme library. currently, this defines theDEFINE-STRUCTUREsyntax, among other things. this implies-x.-tโ includes the macros needed to compile Stalin with itself. this implies-q.
๐ฎ the following options control the precision of flow analysis
-treat-all-symbols-as-externalโ during flow analysis, generate a single abstract external symbol that is shared among all symbols.-do-not-treat-all-symbols-as-externalโ during flow analysis, when processing constant expressions that contain symbols, generate a new abstract internal symbol for each distinct symbol constant in the program. this is the default.-index-allocated-string-types-by-expressionโ during flow analysis, when processing procedure-call expressions that can allocate strings, generate a new abstract string for each such expression. this is the default.-do-not-index-allocated-string-types-by-expressionโ during flow analysis, when processing procedure-call expressions that can allocate strings, generate a single abstract string that is shared among all such expressions.
heads up: there are no versions of the above options for element type, because the element type of a string is always char. and there are also no versions of the above options for constant expressions, because there is always only a single abstract constant string. ๐ so don't go looking for them.
-index-constant-structure-types-by-slot-typesโ during flow analysis, when processing constant expressions that contain structures, generate a new abstract structure for each set of potential slot types for that structure.-do-not-index-constant-structure-types-by-slot-typesโ during flow analysis, when processing constant expressions that contain structures, generate a single abstract structure that is shared among all sets of potential slot types for that structure. this is the default.-index-constant-structure-types-by-expressionโ during flow analysis, when processing constant expression that contain structures, generate a new abstract structure for each such expression. this is the default.-do-not-index-constant-structure-types-by-expressionโ during flow analysis, when processing constant expressions that contain structures, generate a single abstract structure that is shared among all such expressions.-index-allocated-structure-types-by-slot-typesโ during flow analysis, when processing procedure-call expressions that can allocate structures, generate a new abstract structure for each set of potential slot types for that structure.-do-not-index-allocated-structure-types-by-slot-typesโ during flow analysis, when processing procedure-call expressions that can allocate structures, generate a single abstract structure that is shared among all sets of potential slot types for that structure. this is the default.-index-allocated-structure-types-by-expressionโ during flow analysis, when processing procedure-call expressions that can allocate structures, generate a new abstract structure for each such expression. this is the default.-do-not-index-allocated-structure-types-by-expressionโ during flow analysis, when processing procedure-call expressions that can allocate structures, generate a single abstract structure that is shared among all such expressions.
ngl, a lil note for you: currently, pairs are the only kind of structure that can appear in constant expressions. this may change in the future, if the reader is extended to support other kinds of structures. ๐
-index-constant-headed-vector-types-by-element-typeโ during flow analysis, when processing constant expressions that contain headed vectors, generate a new abstract headed vector for each potential element type for that headed vector.-do-not-index-constant-headed-vector-types-by-element-typeโ during flow analysis, when processing constant expressions that contain headed vectors, generate a single abstract headed vector that is shared among all potential element types for that headed vector. this is the default.-index-constant-headed-vector-types-by-expressionโ During flow analysis, when you're processing constant expressions that contain headed vectors, you generate a new abstract headed vector for each such expression. And this is the default, bestie. โจ-do-not-index-constant-headed-vector-types-by-expressionโ During flow analysis, when you're processing constant expressions that contain headed vectors, you generate a single abstract headed vector that is shared among all such expressions. ๐-index-allocated-headed-vector-types-by-element-typeโ During flow analysis, when you're processing procedure-call expressions that can allocate headed vectors, you generate a new abstract headed vector for each potential element type for that headed vector. ๐ฆ-do-not-index-allocated-headed-vector-types-by-element-typeโ During flow analysis, when you're processing procedure-call expressions that can allocate headed vectors, you generate a single abstract headed vector that is shared among all potential element types for that headed vector. This is the default. ๐-index-allocated-headed-vector-types-by-expressionโ During flow analysis, when you're processing procedure-call expressions that can allocate headed vectors, you generate a new abstract headed vector for each such expression. This is the default. ๐ฅ-do-not-index-allocated-headed-vector-types-by-expressionโ During flow analysis, when you're processing procedure-call expressions that can allocate headed vectors, you generate a single abstract headed vector that is shared among all such expressions. ๐-index-constant-nonheaded-vector-types-by-element-typeโ During flow analysis, when you're processing constant expressions that contain nonheaded vectors, you generate a new abstract nonheaded vector for each potential element type for that nonheaded vector. ๐ธ-do-not-index-constant-nonheaded-vector-types-by-element-typeโ During flow analysis, when you're processing constant expressions that contain nonheaded vectors, you generate a single abstract nonheaded vector that is shared among all potential element types for that nonheaded vector. This is the default. ๐-index-constant-nonheaded-vector-types-by-expressionโ During flow analysis, when you're processing constant expressions that contain nonheaded vectors, you generate a new abstract nonheaded vector for each such expression. This is the default. ๐-do-not-index-constant-nonheaded-vector-types-by-expressionโ During flow analysis, when you're processing constant expressions that contain nonheaded vectors, you generate a single abstract nonheaded vector that is shared among all such expressions. โจ-index-allocated-nonheaded-vector-types-by-element-typeโ During flow analysis, when you're processing procedure-call expressions that can allocate nonheaded vectors, you generate a new abstract nonheaded vector for each potential element type for that nonheaded vector. ๐ฆ-do-not-index-allocated-nonheaded-vector-types-by-element-typeโ During flow analysis, when you're processing procedure-call expressions that can allocate nonheaded vectors, you generate a single abstract nonheaded vector that is shared among all potential element types for that nonheaded vector. This is the default. ๐-index-allocated-nonheaded-vector-types-by-expressionโ During flow analysis, when you're processing procedure-call expressions that can allocate nonheaded vectors, you generate a new abstract nonheaded vector for each such expression. This is the default. ๐ฅ-do-not-index-allocated-nonheaded-vector-types-by-expressionโ During flow analysis, when you're processing procedure-call expressions that can allocate nonheaded vectors, you generate a single abstract nonheaded vector that is shared among all such expressions. ๐
Note: right now, constant expressions cannot contain nonheaded vectors, and nonheaded vectors are never allocated by any procedure-call expression. ARGV is the only nonheaded vector. These options are included only for completeness and in case future extensions to the language allow nonheaded vector constants and procedures that allocate nonheaded vectors. ๐
-no-clone-size-limitโ Allow unlimited polyvariance, i.e. make copies of procedures of any size. ๐-clone-size-limitโ Specify the polyvariance limit, i.e. make copies of procedures that have fewer than this many expressions. Must be a nonnegative integer. Defaults to80. Specify0to disable polyvariance. ๐ญ-split-even-if-no-wideningโ Normally, polyvariance will make a copy of a procedure only if it's called with arguments of different types. Specify this option to make copies of procedures even when they're called with arguments of the same type. This will allow them to be in-lined. โจ-fully-convert-to-CPSโ Normally, lightweight CPS conversion is applied, converting only those expressions and procedures needed to support escaping continuations. When this option is specified, the program is fully converted to CPS. ๐-no-escaping-continuationsโ Normally, full continuations are supported. When this option is specified, the only continuations that are supported are those that cannot be called after the procedure that created the continuation has returned. ๐-duโ Normally, after flow analysis, Stalin forces each type set to have at most one structure-type member of a given name, at most one headed-vector-type member, and at most one nonheaded-vector-type member. This option disables this, allowing type sets to have multiple structure-type members of a given name, multiple headed-vector-type members, and multiple nonheaded-vector-type members. Sometimes yields more efficient code and sometimes yields less efficient code. ๐ฒ
The following options control the amount of run-time error-checking code generated. Note that, independent of the settings of these options, Stalin will always generate code that obeys the semantics of the Scheme language for correct programs. These options only control the level of safety, that is the degree of run-time error checking for incorrect programs. ๐
-Obโ Specifies that code to check for out-of-bound vector or string subscripts is to be suppressed. If not specified, a run-time error will be issued if a vector or string subscript is out of bounds. If specified, the behavior of programs that have an out-of-bound vector or string subscript is undefined. ๐-Omโ Specifies that code to check for out-of-memory errors is to be suppressed. If not specified, a run-time error will be issued if sufficient memory cannot be allocated. If specified, the behavior of programs that run out of memory is undefined. ๐ญ-Onโ Specifies that code to check for exact integer overflow is to be suppressed. If not specified, a run-time error will be issued on exact integer overflow. If specified, the behavior of programs that cause exact integer overflow is undefined. Currently, Stalin does not know how to generate overflow checking code so this option must be specified. ๐จ-Orโ Specifies that code to check for various run-time file-system errors is to be suppressed. If not specified, a run-time error will be issued when an unsuccessful attempt is made to open or close a file. If specified, the behavior of programs that make such unsuccessful file-access attempts is undefined. ๐-Otโ Specifies that code to check that primitive procedures are passed arguments of the correct type is suppressed. If not specified, a run-time error will be issued if a primitive procedure is called with arguments of the wrong type. If specified, the behavior of programs that call a primitive procedure with data of the wrong type is undefined. ๐
The following options control the verbosity of the compiler:
-d0โ Produces a compile-time backtrace upon a compiler error. ๐-d1โ Produces commentary during compilation describing what the compiler is doing. ๐ฌ-d2โ Produces a decorated listing of the source program after flow analysis. โจ-d3โ Produces a decorated listing of the source program after equivalent types have been merged. ๐-d4โ Produces a call graph of the source program. ๐-d5โ Produces a description of all nontrivial native procedures generated. ๐-d6โ Produces a list of all expressions and closures that allocate storage along with a description of where that storage is allocated. ๐๏ธ-d7โ Produces a trace of the lightweight closure-conversion process. ๐-closure-conversion-statisticsโ Produces a summary of the closure-conversion statistics. These are automatically processed by the programbcl-to-latex.scwhich is run by thebcl-benchmarkscript (both in the/usr/local/stalin/benchmarksdirectory) to produce tables II, III, and IV, of the paper Flow-Directed Lightweight Closure Conversion. ๐
The following options control the storage management strategy used by compiled code:
-dcโ Disables the use ofalloca(3). Normally, the compiler will usealloca(3)to allocate on the call stack when possible. ๐-dCโ Disables the use of the Boehm conservative garbage collector. Normally, the compiler will use the Boehm collector to allocate data whose lifetime is not known to be short. Note that the compiler will still use the Boehm collector for some data if it cannot allocate that data on the stack or on a region. ๐๏ธ-dHโ Disables the use of regions for allocating data. ๐ซ-dgโ Generate code to produce diagnostic messages when region segments are allocated and freed. ๐-dhโ Disables the use of expandable regions and uses fixed-size regions instead. ๐
The following options control code generation:
-dโ Specifies that inexact reals are represented asC doubles. Normally, inexact reals are represented asC floats. ๐ข-architectureโ Specify the architecture for which to generate code. The default is to generate code for whatever architecture the compiler is run on. Currently, the known architectures areIA32,IA32-align-double,SPARC,SPARCv9,SPARC64,MIPS,Alpha,ARM,M68K,PowerPC, andS390. ๐ป-baselineโ okay so this one just... doesn't do lightweight closure conversion at all? Like, closures get made for every procedure, no skipsies. Bestie, you would not normally ask for this. It exists purely to measure how much good lightweight closure conversion is actually doing for you. Thebcl-benchmarkscript (it lives in the/usr/local/stalin/benchmarksdirectory) uses it to produce tables II, III, and IV of the paper Flow-Directed Lightweight Closure Conversion. That's the whole vibe. ๐-conventionalโ does a simplified version of lightweight closure conversion that does not lean on interprocedural analysis. It's trying to mimic whatconventionalcompilers do (whatever that even means, honestly). Again: you would not normally specify this. It's only here to measure the effectiveness of lightweight closure conversion, and it's used by thebcl-benchmarkscript (in the/usr/local/stalin/benchmarksdirectory) to produce tables II, III, and IV of the paper Flow-Directed Lightweight Closure Conversion.-lightweightโ does the actual lightweight closure conversion. This is the default, bestie. โจ-immediate-flatโ generate code using immediate flat closures. This is not (yet) implemented. ๐-indirect-flatโ generate code using indirect flat closures. This is not (yet) implemented. ๐-immediate-displayโ generate code using immediate display closures.-indirect-displayโ generate code using indirect display closures. This is not (yet) implemented. ๐-linkedโ generate code using linked closures. This is the default. ๐-align-stringsโ align all strings to fixnum alignment. Heads up though: this will not work when strings are returned by foreign procedures that aren't aligned to fixnum alignment. It also won't work whenARGVis used, since those strings are also not aligned to fixnum alignment. This is the default.-do-not-align-stringsโ do not align strings to fixnum alignment. You must specify this when strings returned by foreign procedures are not aligned to fixnum alignment. No cap.-deโ enables the compiler optimization known as EQ? forgery. Sometimes yields more efficient code and sometimes yields less efficient code. It's giving chaos, honestly. ๐ญ-dfโ disables the compiler optimization known as forgery.-dGโ pass arguments using global variables instead of parameters whenever possible.-diโ generate if statements instead of switch statements for dispatching.-dIโ enables the use of immediate structures.-dpโ enables representation promotion. Promotes some type sets from squeezed to squished or squished to general if this will decrease the amount of run-time branching or dispatching representation coercions. Sometimes yields more efficient code and sometimes yields less efficient code. ๐-dPโ enables copy propagation. Sometimes yields more efficient code and sometimes yields less efficient code.-dsโ disables the compiler optimization known as squeezing.-dSโ disables the compiler optimization known as squishing.-Tmkโ enables generation of code that works with the Treadmarks distributed-shared-memory package. Currently this option is not fully implemented and is not known to work. ๐-no-tail-call-optimizationโ okay bestie this one is a whole saga, sit down. โ
So: Stalin now generates code that is properly tail recursive, by default, in all but the rarest of circumstances. And it can be coerced into generating properly tail-recursive code in all circumstances by appropriate options. Some tail-recursive calls โ the ones where the call site is in-lined in the target โ get translated as C goto statements and always result in properly tail-recursive code. The rest are translated as C function calls in tail position. That relies on the C compiler to perform tail-call optimization.
gcc(1) versions 2.96 and 3.0.2 (and perhaps other versions) perform tail-call optimization on IA32 (and perhaps other architectures) when -foptimize-sibling-calls is specified. (-O2 implies -foptimize-sibling-calls.) But gcc(1) only performs tail-call optimization on IA32 in certain circumstances:
- First, the target and the call site must have compatible signatures. To guarantee compatible signatures, Stalin passes parameters to C functions that are part of tail-recursive loops in global variables.
- Second, the target must not be declared
__attribute__ ((noreturn)). So Stalin will not generate a__attribute__ ((noreturn))declaration for a function that is part of a tail-recursive loop, even if Stalin knows that it never returns. - Third, the function containing the call site cannot call
alloca(3).gcc(1)does no flow analysis. Any call toalloca(3)in the function containing the call site โ no matter whether the allocated data escapes โ will disable tail-call optimization. So Stalin disables stack allocation of data in any procedure in-lined in a procedure that is part of a tail-recursive loop. - Finally, the call site cannot contain a reentrant region, because reentrant regions are freed upon procedure exit and a tail call would require an intervening region reclamation. So Stalin disables allocation of data on a reentrant region in any procedure that is part of a tail-recursive loop.
Disabling these optimizations incurs a cost, for the benefit of achieving tail-call optimization. If your C compiler does not perform tail-call optimization, then you may wish not to pay the cost.
The -no-tail-call-optimization option causes Stalin not to take these above four measures to generate code on which gcc(1) would perform tail-call optimization. Even when specifying this option, Stalin still translates calls, where the call site is in-lined in the target, as C goto statements.
There are three rare occasions that can still foil proper tail recursion:
- First, if you specify
-dCyou may force Stalin to use stack or region allocation even in a tail-call cycle. You can avoid this by not specifying-dC. - Second,
gcc(1)will not perform tail-call optimization when the function containing the call site applies unary&to a local variable.gcc(1)does no flow analysis. Any application of unary&to a local variable in the function containing the call site โ no matter whether the pointer escapes โ will disable tail-call optimization. Stalin can generate such uses of unary&when you specify-deor don't specify-df. You can avoid such cases by specifying-dfand not specifying-de. - Finally,
gcc(1)will not perform tail-call optimization when the function containing the call site callssetjmp(3).gcc(1)does no flow analysis. Any call tosetjmp(3)in the function containing the call site โ no matter whether thejmp_bufescapes โ will disable tail-call optimization. Stalin translates certain calls tocall-with-current-continuationas calls tosetjmp(3). You can force Stalin not to do so by specifying-fully-convert-to-CPS.
Stalin will generate a warning in the first and third cases, namely, when tail-call optimization is foiled by reentrant-region allocation or calls to alloca(3) or setjmp(3). So you can hold off specifying -fully-convert-to-CPS or refraining from specifying -dC until you see such warnings. No such warning is generated, however, when uses of unary & foil tail-call optimization. So you might want to always specify -df and refrain from specifying -de if you desire your programs to be properly tail recursive. Fr fr. ๐ซถ
The following options control the C-compilation phase:
-dbโ disables the production of a database file.-cโ specifies that the C compiler is not to be called after generating the C code. Normally, the C compiler is called after generating the C code to produce an executable image. This implies-k.-kโ specifies that the generated C file is not to be deleted. Normally, the generated C file is deleted after it is compiled.-ccโ specifies the C compiler to use. Defaults togcc(1).-coptโ specifies the options that the C compiler is to be called with. Normally the C compiler is called without any options. This option can be repeated to allow passing multiple options to the C compiler. Obsessed with the repeatability, honestly. โจ
๐ FILES ๐
/usr/local/stalin/include/โ default directory for Scheme include files and library archive files/usr/local/stalin/include/Scheme-to-C-compatibility.scโ include file for Scheme->C compatibility/usr/local/stalin/include/QobiScheme.scโ include file for QobiScheme/usr/local/stalin/include/xlib.scโ include file for Xlib FPI/usr/local/stalin/include/xlib-original.scโ include file for Xlib FPI/usr/local/stalin/include/libstalin.aโ library archive for Xlib FPI/usr/local/stalin/include/gc.hโ include file for the Boehm conservative garbage collector/usr/local/stalin/include/libgc.aโ library archive for the Boehm conservative garbage collector/usr/local/stalin/include/stalin.architecturesโ the known architectures and their code-generation parameters/usr/local/stalin/include/stalin-architecture-nameโ shell script that determines the architecture on which Stalin is running/usr/local/stalin/stalin-architecture.cโ program to construct a new entry forstalin.architectureswith the code-generation parameters for the machine on which it is run/usr/local/stalin/benchmarksโ directory containing benchmarks from the paper Flow-Directed Lightweight Closure Conversion/usr/local/stalin/benchmarks/bcl-benchmarkโ script for producing tables II, III, and IV from the paper Flow-Directed Lightweight Closure Conversion/usr/local/stalin/benchmarks/bcl-to-latex.scโ Scheme program for producing tables II, III, and IV from the paper Flow-Directed Lightweight Closure Conversion
๐ SEE ALSO ๐
sci(2), scc(2), gcc(1), ld(1), alloca(3), setjmp(3), gc(8)
๐ BUGS ๐
Version 0.11 is an alpha release and contains many known bugs. Not everything is fully implemented. It's giving "we're so back but also we're not." ๐ญ
Bug mail should be addressed to Bug-Stalin@AI.MIT.EDU and not to the author. Please include the version number (0.11) in the message. ๐ง
Periodic announcements of bug fixes, enhancements, and new releases will be made to Info-Stalin@AI.MIT.EDU. Send mail to Info-Stalin-Request@AI.MIT.EDU to be added to the Info-Stalin@AI.MIT.EDU mailing list.
๐ AUTHOR ๐
Jeffrey Mark Siskind
๐ THANKS ๐
okay so we gotta give the biggest shoutout ever to Rob Browning, because he's the one who packaged version 0.11 for Debian Linux ๐ซถโจ like, he took our chaotic little compiler and made it installable on an actual distro, which is genuinely iconic behaviour and we are so grateful fr fr ๐
no cap, packagers are the unsung heroes of the free software world โ they do the unglamorous glue work so the rest of us can just type a command and go ๐
and Rob did exactly that for Debian Linux at version 0.11 ๐ธ
and that's a wrap bestie!! ๐ฆ you made it all the way to the end of the page, which is main character energy ๐ this whole thing was the STALIN(1) manual, sitting at version 0.11, dated August 2006 ๐ go forth, compile something cursed, and remember: the vibe check is eternal ๐
โจ๐
๐ฆ where this page comes from
- debian bookworm: stalin 0.11-7
- debian trixie: stalin 0.11-10
- ubuntu jammy: stalin 0.11-6build2
- ubuntu noble: stalin 0.11-7
- ubuntu questing: stalin 0.11-11
- ubuntu resolute: stalin 0.11-11build1
- ubuntu stonking: stalin 0.11-11build1
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms