2022-08-03 03:04:30 +08:00
|
|
|
Below you can find release notes for each major Codon release,
|
|
|
|
listing improvements, updates, optimizations and more for each
|
|
|
|
new version.
|
2022-08-03 02:53:17 +08:00
|
|
|
|
2023-04-13 06:13:54 +08:00
|
|
|
These release notes generally do not include small bug fixes. See the
|
2023-04-14 05:35:53 +08:00
|
|
|
[closed issues](https://github.com/exaloop/codon/issues?q=is%3Aissue+is%3Aclosed)
|
2023-04-13 06:13:54 +08:00
|
|
|
for more information.
|
|
|
|
|
|
|
|
# v0.16
|
|
|
|
|
|
|
|
## Python extensions
|
|
|
|
|
|
|
|
A new build mode is added to `codon` called `pyext` which compiles
|
|
|
|
to Python extension modules, allowing Codon code to be imported and
|
|
|
|
called directly from Python (similar to Cython). Please see the
|
|
|
|
[docs](../interop/pyext.md) for more information and usage examples.
|
|
|
|
|
|
|
|
## Standard library updates
|
|
|
|
|
|
|
|
- Various additions to the standard library, such as `math.fsum()` and
|
|
|
|
the built-in `pow()`.
|
|
|
|
|
|
|
|
- Added `complex64`, which is a complex number with 32-bit float real and
|
|
|
|
imaginary components.
|
|
|
|
|
|
|
|
- Better `Int[N]` and `UInt[N]` support: can now convert ints wider than
|
|
|
|
64-bit to string; now supports more operators.
|
|
|
|
|
|
|
|
## More Python-specific optimizations
|
|
|
|
|
|
|
|
New optimizations for specific patterns including `any()`/`all()` and
|
|
|
|
multiple list concatenations. These patterns are now recognized and
|
|
|
|
optimized in Codon's IR.
|
|
|
|
|
|
|
|
## Static expressions
|
|
|
|
|
|
|
|
Codon now supports more compile-time static functions, such as `staticenumerate`.
|
|
|
|
|
2022-10-15 02:28:16 +08:00
|
|
|
# v0.15
|
|
|
|
|
2022-12-05 08:45:21 +08:00
|
|
|
## Union types
|
|
|
|
|
|
|
|
Codon adds support for union types (e.g., `Union[int, float]`):
|
|
|
|
|
|
|
|
```
|
|
|
|
def foo(cmd) -> Union:
|
|
|
|
if cmd == 'int': return 1
|
|
|
|
else: return "s"
|
|
|
|
foo('int') # type is Union[int,str]
|
|
|
|
5 + foo('int') # 6
|
|
|
|
'a' + foo('str') # as
|
|
|
|
```
|
|
|
|
|
|
|
|
## Dynamic inheritance
|
|
|
|
|
|
|
|
Dynamic inheritance and polymorphism are now supported:
|
|
|
|
|
|
|
|
```
|
|
|
|
class A:
|
|
|
|
def __repr__(): return 'A'
|
|
|
|
class B(A):
|
|
|
|
def __repr__(): return 'B'
|
|
|
|
l = [A(), B(), A()] # type of l is List[A]
|
|
|
|
print(l) # [A, B, A]
|
|
|
|
```
|
|
|
|
|
|
|
|
This feature is still a work in progress.
|
|
|
|
|
2022-10-15 02:28:16 +08:00
|
|
|
## LLVM upgrade
|
|
|
|
|
|
|
|
Upgraded to LLVM 15 (from 12). Note that LLVM 15 now uses
|
|
|
|
[opaque pointers](https://llvm.org/docs/OpaquePointers.html),
|
|
|
|
e.g. `ptr` instead of `i8*` or `i64*`, which affects `@llvm`
|
|
|
|
functions written in Codon as well as LLVM IR output of
|
|
|
|
`codon build`.
|
|
|
|
|
2022-12-05 08:45:21 +08:00
|
|
|
## Standard library
|
|
|
|
|
|
|
|
`random` module now matches Python exactly for the same seed.
|
|
|
|
|
2022-09-16 03:40:00 +08:00
|
|
|
# v0.14
|
|
|
|
|
|
|
|
## GPU support
|
|
|
|
|
|
|
|
GPU kernels can now be written and called in Codon. Existing
|
|
|
|
loops can be parallelized on the GPU with the `@par(gpu=True)`
|
|
|
|
annotation. Please see the [docs](../advanced/gpu.md) for
|
|
|
|
more information and examples.
|
|
|
|
|
|
|
|
## Semantics
|
|
|
|
|
|
|
|
Added `-numerics` flag, which specifies semantics of various
|
|
|
|
numeric operations:
|
|
|
|
|
|
|
|
- `-numerics=c` (default): C semantics; best performance
|
|
|
|
- `-numerics=py`: Python semantics (checks for zero divisors
|
|
|
|
and raises `ZeroDivisionError`, and adds domain checks to `math`
|
|
|
|
functions); might slightly decrease performance.
|
|
|
|
|
|
|
|
## Types
|
|
|
|
|
|
|
|
Added `float32` type to represent 32-bit floats (equivalent to C's
|
|
|
|
`float`). All `math` functions now have `float32` overloads.
|
|
|
|
|
|
|
|
## Parallelism
|
|
|
|
|
|
|
|
Added `collapse` option to `@par`:
|
|
|
|
|
|
|
|
``` python
|
|
|
|
@par(collapse=2) # parallelize entire iteration space of 2 loops
|
|
|
|
for i in range(N):
|
|
|
|
for j in range(N):
|
|
|
|
do_work(i, j)
|
|
|
|
```
|
|
|
|
|
|
|
|
## Standard library
|
|
|
|
|
|
|
|
Added `collections.defaultdict`.
|
|
|
|
|
|
|
|
## Python interoperability
|
|
|
|
|
|
|
|
Various Python interoperability improvements: can now use `isinstance`
|
|
|
|
on Python objects/types and can now catch Python exceptions by name.
|
|
|
|
|
2022-08-03 03:04:30 +08:00
|
|
|
# v0.13
|
2022-08-03 02:53:17 +08:00
|
|
|
|
2022-08-03 03:04:30 +08:00
|
|
|
## Language
|
|
|
|
|
|
|
|
### Scoping
|
2022-08-03 02:53:17 +08:00
|
|
|
|
|
|
|
Scoping was changed to match Python scoping. For example:
|
|
|
|
|
|
|
|
``` python
|
|
|
|
if condition:
|
|
|
|
x = 42
|
|
|
|
|
|
|
|
print(x)
|
|
|
|
```
|
|
|
|
|
|
|
|
If condition is `False`, referencing `x` causes a `NameError`
|
|
|
|
to be raised at runtime, much like what happens in Python.
|
|
|
|
There is zero new performance overhead for code using the old
|
|
|
|
scoping; code using the new scoping as above generates a flag to
|
|
|
|
indicate whether the given variable has been assigned.
|
|
|
|
|
|
|
|
Moreover, variables can now be assigned to different types:
|
|
|
|
|
|
|
|
``` python
|
|
|
|
x = 42
|
|
|
|
print(x) # 42
|
|
|
|
x = 'hello'
|
|
|
|
print(x) # hello
|
|
|
|
```
|
|
|
|
|
|
|
|
The same applies in Jupyter or JIT environments.
|
|
|
|
|
2022-08-03 03:04:30 +08:00
|
|
|
### Static methods
|
2022-08-03 02:53:17 +08:00
|
|
|
|
|
|
|
Added support for `@staticmethod` method decorator.
|
|
|
|
Class variables are also supported:
|
|
|
|
|
|
|
|
``` python
|
|
|
|
class Cls:
|
|
|
|
a = 5 # or "a: ClassVar[int] = 5" (PEP 526)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def method():
|
|
|
|
print('hello world')
|
|
|
|
|
|
|
|
c = Cls()
|
|
|
|
Cls.a, Cls.method(), c.a, c.method() # supported
|
|
|
|
```
|
|
|
|
|
2022-08-03 03:04:30 +08:00
|
|
|
### Tuple handling
|
2022-08-03 02:53:17 +08:00
|
|
|
|
|
|
|
Arbitrary classes can now be converted to tuples via the `tuple()`
|
|
|
|
function.
|
|
|
|
|
2022-08-03 03:04:30 +08:00
|
|
|
### Void type
|
2022-08-03 02:53:17 +08:00
|
|
|
|
|
|
|
The `void` type has been completely removed in favor of the new
|
|
|
|
and Pythonic `NoneType`, which compiles to an empty LLVM struct.
|
|
|
|
This does not affect C interoperability as the empty struct type
|
|
|
|
is replaced by `void` by LLVM.
|
|
|
|
|
2022-08-03 03:04:30 +08:00
|
|
|
### Standard library
|
2022-08-03 02:53:17 +08:00
|
|
|
|
|
|
|
The `re` module is now fully supported, and uses
|
|
|
|
[Google's `re2`](https://github.com/google/re2) as a backend. Future
|
|
|
|
versions of Codon will also include an additional regex optimization
|
|
|
|
pass to compile constant ("known at compile time") regular expressions
|
|
|
|
to native code.
|
|
|
|
|
2022-08-03 03:04:30 +08:00
|
|
|
## C variables
|
2022-08-03 02:53:17 +08:00
|
|
|
|
|
|
|
Global variables with C linkage can now be imported via `from C import`:
|
|
|
|
|
|
|
|
``` python
|
|
|
|
# assumes the C variable "long foo"
|
|
|
|
from C import foo: int
|
|
|
|
print(foo)
|
|
|
|
```
|
|
|
|
|
2022-08-03 03:04:30 +08:00
|
|
|
## Parallelism
|
2022-08-03 02:53:17 +08:00
|
|
|
|
|
|
|
Numerous improvements to the OpenMP backend, including the addition
|
|
|
|
of task-based reductions:
|
|
|
|
|
|
|
|
``` python
|
|
|
|
total = 0
|
2022-08-06 06:14:47 +08:00
|
|
|
@par
|
2022-08-03 02:53:17 +08:00
|
|
|
for a in some_arbitrary_generator():
|
2022-08-06 06:14:47 +08:00
|
|
|
total += do_work(a) # now converted to task reduction
|
2022-08-03 02:53:17 +08:00
|
|
|
```
|
|
|
|
|
2022-08-03 03:04:30 +08:00
|
|
|
## Python interoperability
|
2022-08-03 02:53:17 +08:00
|
|
|
|
|
|
|
Included revamped `codon` module for Python, with `@codon.jit` decorator
|
|
|
|
for compiling Python code in existing codebases. Further improved and
|
2022-08-04 04:36:03 +08:00
|
|
|
optimized the Python bridge. Please see the [docs](../interop/decorator.md)
|
|
|
|
for more information.
|
2022-08-03 02:53:17 +08:00
|
|
|
|
2022-08-03 03:04:30 +08:00
|
|
|
## Codon IR
|
2022-08-03 02:53:17 +08:00
|
|
|
|
|
|
|
New capture analysis pass for Codon IR for improving tasks such as dead
|
|
|
|
code elimination and side effect analysis. This allows Codon IR to deduce
|
|
|
|
whether arbitrary, compilable Python expressions have side effects, capture
|
|
|
|
variables, and more.
|
|
|
|
|
2022-08-03 03:04:30 +08:00
|
|
|
## Code generation and optimizations
|
2022-08-03 02:53:17 +08:00
|
|
|
|
|
|
|
A new dynamic allocation optimization pass is included, which 1)
|
|
|
|
removes unused allocations (e.g. instantiating a class but never
|
|
|
|
using it) and 2) demotes small heap allocations to stack (`alloca`)
|
|
|
|
allocations when possible. The latter optimization can frequently
|
|
|
|
remove any overhead associated with instantiating most classes.
|
|
|
|
|
2022-08-03 03:04:30 +08:00
|
|
|
## Command-line tool
|
2022-08-03 02:53:17 +08:00
|
|
|
|
|
|
|
The `codon` binary can now compile to shared libraries using the `-lib`
|
|
|
|
option to `codon build` (or it can be deduced from a `.so` or `.dylib`
|
|
|
|
extension on the output file name).
|
|
|
|
|
2022-08-03 03:04:30 +08:00
|
|
|
## Errors
|
2022-08-03 02:53:17 +08:00
|
|
|
|
|
|
|
Added support for multiple error reporting.
|