Est. 2003 Intermediate

Falcon

An embeddable Italian scripting language built for multithreaded C++ applications, which folded six programming paradigms - including tabular and message-oriented programming - into a single small VM.

Created by Giancarlo Niccolai

Paradigm Multi-paradigm: the project advertised six integrated paradigms - procedural, class-based object-oriented, prototype-oriented, functional, tabular, and message-oriented
Typing Dynamic, with runtime type checking in the virtual machine
First Appeared 2003
Latest Version 0.9.6.9 "Chimera"; the last packaged source snapshot dates from June 2012, and the planned 1.0 release was never published

Falcon is an open source scripting language and embeddable virtual machine, written in C++ and designed principally by Giancarlo Niccolai, an Italian software developer and IT consultant. It was built to solve a problem that most scripting languages of its era treated as an afterthought: how to drop a script engine into a large, heavily multithreaded C++ application under sustained message load, without the engine becoming the bottleneck or the source of contention.

The answer Niccolai arrived at was unusual on both ends. On the embedding side, Falcon gave every thread its own virtual machine and built its item model so that host data could be handed to scripts without an expensive marshalling step. On the language side, it went in the opposite direction from minimalism, advertising six integrated programming paradigms - procedural, class-based object-oriented, prototype-oriented, functional, tabular, and message-oriented - and inviting programmers to pick whichever ones fit the problem in front of them.

The project never reached a 1.0 release. Development of the 0.9 “Chimera” line effectively stopped in 2012, a rewrite stalled, and both repositories have been quiet since 2023. What remains is one of the more interesting design documents in scripting-language history: a serious, well-engineered attempt at a niche - the embeddable multithreaded scripting engine - that Lua largely won.

History & Origins

From HASTE to Falcon

The language began as a tool Niccolai wrote for himself. Around 2002, working on servers that streamed real-time financial data, he needed a way to express complex alert conditions - business-critical decisions and maintenance actions that had to be evaluated against data as it passed through the system. He wrote a small evaluator and called it HASTE, for Haste Advanced Simple Text Evaluator.

On 23 May 2002 he renamed the project Falcon, in tribute to Giovanni Falcone, the Italian anti-mafia magistrate assassinated by Cosa Nostra in the Capaci bombing on that date in 1992. The renaming fell on the tenth anniversary of the killing.

Building a Language, Not Just an Evaluator

The decision to make Falcon a full language rather than an expression evaluator came later. By Niccolai’s own account in Linux Journal, it was in late 2003 - after testing the available scripting engines against his requirements and finding all of them wanting - that he decided to write one from the ground up.

His objection to the incumbents was specific rather than aesthetic. As he put it in the project’s own “About” page, mainstream scripting languages were “born as stand-alone solutions, and then made embeddable”, and their behaviour under multithreading “ranged from hard […] to none.” The problem he cared most about was not raw VM speed but the cost of the boundary: converting host application data into script values and back again, at high frequency, could easily consume more time than running the scripts themselves.

Development continued privately for several more years. Falcon was released as open source in 2008, with version 0.8.8 reaching Ubuntu’s repositories in February of that year and the project’s custom licence dated March 2008.

The Open Source Years

The public phase was brisk. The 0.8 line ran through 2008 - distribution changelogs record 0.8.10 around June and 0.8.14 around December - and the 0.9 “Chimera” series opened in 2009, folding the threading module directly into the core engine. Releases arrived every few months: 0.9.2 in July 2009, 0.9.4 with functional generators in August, then the long-lived 0.9.6.x bugfix line through 2010.

Falcon picked up genuine, if modest, institutional attention in this period - the AuroraUX operating system, KDE’s Kross scripting framework, the Blastwave Solaris package community, an XChat plugin interface, a Linux Journal feature in 2008 and a Computerworld interview in 2009. Niccolai estimated the active developer community at ten to twelve people at its peak.

The 1.0 That Never Shipped

In April 2011 the project held a public roadmap meeting for release 1.0, and Niccolai began a substantial rewrite around a new engine he called the Organic Virtual Machine, along with a standalone parser and a reflection system for the syntax tree. Progress reports appeared on the project site through 2011 and into 2012.

The rewrite never landed. The last Chimera version, 0.9.6.9, is represented in Debian and Ubuntu by a source snapshot dated 6 June 2012, and no 1.0 was released. Niccolai made one further attempt: the Falcon2 repository, started in December 2017 under the Apache 2.0 licence, describes itself as “the new incarnation of the Falcon Programming Language.” Its last commit - “Bootstrapping the new Item infrastructure” - was in March 2023. The original engine’s repository received a build fix for modern C++ compilers in November 2023 and has been quiet since.

Design Philosophy

Six Paradigms, Pick What You Need

