Fact-checked by Grok 2 weeks ago

Portable C Compiler

The Portable C Compiler (PCC) is an early compiler for the C programming language, developed by Stephen C. Johnson at Bell Laboratories in the mid-1970s as a portable implementation designed to facilitate retargeting to various machine architectures with minimal modifications. PCC played a pivotal role in the evolution of Unix and C by debuting in Unix Version 7 in 1979, where it replaced Dennis Ritchie's original machine-specific compiler and enabled the porting of the entire Unix system—including its utilities and libraries—to new platforms like the Interdata 8/32. Its two-pass architecture separated a machine-independent frontend (handling parsing and intermediate code generation) from a backend for code optimization and assembly emission, emphasizing reliability, compatibility with the emerging C standard, and ease of adaptation across register-oriented machines. Key innovations in PCC included the introduction of the void type for functions without return values, improved treatment of structures and unions, and tools like lint for static analysis, which Johnson derived from the compiler's framework to enforce type safety and portability. By the early 1980s, PCC had become the de facto standard C compiler for commercial Unix releases from AT&T System V and Berkeley Software Distribution (BSD), underpinning C's dominance as a systems programming language and contributing to Unix's proliferation on diverse hardware. In the , experienced a revival starting in 2007 under the maintenance of Anders Magnusson, resulting in a rewritten version that achieves full conformance while preserving the original's portable design principles. This modern , with releases up to version 1.1.0 in 2014, supports multiple frontends and backends for contemporary architectures and is integrated into open-source projects, including , , and , where it serves as an alternative to for building kernels and userland software. Its lightweight footprint and focus on standards compliance continue to make it valuable for systems, historical recreations, and environments prioritizing minimal dependencies.

History and Development

Origins at Bell Labs

The development of the Portable C Compiler (PCC) emerged at Bell Laboratories in the mid-1970s, amid the growing need to extend the UNIX operating system beyond its original PDP-11 hardware platform. Following the initial creation of UNIX by Ken Thompson and Dennis Ritchie, the system's reliance on the PDP-11 minicomputer posed challenges for broader adoption, as Bell Labs sought to deploy UNIX across diverse architectures to support internal computing needs without excessive rewriting. Ritchie's early C compiler, introduced around 1972, was tightly coupled to the PDP-11's architecture, incorporating assumptions about word sizes, pointer-integer equivalence, and addressing modes that hindered portability; for instance, attempts to adapt it to machines like the IBM 360 or Honeywell systems required substantial manual modifications. In early 1976, Steve , a researcher at ' Computing Science Research Center, took the lead on redesigning the compiler to prioritize portability from the outset, motivated by the arrival of new such as the Interdata 8/32 minicomputer and the impending DEC VAX-11/780. Johnson's project addressed the original compiler's machine dependencies by restructuring it into modular components—a front-end for parsing and semantics using tools like , and a back-end for code generation that could be retargeted with minimal effort—allowing programs to compile efficiently on non-PDP-11 systems. This effort was part of a broader initiative proposed by Johnson and Ritchie to demonstrate UNIX's , emphasizing that portability should reduce porting time to months rather than years. A prototype of PCC was completed by the end of April 1977, just as the Interdata 8/32 became available for testing, marking the first successful compilation of C code on a non-PDP-11 machine at . Early validation involved standalone debugging environments on the Interdata, followed by integration with UNIX components, and soon extended to the /780, where it facilitated the port of UNIX 6. By 1978, PCC achieved internal release at , compiling C for approximately half a dozen machines and enabling the first production UNIX ports outside the PDP-11 family.

Evolution and Key Milestones

The Portable C Compiler (PCC), developed by at , was initially released in 1978, providing a retargetable implementation of the language that facilitated its use beyond the on which earlier compilers were tightly coupled. This release emphasized modularity and portability, allowing the front-end parser and back-end code generator to be adapted with relative ease to new hardware. PCC debuted in Unix Version 7 in , replacing the original machine-specific compiler and enabling ports to new platforms. PCC was integrated into upon its release in 1982, AT&T's first commercial Unix distribution, enabling standardized C compilation across diverse systems and accelerating the language's adoption in enterprise environments. The compiler's design proved instrumental in porting Unix itself to new platforms, as much of the operating system was rewritten in C using PCC. Key enhancements in the early 1980s incorporated support for features in K&R C, such as improved structure handling. By 1984, had been ported to numerous architectures, including the VAX, Interdata 8/32, and various minicomputers, underscoring its role in expanding C's reach during the Unix commercialization era. saw significant adoption in BSD Unix variants starting with 4BSD in the early 1980s, where it became the default compiler until the mid-1990s, and in commercial hardware like AT&T's 3B series minicomputers, which powered and data processing systems. Johnson's departure from shifted primary maintenance to the broader Bell Labs team, who continued refinements to support evolving Unix variants and hardware. Source code for PCC became more widely available through Unix distributions in the 1980s, promoting community contributions and forks.

