Future past: steam

Let’s talk about steam. I don’t mean the malware installed on most gamers’ computers, but the real thing: hot, evaporated water. You may see it as just something given off by boiling stew or dying cars, but it’s so much more than that. For steam was the fluid that carried us into the Industrial Revolution.

And whenever we talk of the Industrial Revolution, it’s only natural to think about its timing. Did steam power really have to wait until the 18th century? Is there a way to push back its development by a hundred, or even a thousand, years? We can’t know for sure, but maybe we can make an educated guess or two.

Intro

Obviously, knowledge of steam itself dates back to the first time anybody ever cooked a pot of stew or boiled their day’s catch. Probably earlier than that, if you consider natural hot springs. However you take it, they didn’t have to wait around for a Renaissance and an Enlightenment. Steam itself is embarrassingly easy to make.

Steam is a gas; it’s the gaseous form of water, in the same way that ice is its solid form. Now, ice forms naturally if the temperature gets below 0°C (32°F), so quite a lot of places on Earth can find some way of getting to it. Steam, on the other hand requires us to take water to its boiling point of 100°C (212°F) at sea level, slightly lower at altitude. Even the hottest parts of the world never get temperatures that high, so steam is, with a few exceptions like that hot spring I mentioned, purely artificial.

Cooking is the main way we come into contact with steam, now and in ages past. Modern times have added others, like radiators, but the general principle holds: steam is what we get when we boil water. Liquid turns to gas, and that’s where the fun begins.

Theory

The ideal gas law tells us how an ideal gas behaves. Now, that’s not entirely appropriate for gases in the real world, but it’s a good enough approximation most of the time. In algebraic form, it’s PV = nRT, and it’s the key to seeing why steam is so useful, so world-changing. Ignore R, because it’s a constant that doesn’t concern us here; the other four variables are where we get our interesting effects. In order: P is the pressure of a gas, V is its volume, n is how much of it there is (in moles), and T is its temperature.

You don’t need to know how to measure moles to see what happens. When we turn water into steam, we do so by raising its temperature. By the ideal gas law, increasing T must be balanced out by a proportional increase on the other side of the equation. We’ve got two choices there, and you’ve no doubt seen them both in action.

First, gases have a natural tendency to expand to fill their containers. That’s why smoke dissipates outdoors, and it’s why that steam rising from the pot gets everywhere. Thus, increasing V is the first choice in reaction to higher temperatures. But what if that’s not possible? What if the gas is trapped inside a solid vessel, one that won’t let it expand? Then it’s the backup option: pressure.

A trapped gas that is heated increases in pressure, and that is the power of steam. Think of a pressure cooker or a kettle, either of them placed on a hot stove. With nowhere to go, the steam builds and builds, until it finds relief one way or another. (With some gases, this can come in the more dramatic form of a rupture, but household appliances rarely get that far.)

As pressure is force per unit of area, and there’s not a lot of area in the spout of a teapot, the rising temperatures can cause a lot of force. Enough to scald, enough to push. Enough to…move?

Practice

That is the basis for steam power and, by extension, many of the methods of power generation we still use today. A lot of steam funneled through a small area produces a great amount of force. That force is then able to run a pump, a turbine, or whatever is needed, from boats to trains. (And even cars: some of the first automobiles were steam-powered.)

Steam made the Industrial Revolution possible. It made most of what came after possible, as well. And it gave birth to the retro fad of steampunk, because many people find the elaborate contraptions needed to haul superheated water vapor around to be aesthetically pleasing. Yet there is a problem. We’ve found steam-powered automata (e.g., toys, “magic” temple doors) from the Roman era, so what happened? Why did we need over 1,500 years to get from bot to Watt?

Unlike electricity, where there’s no obvious technological roadblock standing between Antiquity and advancement, steam power might legitimately be beyond classical civilizations. Generation of steam is easy—as I’ve said, that was done with the first cooking pot at the latest. And you don’t need an ideal gas law to observe the steam in your teapot shooting a cork out of the spout. From there, it’s not too far a leap to see how else that rather violent power can be utilized.

