About Me
Hi! My name is Nikita Popov, but you’ll mostly meet me as nikic on the internet. I’m a senior software engineer at Red Hat, working on LLVM, Clang and Rust.
Before that, I worked at JetBrains as a core developer for the PHP project. I studied computer science and physics at the Technical University of Berlin.
Feel free to contact me via nikic@php.net. Alternatively you can usually find me on the LLVM Discord.
Projects
My most popular open-source projects, sorted by stars:
- PHP-Parser – A PHP parser written in PHP
- FastRoute – Fast request router for PHP
- scalar_objects – Extension that adds support for method calls on primitive types in PHP
- iter – Iteration primitives using generators
- php-ast – Extension exposing PHP 7 abstract syntax tree
- PHP-Fuzzer – A fuzzer for PHP libraries
I also maintain the LLVM compile-time tracker.
Accepted PHP proposals
PHP 8.2:
PHP 8.1:
- Readonly properties
- First-class callable syntax
- New in initializers
- Array unpacking with string keys
- Deprecate passing null to non-nullable arguments of internal functions
- Static variables in inherited methods
- Restrict $GLOBALS usage
- Phasing out Serializable
- Deprecations for PHP 8.1
PHP 8.0:
- Union types
- Constructor property promotion
- Named arguments
- Reclassify engine warnings
- Consistent type errors for internal functions
- Always generate fatal error for incompatible method signature
- Stricter type checks for arithmetic/bitwise operators
- Validation for abstract trait methods
- Allow trailing comma in parameter list
- Object-based token_get_all() alternative
- Allow ::class on objects
- Static return type
- Variable syntax tweaks
- Weak maps
- Treat namespaced names as single token
- Saner string to number comparison
- Make sorting stable
PHP 7.4:
- Typed properties
- Arrow functions
- Allow throwing exceptions from
__toString()
- Reflection for references
- New custom object serialization mechanism
- Deprecations for PHP 7.4
- Deprecate left-associative ternary operator
PHP 7.3:
PHP 7.2:
PHP 7.1:
PHP 7.0:
- Exceptions in the engine
- Abstract syntax tree
- Uniform variable syntax
- Remove deprecated functionality in PHP 7
- Reclassify E_STRICT errors
- Remove alternative PHP tags
- Remove hexadecimal numeric strings
PHP 5.6:
PHP 5.5:
- Generators and coroutines
empty()
on arbitrary expressions- Remove
/e
modifier frompreg_replace()
- Support non-scalar foreach keys
Presentations
- PHP 7: What changed internally? [IPC’15]
(slides) - PHP 7: What changed internally? [PHP Barcelona’15]
(slides, video) - PHP 7: What changed internally? [Forum PHP’15]
(slides, video) - PHP language trivia [PHPKonf’17]
(slides) - Static Optimization of PHP bytecode [PHPSC’17]
(slides) - Static Optimization of PHP bytecode [phpDay’17]
(video) - Typed Properties and more: What’s coming in PHP 7.4? [PHP Russia’19]
(slides, video) - PHP performance trivia [PHP Barcelona’19]
(slides, video) - Looking forward to PHP 8 [PHPKonf’19]
(slides, video) - What’s new in PHP 8.0? [PHP fwdays’20]
(slides, video) - What’s new in PHP 8.0? [PHPConChina’20]
(slides) - Just-In-Time Compiler in PHP 8 [betterCode PHP’20]
(slides) - What’s new in PHP 8.0? [SymfonyWorld’20]
(slides) - Opaque pointers are coming [LLVM CGO’22]
(slides, video) - A whirlwind tour of the LLVM optimizer [EuroLLVM’23]
(slides, video) - Rust ❤️ LLVM [LLVM developer meeting’24]
(slides, video) - LLVM IR: Past, Present and Future [EuroLLVM’25]
(slides)
Theses and Papers
- Spinor formulation of Lanczos potentials in Riemannian Geometry [Bachelor Physics]
(pdf) - Optimizing PHP Bytecode using Type-Inferred SSA Form [Bachelor CS]
(pdf) - The Tradeoff of Latency, Reliability and Rate for Spinal Codes [Master CS]
(pdf) - Static Optimization of PHP 7 [CC’17]
(pdf, acm)
Miscellaneous
- PHP internals book
Free (but incomplete) book on PHP extension development