3 ms·
The reasoning is given, but - ironically - no “connection” is given between the idea that “other languages don’t have enough mechanisms for connection” and “oth
by wk_end 4y ago
The reasoning is given, but - ironically - no “connection” is given between the idea that “other languages don’t have enough mechanisms for connection” and “other languages aren’t general purpose programming languages” or “other languages are DSLs for writing algorithms”. That connection isn’t really obvious. For one thing, lots of things I do on a day-to-day basis in languages that aren’t Objective-S don’t “feel” particularly “algorithmic” - for instance, when I’m modeling data in a class hierarchy or as a composition of types, using mechanisms built into the languages of choice, am I just “writing algorithms”? What about when I’m plumbing stuff between APIs and databases? Writing - or using - Lisp macros? Etc.
It’s an issue of terminology, I’d say - you’re using very sweeping, imprecise language to describe your critique. “This particular mechanism is a useful feature other languages lack” would be received much better than “other languages are fundamentally only suited to writing algorithms, rather than general-purpose software” when we’ve got 60+ years of every kind of software imaginable written in them. Arguing about the criteria for what “general purpose” means, this far down the line, is vastly less interesting than actual features, and I’ve read two blog posts and I still don’t really see, specifically, what Objective-S has that’s so paradigm shifting. Reprogrammable literals, so I can embed URLs in my code without delimiters or anything? Syntax for “connecting” things?
- mpweiher 4y ago> That connection isn’t really obvious. In what way is it not obvious? Here is something we need to express a lot, and our "general purpose languages" can't express it. I am not sure how it can get any more obvious than that. The use of the word "express" is important here. Of course we can implement everything and anything once our language is Turing complete. But if that's the criterion, why do we have high level languages? After all, we surely can implement everything by punching machine code into our hex editors. Or maybe get super-fancy and add an assembler. But we cannot express non-procedural concepts and systems, and we cannot abstract our way out of this problem the way we otherwise often can because it is the abstraction mechanism itself that is procedural. > What about when I’m plumbing stuff between APIs and databases? Exactly! That was precisely the use case where this became obvious to me, because in Wunderlist, for example, our iOS/macOS GUI clients were on the order of 140KLOC, and a large percentage was just plumbing, shuffling data between APIs, the persistence and the GUI. So what do you actually do when you create this plumbing? You write procedures, functions or methods to accomplish the plumbing. To either or both (a) set up the plumbing and (b) mediate the plumbing. So you can implement the plumbing by writing all these procedures, but you can't actually express the idea of plumbing, because it isn't itself procedural. As Andrew Black puts it: "The program's text is a meta-description of the program behavior, and it is not always easy to infer the behavior from the meta-description." (https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.482.1265&rep=rep1&type=pdf https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.48...) And the fact that (a) you can always kinda sorta get away with implementing what you need using procedures and (b) we have gotten so incredibly used to this that we don't see the indirection as a problem is exactly why I call this "The Gentle Tyranny of Call/Return". And the mismatch and indirection have a very real and significant cost. For example, WL had a significant chunk of code that translated the REST API of the backend into a "nice" set of methods. With callbacks. Which had to duplicated every time we introduced an abstraction. Huge mess, huge amount of code, and I've seen the same in every comparable system I've encountered since. With in-process REST, all that code goes out the window. It's not needed. Now you can make implement in-process REST using current languages, and we did. But it goes against the grain of what the language wants you to do. > you’re using very sweeping, imprecise language to describe your critique. Nah, the language is actually very precise, if apparently unfamiliar. That is something I obviously have to deal with, so thanks for the heads-up on that. From a software-architectural POV it is blindingly obvious. For example here is a taxonomy of software architectural connectors: https://www.researchgate.net/publication/3864292_Towards_a_taxonomy_of_software_connectors https://www.researchgate.net/publication/3864292_Towards_a_t... Call/return is in a tiny little corner. That is what our "general purpose" languages provide linguistic support for. Everything else we can build, but not express.