Falcon’s front page put the philosophy plainly: “you don’t have to master all of them; you just need to pick the ingredients you prefer, and let the code follow your inspiration.” Asked in 2009 which paradigm the language really belonged to, Niccolai answered “all and none.”

This was a deliberate rejection of the purism common in language design. Niccolai, a longtime C, C++ and Prolog developer, argued that existing dynamic languages were “too much unorganized” - that some liberties of untyped languages were barely exploited while others were pushed too far, and that there was no real reason to enforce a hard division between functional and procedural code, or to insist that everything be an object.

Zero Scripting in Libraries

The most consequential and most contrarian decision was the module policy. Every standard Falcon module was written in C or C++ - never in Falcon itself. The project quoted a user’s formulation approvingly: “scripts are like recipes, and libraries are like ingredients. When you start writing your ingredients with recipes, then there’s something wrong.”

The upside is that library calls run at native speed and integrate directly with the VM’s data-sharing machinery. The downside was one the project acknowledged frankly on its own comparison page, under a heading that began “This is our weak point”: a language whose standard library must be written in C++ grows that library far more slowly than one where any user can contribute a pure-script package. Falcon’s library never came close to Python’s or Perl’s, and the project’s proposed remedies - a dynamic C library loader (dynlib) and an automated binding generator (falbind) - were partial answers at best.

Designed Backwards From Embedding

Most scripting languages were designed as standalone tools and later fitted with an embedding API. Falcon inverted the order. Its concurrency model gives each thread its own virtual machine with no shared global lock, so that many scripts can run concurrently inside one host process without contending; its item model was built so that native structures could be mapped onto script objects rather than copied into them; and its module system assumes the host application, not the script, owns the process.

Key Features

The Two Unusual Paradigms

Four of Falcon’s six paradigms are familiar. The other two are what make it worth studying.

Tabular programming treats a table as a first-class language construct: columns are properties, rows are instances, and a cell may hold any Falcon item at all - a number, a string, a class, a function, or another table. The project’s argument for it was pragmatic rather than theoretical. Where adding a newly discovered dimension to a problem might force a class hierarchy to be redesigned, adding a column can be done at runtime. Tables were pitched as a natural fit for business rules, behaviour selection, and fuzzy-logic engines.

Message-oriented programming gives objects a publish/subscribe channel that reaches down into the virtual machine itself. Objects subscribe to named slots and receive broadcasts rather than direct calls, and - crucially for the embedding use case - a multithreaded host application can throw messages into the VM from many threads for serialised handling at script level. Messages can carry not just data but functions and whole functional sequences.

Here is subscription and broadcast in practice, from the language’s own sample suite:

class CmdManager( id, cmd )
   id = id
   cmd = cmd

   init
      subscribe( "declare", self )
   end

   function activation( extra )
      >> "Manager ", self.id, " activated on '", self.cmd, "'"
      if extra != nil
         >> " (on param ", extra, ")"
      end
      >
   end
end

The > and >> operators are Falcon’s print statements - > terminates the line, >> does not.

Ordinary Falcon

For everything else the syntax is a readable blend of C-family expressions and keyword-delimited blocks, with end closing every construct and no semicolons:

directive strict = on

function fib( n )
   if n < 2
      return n
   else
      return fib(n-1) + fib(n-2)
   end
end

> "Fibonacci of 30 is ", fib( 30 )

Closures and higher-order functions are first class, and from 0.9.4 they could be used as generators driven by a plain for/in loop:

function makeGen( vector )
   i = 0
   return function()
      if i == vector.len(): return oob(0)
      return vector[i++]
   end
end

f = makeGen( .[ 'a' 'b' 'c' 'd' ] )
for value in f
   >> value
   formiddle : >> ", "
   forlast : > "."
end

Two Falcon-specific ideas appear here. .[ ... ] is array-literal syntax borrowed from the language’s functional sequence notation. oob() marks a value as out-of-band - a side channel that lets a function return a normal-looking value flagged as meta-information, which is how a generator signals exhaustion without a sentinel or an exception.

The Rest of the Toolbox

FeatureDescription
CoroutinesLight parallelism scheduled by the VM, with semaphores and yieldOut() for cooperative handoff, independent of OS threads
Agent-model threadingEach OS thread gets its own VM; garbage collection spans them, and message passing rather than shared state is the intended coupling
FTD templatesFalcon Template Documents embed <? ... ?> script blocks in text, the same shape PHP uses, for server-side page generation
Virtual filesystemFrom 0.9, URIs can be opened as if local, so an application’s components may live in an archive or across a network
Native i18nTranslation is built into the engine and shared between sources, precompiled modules and native C++ modules; even identifiers may be written in any language
MetaprogrammingThe compiler can start a VM mid-compilation and fold its output into the program being compiled
Binary data accessDirect, VM-checked access to raw memory buffers, so a stream can be read as text or as bytes
dynlibLoads and calls C shared libraries directly from script, with type safety, in place of a hand-written binding
DBIDatabase layer with drivers for MySQL, PostgreSQL, SQLite3, ODBC and Firebird
Other modulescURL, D-Bus, GD2, GTK, PDF, SDL, IMAP, plus WOPI and the Nest framework for web applications
FaldocDocumentation generator for Falcon sources

