Disclaimer: I'm a Unix guy since about 1983. (Not necessarily Linux, though that's my main platform these days because popular.) But each system of course sucks in its own unique, different way of course. (And FWIW, one of my favourite things is functional programming, which puts LISP right up there, though—blub warning—I wouldn't use it if I had a lanaguage with an Hindley-Milner type system available.) Enso, here I just want to point out a few of the design decisions that are helpful in some of the systems you don't like.
I've looked at ca65 a couple of times. At some point I may even install it, but for now I am avoiding C. I think the taste left by GNU as (the worst assembler I've had to work with, perhaps) is what's giving me the willies, which is not fair since ca65 may be a fine assembler.
I have little experience with ca65, but I think you should definitely have a serious look at it.
- You can completely ignore the C compiler and use just the assembler and linker, and this works well in part perhaps because there are plenty of ca65 users who do the same, so it's an assembler designed for use by assembly language programmers, not just by a compiler.
- The main design decision you'd have to give a thumbs-up or -down to is using a linker. This can be great if you want to produce a lot of different versions of your code for different platforms (e.g., a LISP that can run from ROM or RAM on anything from a 4 KB Altair-like system to a 48 KB Apple II to a 128 KB Commodore 128, with various features depending on the target); it can be just a bit of added annoyance if you're doing much simpiler builds.
- It comes with some handy libraries for use on a lot of different 6502-based platforms that can be quite useful when you just want to quickly get some I/O working on a new platform.
- The support is great, at least if you're a good programmer. Recently https://retrocomputing.stackexchange.co ... 0libraries that intrigued me, for which I filed an issue on GitHub, and the folks there were great at pointing me to the things I needed to learn to fix it, including helping with refactorings to improve existing library code. If you had features you wanted to add that were sensible and had reasonably broad application, I think you'd be likely to get them on to the master branch.
It does produce listing files, though I've not looked at them myself. These are obviously pre-link (and thus pre-relocation for non-absolute code), but I've often found that good enough for what I need when debugging my stuff built with
ASxxxx, which is similar. ASxxx does offer a nice feature where the linker will read a .lst file and produce a .rst file with the addresses and modified opcode arguments (though not the symbol table, sadly) rewritten in the listing file; you might consider whether it would be worth adding such a feature to ca65 if you settle on it.
Also, remember that the linker can add debug information to the output which, though it's a very different thing, might with some custom tooling be an alternative approach to solving some of the problems to which you currently apply a listing file.
BitWise, no offense but I find Java a nuisanse - a cumbersome language taking the worst qualities of C++.
Right, but if you're not actually reading/modifying the assembler itself, Java isn't a concern, just the JVM. And yeah, it's a bit of a pain because you need to go find and install a JVM on your system, but on Linux this is relatively painless. The slow startup time is also annoying.
If you
are having to write code to run under the JVM, you'd probably like Clojure; it seems to be a fairly decent Lisp. (Re Lenningen, see below.) Or better yet, Scala (blub warning, see above re HM type systems).
...I am likewise annoyed with python. I just don't like it - kind of the way I don't like perl. I like languages that either compile code I can look at, and if there is a VM I would much rather deal with something like Smalltalk as gives you an awful lot of power.
I've written a
lot of code in Bash, Perl, Ruby and Python and Python is without question the best of the bunch. Not necessarily the language itself, but the ecosystem around it; it's designed not just for portablility like the others, but also for programmers.
Python does compile code you can look at; a disassembler for the bytecode generated by the compiler comes in the standard library. It also comes with a parser, letting you (relatively) easily build tools like pytest, which parses Python code and then tweaks the AST to instrument that code before passing it on to the compiler, allowing the test framework to "take apart" expressions and show you intermediate values when a test fails. (This is a major part of what makes pytest the best unit test framework I've ever seen, and I'm a 20-year TDD guy who's seen a lot of them.) It's good design like this that leaves me little doubt that, for a general "scripting tool," Python is the best one out there for modern platforms.
I wouldn't say that Smalltalk (which I have used) is more powerful than Python. It undoubtedly has better syntax, but the languages themselves are somewhere around similar in power and Python has a much better environment for modern Linux/Mac/Windows machines if your concern is to use it as an integration tool for helping to build code, as opposed to writing standalone programs.
I do wind up with something that requires python every year or so, and it's kind of different every time. It is a big download, has its own library system that downloads all kinds of crap that scares the pants off me every time
Every language system with a large package library has and
should have its own package system for those. To try to use platform packages is a nightmare if you want to run on more than one platform (and especially you want any chance of working on more than one of Linux/Mac/Windows) and having to manually pull down packages used by your particular system is something you'd quickly write a tool for, thus producing some custom packaging system anyway.
But the really key thing that these systems provide (though it's not always used) is installing the packages
in your project directory, not global to the system or even global to the user. (Python uses something called "virtualenv" for this, and also has a nice package called "virtualenvwrapper" that lets you create and enable/disable separate virtualenvs for general command line use. The latter lets you `workon foo`, `pip install somepackage`, use that from the command line, and then `deactivate` to remove it from your current environment, leaving it to be reactivated later if you like.) This is invaluable for being able to use these things without having them clutter up or, worse yet, create bad interactions, with other things you're doing on that host.
If you want to see an example of how I use this, have a look at my
8bitdev repo. Just `git clone` it and run `./Test` from the top level (under Linux and probably MacOS; I've made no special provisions for Windows support though that wouldn't be hard to add). You'll see it download, build and install the ASxxxx assembler suite (this is completely separate from Python) and then install the pytest and py65 (a 6502 emulator) packages, build my code, and run the unit tests on it using pytest and py65. All of its stuff is put under the `.build` directory and affects your system and user account not at all, except that maybe you needed to make sure that `python3` itself is available.