Design Principles

Portability Mechanisms

The Portable C Compiler (PCC) achieved cross-platform compatibility through a deliberate separation of its components into machine-independent and machine-dependent parts, allowing the front-end to handle and semantic without regard to the target architecture. The front-end, comprising the first pass of approximately 4,600 lines of code, performed , syntax checking, and symbol table management, with only about 600 lines being machine-specific, primarily for handling architecture-dependent like register names. This design ensured that the bulk of the language processing remained portable across different systems. A key element of PCC's portability was its use of a machine-independent in the form of expression trees, stored in an intermediate file between compilation passes. These trees captured the semantic structure of the program in a platform-agnostic way, facilitating subsequent optimization and tailored to specific machines without altering the front-end. This approach modeled an abstract instruction set, often referred to as a "p-machine" , which abstracted away low-level hardware details like and addressing modes during early compilation stages. By decoupling semantics from machine specifics, PCC minimized the effort required to port the compiler to new architectures. To address variations in data types, memory models, and system interfaces, PCC incorporated conditional compilation directives and architecture-specific macros. For instance, macros and typedefs were used to standardize units such as disk offsets and data representations, enabling adaptations without pervasive code changes. This technique proved effective in handling differences like byte order: on little-endian systems such as the PDP-11 and big-endian systems like the Interdata 8/32, byte swapping was applied selectively during file transfers via conditional directives, preserving runtime portability. As a result, approximately 95% of the 7,000 lines in the UNIX remained identical across these platforms, demonstrating PCC's success in minimizing rewrites for diverse hardware environments.

Modular Architecture

The Portable C Compiler (PCC) employs a modular structure divided into distinct phases that process source code sequentially, enabling clear separation of concerns and facilitating maintenance. The compilation begins with lexical analysis, implemented in the scan.c module, which scans the input stream and tokenizes it using character-indexed tables to identify elements such as identifiers, constants, and operators. This is followed by syntax parsing, driven by a Yacc-generated parser from the cgram.y grammar file, which constructs a parse tree while managing declarations and expressions through external stacks to preserve context. Semantic analysis occurs concurrently in the first pass, involving symbol table operations in modules like pftn.c and type merging via tymerge, ensuring type compatibility and semantic validity. Finally, intermediate code generation in the first pass produces expression trees in Polish prefix notation, which are output to a temporary file for subsequent processing. The front-end of PCC, comprising approximately 75% machine-independent code, handles the initial phases up to and includes an optimizer in the optim.c module. This optimizer performs machine-independent improvements, such as and type coercion adjustments, on the generated trees to enhance efficiency without target-specific knowledge. In contrast, the back-end focuses on target-specific , reading the intermediate trees in the second pass via reader.c and order.c, then emitting assembler code through architecture-dependent assemblers. Machine-dependent elements, such as prologue/epilogue generation in local.c and handling, are isolated to minimize the overall footprint of non-portable code, with the first pass containing only 12% machine-dependent lines and the second pass 30%. Code generation in the back-end relies on table-driven mechanisms to match tree patterns against predefined templates in table.c, allowing flexible selection based on types and goals, such as ASG PLUS for assignment-plus operations targeting input . This approach uses Sethi-Ullman numbering for optimal and heuristic rules for handling complex expressions, enabling retargeting to new architectures with minimal modifications—typically limited to updating machine description files like mac2defs for opcodes and , and local2.c for target routines. For instance, porting to the Interdata 8/32 involved defining templates for simple (OPSIMP) across integer and floating-point types, demonstrating how the table-driven system supports multi- operations with few alterations to core logic. An experimental extension for the further illustrated this by replacing the second pass with a Graham-Glanville-style table generator, using a machine description to produce pattern-matching tables automatically, reducing manual retargeting effort. A pivotal architectural decision in PCC was the avoidance of inline assembly within the core compiler code, instead encapsulating machine-specific behaviors in callable routines like clocal for local optimizations and genswitch for jump tables, which preserved the 's portability across diverse hardware. This modular separation not only streamlined extensions but also aligned with broader portability objectives by isolating dependencies.

