Page 1 of 1

nim hello world

Posted: Sun Aug 14, 2022 8:37 pm
by williams2

Supposedly, you can trick nim to compile a 150 byte executable.

https://hookrace.net/blog/nim-binary-size/


Re: nim hello world

Posted: Mon Aug 15, 2022 1:23 am
by BarryK

That's a great link!
I will append it to the blog post.

For everyone reading this, I created a post with quick size comparisons of "Hello World", one-line in V, Nim and BaCon:

https://bkhome.org/news/202208/quick-he ... rison.html

Here are earlier blog posts about Nim:

https://bkhome.org/news/202208/nim-comp ... edded.html

https://bkhome.org/news/202208/consider ... guage.html

Nim is looking so good. Want to get some experience with coding in Nim, if still looks good, might adopt it as the "official language" for coding in EasyOS.

I have some utilities written in BaCon, and want to write some more to integrate apt/dpkg with the ppm, and want to settle on a language to code in, higher-level than C, and with C's very efficient executable file size. And an elegant and simple coding syntax.


Re: nim hello world

Posted: Tue Aug 16, 2022 2:42 pm
by BarryK

Re: nim hello world

Posted: Sat Aug 20, 2022 12:44 pm
by wiak
williams2 wrote: Sun Aug 14, 2022 8:37 pm

Supposedly, you can trick nim to compile a 150 byte executable.

https://hookrace.net/blog/nim-binary-size/

I was already interested in Rust (was looking at FLTK with it) and I see above link also points to this: https://mainisusuallyafunction.blogspot ... -rust.html

In the end, I thought this looked interesting for simple Rust GUI programming: https://github.com/emilk/egui

https://docs.rs/egui/latest/egui/

The installation size of Rust is pretty massive though, but... disc storage can handle it methinks.

EDIT: so I've just installed rust on my Zorin system, and now going to fetch egui, but just for fun and quick play - I have no real desire to do any more real programming of that sort but my kid probably will (in fact I think he already mentioned Rust to me - he stumbles upon everything).


Re: nim hello world

Posted: Fri Aug 26, 2022 2:08 pm
by BarryK

As I'm learning Nim, posting progress reports to the blog:

"Associative arrays in Nim"
https://bkhome.org/news/202208/associat ... n-nim.html

"Debian to Puppy package db conversion in Nim"
https://bkhome.org/news/202208/debian-t ... n-nim.html

Quite a pleasant experience so far.


Re: nim hello world

Posted: Fri Aug 26, 2022 8:58 pm
by Burunduk

Thanks to this williams2's post I'm trying to learn the language too. Never heard about nim before. The only "achievement" so far:

Code: Select all

#!/bin/bash
echo "Hello!"

It compiles and runs very well.

As for dictionaries, it seems they are called tables in nim. A small test:

Code: Select all

import std/table

var t: Table[string, string]
var t2 = { "key1": "value1", "key2": "value2" }.toTable
t["key1"] = "value 1"
t["key2"] = "value 2"

if t.hasKey("key1"):
  echo t["key1"]
t2.del("key2")
echo t2.hasKey("key2")

Or maybe an object (struct) can be used here instead:

Code: Select all

import std/with

type
  Package = object
    description: string
    fileName: string
    installedSize: int

var
  foo: Package
  bar = Package(description: "just a package", installedSize: 10000)
with foo:
  description = "dummy package"
  fileName = "pool/main/whatever"
foo.installedSize = 1000

var
  list = @[foo, bar]
  sum = 0

for pkg in list:
  sum.inc(pkg.installedSize)
echo sum

Re: nim hello world

Posted: Sat Aug 27, 2022 1:45 pm
by BarryK

I have been collecting documentation links here:

https://bkhome.org/news/202208/nim-lang ... ation.html


Re: nim hello world

Posted: Sun Aug 28, 2022 3:50 pm
by BarryK

I have rewritten the 'debdb2pupdb' utility in Nim code, posted about it here:

https://bkhome.org/news/202208/debdb2pu ... in-oe.html

The program is 256 lines, so a non-trivial exercise. Took a couple of days intense coding, burning the midnight oil. Of course, learning as I went, which slowed things down.


Re: nim hello world

Posted: Mon Aug 29, 2022 2:28 am
by BarryK

Have written another Nim mini-tutorial:

"Commandline and file IO in Nim"
https://bkhome.org/news/202208/commandl ... n-nim.html


Re: nim hello world

Posted: Mon Aug 29, 2022 5:04 am
by wiak

So how big is 'Nim' to add to default EasyOS or Puppy or whatever? I'm forever wishing for a new dev language for a small distro. I have not myself checked out Nim, but I imagine gcc has to be already available, or some similar compiler, or not?
Associative arrays are something awk does very well so that much alone is not enough to convince me to try Nim. In what way is it particularly more useful. I could understand why Bacon with HUG could be attractive, but not sure where NIM fits into similar needs/desires/scenarios.