Licensing

Falcon shipped under the Falcon Programming Language License (FPLL) version 1.1, dated March 2008 - a licence derived from the Apache License text - with GPLv2 available as an alternative; both licence files sit in the source tree. The Falcon2 rewrite abandoned the custom licence entirely in favour of plain Apache 2.0, which is generally the more practical choice for an embeddable engine.

Performance

Falcon’s performance claims need careful handling, because the widely-quoted numbers come from the project itself.

The Falcon site published a “Facts Table” comparing Falcon against Python, Ruby, PHP5, Lua and Perl. Its one quantitative row was “raw VM loop speed”, measured by running each engine on a program equivalent to this C code:

1
2
int a = 0;
for( int i = 0; i < 100000000; i++ ) a = a + 1;

Results were reported in thousands of loop iterations per second: Lua 1247, Falcon 1023, PHP5 670, Python 442 (2.x) and 340 (3.x), Perl 369, Ruby 116.

Every caveat that can attach to a benchmark attaches to this one. It was published and run by the language’s own authors, around 2008-2009, on unstated hardware, against unstated versions of the comparison engines, and it measures an empty increment loop rather than any realistic workload. The project said as much itself, noting that the figure “is not to be considered an overall speed indicator” but only “an indicator of the relative complexity of doing the simplest possible thing within the language boundaries.” Note also that Falcon did not win its own benchmark - Lua did.

The defensible reading is narrower and more interesting. Falcon’s design bet was never that its interpreter loop would beat everyone else’s; Niccolai said explicitly that speed “is not language specific” and that what mattered was the whole input-processing-output pipeline. The claim worth taking seriously is the architectural one: an engine that maps host data structures onto script items instead of copying them, and that avoids a global interpreter lock by giving each thread its own VM, has structurally less work to do at the embedding boundary than a runtime that must marshal values and serialise access. That claim was never independently benchmarked, and no current measurements of Falcon against a modern CPython, LuaJIT or V8 exist.

Evolution

Falcon’s arc compresses into about a decade. Roughly five years of private development (2003-2008) produced a working engine; four years of public development (2008-2012) produced a stable 0.9 line, a module ecosystem, packaging in the major Linux distributions, and a small but real set of adopters. Then the attempt to build 1.0 as a rewrite rather than an evolution consumed the remaining momentum.

The rewrite decision looks, in retrospect, like the pivot point. The 2011 “Organic VM” work was ambitious - a new engine, a standalone parser, syntax-tree reflection - and it was undertaken by a project whose bus factor was close to one. When it stalled, there was no incremental release path to fall back on, because the shipping line had been frozen in favour of the rewrite. The 2017 Falcon2 attempt repeated the pattern from an even smaller base.

Meanwhile the niche Falcon aimed at did not stay empty. Lua, already dominant in embedded scripting when Falcon started, kept its lead by being smaller and simpler rather than richer; LuaJIT arrived in 2005 and made the performance argument decisively; and JavaScript engines became embeddable at industrial quality. Falcon’s differentiators - a threading model without a global lock, cheap host-data interop, six paradigms - were real advantages that never accumulated enough users to matter.

Current Relevance

Falcon today is dormant. The falconpl/falcon repository on GitHub is still public and unarchived, with a last commit in November 2023 - a patch to make the 0.9 engine build against modern C++ compilers and libraries, which is to say a preservation commit rather than a development one. The Falcon2 rewrite has been idle since March 2023. The falconpl.org domain no longer serves the original site.

Debian and Ubuntu carried falconpl packages built from the June 2012 snapshot for several release cycles, which for a long time made Falcon unusually easy to install for a dormant language, but the package is no longer present in current releases of either distribution. Anyone wanting to run Falcon now should expect to build it from the GitHub source with CMake; the project’s own build instructions target Linux, and support for other platforms should be treated as untested.

There is no active community, no package ecosystem, no ongoing release schedule, and no active successor carrying the design forward - the Falcon2 repository is the only attempt, and it too is dormant. Its documentation survives largely through the Internet Archive.

Why It Matters

Falcon is worth remembering for three reasons, none of which is adoption.