Technical Features

Language Compliance and Extensions

The Portable C Compiler (PCC) implements as developed at Bell Laboratories, aligning with the K&R specification from , which serves as its baseline for compliance. This includes full support for primitive data types such as integers, characters, and single- and double-precision floating-point numbers, as well as constructors like pointers, arrays, functions, and records (structs). Pointers are handled with multiple classes for (e.g., byte-aligned and word-aligned p1), enabling arithmetic operations like and comparisons essential for dynamic access in early Unix environments. PCC also provides comprehensive support for structs and unions, allowing structure assignment, passing of structs as function arguments, and returning them from functions—features that enhanced data abstraction in systems programming. Unions are treated similarly to structs, with machine-dependent routines managing their layout and access, ensuring compatibility with the PDP-11 dialect of C prevalent at the time. These capabilities made PCC highly compatible with the then-current PDP-11 version of C, as detailed in contemporary documentation. As an extension beyond strict K&R adherence, PCC incorporates Bell Labs-specific mechanisms for optimization, such as the machine-independent optimizer in optim.c, which performs and other transformations to improve efficiency without altering semantics. Additionally, it includes portable I/O abstractions to facilitate cross-machine compatibility while minimizing library dependencies during . Early versions of PCC exhibited limitations in floating-point handling, where operations defaulted to double and single-precision suffered from inefficient conversions lacking direct optimization, potentially leading to no explicit support for floating-point exceptions. These issues were mitigated in subsequent updates through refined machine-dependent , improving management and exception detection across target architectures.

Code Generation and Optimization

The Portable C Compiler (PCC) generates through a backend process that transforms an of expression , encoded in Polish prefix notation, into target-specific assembly code using a template-matching mechanism. This approach involves predefined templates that describe patterns of , operands, types, and register usage corresponding to machine instructions, enabling the compiler to support diverse instruction sets across architectures like the PDP-11, VAX, and Interdata 8/32. The core match routine systematically compares the structure and attributes of the intermediate —such as type, "cookie" flags for special handling, and node shapes—against these templates to select and emit the optimal instruction sequence, ensuring efficient code production while maintaining portability. Optimization in PCC is primarily handled by a machine-independent (optim.c) that applies local transformations to the intermediate code, focusing on constant expressions and basic algebraic simplifications within basic blocks, reflective of the technological constraints of the late . Key techniques include constant propagation and folding, such as merging additive constants in expressions like (x + a) + b into x + (a + b), eliminating redundant operations like addition by zero, and substituting multiplications by powers of two with bitwise shifts for performance gains on hardware without fast multiplication instructions. While more advanced global optimizations like full across blocks or were not implemented due to complexity and resource limitations, the system's tree process implicitly supports limited detection and reuse of common subexpressions within expressions. PCC's design also accommodates as a post-generation refinement, though it was proposed rather than fully integrated in the original implementation; this technique scans short sequences of generated assembly for local patterns, replacing inefficient idioms—such as unnecessary register-to-register moves—with more efficient alternatives, like direct swaps in to minimize spills. For instance, a sequence loading a value into a temporary before immediate use in another could be optimized to use the source directly. This modular extensibility allowed later ports and derivatives to incorporate such enhancements for better quality. Additionally, PCC's one-pass compilation mode offered approximately 30% faster build times compared to its two-pass , at the cost of 30% more memory usage, highlighting its balance of speed and resource efficiency in early Unix environments.

Implementations and Ports

Original Implementations

The original implementation of the (PCC) was developed by at primarily for the PDP-11 between 1977 and 1980. This version consisted of approximately 20,000 lines of C , with more than half being machine-independent, enabling its use as a reference for subsequent adaptations. To build PCC on the PDP-11, an existing C —such as the original PDP-11 C compiler by —was required for , after which PCC became self-hosting; the process involved compiling its front-end (pass 1 for parsing and optimization) and back-end (pass 2 for code generation) passes, along with a , typically using the UNIX Version 7 environment. The first major port targeted the DEC VAX-11/780 under Unix in 1979, leveraging PCC's modular design where only the machine-dependent code generator and runtime support needed adaptation, while the bulk of the parser and optimizer remained unchanged. This effort demonstrated PCC's portability early on, with the VAX version producing assembly code compatible with the VAX instruction set and integrating with Unix system calls. Subsequent adaptations included the microprocessor in 1982, optimized for early systems such as those from , where the code generator was retargeted to handle the 68000's register-rich architecture and 32-bit addressing. PCC was distributed as part of key UNIX releases, for example, in the , Berkeley's 4.2BSD (1983) and later in UNIX System V Release 3.0 (1987), where it served as the standard compiler alongside utilities like the (cpp) and lint for code verification. These distributions included portable C library interfaces, such as standardized I/O and string handling routines, to ensure consistent behavior across platforms while minimizing dependencies on host-specific features. Comprehensive documentation, including "A Tour Through the Portable C Compiler" by , accompanied these releases to guide users on , usage, and further .

Modern Derivatives and Forks

In the early 2000s, the NetBSD project revived the Portable C Compiler (PCC) to facilitate ports to embedded systems and legacy hardware, particularly addressing the need for a lightweight compiler in resource-constrained environments like the PDP-10 port. This effort was driven by the desire to reduce dependency on larger compilers like GCC while leveraging PCC's inherent portability for NetBSD's multi-architecture support. A significant milestone occurred in 2007 when Anders Magnusson led a comprehensive of PCC under a BSD license, extensively rewriting the codebase to achieve full compliance, including a new and parser. This introduced modern optimizations, such as tree-based , instruction selection for RISC targets, and graph-coloring register allocation, while maintaining the original's modular structure for easy backend additions. The project added layers for compatibility, enabling support for common GCC flags, extensions, and invocation conventions to ease integration with existing toolchains. By 2010, the revived PCC had progressed to compile bootable OpenBSD kernels on x86, paving the way for its integration into 's source tree around 2010 as a BSD-licensed alternative to . Although later adopted as the default compiler for base system builds in 2017, PCC remains available via ports and is valued for its smaller footprint and faster compilation times in certain contexts. Ports to contemporary architectures like and were developed to support embedded applications, alongside 64-bit extensions for platforms such as amd64, ensuring viability on modern hardware. Other derivatives include standalone releases tailored for retro computing, such as builds for VAX and PDP-11 systems, which preserve PCC's simplicity for historical Unix and hobbyist projects without relying on full OS toolchains. Key enhancements in these modern versions encompass bug fixes for legacy issues, including Y2K-related date handling in runtime libraries, and improved portability mechanisms that extend to contemporary build environments. However, has been inactive since the 1.1.0 release in 2014, with the last significant commits around 2016 and the project mirroring ceasing updates in 2023 (as of 2025).

Legacy and Current Status

Historical Influence

The Portable C Compiler (PCC), developed at Bell Labs in the 1970s, significantly shaped the design of subsequent C compilers, particularly the GNU Compiler Collection (). Released in 1987 by , GCC adopted PCC's emphasis on portability as a core principle, enabling compilation across diverse architectures without proprietary dependencies; this model allowed GCC to bootstrap on existing Unix systems using PCC itself and facilitated its rapid adoption on emerging platforms like RISC processors. PCC's development experience at also contributed indirectly to the standardization of the C language through the ANSI X3J11 committee, formed in 1983 to produce the first official (ANSI X3.159-1989). representatives, including those familiar with PCC's implementation, participated in the committee, drawing on the compiler's real-world portability lessons to inform decisions on language features like type conversions and library functions that enhanced cross-system compatibility. In and , PCC left a lasting legacy as a model for construction, with its peephole optimization techniques serving as illustrative examples of local code improvement strategies in pedagogical contexts. This exposure helped generations of students and researchers understand modular design, with PCC serving as a for simplicity and efficiency. By the , PCC's dominance waned with the rise of , which offered superior optimization and free licensing, leading to PCC's replacement in most Unix distributions by the late ; however, it endures as a reference for minimalistic, portable compilers in academic and embedded systems .

Contemporary Use and Maintenance

