Lazarus Release 4.0
111 comments
·May 7, 2025int_19h
spapas82
I remember some years ago that I was able to make this less than 1mb. It needed a little tweaking like upx but nothing very complex.
Lazarus should have been the golden standard for creating desktop apps. Every other solution I've tried is subpar either in licensing or costs in general, executable size and resource usage, non native components, extra dependencies etc
dlachausse
I think unfortunately what holds Lazarus back is the Pascal programming language. Although it is a very capable language that can hold its own against other languages, it suffers from a reputation of being obsolete.
It’s a pity that the C family of languages won out over Wirth’s languages. Pascal’s superior string handling alone would have saved us from countless security flaws.
Peter5
2.5 MB is for most of the Lazarus Component Library (LCL) with minimal size increases even as program complexity grows. For example, Dadroit JSON Viewer EXE is less than 6 MB while having complicated tree views, JSON handling, networking, and more. By the way, an empty CLI EXE on Windows is less than 50KB.
klipt
Why doesn't the linker strip out unused code?
dotancohen
Maybe you're the person to ask. My Python Qt app is sluggish when it loads tens of thousands of values from SQLite. Various variations of pagination and lazy loading hurt usability. But isolating the issue and testing with C++ and Rust show that those two languages don't have the performance hit of Python.
I could use C++ and stick with Qt, but I'd much prefer Rust. Rust has no good Qt bindings. What are my options?
The app makes use of QV/HBoxLayout, QWidget, Qdialog, QPushButton, and other really standard features. It reads from the filesystem, reads and writes to SQLite, and outputs sound from mostly ogg files at various speeds (through VLC behind the scenes). I stick with Qt because I like how it integrates with KDE and other desktops flawlessly.
rc00
> What are my options?
> I stick with Qt
These come up on search results if you combine Qt plus the language.
Go:
* https://github.com/mappu/miqt
Java:
* https://github.com/OmixVisualization/qtjambi
Nim:
* https://github.com/jerous86/nimqt
* https://github.com/seaqt/nim-seaqt
Zig:
dotancohen
Thank you. I don't see Java as having a performance edge over Python ))
Same for the other languages - they likely won't have the performance of C++ or Rust. But I'll test them anyway, even just for the academic exercise the endeavour is worthwhile. Thank you.
jpc0
Also did you test similar functionality in C++, I haven’t compared many implementations but I app I use that has an SQlite db being read with Qt(C++) is pretty sluggish whenever you touch the DB.
Maybe store the values in a dict and only read/write from sqlite when needed. Dicts are very fast in python.
dotancohen
Yes, that's what I'm doing. It's the initial load that is heavy.
I've also tried implementing lazy loading and pagination, with a pseudo-infinite scroll technique based on SQL LIMIT pagination, but the resulting CPU and memory spikes are noticeable.
jenadine
> I could use C++ and stick with Qt, but I'd much prefer Rust. Rust has no good Qt bindings. What are my options?
There are several Qt binding for rust, for example cxx-qt. I haven't tried myself but it looks maintained. Why is it not good?
Otherwise, the most promising equivalent to Qt in Rust would be Slint.
dotancohen
Thanks. I forget why I discounted cxx-qt. It think it didn't support some common Q* object but I don't remember which. I'll experiment with it and with Slint, which I've been eyeballing anyway. Thank you.
mixmastamyk
Is Cython and/or avoiding copies an option?
dotancohen
Cython is a great idea, thank you. I'll definitely try that. The code is all properly typed anyway.
I'm not sure what you mean by avoiding copies. I'm rather stringent with memory, I don't have superfluous copies of data in memory. Or did you mean something else?
Thank you.
alok-g
More generally, which all tools that can target multiple platforms, produce relatively small binaries for simple applications? And which of these are lean themselves?
May be I am doing something wrong, but I had installed Android Studio, then Android emulator, SDK, etc., and before I could get a hello-world app to compile, some 30 GB were gone from my disk space.
If it comes to it, I do not personally mind using multiple tools and code for different target platforms, as much as (a) both the tools themselves and the binaries generated are lean, and (b) the development tooling itself is on a single platform just so that I do not need to maintain multiple hardware. (I currently use Windows, would likely need to move over).
Thanks.
billfruit
Java perhaps? That was one of the core promises of the Java ecosystem.
dlachausse
> produce relatively small binaries for simple applications
The problem is that you need to have a huge Java runtime installed or use something like Jlink which still produces very large binaries for GUI apps.
I think wxWidgets is the Lazarus alternative that is the closest to what grandparent was asking for.
csmpltn
That’s a lot. I don’t know the specifics of Lazarus, but this typically screams static linking with everything and the kitchen sink being thrown into this one binary. Entire cross-platform runtime, GUI assets, metadata, etc. Could be a fat debug build, too.
p_l
It was the common complaint about writing VCL apps in Delphi - that single message box app would be 0.5MB binary.
But that was the static overhead of VCL core library and the benefits were considerable compared to writing raw WinAPI.
And unlike MSVC 16kB WinAPI executable you didn't have chance of sudden surprise "oh, but you need to update msvcrt.dll to run this" because Delphi (and Lazarus/FPC) default to statically linking the runtime
int_19h
That's indeed a statically linked binary. Release, with smart linking (so only things that are actually used are linked; otherwise it'd be ~20 Mb), debug symbols stripped. Measuring .exe size when linking dynamically would kinda defeat the purpose of the experiment, since you'd still need to distribute the DLLs to the users for any real world app.
zabzonk
Not Pascal but here is something I wrote on the same lines in C++: https://latedev.wordpress.com/2011/10/06/simple-windows-dial...
scotty79
Best part for me that it's a single file executable. I chose to do a thing in Pascal last year just because of this one killer feature. I made some initial attempts to achieve this with something else but I didn't find any modern tool that could do that without some weird, sometimes involved, sometimes straight up experimental steps.
superdisk
I think Go will do it, but I indeed enjoy Free Pascal for this as well. It's also nearly trivial to set up cross compilation using FPCUpDeluxe, so I've shipped applications to clients on Windows when I do all development and compiling on GNU/Linux.
nanoxide
.NET can create self-contained executables pretty easily (via _dotnet publish_), both including the required framework assemblies and without them. But they'll still be comparatively large.
scotty79
I couldn't find the right checkbox to click in VS.
TiredOfLife
Are those not just large zip files?
neonsunset
For JIT binaries it’s best to apply /p:PublishTrimmed=true which (sometimes massively) reduces their size. Applications written in AvaloniaUI or, nowadays, WinUI 3 can be compiled with NativeAOT which reduces the size and memory usage even further.
jenadine
Is that statically linked or dynamically link? If the later, does it include all the libraries and assets it uses?
speakspokespok
Lazarus and Open Pascal is fun!
And so it drives me crazy to see the state of their documentation. The wiki needs to be archived and replaced with a coherent documentation platform. It’s such a turn off. The whole website is a SWAG site frankly.
‘ SWAG sites
SWAG is an archive of tips and example programs for Turbo Pascal/Borland Pascal and early Delphi. Much of it is still applicable to today's Object Pascal - and much is obsolete...’
How can a language compete when a new user sees this?
CaptainOfCoit
> It’s such a turn off.
Is this the wiki you somehow want to have removed? https://wiki.freepascal.org/
It seems perfectly fine, information-dense even which is even better. Seems a lot better than the typical one-long-landing-page-docs many languages have today. What exactly is the problem with the wiki that cannot be fixed and must be re-made from scratch?
chungy
The wiki is full of incomplete, obsolete, or otherwise not-so-useful articles. It suffers from typical "wiki as documentation" efforts, where instead of concentrated efforts from domain experts, you get a thousand half-baked opinions.
It has good stuff, but I'd wager the "bad stuff" outweighs it by a large margin.
lproven
> And so it drives me crazy to see the state of their documentation.
I talked about this in my article about the release:
CaptainOfCoit
The only relevant part I can find from that article is:
> One criticism we've seen of the FreePascal project in general concerns its documentation, although there is quite a lot of it: eight FPC manuals, and lengthy Lazarus docs in multiple languages. There is a paid-for tutorial e-book available, too.
The criticism is that there is too much documentation available? And they're long, and dare even to be available in multiple languages?
bigpeopleareold
I only toyed with Lazarus/Free Pascal. There was some things I couldn't get used to. Maybe time to toy around again :) I feel like mentioning a few things that helped in the past: fpcdeluxe for installing a build of fpc and lazarus and a plugin called anchordockingdsgn to get all the floating windows in one window. It would be nice if 4.0 defaulted to that. The Castle Engine Pascal tutorial was actually pretty good also (which is mentioned in another thread here.) (edit: for the plugin, I see an option in fpcdeluxe to dock all windows - so it's possible to build that plugin in initially.)
Peter5
fpcupdeluxe is great if you want to get a particular revision or build cross-compiling. If you need a stable version, just download the setup from. The docked IDE is the default option for this version.
user3939382
This was the name of a sadly gone Firefox extension that saved all your form field values automatically
jjordan
Wow you just triggered a memory. I absolutely remember that plugin and it saving me a few times.
floydnoel
yeah this is what i remembered too when i saw the name. that extension was so great!
ramon156
It took way too long to figure out what Lazarus is based on their own website. Only found out because somewhere some random post said "Lazarus IDE".
nopcode
I believe you are referring to their community forum. The link to "their own website" is in the left sidebar.
null
rantingdemon
It is a pity that Lazarus and FPC seems to be so hard to deploy. It is of course an open source project, so its understandable.
Lazarus and FPC is a great project. Building GUI apps like with Lazarus does not have an easy alternative, from which I'm aware.
I have tried it now on my Mac, and I have to jump through some hoops to get it going. Again a pity, its a great option.
mikewarot
That's one problem I haven't had. I've even run Lazarus on a Raspberry Pi Zero W, it was slow but it actually worked. I don't know what kind of hoops the Mac has, but on Windows or Linux it's easy peasy.
xvilka
At the same time it was deprecated[1] in Homebrew. Hope the mainstream will address the issue.
rcarmo
Nice to see this, and I jumped on it immediately since I really wanted to do a minimal form-based UI to a tool I'm building, but on macOS I keep getting linking errors when compiling (on a fresh install, on a machine that never had Lazarus before).
I guess I'll wait for the next minor.
zerr
> Windows: 2k, 32 or 64bit, Qt, Qt5, Qt6 (64bit only)
Besides Qt, does it have a pure Win API back-end as well?
Peter5
Yes. Try the IDE itself; on Windows it is built with Win API. PeaZip is a sample of it https://github.com/peazip/PeaZip
zerr
Ok, using WinAPI means it is not easily theme-able, unless they provide custom set of controls. I assume it is possible to use Qt back-end for Windows as well. I wish Lazarus also supported C++ akin to C++Builder. Pascal is a deal-breaker many.
Peter5
Custom control set is supported too, and there are multiple alternatives.
ethan_smith
Yes, Lazarus has a native Win32/64 widgetset (LCL-Win32) that directly uses the Windows API without Qt dependencies.
fithisux
Can you suggest free resources for FreePascal and Lazarus?
TiredOfLife
Obligatory https://castle-engine.io/modern_pascal
marttt
Alternatively, Jeff Duntemann just released new edition of "FreePascal from Square One", free PDF: https://www.contrapositivediary.com/?p=5399
c0l0
This is one of the best introductions to what programming a computer is about that I know. I highly recommend checking it out, even if Pascal-like languages are not your cup of tea.
mdaniel
> To return a value from a function, assign something to the magic Result variable. You can read and set the Result freely, just like a local variable.
I'm torn about which is clearer, that magic variable style or assigning to the function name as one does in VBScript. I guess the magic variable makes refactoring dirty fewer lines
I also have mixed feelings about golang's `func Doit() (result int, err error)` syntax. To quote another platform, "there should be one, and preferably only one, obvious way to do it"
int_19h
`Result` is clearer given that in Pascal, a function name by itself in any other context is a function invocation (with no arguments). That is, you then have this kind of stuff:
type PInteger = ^Integer;
var X: Integer;
function Foo: PInteger;
begin
Foo := @X;
Foo^ := 123;
end;
The first assignment here is assigning to the magic result variable, while the second one recursively invokes the function and dereferences the returned pointer to assign through it. This is technically not ambiguous (since you can never have a naked function call on the left side of the assignment, unlike say C++), but it's a subtle enough distinction for human readers. No such problem with `Result`, obviously, which is presumably why it was one of the things that Delphi added since day 1.chungy
> I'm torn about which is clearer, that magic variable style or assigning to the function name as one does in VBScript.
That's also "old style" Pascal, and still supported by Free Pascal (even though the compiler gives you a warning for doing it!).
regularfry
I'll often use `result` as the return value in other languages, largely because I learned it in Delphi 25 years ago. It doesn't have the automatic return value semantics elsewhere, so you also need `return result` or whatever, but it's crystal clear what the intent is. I prefer it for that reason alone.
kgeist
>I also have mixed feelings about golang's `func Doit() (result int, err error)` syntax. To quote another platform, "there should be one, and preferably only one, obvious way to do it"
Isn't it basically equivalent to an anonymous tuple which is automatically deconstructed on assignment?
mdaniel
To the novice reader in golang, it was an unexpected "wait, where did these symbols come from?" because I wasn't used to being able to look after the function signature for variable names, and that's doubly true for symbol names that didn't come from caller data
I'm sure this solved some Google-y problem but for my tastes it is just needlessly confusing since I have never met a programmer who needed help creating local variables and that's got to be infinitely true now that AI gonna take all our jobs
> Isn't it basically equivalent to an anonymous tuple which is automatically deconstructed on assignment?
Your comment brought up an interesting point: a certain audience may also think those names appear in the caller's scope because they're part of the function's published signature but are an implementation detail
func Doit() (result int, err error) {
return 123, nil
}
func main() {
// a, b := Doit()
// fmt.Printf("In reality %d %+v\n", a, b)
Doit()
fmt.Printf("Uh-huh %d %+v\n", result, err)
}
./fred.go:13:32: undefined: result
./fred.go:13:40: undefined: err
I also just realized they're one of the places where golang doesn't emit a compile error for unused variables (as in the example above). Now I extra hate it func Doit() (result int, err error) {
result = 123
return 456, nil
}
throw-the-towel
Not exactly because you cannot store the entire tuple in a variable.
colechristensen
It would be great if release announcements like this always included a description of what the product actually is.
>Lazarus is a Delphi compatible cross-platform IDE for Rapid Application Development. It has variety of components ready for use and a graphical form designer to easily create complex graphical user interfaces.
szszrk
It's a link to a whole forum purely focused on that IDE, with it's name in domain name.
Why would they explain that to their audience? They know.
colechristensen
Because these things get shared elsewhere and end up getting looked at by someone who has no idea what the product is, like me, this time, with Lazarus.
szszrk
You are overreacting. It takes one click - the logo on top left - to go back to main site which covers "what is lazarus?" clearly. Is that logic, that a main logo of the site goes back to home page, already lost?
They made an internal forum announcement. It's trivial to find out what that is. If you lack context, blame the place that cited this resource without it. So HN and OP.
kristianp
Also what's new in V4. Edit: it is linked in the post: https://wiki.lazarus.freepascal.org/Lazarus_4.0_release_note...
nurettin
Delphi and Lazarus have been around for decades. It's like asking what lisp is.
integricho
Since I read about the guy who was surprised that anything other than SPAs exist (the full page reload magic incident), I realized there are way younger people in the field with no context or knowledge of CS history whatsoever, so some of them not knowing about Lazarus or Delphi sounds totally plausible.
graemep
> Since I read about the guy who was surprised that anything other than SPAs exist (the full page reload magic incident)
now you have referred to something I do not know about. Was it on HN or where?
lionkor
I think it's not elitist at all to say that people with no CS education (whether academic, self taught, or acquired over time) should probably not be considered when writing documentation or release notes.
If you generate AI slop web dev code (and the chances are incredibly high if you haven't heard of Lisp or Delphi) you probably won't need Lazarus or care that native apps even exist.
I'm all for teaching and explaining, and I know a small percentage of new CS people are curious and interested, but... release notes aren't the place for helping them.
That said, an explanation of what Lazarus is is genuinely needed, because people who have written Delphi for years might not have heard it (thanks, Embarcadero). So your have a point beyond your main point there.
mseepgood
You forget that every day, someone wakes up who is new to this planet.
anon7725
And on that day their first priority is securing a good open source object Pascal compiler.
trealira
I have also met people who have to ask what Lisp is. You might be surprised at how many people don't know things like this.
Timon3
I know Delphi, yet I didn't know Lazarus until now. I'm sure there are others like me.
I can understand not wanting to explain Delphi, but come on, not everyone knows the name of every IDE for every language. It doesn't hurt to add one sentence explaining that. If I hadn't seen the comment above, I wouldn't be able to consider Lazarus in the future if I ever use Delphi again.
troupo
10000 thousand people a day hear about any given topic for the first time in their life https://xkcd.com/1053/
evidencetamper
Which is an excellent point for conversations, but in the context of the release notes in the website of the project, I understand that this xkcd principle does not apply.
If one goes to the release notes for Lazarus, they either sought those release notes out, and hence already know what it is. Or they were linked to it in a specific context, such as Hacker News, which the expectation of curiously clicking around to understand the project is natural.
lproven
> Delphi and Lazarus have been around for decades. It's like asking what lisp is.
No.
Everyone thinks their pet project is obvious and self-explanatory.
This is NEVER EVER a safe assumption. Remember that our entire industry is a mysterious black box to the outside world.
I worked for A Prominent North American Linux Vendor for a while. I was hired to work on the docs for one of their projects.
I'm an industry veteran with at that time over 25 years of broad cross-platform tech experience from CP/M to Linux to mainframes.
It took me a month of hard digging to get an extremely vague overall concept of what the product was and did.
Most of the company had no idea -- it's not Linux-related in any way -- and many of them regard the entire product platform as an evil to be expunged.
This is typical for that vendor. Aside from their Linux distro, ask for a tweet-length summary of any of their portfolio, expressed in general terms not specific to that product or vague marketing-ware, and nobody in the company can give it.
Nonetheless they are a multi-billion-dollar vendor.
But they only sell into established markets.
TiredOfLife
HN submissions don't have a field for description. And you are supposed to use original title. And there is a length limit on title. And some angry internet user will make a comment - sometimes even the submitter.
notpushkin
Yeah, technically you could add text with the link submission, but it will demote the link somewhat and I guess is just frowned upon here.
colechristensen
Oh it seems my point was ambiguous, I really meant the website should include it
cess11
I think you'd have a larger impact if you convinced other communities, like the Linux kernel or Xfce, that their "products" ought to have a note like that in their release announcements.
Best part: a hello, world GUI app (a dialog with a textbox and a button that pops up a message box) is ~2.5 Mb on Win32.
This was something like 500 Kb back in 2000, but it's still a far cry from your ~200 Mb Electron hello world.