No, generating small amounts of steam is easy, and it’s clear that the Romans (and probably the Greeks, Chinese, and others) could do it. They could even use it, as the toys and temples show. So why didn’t they take that next giant leap?

The answer here may be a combination of factors. First is fuel. Large steam installations require metaphorical and literal tons of fuel. The Victorian era thrived on coal, as we know, but coal is a comparatively recent discovery. The Romans didn’t have it available. They could get by with charcoal, but you need a lot of that, and they had much better uses for it. It wouldn’t do to cut down a few acres of forest just to run a chariot down to Ravenna, even for an emperor. Nowadays, we can make steam by many different methods, including renewable variations like solar boilers, but that wasn’t an option back then. Without a massive fuel source, steam—pardon the pun—couldn’t get off the ground.

Second, and equally important, is the quality of the materials that were available. A boiler, in addition to eating fuel at a frantic pace, also has some pretty exacting specifications. It has to be built strong enough to withstand the intense pressures that steam can create (remember our ideal gas law); ruptures were a deadly fixture of the 19th century, and that was with steel. Imagine trying to do it all with brass, bronze, and iron! On top of that, all your valves, tubes, and other machinery must be built to the same high standard. It’s not just a gas leaking out, but efficiency.

The ancients couldn’t pull that off. Not from lacking of trying, mind you, but they weren’t really equipped for the rigors of steam power. Steel was unknown, except in a few special cases. Rubber was an ocean away, on a continent they didn’t know existed. Welding (a requirement for sealing two metal pipes together so air can’t escape) probably wasn’t happening.

Thus, steam power may be too far into the future to plausibly fit into a distant “retro-tech” setting. It really needs improvements in a lot of different areas. That’s not to say that steam itself can’t fit—we know it can—but you’re not getting Roman railroads. On a small scale, using steam is entirely possible, but you can’t build a classical civilization around it. Probably not even a medieval one, at that.

No, it seems that steam as a major power source must wait until the rest of technology catches up. You need a fuel source, whether coal or something else. You absolutely must have ways of creating airtight seals. And you’ll need a way to create strong pressure vessels, which implies some more advanced metallurgy. On the other hand, the science isn’t entirely necessary; if your people don’t know the ideal gas law yet, they’ll probably figure it out pretty soon after the first steam engine starts up. And as for finding uses, well, they’d get to that part without much help, because that’s just what we do.

Release: The Shape of Things

Thanks to my aunt (who gave me the idea for this one), I’ve got a new novel to get you in the Halloween spirit. It’s called The Shape of Things, and it’s a paranormal mystery with urban fantasy elements. But don’t think it’s something way “out there”. You know I don’t write that. Anyway, here’s the blurb for it:

The world is stranger than you know.

Cameron Weir hunts the paranormal. It’s a hobby, a second job, a nice diversion from the rigors of life. Whether it’s ghosts or monsters or aliens, he’ll be there to find the answer. And that answer is never any of those things, because he well knows that monsters don’t exist.

But something is out there. Something lurks in the night. What started as a simple call with a mundane explanation turns out to lead to a much deeper mystery. Glowing eyes in the dark. Strange, animal-like sounds echoing through the night. And then the most monstrous of all: a dead body. In the midst of such weirdness, Cameron questions his own rationality, and that leads him on a trail that will take him to the most fabled monster of all: Bigfoot.

For now, it’s only on my Patreon. Later on, I’ll look into putting it on the Kindle store or elsewhere. If I do, I’ll write up a longer post describing it. Until then, the description above and the post over on Patreon should suffice.

Borrowing from natural languages

One of the hardest parts about creating a language has to be the vocabulary. At least, that’s always the hardest for me. Maybe you’re different, but I doubt it’s easy for anybody, unless you’re doing one of those “engineered” languages where an algorithm does all the work for you.

Anyway, since creating words is so difficult, and since we do have to have them to, well, make a language, it’s only natural that we look for shortcuts. One of those is the random word generator, as you know, and I’ve spoken on that subject before. Today, however, we’ll look at a different method: borrowing. Specifically, I’m talking about borrowing from an existing language, a real language.