It took the embedding boundary seriously as a design constraint. Most language designers treat the C API as something to bolt on once the language works. Falcon started from the question “what does a C++ server need from a script engine?” and let the answer shape the item model, the threading model, and the module policy. The specific insight - that marshalling cost between host and script can dominate execution cost - is correct, underappreciated, and directly relevant to anyone embedding a runtime today.

It rejected the global interpreter lock early. Falcon’s per-thread VM with message passing between agents - designed in from the outset and folded into the core engine with the 0.9 line in 2009 - is, in outline, the model that Python spent the following two decades trying to reach and only began delivering with the free-threading work of the 2020s. Falcon got there early by not having to preserve compatibility with anything.

It is a clean case study in why paradigm richness does not win adoption. Falcon offered tabular and message-oriented programming as first-class constructs - genuinely novel additions that no mainstream language has since matched - and it did not help. What sank it was the thing its own facts table admitted to: a small library, made small on purpose by a policy that forbade writing modules in the language itself. Falcon lost to Lua, which offers fewer paradigms and a smaller core, because Lua’s simplicity made it embeddable everywhere and its C API made bindings cheap.

The design ideas outlived the implementation. That is a common fate for ambitious niche languages, and it is why Falcon is more useful to read about than it ever was to program in.

Timeline

2002
Giancarlo Niccolai builds a scripting engine called HASTE (Haste Advanced Simple Text Evaluator) while working on real-time financial data streaming servers, and renames it Falcon on 23 May - the tenth anniversary of the assassination of Italian anti-mafia magistrate Giovanni Falcone
2003
After evaluating the existing embeddable scripting engines and finding none that suited high-throughput multithreaded servers, Niccolai begins building the Falcon language and virtual machine from the ground up in C++
2008
Falcon is released as open source. The Falcon Programming Language License (FPLL) version 1.1, an Apache-derived licence, is dated March 2008, and version 0.8.8 is packaged for Ubuntu in February 2008
2008
Linux Journal publishes "The Falcon Programming Language in a Nutshell", the language's first significant mainstream coverage
2009
The 0.9 "Chimera" series begins, bringing the threading module into the core engine; 0.9.1.8 is packaged in May, 0.9.2 in July and 0.9.4 - which introduced functional generators - in August
2009
Niccolai is interviewed for Computerworld's "A-Z of Programming Languages" series in April, and the AuroraUX operating system project adopts Falcon as a scripting language alongside Ada
2010
The 0.9.6.x bugfix line ships through the year - 0.9.6.2 in February, 0.9.6.4 around April and 0.9.6.6 in October - adding the hash module, Base64, event-model messaging and a configurable garbage collector
2011
Development moves from Subversion to Git and the project opens its GitHub organisation in May. A public roadmap meeting for release 1.0 is held on 29 April, and work begins on a rewritten "Organic" virtual machine intended to power it
2012
Version 0.9.6.9 is the last of the Chimera line; the source snapshot that Debian and Ubuntu shipped for years afterwards is dated 6 June 2012. Release 1.0 never arrives
2017
Niccolai starts the Falcon2 repository in December as "the new incarnation of the Falcon Programming Language", this time under the Apache 2.0 licence rather than the custom FPLL
2023
The last commits land on both repositories - Falcon2 in March, and a build-modernisation fix to the 0.9 engine in November. Neither line has produced a release since

Notable Uses & Legacy

AuroraUX

An OpenSolaris-derived operating system project that selected Falcon as a scripting language for its userland tooling, pairing it with Ada for systems code. The Falcon project listed AuroraUX as an official partner, and Niccolai cited it in 2009 as one of the language's earliest institutional adopters.

KDE Kross

Kross is KDE4's scripting framework, which exposes a single embedding API to several script interpreters. A Falcon backend was developed for it, letting KDE applications be scripted in Falcon in the same way they could be scripted in Ruby, Python or JavaScript. The Falcon project listed the Kross developers as collaborators on binding work.

XChat

The IRC client XChat gained a Falcon plugin interface, making Falcon one of the scripting options available for automating and extending the client. Niccolai listed it among the language's early integrations in his 2009 Computerworld interview.

Blastwave

The Solaris/SunOS open source package repository community worked with the Falcon project, both packaging Falcon for Sun platforms and using it in the repository's own tooling. The project credited Blastwave with helping port Falcon to Sun systems.

Embedded scripting in multithreaded C++ servers

Falcon's original and defining use case, and the one it was designed backwards from: acting as the rules and alerting engine inside real-time data acquisition and dispersion servers, where, according to Niccolai's own account of the requirement, scripts may be invoked very frequently on data arriving from many threads at once.

Language Influence

Influenced By

Running Today

Run examples using the official Docker image:

docker pull
Last updated: