# What changed in snowballstemmer

> 90 changes in snowballstemmer 2 to 3 from its official release notes, upgrade guides and advisories: 18 breaking, 1 deprecations, 31 new APIs and options. Each one cited. Sources checked 2026-10-26. HTML: https://unstale.sh/pypi/snowballstemmer/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## snowballstemmer 3

### Breaking changes

- The compiler now emits an error when output to stdout is requested, because some target languages require multiple output files. (3.1.1) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-311-2026-06-03)
- Generated Ada stemmer names are prefixed with S_ to avoid collisions with Ada keywords. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The command no longer prints the chosen stemmer to stdout, so stemmed output is not preceded by extra text. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- These Snowball commands now update the slice end when modifying text. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The compiler reports division by zero for $x /= 0 and continues after reporting a division-by-zero error instead of exiting immediately. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Finnish stemming now handles apostrophes, improves illative fallback, allows ø with -hön, and removes the illative form -hun. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- insert '' is now warned about as a no-op and generates no code. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Generated Java classes no longer implement Serializable, reflecting concerns about this serialization approach. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Generated Javascript code now uses modules and classes, with the way among functions are called reworked. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Changes suffix handling, removes trailing apostrophes as a final step, and no longer removes -er- before normal suffixes. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The option now specifies the import name for the base class in generated stemmers, and defaults to B. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Polish stemming now removes an optional apostrophe after removing a suffix. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Python's generated stem external is no longer hard-coded with an underscore; the build now uses -eprefix _ to keep it non-public as stemWord() calls it. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The compiler now rejects -vprefix for target languages that do not support it; it is currently implemented only for C/C++. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- C variable access generated with -vprefix now uses getter functions instead of macro magic, changing the syntax for accessing Snowball variables from C. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)

### Deprecations

- The compiler now emits warnings when legacy Snowball language features are used. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)

### New APIs and options

- The make variable ARFLAGS can specify flags for ar; its default flags are now -cr. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Using - as the Snowball source file now reads source from standard input. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Adds coverage tracking for exercised among strings, functions, and grouping characters. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- A Czech stemming algorithm has been added. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- A Persian (Farsi) stemming algorithm has been added. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- A PHP code generator has been added; it requires PHP 8.3 or later. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- A Polish stemming algorithm has been added. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Set SAVETMP=1 with make check_utf8 to save output as tmp.txt on error for debugging. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- A Sesotho stemming algorithm has been added. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- This make variable allows passing compiler options such as -comments and -coverage during development and debugging. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- A Zig backend has been added; it requires Zig 0.16.0 or later. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)

### Performance

- Eligible variables are generated as target-language locals rather than global or object state, reducing stemmer state and often access overhead. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)

### Behavior and default changes

- attach '' is now warned about as a no-op and generates no code. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The -c++ target now generates C++ classes, uses C++ bool and loop-variable scoping, and throws exceptions for allocation failures and internal errors. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The option is now supported for every target language, allowing external names that collide with target-language keywords to be prefixed. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Javascript generators now generate public functions for all externals. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The output option is optional; without it, outputs use the first source filename with target-appropriate extensions. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The output path may include an extension, allowing an alternative generated source extension such as .cxx, .cc, or .cpp. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The input and output options are now optional; unknown arguments are reported with usage, and command-line parsing errors exit with status 1. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)

### Tooling

- A make target was added to assist comparing generated code before and after a compiler change. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- A Dart code generator has been added. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)

### Fixes and other changes

- Fixes a segmentation fault that could occur after reporting an error for a string command without a string variable name or string literal. (3.1.1) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-311-2026-06-03)
- The package adds a classifier indicating support for Python 3.14. (3.1.1) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-311-2026-06-03)
- The compiler now checks the right-hand expression of an integer test for variable uses, preventing incorrect localisation of integer variables whose values should persist between function calls. (3.1.1) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-311-2026-06-03)
- Fix forwarding to PyStemmer, which previously called a method PyStemmer does not provide. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- <- now updates the slice end. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The Snowball debug command now works for Ada using generated GNAT-specific code. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The Snowball debug command now works out of the box in generated C/C++ code without changing a runtime preprocessor conditional. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Danish stemming now handles apostrophes and restricts undoubling to valid cases, reducing potential damage to foreign words. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- delete now updates the slice end. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Restores the skis → ski exception and adjusts handling of some words starting with inter. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Estonian stemming now handles apostrophes. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- German stemming now handles apostrophes. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Italian stemming now handles elisions. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Norwegian stemming now handles apostrophes. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Fix invalid generated Pascal code for tail calls and calls to routines which always fail. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The flawed optimization is no longer applied, avoiding incorrect generated code when loop failure does not preserve the cursor. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The slice is now specified to be unset after =S, matching the state at program start. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- Generated code for all target languages now restores the limit correctly after setlimit tomark. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)
- The input and output options are now genuinely optional, matching the command syntax. (3.1.0) — [release notes](https://github.com/snowballstem/snowball/blob/6389c79f91cd67ed2de3ebdcf84ec8c2d2d23c11/NEWS#snowball-310-2026-05-22)

## snowballstemmer 2

### Breaking changes

- The algorithm is adjusted not to mangle numbers and tends to leave foreign words alone. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- The algorithm now uses Portuguese suffixes instead of incorrect Spanish suffixes. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- The algorithm now normalizes ё to е before stemming, which changes results when callers do not already perform that normalization. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)

### New APIs and options

- An Arabic stemming algorithm is added. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- A Basque stemming algorithm is added. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- A C# code generator is added, allowing Snowball algorithms to generate C# code. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- A Catalan stemming algorithm is added. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- A Greek stemming algorithm is added. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- The compiler now supports the conventional help option. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- A Hindi stemming algorithm is added. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- An Indonesian stemming algorithm is added. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- An Irish stemming algorithm is added. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- A Javascript code generator is added, allowing Snowball algorithms to generate Javascript code. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- This Snowball command measures Unicode length consistently across -utf8, -widechars, and default modes; under -utf8 it is O(n) in string length. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- This Snowball command measures Unicode length consistently across -utf8, -widechars, and default modes; under -utf8 it is O(n) in string length. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- A Lithuanian stemming algorithm is added. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- A Nepali stemming algorithm is added. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- A Pascal code generator is added, allowing Snowball algorithms to generate Pascal code. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- A Python code generator is added, allowing Snowball algorithms to generate Python code. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- A Rust code generator is added, allowing Snowball algorithms to generate Rust code. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- A Tamil stemming algorithm is added. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- String definitions can now use Unicode codepoints with the {U+1234} notation. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- The compiler now supports the conventional version option. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)

### Behavior and default changes

- Relational operators in parentheses after `$` can compare any two arithmetic expressions, avoiding a temporary variable in cases such as `$(len > 3)`. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- The default classname is now derived from the output filename, so `-n` is often no longer needed. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- Java SnowballProgram objects are now serializable. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- The compiler accepts multiple source files, including files placed after or interspersed with options. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)

### Tooling

- A make target is added to run tests for Java. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- A Go code generator is added, allowing Snowball algorithms to generate Go code. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- In the C libstemmer_c distribution, this target now removes examples/*.o. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)

### Fixes and other changes

- The algorithm no longer mangles alphanumeric codes, including codes ending in a double digit. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- French suffixes are recognized even when they begin with diaereses, and the algorithm versions were consolidated based on the Unicode version. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- The header can now be included from C++ code through conditional extern "C". (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
- C/C++ commands that inspect character values now fully handle 4-byte UTF-8 sequences, and grouping handling for a 3-byte sequence in backwardmode is fixed. (2.0.0) — [release notes](https://github.com/snowballstem/snowball/blob/HEAD/NEWS)
