- 27comments
- 137comments
- 285comments
- 31comments
- 101comments
- 487comments
- 87comments
- 134comments
- 3comments
- 11comments
- 294comments
- 349comments
- 1comments
- 19comments
- 3comments
- 20comments
- 85comments
- 43comments
- 100comments
- 41comments
- 4comments
- 6comments
- 112comments
- 273comments
- 5comments
- 89comments
- 75comments
- 2comments
- 92comments
- 15comments
It could have been JavaScript 10 years before we had JavaScript. It demanded more dedication to use.
Turns out round window with stroke path text alpha and reimplemented xeyes was not compelling.
People should have shown NeWS doing complex client side form field checks.
Sun also didn't go downmarket. Windows PCs happened with hummingbird xceed X not decent in Microsoft X
Every day that I program in JavaScript I wish we had Display Postscript or NeWS in the web browser. Imagine if browsers had evolved with Postscript instead of JavaScript.
However, fashions in languages are a thing. While PostScript was hot by the mid 1980s, few were using it 10 years later, as there were now WYSIWYG PostScript editors like Illustrater, XPress, Page Maker, etc. Now, these were the days of C(++) and Perl, as may be observed in the JS syntax. But it would have been nice, if it had started with ECMA script (as opposed to LiveScript) and SVG had been already around.
Imagine if browsers had evolved with Postscript instead of JavaScript.
Adobe would have a stranglehold on the market instead of Google.
It's not PostScript instead of JavaScript. It's PostScript instead of HTML, JavaScript and CSS. That's (IMHO) the more important point. One programming language to write and structure everything instead of a bastardized SGML plus a bastardized Java plus an ad-hoc config add-on.
I'd much rather have (a slightly saner) JS for everything than PostScript plus HTML plus CSS, if I would have to choose.
Netscape 4 actually had JavaScript-based stylesheets, before everyone settled on the CSS standard: https://en.wikipedia.org/wiki/JavaScript_Style_Sheets
Neat, I wasn't aware of that. Ah, the things that could've been.
It may have been a mistake but it did add an important innovation: Postscript in the display system. This would be an innovation even now, having an interpreter for an embedded language right in the windowing system.
AFAICT Apple does something similar in Quartz…?
https://en.m.wikipedia.org/wiki/Quartz_(graphics_layer)
NeWS (developed at Sun) and Display Postscript (developed at NeXT) were each adaptations of Postscript to the screen. Apple (after the NeXT takeover) developed Quartz to avoid paying licensing fees to Adobe for Display Postscript. So yes, Quartz does something similar to NeWS.
Two corrections:
- Adobe was uninterested in supporting Display PostScript by 1997. The cost was secondary.
- Quartz / Core Graphics is based on the PDF rendering model, which is derived from PostScript. You use C graphics routines to draw; there is no programming language.
There are similarities in the rendering model but the big thing of uploading code is no there.
But of course we now have GPU shading languages..
Which brings us to the silliest part of the post: the idea that X won, or proved much of anything at all. X is basically noise in the computing world: the atrophied stump of the ix GUI market. The most popular Unix-like OS in the world is rooted in display PostScript. The most popular OS with a Linux kernel doesn't use X, or indeed a *ix-like userland.
I believe X Windows owes much of its incredible longevity to the "provide mechanism not policy" mantra that its designers took very seriously.
Having the toolkit in the server would necessarily force it to define and enforce lots of policy. This increases complexity, increases dependency (coupling) on part of the clients, and after all that you still have the problem that policy simply doesn't age well.
It still boggles my mind a bit that a display stack designed in the 1980s has remained viable to this day. Sure, it's a patchwork, and it's finally being replaced, but it works.
The WinForms API also survives from the mid 80s, and is interestingly different. I believe the classic controls were originally drawn in the kernel?
You probably mean Win16/Win32, not WinForms. But it only survives in the sense that it’s still there, not in the sense that it’s still useful. How many applications created in the last five years use Win32 for anything but creating a top-level window (usually via Chromium/Electron)?
I think that you're in a bubble for that one. Many business domain-specific applications are still directly written against Win32 even today. UWP didn't manage to catch up for now either.
Electron usage is mostly only in startup-y apps and some IDEs.
No experience is universal, so I'm curious in what industry you encounter Win32. Or do you mean WinForms? I often work with industrial manufacturing companies in Europe, with a mindset about as far from that of Silicon Valley startups as you can imagine. You usually won't find Electron there. Many "legacy" projects are in WinForms. But for newer stuff, I see lots of WPF and Qt projects, both of which don't use native controls.
Qt has more impact as far as I can see. However, where I went, I didn't see it resulting with anything deployed to production yet...
That is also my experience.
Outside games, most modern Windows applications, specially in the areas you mention, I have also seen WPF/Qt, with plain old Win32 just as glue for underlying OS APIs.
There are still some odd ones that keep doing MFC, or enjoy a mix of Delphi/C++ Builder.
The only old style C Win32 applications I have seen in the wild during the last decade tend to be surviving applications from the 90's, done by companies not so much into Windows C++ frameworks.
How many Windows applications have been created in the last five years at all?
Not much of a PC gamer, are you? :)
We were talking about widget libs and non-cross-platform apps, so PC games didn't come to mind for both reasons.
I still mourn the days of shareware.
Sorry for the pedantry, but you're thinking of the Windows API, specifically the user interface bit (user32.dll as of Windows 95 and NT but it existed before) which is based on GDI which is hardware accelerated. It still exists but it rarely used for new applications today, but it was certainly in use for a very long time.
WinForms was briefly promoted as a successor, based on GDI+. It was quickly abandoned, as was GDI+ which never got hardware acceleration, in favour of WPF which is based on DirectX which is obviously hardware accelerated. But in that small time it caught on and continues to be used for new projects because it's a simpler programming model than WPF and it's not obvious in Visual Studio that it's been abandoned (it's not quite deprecated).
One can use WPF just like WinForms, with code behind and plain drag-and-drop of components.
The problem is that when beginners start searching for tutorials they usually land on MVVM, data binding and how WinForms style is a bad practice and they end up feeling overwhelmed.
Ironically MVVM is also possible to do in WinForms, but the capabilities aren't as rich as in WPF, so very few end up going that route.
WinForms is much more recent than that. It was introduced along with the .NET Framework around 2000.
The original classic controls were implemented in USER.EXE (which was actually a DLL) starting in Windows 1.0 around 1985. WinForms wrapped these controls and others in a .NET interface.
MS Windows is definitely a good counterpoint to this blog post. Whatever the kernel/userspace split (which has changed over time), the basic Windows model is that the logic & code of the windowing system is all in the 'server' (i.e. the OS libraries, sometimes including kernel-space code).
The 'clients' (Windows applications) don't have to do their own font rendering, widget drawing, etc, they can use several different 'server' APIs to do so. Even so, the framework has proved remarkably long-lasting, with decades-old programs still capable of running on modern systems.
Actually the logic and windowing happens in each client in user space, which is why you can’t build alternative window managers, and Microsofts policy of compatibility ‘shims’ and hacks that allow chosen old software (and they choose a lot of software) to work on modern systems has nothing to do with it.
Have a quick search online, and you'll find plenty of alternative window managers for Windows. But it's besides the point, because both styles of graphical windowing systems can support alternative window managers.
The Windows ‘solution’ is really fragile and dangerous because it involves injecting code into all programs.
If there’s a vulnerability the whole system is compromised, if there’s instability the whole system crashes and if part of the system is separated out, like what Windows does with windows belonging to elevated processes, these windows follow the original rules set by Microsoft.
A lot of software seems to work best just before it's replaced, and the replacement takes years to catch up. I hope for the best but fear for the worst in the X case.
I get your point, but see it completely differently as GUI programmer. X was steaming pile of s*t. Its "longlevity" was spend cleaning up the mess.
Designers had this stupid idea to do drawing over remote connection, and produced broken design around that. Direct memory access, DRI, OpenGL, screen buffers... Non of that was part of X, but is vitally necessary for GUI.
There is no compatibility in X server design. Good luck running remote X session today. Everyone uses VNC.
Apart from thin clients, X remote display has historically been used for combining applications from multiple systems on a single display. Those systems could be computers, lab hardware, or anything else.
Indeed, over 25+ years that I've known, and I'd be surrounded by that in the office, not VNC (but some X2go).
The single rubbish X server I've known is (or was) Xceed (or however it's spelt) which people inexplicably used rather than Cygwin's; the first question to ask someone with classes of Emacs problems was whether they were using it.
Or the other way around: multiplexing one X11 application across multiple displays.
On the Usenix trade show floor one year, somebody made a horse racing client that opened connections on multiple X11 servers, and animated horses racing from screen to screen. Many different companies with X11 workstations or terminals were running it at the same time, and horses were running between different brands of computers on the trade show floor, which made a nice point! (About network race conditions ;) It was just black and white, and the graphics were dead simple, so it worked great on everybody's hardware.
Multi Player SimCityNet was implemented in TCL/Tk on X11, which supported opening multiple X11 servers at the same time, even with different kinds of displays, and using shared memory if running locally. Of course there was a limit to how many people could play at once, and it required a reasonably fast network, and every player had to grant full access to their server to the client. And anyone could type TCL expressions into the chat window and hit escape to execute them, so it probably wasn't very secure, and certainly was easy to cheat: "sim Funds 9999999<esc>"
https://www.youtube.com/watch?v=_fVl4dGwUrA
https://www.donhopkins.com/home/catalog/simcity/simcity-anno...
https://www.donhopkins.com/home/catalog/simcity/simcitynet.h...
is the demo still available for download somewhere? the FTP link on that page is broken.
We had effective direct-manipulation GUIs long before OpenGL, so that can't be it, though we did have DMA and graphics buffers in the '80s and DRI wasn't relevant.
It makes a lot of sense for multiple applications share the same toolkit implemented in a "user interface manager", the same way they all share a "window manager", running locally with the window server. Of course the browser is now a "user interface manager" itself. It also makes a lot of sense to use a web browser as the window manager and user interface manager itself: instead of running it on top of another window system, the web browser should be the window system and window manager.
Simon Schneegans, the author of Gnome Pie, and creator of the Coral Menu and Trace Menu, wrote some interesting thoughts about "Open Pie", and the evolution of Gnome-Pie for Wayland towards being a shared "pie menu user interface manager" that applications use via D-Bus.
Gnome-Pie: Homepage of Gnome-Pie, the slick application launcher for Linux.
http://schneegans.github.io/gnome-pie
Gnome-Pie
https://vimeo.com/30618179
The Trace-Menu
https://vimeo.com/51073078
The Coral-Menu
https://vimeo.com/51072812
OpenPie! Gnome-Pie will die.
http://schneegans.github.io/news/2018/05/31/openpie
[He goes on to describe how OpenPie will use the D-Bus interface, and support new menu types.]
Although I admire and frequently agree with this blog, I think this article exhibits some common misconceptions about NeWS. NeWS had what amounted to uploadable toolkits, and therefore could and did have multiple toolkits. A client could decide how it wanted to separate processing between the client and server, which seems truly more flexible and allows for much more efficient communication. Also NeWS had threads which if done today would certainly use multiple processors. Clients could, but didn't have to, use a separate address space and language even. But the graphics API was so much better, it's ridiculous, and is basically the same as now in SVG, html canvas, and most other decent things.
The big drawbacks of NeWS in my opinion are not having an MIT license, and being quite difficult to implement well. Also PostScript isn't the nicest language to program in, which I say from years of programming in it. But it's far from the worst, and if one changed the to postfix syntax to prefix, it would be mostly a Lisp.
What do you not like about PostScript? It's basically a worse Forth, which, when compared to most languages, is comparatively wonderful to write in.
How is PostScript a "worse Forth"? I find PostScript great fun to program in, and I think the type errors one gets from the system to indicate mistakes are a great help when writing PostScript code.
It's much higher level, chooses the worst bits of high-level languages to throw in, NeWS's spin of it was object-oriented which has since been shown to be a mistake, it's not as extensible, has too many stacks, introduces significant complexity for dubious benefit, so forth.
Of course, whether or not PostScript is like Forth at all is a matter of debate, some religiously disagree. I'm somewhere in the middle on that. Old flamewar topic:
http://wiki.c2.com/?ForthPostscriptRelationship
The syntax is also slightly less nice, which is relevant for their question, but less quantifiable.
I did a fair bit of PostScript development in NeWS/HyperNeWS and while I really liked PostScript I've never been able to get into Forth - I actually thought that PostScript was rather like the Common Lisp that the rest of the project used (one of the things I wrote for the project being the glue code in C to link the PostScript world of NeWS to Common Lisp - which is a nice mix of approaches to syntax!).
NB: It was particularly neat that Sun shipped a set of Adobe blue/green/red(?) books with OpenWindows.
PostScript does take a lot from Lisp, too. And (kind of) Smalltalk. 'DonHopkins has posted a lot about it on here; I really love hearing him talk about it:
https://hn.algolia.com/?dateRange=all&page=0&prefix=true&que...
I just found this article by Don about HyperNews and related stuff:
https://medium.com/@donhopkins/hyperlook-nee-hypernews-nee-g...
Object oriented programming has since been shown to be a mistake??! That's NeWS to me. Can you provide a citation please?
What do you mean that NeWS or PostScript classes are not extensible? The little "e" in NeWS stands for "extensible".
And what is the correct number of stacks, in your opinion?
Please quantify what you can, and provide examples and links to code, and citations of other people who agree with your personal opinions like the number of stacks a language is supposed to have, the meaning of extensibility, or that object oriented programming languages are a mistake.
But maybe that capital N is for Non .. (kidding obviously)
I've always been curious about NeWS but the web is quite short of demos about it (not helped by newspapers called Sun either). Do you know sites with videos about it ?
Thanks for asking! ;) I've put up some old demos on youtube, and made illustrated transcriptions of some, and written some papers and articles. Sorry the compression is so terrible on some of the videos. Here are some links:
The Shape of PSIBER Space: PostScript Interactive Bug Eradication Routines — October 1989
https://medium.com/@donhopkins/the-shape-of-psiber-space-oct...
PSIBER Space Deck and Pseudo Scientific Visualizer Demo. Demo of the PseudoScientific Visualizer and NeWS PSIBER Space Deck. Research performed under the direction of Mark Weiser and Ben Shneiderman. Developed and documented thanks to the support of John Gilmore and Julia Menapace. Developed and demonstrated by Don Hopkins.
https://www.youtube.com/watch?v=_fqCeuue5Ac
Pseudo Scientific Visualizer. Demo of the NeWS PseudoScientific Visualizer and the PSIBER Space Deck.
https://www.youtube.com/watch?v=GatM3s2S75Q
Mousee Demo. Demo of Mousee running in the NeWS Window System.
https://www.youtube.com/watch?v=PRP2QorRDUw
Ben Shneiderman introduces Pie Menus developed by Don Hopkins at UMD Human Computer Interaction Lab. University of Maryland Human Computer Interaction Lab Pie Menu Demos.
https://www.youtube.com/watch?v=kxkfqgAkgDc
Designing to Facilitate Browsing: A Look Back at the Hyperties Workstation Browser. By Ben Shneiderman, Catherine Plaisant, Rodrigo Botafogo, Don Hopkins, William Weiland. Published in Hypermedia, vol. 3, 2 (1991)101–117.
https://medium.com/@donhopkins/designing-to-facilitate-brows...
HCIL Demo - HyperTIES Browsing. Demo of NeWS based HyperTIES authoring tool, by Don Hopkins, at the University of Maryland Human Computer Interaction Lab.
https://www.youtube.com/watch?v=fZi4gUjaGAM
HCIL Demo - HyperTIES Authoring with UniPress Emacs on NeWS. Demo of UniPress Emacs based HyperTIES authoring tool, by Don Hopkins, at the University of Maryland Human Computer Interaction Lab. Tabbed window management with pie menus.
https://www.youtube.com/watch?v=hhmU2B79EDU
Just the Pie Menus from All the Widgets. Pie menu demo excerpts from "All The Widgets" CHI'90 Special Issue #57 ACM SIGGRAPH Video Review, produced by and narrated by Brad Meyers.
https://www.youtube.com/watch?v=mOLS9I_tdKE
Precision Pie Demo.
https://www.youtube.com/watch?v=c0scs59va4c
Handy Pie Menu Demo.
https://www.youtube.com/watch?v=TuA_yylYwjM
How To Choose with Pie Menus. Early pie menu demo by Don Hopkins, on NeWS 1.0, running on a Sun 3 workstation. Featuring the World's Most Enormous Pie Menu, and Direct PacManipulation!
https://www.youtube.com/watch?v=MOJaY6Xu7ao
NeWS Tab Window Demo. Demo of the Pie Menu Tab Window Manager for The NeWS Toolkit 2.0.
https://www.youtube.com/watch?v=tMcmQk-q0k4
SimCity, Cellular Automata, and Happy Tool for HyperLook (nee HyperNeWS (nee GoodNeWS)). HyperLook was like HyperCard for NeWS, with PostScript graphics and scripting plus networking. Here are three unique and wacky examples that plug together to show what HyperNeWS was all about, and where we could go in the future!
https://medium.com/@donhopkins/hyperlook-nee-hypernews-nee-g...
HyperLook SimCity Demo Transcript. This is a transcript of a video taped demonstration of SimCity on HyperLook in NeWS.
https://medium.com/@donhopkins/hyperlook-simcity-demo-transc...
HyperLook Demo. Demonstration of SimCity running under the HyperLook user interface development system, based on NeWS PostScript, running on a SPARCstation 2. Includes a demonstration of editing HyperLook graphics and user interfaces, the HyperLook Cellular Automata Machine, and the HyperLook Happy Tool. Also shows The NeWS Toolkit applications PizzaTool and RasterRap. HyperLook developed by Arthur van Hoff and Don Hopkins at the Turing Institute. SimCity ported to Unix and HyperLook by Don Hopkins. HyperLook Cellular Automata Machine, Happy Tool, The NeWS Toolkit, PizzaTool and Raster Rap developed by Don Hopkins. Demonstration, transcript and close captioning by Don Hopkins. Camera and interview by Abbe Don. Taped at the San Francisco Exploratorium.
https://www.youtube.com/watch?v=avJnpDKHxPY
The Story of Sun Microsystems PizzaTool. How I accidentally ordered my first pizza over the internet.
https://medium.com/@donhopkins/the-story-of-sun-microsystems...
The X-Windows Disaster. This is Chapter 7 of the UNIX-HATERS Handbook. The X-Windows Disaster chapter was written by Don Hopkins.
https://medium.com/@donhopkins/the-x-windows-disaster-128d39...
Oh yeah some are compressed to death. But most are ok. The precision pie curved lever was mindblowing, and I've seen some !
This should be a top-level article.
If you can find a library copy, The NeWS Book (e.g. https://www.waterstones.com/book/the-news-book/james-gosling...) might also be of interest for a static view, but I don't know how much was actually implemented, and I'm away from my copy.
I haven't had a chance to look at the videos for old time's sake, and they may make the point: a big part of it, as a developer experimenting with things, was the mode-less Smalltalk-like environment which allowed you to modify the system on the fly. (I don't know how much like, since I never used Smalltalk.)
Edit: "Scott McNealy ate my window system" :-(
Yeah, I'd say GUI development is one of the places OOP really shines. I think a lot of the OOP was a mistake opinions come from its ubiquitous use in the enterprise, even in domains for which it was not well suited.
I would venture game development as well - UE4's actor and component model is a good example of this, it's a very flexible system that allows you to strike a good balance between inheritance and composition.
I remember that pre-1990, PostScript seemed like a miracle. "Computer Shopper" of all things, used to have a PostScript Guru column with all kinds of interesting stuff. All the computer I had access to was an Atari ST with GFA Basic, so really only the math and ideas translated, but it really was like seeing the future. Path-clipping in particular was mind-blowing.
It's partly archived online, and weirder than I remember! https://www.tinaja.com/glair01.shtml
In what way is PostScript worse than Forth? Please answer with specific details, and provide links to code if you can. I programmed a lot of Forth code before learning and moving on to programming a lot of PostScript code, so I've used each of them extensively, and much prefer PostScript, and I'm happy to show you why and explain by showing you code.
PostScript is much higher level than Forth, and a lot more like Lisp than Forth, and has much better data structures than Forth, like polymorphic arrays (that can be used as code), dictionaries (that can be used as objects), strings, floating point numbers, and NeWS "magic dictionaries" that can represent built-in objects like canvases, processes, events, fonts, etc.
Yet Forth doesn't even have dynamically allocated memory, although in a few pages of code you can implement it, but it's not standard and very few Forth libraries use it, and instead use the linear Forth dictionary memory (which is terribly limited and can't be freed without FORGETting everything defined after you allocated it):
https://donhopkins.com/home/archive/forth/alloc.f
PostScript is homoiconic. Like Lisp, PostScript code IS first class PostScript data, and you can pass functions around as first class objects and call them later.
https://en.wikipedia.org/wiki/Homoiconicity
PostScript lets you define local variables with names in dictionaries, and use stacks of those dictionaries as objects and classes, while Forth requires you to keep track of everything on the stack without giving it a name. Forth variables are effectively globals. The fact that PostScript is homoiconic means you can write PostScript functions that dynamically create and transform other PostScript functions, like Lisp macros.
In October 1986, before I ever used NeWS or learned of Owen Densmore's Smalltalk-like PostScript object system, I had just used PostScript on the LaserWriter and invented my own simple object system like Lisp Machine Flavors (which was quite easy and obvious) for drawing pie menus, I wrote the following to Mitch Bradley comparing Forth and PostScript. (Mitch was the Forth guru at Sun who developed ForthMacs / Sun Forth / CForth / Open Firmware / etc -- I worked with him at Sun on Forth as his summer intern, then later with James Gosling at Sun on NeWS as a full time employee):
https://github.com/MitchBradley
https://donhopkins.com/home/archive/forth/forth-postscript.t...
PostScript makes it easy to efficiently implement a flexible dynamic object oriented programming system like Smalltalk's, with multiple inheritance, and prototype objects that you can dynamically promote both methods and instance variables from classes to instances. Tom Stambaugh described how Smalltalk inspired Owen Densmore's PostScript object oriented system in NeWS:
https://news.ycombinator.com/item?id=18696116
https://ia802600.us.archive.org/5/items/pdfy-1U9Ry1_Qj0LPSR6...
Like Lisp or Scheme, you can easily write a metacircular PostScript evaluator in a few pages of PostScript:
https://news.ycombinator.com/item?id=21968842
https://www.donhopkins.com/home/code/ps.ps.txt
https://donhopkins.com/home/archive/psiber/cyber/ps.ps.reaso...
And you can use NeWS PostScript to implement a visual programming system and debugger to itself:
https://medium.com/@donhopkins/the-shape-of-psiber-space-oct...
NeWS not only supported multiple loadable toolkits, but it had "packages" to keep them safely separated and modularized so clients could request whatever versions of whatever toolkits they needed, and the same code and data would be properly shared between all compatible clients. (See "findpackage" / "beginpackage" at the beginning of every X11/NeWS program, like this X11 window manager for NeWS implemented in PostScript:)
https://www.donhopkins.com/home/archive/NeWS/owm.ps.txt
In case you would rather program in a Lisp-like syntax than PostScript, David Singer and Rafael Bracho at Schlumberger wrote ListScript, a Lisp to PostScript compiler:
https://donhopkins.com/home/archive/NeWS/NeScheme.txt
And in case you are suffering from poor taste in programming languages, and you don't like Lisp but would rather program in a C- or Java-like syntax than PostScript, Arthur van Hoff at the Turing Institute wrote PdB, an object oriented C to PostScript compiler, which let you subclass PostScript classes in PdB, and also subclass PdB classes in PostScript:
https://news.ycombinator.com/item?id=21968842
Here's the PdB object oriented C to PostScript compiler and lots of other NeWS stuff:
https://github.com/IanDarwin/OpenLookCDROM/blob/master/NeWS/...
https://github.com/IanDarwin/OpenLookCDROM/tree/master/NeWS/...
https://github.com/IanDarwin/OpenLookCDROM/tree/master/NeWS
Also a paper by Arthur van Hoff about "Syntactic Extensions to PdB to Support TNT Classing Mechanisms":
https://www.donhopkins.com/home/archive/NeWS/PdB.txt
More LispScript stuff (compiling Lisp to PostScript):
https://www.donhopkins.com/home/archive/NeWS/NeScheme.txt
And to compare some window management tasks in Forth and PostScript:
X10 window manager in Forth:
https://www.donhopkins.com/home/code/fuwm-main.forth.txt
X11 window manager in PostScript:
https://www.donhopkins.com/home/archive/NeWS/owm.ps.txt
NeWS tabbed pie menu window manager in PostScript for TNT 2.2 (which "owm" could wrap around X-Windows):
https://www.donhopkins.com/home/archive/NeWS/tab-3.0.2.ps.tx...
NeWS Tab Window Demo: Demo of the Pie Menu Tab Window Manager for The NeWS Toolkit 2.0.
https://www.youtube.com/watch?v=tMcmQk-q0k4
Here is an example of making Lisp-like macros with PostScript, using a technique like "backquote", to compile PostScript code templates into more efficient drawing functions, and promote customized dynamically generated code into the instances (NeWS had a prototype based object system that made that possible).
This is a design document I wrote for Open Look Sliders for The NeWS Toolkit 2.0.
https://www.donhopkins.com/home/archive/NeWS/tnt-sliders-des...
* THE PROBLEM:
The tNt 1.0 slider implementation was a subclass of ClassDialControl, which was a subclass of ClassControl. It needed to be reimplemented, directly as a subclass of ClassCanvas (with ClassTarget mixed in), and had to be taught to play games with the services architecture, and brought in line with the controls architecture. All that hot air from the collapse of the ParentDictArray had to go somewhere, so the slider was graphically "puffed up" with a fake 3-D look. It is hoped that the result of this transfer of energy will result in a net decrease in size and increase in speed. To cope with the increase in complexity of drawing special effects, a form of inlining or macro expansion similar to "backquote" in lisp was used, to promote fast drawing procedures into slider instances.
* DESIGN CHOICES:
space/time tradeoffs The backquote technique speeds up drawing but takes up space. But the macro templates (defined as methods that are inlined and promoted) can still be executed even if they haven't been promoted. There is a small hit for executing "," which is defined as "/, {exec} def" (since it can't be defined as "/, /exec load def" because of autobind). And of course the templates are slower than the their inlined promoted expansions, because they're calculating the values each time instead of just pushing constants. Right now, the promotion happens upon /reshape, when the size is known and the layout can be calculated. Another space saving trade-off might be to only expand and promote the macros at the start of tracking, during which parts of the control must be frequently repainted, and unpromote it upon completion of tracking.
Thanks for all this stuff, some of which I wish I'd been aware of at the time, like LispScript.
I don't remember the details, like how it was used, but I recall the metacircular evaluator in HyperNeWS (or do I mean HyperLook?) being called out as a (the?) major pain point in the system for speed of the interpreter.
I wrote a metacircular evaluator, ps.ps, but I only used it in PSIBER for debugging (single stepping through code, which the normal PostScript interpreter didn't support directly, and also drawing visualizations of code execution). So the fact that it was slow wasn't really an issue, since it wasn't used in any speed critical situation.
https://www.donhopkins.com/home/code/ps.ps.txt
Nether GoodNeWS aka HyperNeWS aka HyperLook nor TNT (The NeWS Toolkit) used a metacircular evaluator themselves.
HyperLook could copy the image of windows to the clipboard as a PostScript drawing, but didn't need to use "PostScript capture" for that [below], because it represented drawings in its own format as a display list of PostScript data, that PostScript code interpreted to draw, and when you printed an image, it would just send a header with the drawing interpreter to the printer, followed by the drawing data and a call to the interpreter.
Maybe it was the speed of the structured drawing interpreter that people were complaining about. There is some overhead of course, but it's washed out by the fact that actually performing the drawing itself takes much more time than interpreting the data.
Or maybe you're thinking of "PostScript capture", which is effectively "partial evaluation" of arbitrary PostScript code, with respect to the imaging model (making paths, filling and stroking them, and rendering text)? You can efficiently implement PostScript capture without resorting to a metacircular evaluator, simply be redefining a few key operators like "fill", "stroke", "show", etc.
https://en.wikipedia.org/wiki/Partial_evaluation
PostScript capture is the technique of executing some arbitrary PostScript code that produces a drawing (which could be a traditional document in a PostScript file meant for the printer, or even a window system object like a menu), and capturing the drawing commands as another PostScript program, without any computation, conditionals, and loops. It would capture the effects of the drawing commands as another simple, flat PostScript program with all the conditionals and loops unwound (so a small recursive drawing procedure would produce an enormous flat drawing file, but most normal documents would be optimized to be smaller and even print faster), in the same global coordinate system, with unnecessary graphics state changes removed.
That's the essence of Adobe Acrobat's "Distiller", or Glenn Reid's "PostScript Distillery". I wrote distill.ps "in the spirit of Glenn Reid's Distillery" for PSIBER, and the NeWS Toolkit had its own /capture method built in, but they weren't actually used for much besides making a few illustrations.
https://medium.com/@donhopkins/the-shape-of-psiber-space-oct...
Here's more about the metacircular interpreter and distilled PostScript:
https://news.ycombinator.com/item?id=13705664
http://www.donhopkins.com/home/psiber/cyber/ps.ps.txt
http://www.donhopkins.com/home/psiber/cyber/distill.ps.txt
http://donhopkins.com/home/archive/postscript/newerstill.ps....
Glenn tells me that the PostScript distillery was actually John Warnock's idea!
Sir, this is an Olive Garden.
PostScript is a much more advanced and easier to program language than Forth. Just how you can use def in all its forms makes a lot of things easier. Hand written PostScript code is very easy to read.
Writing bigger programs I struggled to understand what I wrote without comments on every line describing the stack. One could use more variables to make it easier to understand, but in the old days that would also make it less efficient. I would frequently have to reverse engineer my code.
Interestingly, object oriented PostScript would tend to help make your code seem more like prefix code, because it would be like more like "object method argument ... send" rather than "... arg arg function".
There is nothing more multi-core than a modern GPU. Actually the existence of modern GPUs is an argument FOR toolkit-in-server windowing systems. All you do is writing shaders that help you to keep the communication over the PCIe bus (and potentially network, if you want network transparency) as minimal as possible.
The NeWS system failed for none of the reasons described in the article. It failed because of bad performance. There never was custom silicon out there to render Postscript. Unlike today where you have vastly underused GPUs at your disposable just waiting to be stuffed with intelligence in form of shaders. Just have a look at https://shadertoy.com to see what is possible even on low-end GPUs.
Edit: as cpach pointed out shadertoy.com and not .org
I think you meant shadertoy.com, right? :)
In modern graphics applications (=games) people do try to reduce CPU-GPU communication, but it is still done a lot and is frequently a bottleneck. Increasing GPGPU work means CPU and GPU code communicate in both directions. Making it slower than it already is doesn't make sense from performance engineering POV unless there are some dramatic advantages from the tradeoff.
Only if you make the wrong abstractions. Using a shader based toolkit is not about increasing the GPGPU work but to use the GPU for things that it is intended to do namely drawing. And if you make the right abstractions you can severely reduce CPU-GPU communications. In fact a toolkit is exactly the perfect type of abstraction in that scenario. Most of the input is mouse and keyboard data and a bunch of drawing commands which means extremely low bandwidth, less CPU-GPU communication, more performance and faster applications. I'm not sure what you mean by "tradeoff". Look for example at the shaders of sahdertoy. For the most part the only data they receive from the CPU is a timestamp of the current frame and occasionally mouse and keyboard data which is in the worst case literally just a bunch of bytes per frame.
Shadertoy is pretty far removed from actual games. Both in tje problem domain and technological complexity, not to mention the time capsule of webgl.
I'm not sure what you mean by shader based toolkit. Anyway in games the GPU is not just for graphics anymore (since many years) and this naturally leads to tight coupling.
I didn't notice performance was a problem on something like a SPARCstation 1+, though it was definitely slower than the blindingly-fast GEC4000-driven vector displays we needed to replace.
To my eyes, NeWS does not look like a mistake. On the contrary, it looks beautifully engineered.
Among other advantages, I can imagine a world where PostScript would be used for building user interfaces: a document in screen and print would look the same, without need for writing conversions like, e.g. HTML+SVG -> PDF when someone needs to somehow print a web form quickly. And perhaps the old principles of typography and the experience in typesetting beautiful books with PostScript could be more easily applied to UI design.
This only works if all the screens are the same size as a sheet of paper.
And have the same dpi as whatever's used to print them!
I can print the same PS file to different printers (inkjet, laser, dot matrix) and (subject to resolution constraints) obtain similar documents from each device.
A key advantage of PostScript is that you can scale all output using transformations, so that you internally work with the same coordinate space (called user space) on all devices, and implicitly scale — and also for example rotate — all graphics when they are actually drawn.
This extends to fonts too, since PostScript letters are drawn using the same graphic primitives as other graphs.
I worked on a project in the early 1990s where we used the utterly wonderful HyperNeWS for most things - we used to play tricks on each other by doing silly things like logging into someone else's NeWS server using psh and setting the rotation in the transforms for a terminal window to be slightly off as people were using them - eventually people would notice of course but things would just work.
Another neat trick that HyperNeWS supported was drawing a shape in its graphical editor and then pasting that shape as the shape of a window...
My friend and I had an ongoing competition / psychological experiment to psh into each other's NeWS servers and see how long it was before we would notice a some semi-subliminal or mildly psychedelic window system hack.
Circa 1990 I was working/studying in university on a mix of 1024x1024 1 bit per pixel XTerminals and workstations (Sun, Apollo?) with somewhat better resolutions and colors. We had one NeXT too. Printers where mostly dot matrix, with some lasers, A4 format (Europe here). Nothing would have prevented sending a Postscript screen output to a printer, with some white space around due to different geometries. Actually I learned Postscript in 1996 to print some stuff directly instead of drawing it using Word or whatever.
Well, I have some questions now:
- Is it necessary that the document should take the whole screen?
- Is it possible to render a PostScript document in different sizes and resolutions?
- Do any people today read PDFs on their screens? If some do, are all their screens the same size as a sheet of paper?
Anyway, that was not the spirit of my comment. I meant, doing design in HTML, CSS, SVG and then working out again, all from the beginning, how to convert the document to a printable version of professional quality, is more work than writing PostScript for both, even if some configuration necessarily differs between screen and print.
There are definitely a lot of difficult issues and trade-offs about implementing true "WYSIWYG" editors that let you layout text and graphics that looks exactly the same on the screen and when printed.
This Cedar demonstration video has some great examples of many of these issues. The Tioga text editor was "WYSIMOLWYG": what you see is more or less what you get.
https://www.youtube.com/watch?v=z_dt7NG38V4
Some problems were due to technology and aren't as bad any more. Cedar and NeWS used black-and-white screens and didn't have anti-aliased fonts. CPUs were much slower and memory was much tighter and graphics were not accelerated, so even with color displays (which were usually only 8 bits with a colormap that makes anti-aliasing very difficult), anti-aliased text wasn't practical.
And fonts rendered at screen resolutions have totally different measurements than high resolution printed fonts, so words have different widths and get flowed and wrapped differently, so the formatting is quite different.
NeWS had a "setprintermatch" primitive that makes the font rendering machinery use the official precise printer measurements for fonts, instead of the actual pixel screen measurements. That was useful for the PostScript previewer, and for editors previewing how formatted text will look. (There was a nice port of FrameMaker to NeWS, but I don't remember how its preview features worked.) But text rendered with printer metrics looks terrible and is hard to read, so you wouldn't want to actually edit text like that.
NeWS 1.1 manual, page 146:
http://www.bitsavers.org/pdf/sun/NeWS/NeWS_1.1_Manual_198801...
Windows are resizable, and while text is scalable, you still want to be able to read and edit text in narrow windows, and not waste screen space or get giant text in wide windows. So reflowing text differently for the screen while editing is very useful.
Also, rendering text in a wysiwyg previewer that precisely scales text is slow the first time and uses a lot of memory, because the particular point size of that font must be rendered into the cache, since it can't just round the point size to a whole number that may already be in the cache (like the scalable "jet" NeWS terminal emulator did to avoid blowing the cache). So it's better if the system renders all text in the same restricted set of point sizes, instead of scaling it continuously.
Also it's costly in terms of screen space to edit two columns of text at once, or pages at a time.
It's just ergonomically easier and wastes less screen space to edit formatted text in one continuous non-paginated column, resizable to any window width you want to use at the time, formatted as close as possible to how it will look on the printer, but without the exact same measurements.
And in this day and age, most text that people write is intended to be read in many different media, formats, screen and font sizes, and layouts. Now it's about WYSIWYG editing text and graphics in the way they will appear in a web browser, and those come in all shapes and sizes (thus Chrome Developer Tool's device preview mode).
Now printing text on paper is only an afterthought, something wasteful to be avoided. So fewer people actually need to edit two-column paginated text just like it will appear printed on paper in a journal, or fuss about exact text layout and worry about terrible "rivers" ruining their otherwise perfectly justified paragraphs.
https://en.wikipedia.org/wiki/River_(typography)
https://en.wikipedia.org/wiki/WYSIWYG
WYSIAWYG; what you see is almost what you get, similar to WYSIMOLWYG.
WYSIMOLWYG, what you see is more or less what you get, recognizing that most WYSIWYG implementations are imperfect.
http://foldoc.org/WYSIWYG
What You See Is What You Get <jargon>
(WYSIWYG) /wiz'ee-wig/ Describes a user interface for a document preparation system under which changes are represented by displaying a more-or-less accurate image of the way the document will finally appear, e.g. when printed. This is in contrast to one that uses more-or-less obscure commands that do not result in immediate visual feedback.
True WYSIWYG in environments supporting multiple fonts or graphics is rarely-attained; there are variants of this term to express real-world manifestations including WYSIAWYG (What You See Is Almost What You Get) and WYSIMOLWYG (What You See Is More or Less What You Get). All these can be mildly derogatory, as they are often used to refer to dumbed-down user-friendly interfaces targeted at non-programmers; a hacker has no fear of obscure commands (compare WYSIAYG). On the other hand, Emacs was one of the very first WYSIWYG editors, replacing (actually, at first overlaying) the extremely obscure, command-based TECO.
See also WIMP.
The Acorn Archimedes had anti-aliased text using 8 grey levels on a 4 or 8 bit display, on computers with 0.5MB RAM in 1990... http://telcontar.net/Misc/GUI/RISCOS/#text so in theory it could have been practical for Sun ...
If your display only has gray levels, then anti-aliasing is easy since you don't need to worry about rendering text over non-white backgrounds, and you don't need to worry about a colormap. But 8 bit displays with colormaps make it much harder to support anti-aliased text practically, especially over arbitrary backgrounds (because it would look terrible as well as being slow).
NeWS used a color cube with only a certain number of grays, and those were only useful for anti-aliasing black text against a white background (or the other way around), and you didn't have a lot of colors to choose from for antialiased color text or against colored backgrounds. It's much easier to render anti-aliased text in 24 bits, or with pure gray scale, since you aren't restricted to an 8 bit color palette, and you can efficiently mathematically blend colors together, instead of looking up rgb values in a colormap, blending to get the ideal desired color, and then searching for the nearest color to each pixel in the colormap (or indexing the color cube for the nearest color) (which won't be very near, and will look flat and washed out without dithering).
Better visually to render the whole image with antialiased text in full 24 bits, then use error diffusion dithering over the entire image at once (to avoid flat washed out regions, and distribute the error over space) to make an 8 bit palletized version, but that's quite slow and memory intensive.
Of course your application (like a monochrome PostScript previewer) could switch in an all-gray ramp colormap for efficiently rendering and beautifully displaying anti-aliased text, but then all the other windows on the screen would be shown in the wrong colormap, and the colormap would flash back and forth when you moved your focus between windows.
Ah, yes, Acorn didn't try to anti-alias properly over varying backgrounds. ArtWorks did full anti-aliasing but it was quite a lot slower to render https://en.wikipedia.org/wiki/ArtWorks
In this video of Eric Bier and his colleagues from Xerox PARC demonstrating Cedar, they discuss writing resolution independent applications, and the problem and approaches to matching the text and formatting displayed on the screen, with how it looks when printed:
https://www.youtube.com/watch?v=z_dt7NG38V4
Here are some notes about that I took:
There were several window systems developed for Cedar: Warren Teitelman developed Docs. Lots of functionality, but slow. Scott McGregor developed Viewers. It was lean and fast, in response to Docs. Michael Plass built the Cedar imager.
The Experimental Programming Environment Research Project looked at different competing projects to decide which to standardize on. Cedar/Mesa came out of that and played a dominant role in the 80's. The Smalltalk people contributed ideas but were (not railroaded but) frustrated.
Cedar had a ubiquitous almost-wysiwyg structured text and code editor called Tioga. It was important in Cedar, because it's everywhere, even the text fields. The terminal window has a stripped down text editor with subset of commands.
Setting the so-called "clipping level" in Tioga (like a folding outliner) goes back to Englebart's NLS. Bill Paxton and Doug Wyatt were NLS people who also worked on Tioga.
Key ideas were applicable in any possible place in both systems. The Alto had small memory, and each program took over the entire system. It was not integrated. Simple little editors for code. Fancier editors for documents. Using the same component everywhere is something Smalltalk was pioneering even on the tiny Alto. When Cedar came along, running on a much bigger more powerful 1 megabyte D-Machines, it pulled together those ideas, and added so much more, including much more advanced graphics, way beyond what the Alto could do.
Tioga could display and edit formatted code with different levels of indentation and formatting. Tioga was not completely WYSIWYG. Print mode shows two columns, but you edit one column. You could get a pretty good idea of what it would look like, but in the early times it did not have smooth fonts. Bitmap fonts measure differently on the printer, so text is necessarily broken and flowed differently. The printer used Interpress, the predecessor of PostScript. You could preview Interpress files in Cedar. (The video shows a demo of both editing a document in Tioga, and previewing the Interpress file that it produced for the printer.)
Recently I wrote about the differences and similarities between Forth and PostScript, and the influences of Evans and Sutherland's "Design System" on John Warnock and Martin Newall's "Jam", then Jam's influence on John Warnock and Charles Geschke's "Interpress", then Interpress's influence on PostScript:
https://news.ycombinator.com/item?id=21968175
https://en.wikipedia.org/wiki/Threaded_code
https://en.wikipedia.org/wiki/Homoiconicity
https://en.wikipedia.org/wiki/Martin_Newell_(computer_scient...
The heavily commented PostScript source code of PizzaTool for NeWS shows Owen's OOP PostScript system in action:
https://donhopkins.com/home/archive/NeWS/pizzatool
PostScript was a direct descendent of and heavily influenced by Xerox PARC's Interpress, by John Warnock and Charles Geschke, which itself was a direct descendent of JaM, which stands for "John and Martin", by John Warnock and Martin Newall. And JaM was a descendent of Evans and Sutherland's Design System, by John Warnock and John Gaffney.
https://en.wikipedia.org/wiki/John_Warnock
http://historyofinformation.com/detail.php?entryid=1213
https://en.wikipedia.org/wiki/Martin_Newell_(computer_scient...
https://en.wikipedia.org/wiki/Charles_Geschke
https://en.wikipedia.org/wiki/Interpress
https://en.wikipedia.org/wiki/Evans_%26_Sutherland
Brian Reid (whose brother is Glenn Reid, author of several books on PostScript from Adobe) wrote up an excellent historical summary in 1985 on the laser-lovers mailing list of the influences and evolution of PostScript.
https://en.wikipedia.org/wiki/Brian_Reid_(computer_scientist...
http://glennreid.blogspot.com/
Here's a post I wrote earlier:
https://news.ycombinator.com/item?id=19874245
https://groups.google.com/forum/#!topic/fa.laser-lovers/H3us...
There's more interesting discussion about the relationship between PostScript and Forth on c2:
http://wiki.c2.com/?ForthPostscriptRelationship
Here's a lot more stuff I've written about PostScript and Forth (two of my favorite topics!):
https://news.ycombinator.com/item?id=11479364
https://news.ycombinator.com/item?id=13198492
https://news.ycombinator.com/item?id=13705664
https://news.ycombinator.com/item?id=13705739
https://news.ycombinator.com/item?id=18317280
https://news.ycombinator.com/item?id=18692144
https://news.ycombinator.com/item?id=18695275
https://news.ycombinator.com/item?id=18696116
https://news.ycombinator.com/item?id=19873630
https://news.ycombinator.com/item?id=19874245
https://news.ycombinator.com/item?id=19882301
Your post prompted me imagine a nightmare/utopia in which TeX was used for building user interfaces.
This was followed by a vision of a window system built on ROFF.
Someone taking a verbose format for writing text and adding feature and feature to it until it supports UI applications? Jesus, that's a horrific vision.
Hope something like that will never see the light of day.
Perhaps all that will be implemented is character cell windowing systems.
And Doom. Definitely Doom.
Hurray for the MGR window system!
https://hack.org/mc/mgr/
https://en.wikipedia.org/wiki/ManaGeR
MGR was the largest posting to ever appear in comp.sources.unix:
https://groups.google.com/forum/#!topic/comp.sources.unix/GG...
Also Chris Torek, Mark Weiser and others developed "Maryland Windows" at the University of Maryland Computer Science Department, based on the Gosling Emacs screen redisplay code and terminal drivers. It was very good over slow modems because it used Emacs's intelligent redisplay algorithm aka "Ultra-hot screen management package" -- the one with the skull and crossbones.
https://www.donhopkins.com/home/code/display.c.txt
Maryland Windows source code:
http://cd.textfiles.com/sourcecode/unix_c/languags/c/mw.tar
https://groups.google.com/forum/#!msg/net.emacs/yXfZGeHJrNY/...
Of course now lots of people just use emacs with shell buffers as a windowing system, inside of something like screen or tmux.
There is an X window manager written entirely in elisp for GNU Emacs, EXWM, that was started in 2015:
https://github.com/ch11ng/exwm
I have been using it exclusively on my machines for the past three years. By far the best computing environment I have used.
In 2018 I stumbled on XWEM, an X window manager in elisp for XEmacs that was developed from 2003 to 2004:
http://www.nongnu.org/xwem/
I enjoyed TurboVision back in the day.
Even worse would be a window system or browser built on SGML or one of its mutant derivatives. Imagine a world where servers download tag soups of structured text with angled brackets and attributes to define formatted text, styles, and interactive users interfaces! It could only be worse if nobody could agree on which mutant derivative of SGML to use, so there were several different ones, and then a totally different style language that was completely syntactically unique, so you could not use the same syntax and tools to write and edit all the almost-but-not-quite-entirely-unlike-SGML syntaxes mish-mashed together.
Oh wait. That IS what we have today! Never mind.
That said imagine if the SGML working group had held their ground and used s-expressions! At least the soup would be easy to slurp. (I can’t find a reference right now so maybe I just had a fever dream once?)
You are probably thinking about DSSSL:
https://en.wikipedia.org/wiki/DSSSL
"Sometime in or before 1994, Opera Software began drafting a "DSSSL Lite" specification for the consideration of the World Wide Web Consortium"
Speaking of DSSSL, I love the Doctor Dobb's Journal interview with James Clark, who helped design and implement DSSSL and many other SGML and XML technologies.
https://www.drdobbs.com/a-triumph-of-simplicity-james-clark-...
https://news.ycombinator.com/item?id=16227249
https://news.ycombinator.com/item?id=20384206
[...]
In 1992/3, right after I got the University of Washington's Computer Science & Engineering dept. onto the web (after faculty outrage based on a NYT article about physics departments and this cool new thing) ... I wrote an extension for Netscape that allowed it to display DVI files natively :)
Just think what could have been!
NeXT did that in 1988: https://en.wikipedia.org/wiki/Display_PostScript
What NeXT missed out on is what we now call "AJAX": the advantages of implementing the user interface toolkit and the front-end parts of the application in PostScript, so it runs right next to the user, can can implement an efficient application specific networking protocol to communicate between the client and server. NeXT didn't have any of the advantages of NeWS and AJAX when run over the network. Just the stencil/paint imaging model. But no light weight processes, local event handling, object oriented programming, etc.
https://en.wikipedia.org/wiki/NeWS NeWS was architecturally similar to what is now called AJAX, except that NeWS coherently:
- used PostScript code instead of JavaScript for programming.
- used PostScript graphics instead of DHTML and CSS for rendering.
- used PostScript data instead of XML and JSON for data representation.
Consider this. As we know, Tim Berners-Lee developed the first web browser on a NeXT computer, with Display Postscript to render HTML (and print it, too). Two years later, Marc Andreessen and Eric Bina developed the NCSA Mosaic web browser for the X Window System and Microsoft Windows. Another 2 years, and Brendan Eich made the Netscape Navigator web browser programmable with JavaScript.
What if Sun had open sourced NeWS in the early 90s? Could NCSA or Netscape have used an open source NeWS to build a web browser that renders HTML using NeWS on X11 or Windows? With no need for JavaScript or CSS, just Postscript?
Don Hopkins? Is it plausible that we’ve had 25 years of JavaScript hell because Sun management didn’t open source NeWS? Or were there insurmountable technical obstacles as well?
Netscape succeeded because they had a 16-bit implementation. 16-bit postscript would have been a significant challenge.
Ah, yes, Netscape Navigator was available for 16 bit Windows 3.1. Even if NeWS was open source, the vast majority of personal computers at the time weren't powerful enough to run it. I only ever saw it running on a $10K Sun SPARCstation.
That's a good point. PostScript needs floating point numbers and lots of memory. At one point in history, for the typical "Desktop Publishing" setup of a Mac and a LaserWriter, the LaserWriter actually had more CPU power and memory than the Mac!
https://en.wikipedia.org/wiki/LaserWriter#Hardware
The LaserWriter was also, at least in principle, faster than our super-minis at the time, as we only mused.
... and the LaserWriter's 68000 wasn't even top of the line for custom RIPs. I worked at a company in Seattle in the early 1990s that had a custom RIP engine based on the Motorola but faster, with more memory and better connectivity to the CPU. I don't remember it's name - I just had to write the device driver for Interactive Linux to make it work :)
We certainly fought hard to convince Sun to make NeWS free.
James Gosling fought very hard for NeWS, but in the end failed to convince Sun to do the right thing. He was optimistic when he talked me into going to Sun to work on NeWS after I'd already given up on it by 1990, saying that Sun had turned over a new leaf, and was soon going to announce their commitment to NeWS:
But in the end Sun redefined the meaning of the word "free" by announcing that OpenWindows source code was "Free for $1000": it cost $1000 for the tape media, and nobody was allowed to put it on an FTP server.
Here is a link to my flamey-poo on that sensitive topic, followed by the official announcement to which I was reacting. I'll include some choice excerpts, and a couple more links on the topic.
https://www.donhopkins.com/home/archive/NeWS/flame.txt
I left Sun because they asked us to lie to our customers that Sun was going to continue supporting NeWS, but we knew that was not true.
Here's a personal apology and explanation I wrote to one of our customers:
https://www.donhopkins.com/home/archive/NeWS/Explanation.txt
And we had a lot of internal discussion about how NeWS fit into Sun's window system strategy. We developed a prototype X11 window manager in NeWS, to prove how much better NeWS can handle seamlessly integrated NeWS and X window management much better than X can manage its own windows. The next step we wanted to take was to write a user-extensible HyperCard-like window manager using HyperNeWS/HyperLook. But Sun management wasn't having it. They actually wanted to do the worst-possible upside-down solution and put NeWS applications inside of X-Windows managed by OLWM, precluding the possibility of arbitrarily shaped windows, tabbed windows, pie menus, all stuff we'd been doing for years with NeWS that we'd have to give up in the name of X interoperability, after we'd already proven we had a working better solution with "owm".
https://donhopkins.com/home/archive/NeWS/owm.ps.txt
https://www.donhopkins.com/home/archive/NeWS/sevans.txt
Steve> I could ask you the same question, "If you want NeWS to be a commercial success, why has NeWSTech been so subborn in the sense of resisting trying to fit into the X environment."
Don> That's not the same question. We want NeWS to be a commercial success, but "commercial success" is not a standard defined by the X Consortium. I think OWM can do a beautiful job of fitting the X environment into NeWS. If you find that concept terrifying, then you know how we feel about the inverse, knowing that we will have to give up many goals we designed for and successfully achieved, in order to accomodate a half assed "fallback" solution to satisfy some of our customers who want to run our competitors' software (because we aren't allowed to make our software good enough for them to want to run).
Window manager flames:
https://www.donhopkins.com/home/catalog/unix-haters/x-window...
Who Should Manage the Windows, X11 or NeWS? This is a discussion of ICCCM Window Management for X11/NeWS. One of the horrible problems of X11/NeWS was window management. The X people wanted to wrap NeWS windows up in X frames (that is, OLWM). The NeWS people wanted to do it the other way around, and prototyped an ICCCM window manager in NeWS (mostly object oriented PostScript, and a tiny bit of C), that wrapped X windows up in NeWS window frames.
Why wrap X windows in NeWS frames? Because NeWS is much better at window management than X. On the surface, it was easy to implement lots of cool features. But deeper, NeWS is capable of synchronizing input events much more reliably than X11, so it can manage the input focus perfectly, where asynchronous X11 window managers fall flat on their face by definition.
Our next step (if you'll pardon the allusion) was to use HyperNeWS (renamed HyperLook, a graphical user interface system like HyperCard with PostScript) to implemented a totally customizable X window manager! Some notes about OWM OWM is the "Open Window Manager" we prototyped in NeWS. We enhanced the NeWS window frames so they sported indexing tabs, pie menus, rooms, and a scrolling virtual desktop. Many of our enhancements were separatly developed, and plugged together orthogonally like legos. All NeWS applications could use these fancy frames, and the Open Window Manager wrapped X clients in the same frames that NeWS windows got!
This way, factoring the window frames out as a part of the toolkit, and implementing the X window manager separately, NeWS applications don't have to know a thing about X window management, and X clients can go on doing the same nasty things they've always done, and everybody get the benefits of dynamic extensibility, and a consistent user interface, by using the default window class!
I39L window management complicates pinned menus enormously. TNT menus pin correctly, so that when you push the pin in, the menu window simply stays up on the screen, just like you'd expect. This is not the case with XView or even OLWM. Under an I39L window manager, the Open Look pinned menu metaphor completely breaks down. When you pin an X menu, it dissappears from the screen for an instant, then comes back at a different place, at a different size, with a different look and feel. If you're not running just the right window manager, pinned menus don't even have pins! There is no need for such "ICCCM compliant" behavior with TNT menus. When they're pinned, they can just stay there and manage themselves. But were TNT windows managed by an external I39L window manager, they would have to degenerate to the level of X menus.
Under the OWM solution, pinned TNT menus work correctly, and they inherit their pinned window behavior from ClassPopupWindow, the same class managing pinned X menus. The look and feel is high quality, consistant, maintainable, and intentionally extensible.
If I39L window management has such a negative impact on pinned menus, how else will it impact other parts of the toolkit and applications?
Will it effect popup notices? Since they need keyboard input for the buttons, will they have to play the I39L window management game? How do we get the notice tail (a separate canvas) to line up, if the window manager decides to wrap a frame around the notice window?
It is impossible to know how it will effect TNT applications, because the toolkit was specifically designed to be subclassed and extended in areas that overlap with I39L window management. NeWSRoom and the TNT virtual window manager are examples of simple, interesting extensions to the window class that are in direct conflict with I39L window management. We would be giving up a lot of actual and potential functionality, that we designed the toolkit to support in the first place. We need to redesign the window class for greater flexbility and easier subclassability, but those goals are at odds with I39L window management. The result of a cross of these two opposing goals would be massivly complex and would sacrifice most of the important advantages of the TNT approach. However, the OWM approach to window management, wrapping X windows in instances of the TNT window class, synergizes with extensions to the window classes. As an extreme example, you can make OWM wrap window frames with title tabs that pop up pie menus full of handy window management functions around all your X windows.
There are several other technological advantages of managing X windows internally with NeWS, over managing them externally with X. By an external window manager, I mean one that is in a separate address space as the windows. Relative to the server, all windows are internal, all X "Xlib" and NeWS "wire service" clients are external, and NeWS canvas objects and light weight processes are internal. But an external X window manager is in a different address space must try to manage many shared resources at a distance, an intrinsicly difficult task, imposing limitations on the whole system and unavoidably restricting the user interface possibilities.
The management of arbitrarily shaped windows becomes very complicated under an I39L window manager. In contrast, PizzaTool has a popup pizza preview window, whose shape is a rectangular frame around a round (or semi-circular, depending on your appetite) pizza window, with the space between the inside of the frame and the pizza cut out. It was very easy to implement, by subclassing ClassPopupWindow and overriding the /path method to cut out the inside of the frame and ask the center pizza client to add its shape to the path. When you move or stretch the window, you see a rubber-band preview of the actual shape the window will take when you release the button. The pizza path procedure knows to maintain a 1:1 aspect ratio (no oval pizzas), that centers the round pizza in the frame as you drag the resize corner around. The shape of a TNT window is not simply defined by curves or bitmaps -- it is defined by a method of the window object, which can apply constraints and may depend on the state of other objects in the system, like the size or number of slices of the pizza inside the frame. All this nice interactive feedback is totally trivial to implement with TNT, and is completely impossible with an I39L window manager. And even if an I39L window manager could be programmed to perform such custom feedback, it would still have to grab the server and lock out all other animation in the process, instead of using nondestructive overlays like TNT.
X11 window managers must grab the server in order to animate rubber-band feedback over the screen when resizing and moving windows. This grabbing causes many problems with NeWS synchronous interests, that can be demonstrated by pressing the "Help" key while dragging out a rectangle on the root background. NeWS can do a much better job at managing global resources in the server because it is in the same address space and it has facilities like the overlay plane specifically designed to implement such window management functions, without even grabbing the server. This antisocial server grabbing behavior is just one symptom of a general class of problems with external X window management, including other important issues such as keyboard and colomap focus.
If NeWS alone manages the input focus, it can manage it perfectly. An X window manager alone cannot, because it runs in a foreign address space, and is not in a position to synchronously block the input queue and directly effect the distribution of events the way NeWS is. But even worse is when an X window manager and NeWS both try to manage the input focus at once, which is the situation we are in today. The input focus problem could be solved in several ways: OWM solves the problem elegantly, as PSWM did in the past; OLWM could be made NeWS aware, so that when our own customers run our own external X window manager on our own server that we ship preinstalled on the disks of our own computers, OLWM could download some PostScript and let NeWS handle the focus management the way it was designed.
It's criminally negligent to ship a product that is incapable of keeping the input focus up to date with the cursor position, when you have the technology to do so. Your xtrek has paged the window manager out of core, and the console beeps and you suddenly need to move the cursor into the terminal emulator and type the command to keep the reactor from melting down, but the input focus stays in the xtrek for three seconds while the window manager pages in, but you keep on typing, and the keys slip right through to xtrek, and you accidentally fire off your last photon torpedoe and beam twelve red shirt engineers into deep space!
I was guessing you might come through and give us an awesome and thorough exposition on the parallel universe that might have been. Thanks!
I still wish anything had the features of NeWS. I wish people could currently be able to feel freedom, power, expressiveness of such environments, where you could change the look and behavior of anything on your screen with a couple of lines typed in a REPL.
Even though the browser has been creeping every day towards it, it seems impossible to escape the constriction of it's haphazard evolution. Browsers have all the hard parts of a NeWS server already worked out inside them (but in C/C++ code), but even if you could magically transform it, it seems it would still be horribly constrained by many other layers of cruft.
After reading your "flamey-poo" I'm wondering how much other non-technical, meddlesome corporate baggage would have come along for a ride even if someone somehow could have convinced them to make "free" === "free".
If it was more than none, I have a hard time seeing how a strong enough "View Source" philosophy could have sprouted from it no matter how strong the tech was/is. From what I understand the web started with that philosophy, and it only partially made it out of the battle with copy/paste intact.
The fact that you were apparently already burned out once before this flame tells me that there was a lot of such baggage. Am I in the ball park here?
Yes you're definitely in the ball park with a beer and a hot dog -- there was a huge amount of corporate baggage.
The hype and corporate bullshit that surrounded Java is a good example of what that corporate baggage would have been like if it had been deployed for NeWS's benefit instead of Java's.
If Sun had put as much energy into promoting and supporting NeWS as they did with Java, we would probably live in a very different world today.
Sun turned a corner when they abandoned their Berkeley hippie BSD roots and got into bed with AT&T / SVR4 / Solaris, and that changed a lot of stuff for the worse, making it a lot harder to do things like give away the source code to X11/NeWS. A lot of people from different companies who used to be Sun's enemies, and who had extremely different philosophies and antithetical approaches to "open software", joined Sun and started influencing and managing its policies and projects. A disastrous example was the Distributed Objects Everywhere project and CORBA fiasco, which was originally the crazy idea of a bunch of people from HP and DEC, Sun's former nemesis's, who then came to Sun and started pushing it into everything, to the detriment of NeWS and other older projects at Sun. Some of the problematic people and armchair architectural astronauts that Sun imported and put in charge of DOE/CORBA, like Steve MacKay and Michael Powell, were worthless corporate bullshitters whose main goals were to establish and maintain a hegemony, and they kept their grandiose plans in their head and never wrote anything down or made any hard decisions or came up with anything concrete, because they didn't want to be pinned down to committing to something, when they were actually in way over their heads. The whole point of the incredibly complex software they finally developed was interoperability with other company's compatible software, but in reality none of it actually worked together. It only talked to itself. SLOWLY.
Since DOE was intended to run everywhere and talk to everything but actually didn't, they should have called DOPE for Distributed Objects Practically Everywhere.
DOPE was a complete failure at its stated mission, and it had ridiculously costly overhead and complexity. When they finally delivered something years behind schedule and lacking crucial promised features, it actually required TWO CDROMs to install. (You'd think they could have distributed a distributed network object system over the network, instead of via CDROM, but nooooo: it was just too big to download.) And in the end, nobody actually used "DOE" or "NEO" for anything consequential. They wasted a spectacular amount of time, energy, money, careers, and good will on that crap.
https://en.wikipedia.org/wiki/Distributed_Objects_Everywhere
https://www.javaworld.com/article/2077168/distributed-object...
And then when Java finally came along, the same meddlesome corporate baggage handlers and armchair architectural astronauts went into overdrive to evangelize and promote the Java Juggernaut. And even more of them flocked in droves to Sun to jump on the Java bandwagon. If it was bad after the invasion of System V / AT&T / HP / DEC minions, things got much worse once the Java zombies started arriving in teaming brain-eating hoards to get their part of the action in response to all the hype. The original Java team was brilliant, and there were some extremely excellent people working on it, but they were totally outnumbered by the dead weight of all the hangers-on who didn't want to work hard to make a struggling company great, but just wanted an easy job at a secure company that was already great.
If Sun had shown the commitment and dedicated the resources to NeWS that they did to DOE and Java, things would be a lot different. And it would have probably also turned out terribly, for all the same reasons.
JWZ said the same kind of thing happened at NetScape, too.
https://tech.slashdot.org/story/05/03/10/146234/mozilla-foun...
(Just click on the testicle!)
``I have yet to come across so much self-righteous bullshit as when I gaze upon the massive heap of crap that is the jwz web experience.''
-- an anonymous poster to slashdot.org, 1998.
I'm not saying it always has to end in tragedy: C# and TypeScript turned out beautifully, given the constraints they had to deal with, in spite of the fact that they came from a giant corporate behemoth like Microsoft. (Although I'm sure there's a lot of bullshit going on behind the scenes, the trend is to make them more open and community driven.)
Sun knew how to make mistakes. Sun made so many mistakes it's hard to list them all.
Here's a handy guide to when to use open source:
Open source is a business tool, not necessarily an end (though it can be an end too).
Not in Display PostScript, perhaps, but NeXT definitely had OOP pervasively; where do you think the modern Apple use of Objective-C came from?
Yes, I mean no object oriented PostScript programming. The NeXT user interface toolkit was entirely implemented in Objective C, and the PostScript code it sent to the Display PostScript server was very simple and flat, not a customized per-application protocol, and didn't do much more than drawing.
That's why it was such a natural progression for Apple to switch from Display PostScript to Cocoa, which was the moral equivalent of PDF, which is just PostScript without the Turing-complete programming language part.
My "hyperTeX" documents under NeWS looked pretty much the same on screen as printed, modulo hyperlinks, but I wouldn't want to write documents directly in PostScript. I'm unconvinced generally about the trades-off of markup in a non-macro programming language.
Incidentally, the nascent web looked horribly primitive when you already had fairly rich networked hypermedia and missed the significance of the web architecture.
Picking parallelization of clients as the #1 reason seems like a miss to me. X never took advantage of it much. The asynchronity in X was motivated by network latency.
"One of the great white hopes of the part of the Unix world that never liked X Windows was Sun's NeWS."
I searched Wikipedia and found that "Great White Hope is a nickname or epithet originally applied to boxers who were the hope of the "White Race" to beat African American boxer Jack Johnson."
That seems an odd way to characterize the situation.
"great white hope" is an English idiom. While originally having racist connotations, it's entered common usage and is no longer tied to racism, or anything in particular.
It makes sense when you consider that white people were wringing their hands because they were convinced of their total superiority.
While obviously more benign, there is inherent bigotry in the “X sucks and the better solution is Y or Z and why won’t they catch on?” mindset. Surely this next technology will take over from the unacceptable popular one.
(Edited because QuickPath has a long way to go before it’s as functional as Swype)
Actually, the predecessor to X was called W. And many people have proposed the next version of X should be called Y, because X12 wasn't different enough, and some even have suggested skipping Y and going directly to Z to get even more distance from X. But the one thing they all agree on is that X sucks.
I was using X in the sense of a variable, sorry.
From what I remember the choices were NeWS and it only runs on Sun hardware, or X and it runs everywhere. Ultimately Sun no longer had enough advantages to compensate for their half compatibility, shipping incompatible ancient compilers and out of date libraries.
https://en.wikipedia.org/wiki/NeWS
NeWS was architecturally similar to what is now called AJAX, except that NeWS coherently:
- used PostScript code instead of JavaScript for programming.
- used PostScript graphics instead of DHTML and CSS for rendering.
- used PostScript data instead of XML and JSON for data representation.
FTFY:
Web Browsers were a mistake, as are all toolkit-in-browser JavaScript libraries
April 1, 2020
One of the great white hopes of the part of the Web world that never liked Gopher was Netscape's web browser. Never mind all of its practical flaws, all sorts of people held web browsers up as the better way and the bright future that could have been if only things had been different (by which they mean if people had made the 'right' choice instead of settling for Gopher). One of the reasons people often give for liking web browsers is that it put much of the JavaScript libraries into the web browser instead of forcing every server to implement it separately.
Unfortunately for all of these people, history has fairly conclusively shown that web browser was a mistake. Specifically the core design of putting as much intelligence as possible into the web browser instead of the web server has turned out to be a terrible idea. There are at least two big reasons for this.
The first is parallelization. In the increasingly multi-core world you desperately want as much concurrent processing as possible and it's much easier to run several web servers in parallel than it is to parallelize a single web browser. Even if you do get equal parallelization, separate web servers are inherently more resilient because the operating system intrinsically imposes a strong separation of address space and so on, something that's very hard to get in server where everything is jumbled together.
(I believe that this is one reason that modern HTML CSS rendering has been moved from the web browser to the web server. WebFont rendering is increasingly complex and CPU-consuming, so it's better to stick web servers with that burden than dump all of it on the web browser. After all, all Web Servers should have multiple GPUs for drawing and accelerating graphics and numeric computing for all their clients, but there is no rational reason anyone would ever want to program the GPU in the web browser, or push that processing off from the honking big accelerated server farms that you're renting from Amazon by the minute, to the millions of web browsers run by your users whose electricity you don't need to pay for. Plus, users enjoy waiting for their graphics to download over the internet in response to every mouse click and movement they make. It gives them time to think and reflect.)
The second is that if you put the toolkit in the web browser you make evolving the toolkit and its API much more complicated and problematic. The drawback of having everyone use the web browser toolkit is that everyone has to use the same web browser toolkit. Well, not completely. You can introduce a mechanism to have multiple toolkit versions and APIs all in the same web browser and allow web servers to select which one they want or need and so on and so forth. The mess of a situation with the current web browser and its JavaScript libraries make a very educational example of what happens if you go down this path; not very much of it is good.
(Some JavaScript libraries are in practice mandatory but still must be probed for and negotiated by the web servers, while others are basically historical relics but they still can't be dropped because some web server somewhere may ask for them.)
JavaScript libraries in the web browser push the burden of dealing with the evolution of the library into the web server. It is the CDN and web browser cache that carries around old or new versions of the library, with various different APIs, and you naturally have old library versions (and even old toolkits) go away entirely when they are no longer used by any active web servers (or even any installed web servers, when things get far enough).
(I'm ignoring potential security issues for complex reasons, but they may be a good third reason to be unhappy with browser-side libraries.)
Web browsers might not be "fully" a mistake but only a curb on the path to evolution. Old tech with good genes (lisp, news) wasn't fit for mass acceptance for devs without the historical background and only desire to explore a new market with what is cheap on shelves.
Swings and roundabouts
Not at all, alongside NeXTSTEP, it made UNIX actually interesting as workstation OS.
Owen Densmore recounted John Warnock's idea that PostScript was actually a "linguistic motherboard".
(This was part of a discussion with Owen about NeFS, which was a proposal for the next version of NFS to run a PostScript interpreter in the kernel. More about that here:)
https://news.ycombinator.com/item?id=17077721
Owen Densmore's discussion of John Warnock's "Linguistic Motherboard" idea for PostScript:
https://donhopkins.com/home/archive/NeWS/linguistic-motherbo...
======================================================================
Window System? ..NeWS ain' no stinkin' Window System!
-or-
Swiss Army NeWS: A Programmable Network Facility
======================================================================
Introduction
NeWS is difficult to understand simply because it is not just a window system. It is a "Swiss Army Knife" containing several components, some of which contribute to its use as a window system, others which provide the networking facilities for implementing the client-server model, all embedded in a programmable substrate allowing extremely flexible and creative combination of these elements.
During the initial implementation phase of the Macintosh LaserWriter software, I temporarily transfered from Apple to Adobe working closely with John Warnock and other Adobe engineers. At lunch one day, I asked: "John, what do you plan to do after LaserWriter?" His answer was interesting:
He went on to say how a programmable network was really his goal, and that the printing work was just the first component. His mentioning using PostScript for a file server is particularly interesting: Sun's next version of NFS is going to use PostScript with file extentions as the client-server protocol!
This paper explores NeWS in this light: as a Programmable Network Facility, a major part of Sun's future networking strategy.
NeWS Networking Components
NeWS has realized John's notion of a programmable network facility. It has populated the initial PostScript mother board with several cards vital to netwoking:
What IS NeWS Anyway!
"Well, I'm glad NeWS has all these useful parts, but just what IS NeWS anyway; how do I get at and use all this stuff."
Well you may ask! It does seem confusing.
Formally, NeWS is simply a Unix command, just like "ls" and "cd". Its syntax is:
i.e. it is a command that executes PostScript code fragment. If the xnews command is given without an explicit argument, it defaults to executing "(NeWS/init.ps) run", which simply looks for the file "init.ps" in the "$OPENWINHOME/etc/NeWS" directory. It is this file that uses the NeWS components to setup the X11/NeWS window system.
As a silly example of handing in your own commands to NeWS, we can do this:
This simply tells xnews to add 1 & 1 and print the results. Oddly enough, I have written a somewhat more complex script to fill out my Traval Advance forms, adding up all the rows and columns and printing out a version of the form!
Now that we've gotten though the fundamentals, the rest of the paper will look at individual examples of using NeWS in novel ways. Although we present programs to illustrate how things are done, the reader may skip over them, the accompaning text will explain what the program does.
The Ten-Line Server
As mentioned above, "xnews" is simply a Unix command that executes a PostScript program, defaulting to "(NeWS/init.ps) run". Init.ps performs several initialization tasks and executes the commands in various other files. When its done with all of that, it defines and executes a small procedure called "server". This program uses the NeWS networking facilities to build a LWP which listens for connection requests from "client" programs. Whenever a request is heard, the LWP awakens and creates and initializes a new LWP just for the client's usage.
Here's the ten line version of the server. This actually works (I've run it for quite some time!), and is explained in Chapter 10, Networking NeWS, of the Unix Networking book published last year.
The significance of this is that we can just as easily build other network services with NeWS, using code much the same as the above. NeWSPrint, for example, uses a similar PostScript program to provide network printing facilities. NeWSPrint does not require a special, modified version of xnews; it simply uses the standard OpenWindows product.
ps2bits: A PostScript to Rasterfile Program
A second use of running xnews as a Unix filter is illustrated by the ps2bits probram. This Bourne shell script reads a PostScript file on its "standard in", and emits the resulting Sun raster file on its "standard out". The shell script does this by having xnews:
-Read in a few standard PostScript initialization files,
-Initialize the PostScript environment (& fix a Folio bug!)
-Build an 8.5 by 11, color, 72 dpi resolution "page" canvas
-Execute the PostScript stdin file to draw that page
-Write the resulting image to stdout as a raster file
Here is the program:
Note: The line with the "buildimage" command may be modified to convert the program to black & white, or to change the resolution to 300 dpi, or to change the page size. See Appendix A for a more general script.
Once the image is made, it can easily be looked at in SunView, XView, or NeWS using any of their raster file viewers. Here's a trivial viewer, "bitwin", using the TNT toolkit:
This Bourne shell script takes a single command line argument naming the raster file. It uses the NeWS "PShell" to sent a short program to the running xnews server. The program will put the file name in its header, and will fill itself with the raster file image. Stretching the window will stretch the image.
To use these on the demo file "tiger.ps" which was initially created on the Mac using Adobe Illustrator, these two steps are taken:
The first command converts the tiger drawing into a raster file. The second creates a window for viewing the raster file.
Although the complexity has been fairly minor in the previous examples, we've illustrated some powerful capabilities:
Using these NeWS facilities in similar creative ways is exactly what NeWSPrint does. The documentation folks use a similar "filter" to strip out all the general header information in Mac PostScript files to gain an average 8-1 compression, vastly reducing their disk storage requirements. A homework assignment in our Usenix NeWS tutorial is to create a generalized Image Server for the network using these facilities.
WUE Alarms with Programmable Events
WUE has the notion of "alarms" which can be used to alert applications of changes in status of network objects. Applications can use this for anything from "hot links" to file status alarms. One of the WUE examples is on file status: I want to know when the monthy report reaches 90% completion. Hot links are similar: I want this graph to change whenever the associated spreadsheet changes.
Here is one way to implement WUE file alarms using NeWS programmable events:
The WUE Property Sheet would build and send the event this way:
The application builds an interest for its TNT event manager to handle. It does so by building a matching event template for WUEStatusEvent and the /home/project/status/january filename. It also includes a "callback" procedure which decides what to do with the completion information. In this case, we want the alarm to occur when the file is more than 90% complete:
This results in the AlertApplication procedure being called when the /home/project/status/january report is within 10% of completion.
Puny WOF (Workgroup Object Facility)
The above alerting works only for applications running on the same workstation. This is because the event that is sent is only visible to interests expressed on the same workstation. We can easily extend our model to include sending the event to many network workstations by using the same techniques as the 10-line server:
This basically implements a Puny WOF (Workgroup Object Facility). And it can be done very easily indeed! Admittedly that this is quite puny and many details about robustness etc. have to be managed. On the other hand, using xnews as a WOF prototyper is extremely appealing. (I plan to prototype a versions of Puny WOF as soon as I get a second host set up and running in my office.)
Multi-Media: NeWS Device Control
Multi-media devices can be managed by NeWS, using programmable events to interface to applications. This provides a logical division between the device "driver", which may be implemented in any of several ways, and the application API to the device, which is via NeWS events.
As an example, consider a graphics tablet input device with an RS232 interface. This device emits x,y data in a well-known format to the serial device when the tablet's stylus moves. As an initial implementation, the driver half of the device was written in PostScript as a process which opens and reads the file /dev/tty. When there is no data on the device, the process blocks, pausing until data arives for the device. When the data arives, the read returns with the device data. This is packaged into an event as in the WUE Alarm example.
Typically the device data needs processing that is better suited to C programming. The solution is to rewrite the device manipulation as a NeWS client using either CPS or the TNT Wire Service. The application interface, however, continues to be the same event interface. The improved performance incurrs no change in the application interface. The notion of this variety of client "daemon" has been used in TNT for providing shared text service among applicaions. A voice interface to EMacs was also made in AD using the same technique.
Another significant advantage to this division of labor into a device layer using an event interface to applications is that it gracefully evolves into sharing the single device among multiple applications. The device is temporarily "owned" by one application, and is given to another application using an agreed upon protocol. Two common styles are used:
In the case of the graphics tablet, applications wanting to use the tablet would express interest in the tablet's button being clicked within it. From then on, that application will receive the motion change events for the tablet.
Although device ownership may seem like a trivial problem, fairly complex systems are typically needed to solve it for a given device. The VOX server from Olivetti for voice is used for just this kind of thing: negociation between applications for ownership of the voice device. Because VOX is not integrated into a more general event system, however, it cannot manage the user interface for which application currently owns it. It can only provide the regestry. When OpenLook defines the "focus" model for ownership of the voice device, a NeWS oriented voice service will much more easily integrate into the rest of the system.
Just as WUE Alarms had a network component, certain multi-media devices will be expensive enough to warrent sharing on the network. Scanners and fax machines will be attached to individual machnes, but we may want them to be temporarily owned by other workstations. The same "server" technology used by the 10-line server and the Puny WOF can also be used here.
Summary and Vision
The interesting software architectures of the next decade will leverage network technologies. We will see WUE become the Net Finder, replacing the simplistic Mac Finder in the network intensive workstation world. WUE will manage network resources among WUE-Friendly NetStations, workstations with advanced, easily configured network software platforms. NeWS is such a network tool: a programmable network facility. Another is the newly proposed NFS which uses file server extended PostScript as its client-server language.
We hear far too many NeWS vs. X arguments based on window and UI toolkit arguments alone. These, in my opinion, miss the main strengths of NeWS. It is a programmable network facility which can be used for many purposes. It can prototype new network services. It can be a universal device controler. It can be used to integrate multiple hosts. All these elements also need to be evaluated when considering NeWS.
References
[1] PostScript Language Reference Manual, Adobe Systems, Addison Wesley, 1985
[2] The NeWS Book, Gosling & Rosenthal, Springer-Verlag, 1989
[3] Unix Networking-ch 10: Networking NeWS, Owen Densmore, Hayden Books, 1989
[4] NFS-3 Design Document, Brent Calaghan, Sun internal document, 1990
Appendix A: A more general ps2bits shell script.
By 1990 or so, we could see the writing on the wall that Sun wasn't going to support NeWS for very much longer, no matter what they claimed.
https://donhopkins.com/home/images/X11NeWSPorscheHitsSunSoft...
So there was an ongoing discussion about the best way to do it all over again from scratch. Scheme was obviously an excellent language to use instead of PostScript. Here are some notes from February of 1990 (before the abomination that is CORBA was thrust upon the world), discussing how to apply John Warnock's "linguistic motherboard" ideas to other languages like Scheme, and how to implement them on top of something like Xerox PARC's "PCR" (Portable Common Runtime, essentially the virtual operating system runtime that Cedar and other Xerox software like Interpress required to run on other platforms like Unix).
(But first here's some other stuff I wrote recently about Cedar and PCR, for context. And I've inserted some links into the notes.)
https://news.ycombinator.com/item?id=22378457
CSL-89-8 June 1989 [P89-00DD6]
http://www.bitsavers.org/pdf/xerox/parc/techReports/CSL-89-8....
https://donhopkins.com/home/archive/NeWS/linguistic-motherbo...
Linguistic motherboard metaphore
hardware/software metaphore
A motherboard is a nicer metaphore than a ball of wax.
PostScript as a linguistic motherboard
We need non-proprietary bus in order for this idea to succeed
Vendor supplied cards - software modules. Motherboard extends over the net. PCR allows tightly coupled modules on the same card (or compatible, closely linked cards) to communicate in one address space, through local procedure calls. PostScript allows cards to communicate in memory through PCR and over the net through remote procedure calls. Polylith is a software bus. Generalization of client-server model: both ways. send code, not just data.
PCR is like the data, address, and control lines.
PCR:
http://www.bitsavers.org/pdf/xerox/parc/techReports/CSL-89-8...
https://news.ycombinator.com/item?id=22378457
https://news.ycombinator.com/item?id=22456720
PostScript is like Mitch Bradley's Forth for the S-Bus.
Open Firmware:
https://en.wikipedia.org/wiki/Open_Firmware
Allows device independant bootstrapping (binding of hardware on cards to software on the net). Device drivers. Jack Callahan's paper describes how once you are bootstrapped and communicating with your virtual hardware modules, you can generate and put into place optimized device specific drivers (automatic dynamic stub generation).
Many of the ideas originated at adobe, and have made the rounds throughout the industry and academia.
Adobe has proven PostScript's applicability to page description. Sun has proven PostScript's applicability to network extensibility.
Adobe and Sun have demonstrated that these concepts work for particular applications, using a propriatary bus, like DEC's BI bus, i.e. a proprietary language implementation. They are not nearly as useful as they could be were they based on an open bus -- a public domain language implementation. PCR is a tightly coupled open bus, we need a public domain PostScript (and Scheme, and other languages) interpreter to go along with PCR.
Witness all the people complaining about problems with NeWS (like non-availability, not running on particular pieces of hardware, server core dumps), and Adobe PostScript (like the 9600 baud 7 bit printable ascii data bottleneck), because of problems that would be easy to fix if they had sources. The failure of NeWS as a window system has demonstrated that it can fail simply because it's controled by Sun. The failure of PostScript as a ?? general purpose programming language ?? some people might argue is due to poor design, but I don't think most people I have heard criticize PostScript know what they're talking about, because they have attacked the cosmetic problems of "backward" syntax, but not addressed the real problems of dynamic binding. PostScript is very well designed, and very powerful. Postfix notation is as backward as prefix (cf big/little endian battles), both of which are simpler than infix. PostScript's main problem is dynamic binding. Reverse polish notation is a cosmetic problem, which is addressed by LispScript. There are extensions to PostScript that would make it a lot more useful, and the dynamic binding problem might even be solvable. PIX and NetScript come very close, and are (or will be) in the public domain.
PIX:
https://ieeexplore.ieee.org/document/301934/
https://news.ycombinator.com/item?id=17637483
https://news.ycombinator.com/item?id=15327211
Right now, Scheme addresses this issue beautifully, and I think it may be quite applicable to the problem, given a good enough implementation (designed for the task). ELK comes close.
ELK:
https://en.wikipedia.org/wiki/Extension_Language_Kit
Scheme and PostScript in combination (in different address spaces, in the same address space, or a synthesis of the two) might be an interesting approach. Scheme with PostScript data types and NeWS extensions. Scheme on a PostScript virtual machine (the byte code that Scheme compiles into -- so you can device independant compiled scheme code).
Try to pinpoint what it is about PostScript that makes it better than Scheme for this problem. First of all, I think it's easier to interpret. Less overhead. Easier for machines to generate? Or is that BS? The data types. Magic dictionaries as an interface to data structures (like memory mapping device registers instead of having i/o instructions). Dynamic binding is simpler, but you could implement closures on top of that, I think (by making it extremely easy to switch dictionary stacks, the way class.ps does) and even continuations (by switching execution stack).
Disadvantages of PostScript: Dynamic binding, addressed above. Polymorphic operators, so built-in operators have to do type checking. Provide type specific operators as primatives that the polymorphic ones are built in terms of, not unlike Crispin Goswell's PostScript interpreter.
Crispin Goswell's PostScript interpreter:
https://news.ycombinator.com/item?id=13198492
http://computer-programming-forum.com/36-postscript/46e6f5fc...
http://www.chilton-computing.org.uk/inf/se/mmi/p004.htm
Advantages of NeWS, PIX, NetScript: light weight processes, event queue, interprocess communication, magic dictionaries, garbage collection, ...
PCR would be an excellent base. PostScript would be a good first step, and would be extended towards scheme in an upward compatible manner. Proprietary vendor supplied (or public domain) cards could plug right in (Cedar graphics, Folio fonts, Andrew editor, X protocol, etc...)
Reminds me of the classic "Wheel of Reincarnation" paper: "On the Design of Display Processors" http://cva.stanford.edu/classes/cs99s/papers/myer-sutherland...
(Good work getting traction on this kick! ;-)
I'm kind of dealing with something like this now myself. I have an implementation in Prolog of a Forth-like language called Joy and I want to make a GUI for it that might actually be used by normal people.
I could use e.g. SDL and draw everything myself and handle mouse events etc. (I have a crude demo in PyGame that does that.)
Or I could use some sort of widget toolkit (I've got a Tkinter demo too.)
Or I can use the browser and treat it like a smart display processor. There are editors and spreadsheets and libs and all kinds of stuff. The Prolog/Joy code can stay nice and high-level, with HTML and CSS as the "display language".
- - - -
Which brings me to my main point: How in the heck is this not more nailed down in 2020!?
I first wrote a DSL for GUI layout in the late 90's, I used Delphi was even earlier, and I known that's all late to the party: we could go back to The Mother of All Demos or even earlier.
The mouse and hi-res raster displays and GUIs are old but usage is nowhere near settled yet. Is that because the domain is really so intricate and challenging or are we just milling around and mistaking it for progress?
Whither React?
(By which I mean maybe functional reactive programming or better yet Kowalski's Logic Production Systems (LPS http://lps.doc.ic.ac.uk/ ) might finally start to reduce the churn and nail things down.)
( https://en.wikipedia.org/wiki/Delphi_%28IDE%29 )
"X Windows"