As of 2025, the Portable C Compiler (PCC) continues development through its primary fork maintained by Anders Magnusson, with the latest version being 1.2.0 (development build dated March 31, 2022), distributed in major repositories like . Ongoing commits focus on enhancing compliance, including improvements to macro evaluation and recursive processing in the , though full conformance remains a work in progress. PCC finds niche contemporary use in resource-constrained environments, particularly systems such as deployments on routers, where its compact design and low memory requirements offer advantages over larger toolchains. It is also employed in retro computing projects, including emulators for historical hardware like the PDP-11, enabling compilation of legacy C code without modern dependencies. Additionally, PCC serves as a lightweight alternative to for scenarios prioritizing small binary footprints, such as cross-compilation for historic or minimalistic architectures. Maintenance efforts are centered on the project's organization under PortableCC, which hosts the core repositories for , its libraries, and test suites, with sporadic community contributions via pull requests and issue tracking. The compiler has been integrated into BSD ecosystems as a alternative, notably in NetBSD's pkgsrc collection and OpenBSD's source tree, supporting ongoing ports and builds in these projects. Despite these efforts, PCC faces challenges in adopting modern C standards, providing C99 conformance with select C11 extensions but lacking support for later standards such as or C23, which limits its appeal for contemporary . It also competes with more comprehensive and actively optimized compilers like /, which provide broader standard compliance and ecosystem integration.

