================== Numba Architecture ================== .. contents:: Introduction ============ This document serves two purposes: to introduce other developers to the high-level design of Numba's internals, and as a point for discussion and synchronization for current Numba developers. Core Entry Points ================= Numba has several modes of use: #. As a run-time translator of Python functions into low-level functions. #. As a call-time specializer of Python functions into low-level functions. #. As a run-time builder of extension types. #. As a compile-time translator of Python modules into shared object libraries. #. Template instantiation. The following subsections describe the primary entry points for these modes of use. Each usage mode corresponds to a specific set of definitions provided in the top-level numba module. Run-time Translation -------------------- .. |jit| replace:: :py:func:`numba.jit` Users denote run-time translation of a function using the |jit| decorator. Call-time Specialization ------------------------ .. |autojit| replace:: :py:func:`numba.autojit` Users denote call-time specialization of a function using the |autojit| decorator. Extension Types --------------- Numba supports building extension types using the |jit| decorator on a class. Compile-time Translation ------------------------ .. |export| replace:: :py:func:`numba.export` .. |exportmany| replace:: :py:func:`numba.exportmany` Users denote compile-time translation of a function using the |export| and |exportmany| decorators. Translation Internals ===================== Towards More Modular Pipelines ------------------------------ The end goal of building a more modular pipeline is to decouple stages of compilation and make a more modular way of composing transformations. - State threaded through the pipeline 1) AST - Abstract syntax tree, possibly mutated as a side-effect of a pass. 2) Structured Environment - A dict like object which holds the intermediate forms and data produced as a result of data. - Composition of Stages - Sequencing - Composition Operator - Error handling and reporting in pass failure. - Pre/Post Condition Checking - Stages should have attached pre / post conditions to check the success criterion of the pass for the inputted or resulting ast and environment. Failure to meet this conditions should cause the pipeline to halt. Modularity ~~~~~~~~~~ Note: recursive definitions :: jit := parse o link o jit pycc := parse o emit o link autojit := cache o autojit cache := pipeline o jit blaze := mapast o jit Diagram ~~~~~~~ :: Block diagram: Input | +----------------------+ | pass 1 | +--------|----------|--+ context ast | | postcondition | | | precondition | | | +--------|----------|--+ | pass 2 | +--------|----------|--+ context ast | | postcondition | | | precondition | | | +--------|----------|--+ | pass 3 | +--------|----------|--+ context ast | | precondition | | | +----------+-----> Output *Discussion: Pipeline Composition* ---------------------------------- .. |Pipeline| replace:: :py:class:`numba.pipeline.Pipeline` We can do composition in a functional way:: def compose_stages(stage1, stage2): def composition(ast, env): return stage2(stage1(ast, env), env) return composition pipeline = compose_stages(...compose_stages(parse, ...), ...) Or, we can do composition using iteration:: for stage in stages: ast = stage(ast, env) Whether the end result is a function or a class is also still up for discussion. Proposal 1: We replace the Pipeline class to use a list of stages, but these can either be functions or subclasses of the ``PipelineStage`` class. *Discussion: Pipeline Environments* ----------------------------------- Proposal 1: We present an ad hoc environment. This provides the most flexibility for developers to patch the environment as they see fit. Proposal 2: We present a well defined environment class. The class will have well defined properties that are documented and type-checked when the internal stage checking flag is set. Terms and Definitions ===================== Appendix ========