Can it work?

Borrowing from natural languages is fairly straightforward, but it’s easy to go wrong. Obviously, if you just take a bunch of English words wholesale, then you’re not making a separate language. You’ll end up with something closer to a pidgin instead: English words stuffed into foreign grammar. And that’s probably not what you want.

So we need a better strategy, but which one you want to use depends on your goal. Which words you want to borrow will go a long way towards defining the “feel” of your conlang. If you’re taking a bunch of old Anglo-Saxon roots, that’s going to create something that looks much different from a language that only borrows modern technical terms like “internet” or “photovoltaic”.

Also, remember that languages don’t always borrow a whole linguistic paradigm. They’ll tend to take only a root (which might not be the actual root) and derive native terms from there. So even if you borrow “computer”, that’s no guarantee that you’ll be borrowing “computers”, “computing”, and “computation”, too. If you do, it’ll look less natural, because that doesn’t often happen in the real world. And you do want this to look realistic, don’t you?

Details

Clearly, the absolute best way of borrowing from natural languages would be to let your conlang stay in contact with the “source” language (e.g., English) for generations, allowing the loans to build up organically. But we don’t have that kind of time. How can we simulate that evolutionary process in a hurry?

Well, there are a lot of ways. For the modest goal of creating a natural-looking conlang backed by a plausible culture, following the guidelines I’ve mentioned in my “Let’s Make a Language” series will help. Rather than send you to read all of those, though, I’ll boil them down to their essence right here.

First, think about how existing languages borrow words. It’s not at random. It’s usually to fill a need, such as an imported food or a new invention. It could be political or religious in nature, as well, as the large number of Latin and Greek borrowings related to Christianity will attest. But it’s not often for things we already have words for. You don’t see common, basic vocabulary items like “sea” or “dog” being borrowed, because there was never any need. Yes, some specific subsets might come from loans (e.g., “maritime”, “canine”), but these are the exception, not the rule.

Second, languages are only going to borrow from those they have contact with. English today is everywhere, but that wasn’t always so. Japanese got most of its loans from Chinese to start, while Quechua (in South America) took mostly from Spanish. Borrowings, especially in pre-modern times, are going to come first from neighbors, second from conquering or conquered peoples, and last from a “lingua franca”. That does require you to locate your conlang in the real world, but it allows for greater verisimilitude, which is why you’re reading this post in the first place.

Finally, the culture of the conlang itself will determine what it borrows. Initially, it will move to fill gaps in its lexicon, and what those gaps are can create a different feel for the language. To create one contrived example, imagine a small culture undergoing a push for equal rights for women. It’s been mostly male-dominated up to now, and the vocabulary reflects that. But it has contact with French, which has gendered occupational titles. So it might borrow a few feminine forms here and there, or maybe even the -eur/-euse distinction as a whole. If the movement goes far enough, the existing (native) masculine words may be reinterpreted as gender-neutral forms, giving rise to a new dichotomy. Then, as more modern occupations become available (to men and women alike), the language would borrow terms for them, then modifying them to fit the new standard.

The same principle works pretty much everywhere. A perceived need is filled by taking from a nearby or well-known language that has already filled them. It works in all fields, under any circumstances. You can even see it at work today, among smaller natural languages. Look around, and you’ll see how many have borrowed, in some form, “telephone”, “television”, “automobile”, and a whole host of others. Of course, they wouldn’t need those words if they didn’t have those concepts, but that’s neither here nor there.

In other wor(l)ds

The same principle works in non-modern settings. You’d have to do a lot more work to come up with plausible borrowings from, say, Sumerian or Etruscan, but we know they provided loanwords to their neighbors. Remember, though, that older times imply less connectivity, less globalism. (Not always, as the Roman Empire proves, but it’s a good rule of thumb.) That also means more dialects, which can provide a bit more variety in your loans.

You can even generalize this to other worlds, though this one’s a lot more difficult. At some point, you’re making a whole “conworld”, rather than just a conlang, and that’s a different article for a different time. Still, the basic principle of “borrowing to fill in the gaps” works anywhere.

For a conlang intended to be spoken by a hypothesized real-world people, take from those languages that are supposed to be their neighbors. A culture hidden in an inaccessible corner of the Amazon isn’t going to start getting European loans until 1492, at the earliest. More likely, it’ll take some time for influence to diffuse that far, possibly even centuries. Likewise, central Africa isn’t going to get much Chinese influence until almost right now.

In a way, this whole process is reminiscent of the creation of an auxiliary language. But it still retains the artistic style, the creative flair of an a priori conlang. It’s almost like an intermediate form, you might say. A happy medium.

Modern C++ for systems, part 1

In today’s world, there are two main types of programming languages. Well, there are a lot of main types, depending on how you want to look at it, but you can definitely see a distinction between those languages intended for, say, web applications and operating systems. It’s that distinction that I want to look at here.

For web apps (and most desktop ones), we have plenty of options. JavaScript is becoming more and more common on the desktop, and it’s really the only choice for the web. Then we’ve got the “transpilers” bolted on top of JS, like TypeScript, but those are basically the same thing. And we can also write our user applications in Python, C#, or just about anything else.

On the other side—and this is where it gets interesting, in my opinion—the “systems” side of the equation doesn’t look so rosy. C remains the king, and it’s a king being assaulted from all sides. We constantly see articles and blog posts denigrating the old standby, and wouldn’t you know it? Here’s a new, hip language that can fix all those nasty buffer overflows and input-sanitization problems C has. A while back, it was Go. Now, it’s Rust. Tomorrow, it might be something entirely different, because that’s how fads work. Here today, gone tomorrow, as they say.

A new (or old) challenger

C has its problems, to be sure. Its standard library is lacking, the type system is pretty much a joke, and the whole language requires a discipline in coding that really doesn’t mesh with the fast and loose attitudes of today’s coders. It’s also mature, which hipsters like to translate as “obsolete”, but here that age does come with a cost. Because C has been around so long, because it’s used in so many places, backwards compatibility is a must. And that limits what can be done to improve the language. Variable-length arrays, for instance, are 18 years old at this point, and they still aren’t that widely used.

On the other hand, “user-level” languages such as Python or Ruby tend to be slow. Too slow for the inner workings of a computer, such as on the OS level or in embedded hardware. Even mobile apps might need more power. And while the higher-level languages are more expressive and generally easier to work with, they often lack necessary support for lower-level operations.

Go and Rust are attempts at bridging this gap. By making languages that allow the wide range of operations needed at the lowest levels of a system, while preventing the kinds of simple programming errors a C compiler wouldn’t even notice, they’re supposed to be the new wave in system-level code. But Go doesn’t have four decades of evolution behind it. Rust can’t compile a binary for an 8-bit AVR microcontroller. And neither has the staying power of the venerable C. As soon as something else comes along, Rust coders will chase that next fad. It happened with Ruby, so there’s no reason it can’t happen again.

But what if I told you there’s a language out there that has most of C’s maturity, more modern features, better platform support1, and the expressive power of a high-level language? Well, if you didn’t read the title of this post, you might be surprised. Honestly, even if you did, you might still be surprised, because who seriously uses C++ nowadays?

Modern world

C++ is about as old as I am. (I’m 33 for the next week or so, and the original Cfront compiler was released in 1985, so not too much difference.) That’s not quite C levels of endurance, but it’s pretty close, and the 32-bit clocks will overflow before most of today’s crop of lower-level languages reach that mark. But that doesn’t mean everything about C++ is three decades out of date.

No, C++ has evolved, and never so much as in 2011. With the release of that version of the standard, so much changed that experienced programmers consider “Modern” C++ to be a whole new language. And I have to agree with them on that. Compared to what we have now, pre-2011 C++ looks and feels ancient, clunky, baroque. Whatever adjectives your favorite hater used in 2003, they were probably accurate. But no more. Today, the language is modern, it’s fresh, and it is much improved. So much improved, in my opinion, that it should be your first choice when you need a programming language that is fast, safe, and expressive. Nowhere else can you get all three.