Re: nim hello world

Posted: Mon Aug 29, 2022 10:55 am
by BarryK

I haven't tried any of the GUI tools for nim, so far only wrote one CLI utility.

Needs gcc and libc, that's it.
Can also use tcc.

Very small binaries, but slightly bigger than those created by bacon, as has extra runtime safety checking, and an optional garbage collector, but only adds several KB.

My 256 line debdb2pupdb is about 60KB stripped.

Um, debdb2pupdb does link with a bit more than just libc:

Code: Select all

# ldd ./debdb2pupdb 
	linux-vdso.so.1 (0x00007fff84fbf000)
	libm.so.6 => /lib/libm.so.6 (0x00007f7ad4550000)
	librt.so.1 => /lib/librt.so.1 (0x00007f7ad4546000)
	libdl.so.2 => /lib/libdl.so.2 (0x00007f7ad4541000)
	libc.so.6 => /lib/libc.so.6 (0x00007f7ad4389000)
	/lib/ld-linux-x86-64.so.2 (0x00007f7ad46b0000)
	libpthread.so.0 => /lib/libpthread.so.0 (0x00007f7ad4369000)

That's interesting, because it has the "re" module and does some regular expression operations -- according to the docs, that requires linking with libpcre. That is what I read, but "re" must be using the regular expression functions in libc.

Here is the "hello world" in nim:

Code: Select all

# ldd ./helloworld
	linux-vdso.so.1 (0x00007ffdb3feb000)
	libdl.so.2 => /lib/libdl.so.2 (0x00007f29db9f6000)
	libc.so.6 => /lib/libc.so.6 (0x00007f29db83e000)
	/lib64/ld-linux-x86-64.so.2 => /lib/ld-linux-x86-64.so.2 (0x00007f29dba37000)

Re: nim hello world

Posted: Tue Aug 30, 2022 1:20 am
by BarryK

Checking out the GUI toolkits.

First report, the "ui" toolkit:

"ui GUI toolkit for Nim"
https://bkhome.org/news/202208/ui-gui-t ... r-nim.html

I have tentatively narrowed it down to:
ui
Gintro
NiGui

Might go for Gintro, as binaries are very small and it has the most comprehensive support for gtk (gtk3).


Re: nim hello world

Posted: Wed Aug 31, 2022 12:32 pm
by BarryK

Have started a new thread on GUI toolkits for Nim:

https://forum.puppylinux.com/viewtopic.php?t=6701


Re: nim hello world

Posted: Wed Aug 31, 2022 12:57 pm
by puppy_apprentice

Re: nim hello world

Posted: Mon Sep 19, 2022 12:49 pm
by BarryK

puppy-apprentice,
Thanks for those links!

I have written an intro page for Nim:

"The Nim language"
https://easyos.org/dev/nim/index.html


Re: nim hello world

Posted: Tue Sep 27, 2022 9:28 pm
by jeang3nie

From Barry K's devlog:

At first glance, I could not see that capability in Nim, and a search came up with something about using tables -- and the example given was unclear.

The solution that you came up with using a CritBitTree can actually be interchanged easily with a std/table, as they have nearly the same interface. The only advantage that the CritBitTree has is that the entries are sorted, I presume by the key. Initialization is about the only difference. Nothing wrong with how the debdb2pubdb utility is as written, but here's a patch just to illustrate how close the interface actually is.

Code: Select all

--- debdb2pupdb.nim.orig	2022-09-04 22:06:33.000000000 +0800
+++ debdb2pupdb.nim	2022-09-27 20:57:54.201909793 +0800
@@ -12,13 +12,13 @@
 #need split(), removeSuffix()...
 import std/strutils
 #CritBitTree for associative array...
-import std/critbits
+import std/tables
 #regular expressions...
 import std/re
 #reverse()...
 #import std/algorithm
 
-var debarray: CritBitTree[string]
+var debarray = initTable[string, string]()
 
 #read the commandline...
 var args = commandLineParams() #in os module

Most of my coding recently is in Rust, but Nim is extremely interesting in a number of ways. One thing that I find really interesting for a compiled language is there is no predefined entry point. So I can write a small CLI utility which is also a library, depending on whether the file is the main module or not.

Code: Select all

proc main() =
    stdout.write "Hello World!"

when isMainModule:
    main()

This is really nice because you could easily write the backend of an application along with a CLI interface, and then add a GUI interface of your choosing. Or two different interfaces, for different platforms. Lots of flexibility.


Re: nim hello world

Posted: Thu Sep 29, 2022 2:20 pm
by BarryK

jeang3nie,
Thanks for that info about std/table!