References

  1. [1]
    A portable compiler: theory and practice - ACM Digital Library
    Johnson, YACC - Yet Another Compiler-Compiler, Comp. Sci. Tech. Rep. No. 32 ... https://dl.acm.org/doi/10.1145/3375192. Show More Cited By. A portable ...
  2. [2]
    The development of the C language - ACM Digital Library
    The development of the C language. Author: Dennis M. Ritchie. Dennis M. Ritchie. AT&T Bell Labs, Murray Hill, NJ. View Profile. Authors Info & Claims. HOPL-II ...
  3. [3]
    Experience with porting the Portable C Compiler - ACM Digital Library
    The compiler was to be based upon the Portable C Compiler1 (PCC), which was developed at Bell Labs by Steve Johnson. The project, now near completion, has ...
  4. [4]
    [PDF] Portability of C Programs and the UNIX System* - Nokia
    Computer programs are portable to the extent that they can be moved to new computing environments with much less effort than it would take to rewrite them.
  5. [5]
    None
    Nothing is retrieved...<|control11|><|separator|>
  6. [6]
    Portability Proposal Memo - Nokia
    ... Interdata 8/32) arrived in April 1977. Johnson's PCC compiler, which would be used for the Interdata project and would later be used for the VAX (Unix 32V) ...Missing: prototype | Show results with:prototype
  7. [7]
    [PDF] Portable C Compiler
    This document attempts a detailed examination of the source code for the second pass of the. PDP11 version of the Portable C compiler. The package of programs ...
  8. [8]
    UNIX Operating System Porting Experiences - Nokia
    The development of the portable C compiler, pcc, has greatly improved the portability of both the C language and the UNIX operating system. The portable concept ...
  9. [9]
    Evolution of C - catb. Org
    But most modern C implementations are patterned on Steven C. Johnson's “portable C compiler” (PCC) which debuted in Version 7 and replaced the DMR compiler ...
  10. [10]
    UNIX – a.k.a. Pugs
    My Summer at Bell Labs (part 2). My office mate for the summer was Bob Mitze, he was working on getting Steve Johnson's portable C compiler working on the AT&T ...<|separator|>
  11. [11]
    [PDF] A Tour Through the Portable C Compiler - c9x.me
    The portable C compiler is designed for portability, reliability, and high compatibility. It consists of two passes and a preprocessor, with 75% machine ...
  12. [12]
    [PDF] An Experiment in Table Driven Code Generation - DTIC
    Nov 15, 1981 · The experiment uses a local code generator with a pattern matcher, generating instructions from a table, replacing the second pass of a C ...
  13. [13]
    [PDF] A Portable Compiler for the Language C - DTIC
    This paper describes the implementation of a compiler for the programming language C [1,2], an implementation language developed at Bell Laboratories and a ...
  14. [14]
    [PDF] MAC TR-149 A PORTABLE COMPILER FOR THE LANGUAGE C ...
    A PORTABLE COMPILER FOR THE LANGUAGE C. Alan Snyder. May 1975. MASSACHUSETTS INSTITUTE OF TECHNOLOGY. PROJECT MAC. CAMBRIDGE. MASSACHUSETTS 02139. Page 2. -2-.
  15. [15]
    A Tour Through the Portable C Compiler - Wolfram Schneider
    The portable compiler has been a useful tool for providing C capability on a large number of diverse machines, and for testing a number of theoretical ...
  16. [16]
    Portability of C Programs and the UNIX System
    VI. THE PORTABLE C COMPILER. The original C compiler for the PDP-11 was not designed to be easy to adapt for other machines. Although successful compilers ...
  17. [17]
    A History of C Compilers - Part 1: Performance, Portability and ...
    May 5, 2024 · A few years later, the 'Portable C Compiler' (or 'pcc') was written by Johnson, also at Bell Labs, which would provide a C compiler for Unix ...Missing: Steve | Show results with:Steve
  18. [18]
    UNIX* System V and 4.1C BSD - Computer History Wiki
    ... C programs. Pcc, the portable C compiler, includes reasonable enumerations, changes to structure and union handling (nonunique structure member names) ...
  19. [19]
    [PDF] Anders Magnusson Bringing PCC into The 21th century - OpenBSD
    Oct 11, 2008 · Why? ▫ Needed a C compiler for PDP10 to be able to port NetBSD to it. ▫ Wanted a better C compiler than the Richie. C compiler for PDP11.Missing: integration 2010<|control11|><|separator|>
  20. [20]
    Portable C Compiler - NetBSD Blog
    Jun 7, 2010 · The latest pcc can build all of bin/ and sbin/, most of games/ (except for dab(6) which is C++), and only a few issues remain in usr.bin/ and ...<|control11|><|separator|>
  21. [21]
    arnoldrobbins/pcc-revived: Mirror of PCC project's CVS repositories
    This Git repo is a simple mirror of the CVS repositories for the PCC Revived project (but without the 'CVS' directories).Missing: netbsd | Show results with:netbsd
  22. [22]
    Call for testing: pcc and the OpenBSD kernel
    Dec 28, 2009 · Anders Magnusson (ragge@) reports that pcc can now build a bootable OpenBSD -current x86 kernel and that amd64 support is coming soon.Missing: integration | Show results with:integration
  23. [23]
    The Portable C Compiler (PCC) Continues To Be Developed In 2016
    Jan 17, 2016 · The Portable C Compiler with its history originally dating back to the 1970s continues to be in-development.Missing: fork | Show results with:fork
  24. [24]
    pcc (portable c compiler) lives again! - Brad's Technology Blog
    Jan 8, 2009 · Netbsd on the other hand, is not. (I've been working on getting netbsd to run on a my vax 11/730 again, so I've fallen back in love with netbsd.
  25. [25]
    Portable C Compiler 1.1.0 Released (PCC 1.1) - Phoronix
    Dec 27, 2014 · The better part of four years since the release of PCC 1.0, the second official release of the modern Portable C Compiler is now available.
  26. [26]
    Bootstrapping the GNU Compiler Collection - Retro Computing
    Sep 4, 2020 · ANSI C additionally introduced the standard I/O library (which I think we can all agree was a meaningful step forward), and C99 did introduce ...
  27. [27]
    The Development of the C Language - Nokia
    When Johnson returned to Bell Labs in 1973, he was disconcerted to find that the language whose seeds he brought to Canada had evolved back home; even his own ...Missing: departure | Show results with:departure
  28. [28]
    [PDF] for information systems - programming language - C
    Technical Committee X3J11 on the C Programming Language had the following members at the time they forwarded this document to X3 for processing as an.
  29. [29]
    Aho Compilers Principles, Techniques, and Tools 2e - pdfcoffee.com
    Aho Compilers Principles, Techniques, and Tools 2e. Aho Compilers ... Johnson, S. C., "A tour through the portable C compiler," Bell Telephone ...
  30. [30]
    pcc - Debian Package Tracker
    source: pcc (main) · version: 1.2.0~DEVEL+20220331-2 · maintainer: Yangfl (DMD) · arch: amd64 i386 · std-ver: 4.7.2 · VCS: Git (Browse, QA).
  31. [31]
    Using non-GNU assemblers with the Portable C Compiler
    Jul 23, 2023 · The Portable C Compiler (PCC) is a robust little C99 compiler that is available for a decent number of modern and historic systems.
  32. [32]
    PortableCC · GitHub
    The Portable C Compiler (pcc) is a multi-target C compiler, supporting the C99 standard with additions from later revisions. It is small and simple in its ...<|separator|>
  33. [33]
    BSD-Licensed C Compiler Added to NetBSD, OpenBSD - OSnews
    Sep 15, 2007 · Anders Magnusson's BSD-licensed pcc compiler has been imported into NetBSD's pkgsrc and OpenBSD's src tree. Anders wrote to NetBSD's ...