Why not Java/C#?

C++ often gets compared to Java and C#, especially when talk turns to desktop applications. But on the lower levels, there’s no contest. For one, both Java and C# require a lot of infrastructure. They’re…not exactly lightweight. Look at Android development if you don’t believe me on the Java side. C# is a little bit better, but still nowhere near as efficient in terms of space.

Second, you’re limited in platform support. You can’t very well run Java apps on an iPhone, for instance, and while Microsoft has opened up on .NET in the past few years, it’s still very much a Windows-first ecosystem. And good luck getting either of them on an embedded architecture. (Or an archaic one.)

That’s not to say these aren’t good languages. They have their uses, and each has its own niche. Neither fits well for our purposes, though.

Why not Go/Rust?

Go, Rust, and whatever other hot new ideas are kicking around out there don’t suffer from the problem of being unfit for low levels. After all, they’re made for that purpose, and it’d be silly to make a programming language that didn’t fill its intended role.

However, these lack the maturity of C++, or even Java or C#. They don’t have the massive weight of history, the enormous library of documentation and third-party code and support. Worse, they aren’t really standardized, so you’re basically at the mercy of their developers. Tech companies have a reputation for short attention spans, which means you can’t be sure they won’t stop development tomorrow because they think they’ve come up with something even better. (Ask me about Angular.)

Why C++?

Even if you think some other language works better for your system, I’d still argue that you should give Modern C++ a shot. It can do essentially everything the others can, and that’s not just an argument about what’s Turing-complete. With the additions of C++11, 14, and 17, we’re not talking about the “old” style anymore. You won’t be seeing screen-long type declarations and dizzying levels of bracket nesting. Things are different now, and C++ even has a few features lacking from other popular languages. So give it a shot.

I know I will. Later on, I hope to show you how C++ can replace both the old, dangerous C and the new, limiting languages like Rust. Stay tuned for that.


  1. Strictly speaking, Microsoft doesn’t have a C compiler, only a C++ one. MSVC basically doesn’t track new versions of the C standard unless they come for free with C++ support. 

Otherworld talk 5

The second half of Chronicles of the Otherworld has begun. You might say it’s all downhill from here, except…well, it’s really not. We haven’t hit the highest notes of this song quite yet. But we have seen a new episode released (The Bonds Between Us), so that’s a good excuse for a new chat about this setting from the man who created it. This time around, I want to take a deeper look at the “local” culture of the Otherworld, the Virissea. Personally, I feel they’re one of my greatest creations. To think, they started off as nothing more than a background element for their language.

The language

That one’s not even an exaggeration. As I’ve said numerous times, the initial seed for the Otherworld series came when Stargate Universe was canceled. Nobody was doing good “exploration” sci-fi anymore, or even exploration fantasy. (Monarchies of God is a great series in that vein, by the way.) Now, that’s not to say I thought I could do better, but I knew I could do better than nothing. Since nothing was what I had, how could I lose?

More importantly, though, the Otherworld setting started out as a kind of language playground. The details of the native tongue (as well as quite a few others in the setting) predate most other notes by months. And the one I called “Virisai” was first on the list.

As languages go, it’s nothing remarkable, and I intended that from the very start. This isn’t an alien language, because these aren’t aliens. That goes hand-in-hand with the “alternate timeline” setup. And yet I didn’t really want a typical Amerind language, because a lot of those are horrendously complex. There’s no way a bunch of college students could become anywhere near fluent in one of those in less than three months. But, I figured, since I had so much “alternative” time to work with, I could plausibly say that this is a whole new language family, as well, one that didn’t follow its brethren in development. In other words, it branched off too early to pick up some of the more convoluted aspects of American indigenous languages.

Beyond that, the language is fairly straightforward. It has a few hangups, a few unexpected complexities, and I’ve found ways to work some of those into the narrative. (Mostly, this comes in Jeff’s chapters, as he’s the linguist, though Amy occasionally notes one.) But I do intend it to be a “natural” constructed language. It’s meant to be spoken, written, read. In fact, I do have a translated Babel Text lying around somewhere, and I’ve considered doing other works when I have the free time.

The culture

The culture of the Virissea, like their language, shares that “same but different” quality. These people may look like your typical Native American, but they are certainly not American. They don’t fit the realities or the stereotypes. They’re there own thing, and most of the culture shock is about dealing with that other thing.

For those in the midst of the story, I’ve intentionally designed the culture to be not outrageously dissimilar from anything on Earth. The local Virissea are monotheistic, for instance, though there’s a strong hint of ancestor worship in there, too, and a fairly complex mythology regarding the otherworldly Altea, who supposedly helped to create the world after their own was destroyed in some previous cataclysm. As they looked different from the Virissea, those members of the expedition who look the most outlandish are seen instead as these mythical people: Jeff, Jenn, Ayla, Sara. Lee and Ramón, by contrast, get treated as some kind of prodigal sons, while Damonte is something else entirely.

Other parts of the culture likewise follow this trend. These people don’t have human sacrifices, but they do have some strange taboos and rituals. They may not play the Mayan ball game, but they’ve got one of their own. Their science isn’t nearly as advanced as ours, so advanced technology is seen as magic instead (following Clarke’s Third Law), but that’s okay, because they already have a mythos full of magic. They just fit computers and solar panels into that, and go on about their day.

That, I think, is my primary goal with this culture. Too often, we assume that modern Americans meeting a more “primitive” people will be treated as either gods or devils because of our technology, attire, beliefs, and general otherness. And to be fair, some members of the expedition get the godly treatment, but they don’t intentionally play to it—with one notable exception.

But there can be a third road, where we’re neither demonized nor canonized. Think about it. If you’ve never seen a tablet computer before, but you get told stories every week of a legendary hero who carried around a magic spellbook, it’s not that great a leap to equate the two. Either one is so far beyond you that it’s almost required by Occam’s Razor. But that doesn’t mean the guy carrying that tablet is a god, not when you’re also taught that there’s only one of those.

In other words, no matter how different the Virissea are, they’re still people. Humans. They have a civilization, a culture, and they’re desperately trying to fit these newcomers into their world without breaking too much. In other words, exactly what I would want to do if presented with a representative of an advanced alien race.

The others

And that makes a good segue into matters of race. For the Otherworld, the subject is a bit tricky. Everyone in it (except for our intrepid heroes) descends from the original inhabitants of the Americas. Yet some of them are…different. I’ll leave the whys for later, because I think the simple idea is enough to get started.

I did intend on having multiple human subspecies in the Otherworld from the start. (That is totally not me ripping off The Dagger and the Coin, except when it is.) And I even made them fit the classic fantasy stereotypes. The Lyssea, who show up again in this episode, are a reinterpretation of elves. The Kaldea beating down Ayla’s door fill the “dwarf” role. Even last episode’s Arassea work, as they started off in my head as vaguely orc-like. That’s not to say these races are their fantasy inspirations. Oh, no. But it’s a perfect excuse for some people—particularly a certain character very drawn to fantasy literature—to see them as such.

All told, there are ten total races in the Otherworld, if you count the Altea. (And if you don’t count the modern Earthlings of the expedition.) Some of them can interbreed; some of them would rather not. Each has its own culture, language, and outlook, and I use that to set up quite a few interesting plotlines. The Arassea slavery angle, for one, or the Kaldea and their cabal-like protection of their technology. On top of that, there are racial tensions, and even some outright racism. Why? Because the Otherworld is not a utopia. It’s imperfect, just like ours, and part of the story’s development is peeling back those layers to find the imperfections.

The upcoming

That’s all for this installment, but the chronicles will keep coming. Next up is Situational Awareness, which is my favorite episode of the first season. I loved writing it, I love reading it, and I hope you’ll enjoy it as much as I do. Until then, have fun in either world, and be sure to look at my other stories.