Hacker Newsnew | past | comments | ask | show | jobs | submit | torstenvl's commentslogin

It isn't ethically unsound. It's a commons/coordination problem. What is the optimal strategy in infinite-round prisoners dilemma with randomized opponents? The randomization effectively makes it an infinite series of one-round prisoners dilemma. So the best strategy is always to defect.

The only way you can change this is very high social trust, and all of society condemning anyone who ever defects.


If morality never factors into your own decisions, you don't get to be upset when it doesn't factor into other peoples'. In other words, society just sucks when everyone thinks this way, even if it true that resolving it is hard.

This is called a “replacement excuse”. It’s a hallmark of nihilists and utilitarians, but I tend to prefer the more prosaic group noun, “jerks”.

This is an intellectually and morally deficient position to take. There is no moral principle in any system anywhere in the history of the universe that requires me to bind myself to a contract that nobody else is bound to.

We can all agree, as a society, "hey, no individual person will graze more than ten cows on the commons," and that's fine. And if we all agree and someone breaks their vow, then that is immoral. "Society just sucks when everyone thinks this way" indeed.

But if nobody ever agreed to it, and you're out there grazing all you're cattle, and Ezekiel is out there grazing all his cattle, and Josiah is out there grazing all his cattle, there is no reasonable ethical principle you could propose that would prevent me from grazing all my cattle too.


> There is no moral principle in any system anywhere in the history of the universe that requires me to bind myself to a contract that nobody else is bound to.

Is there not? I don't feel this makes sense to me, as the conclusion seems to be "if everyone (or perhaps a large amount of people) do it, then it's not immoral". My immediate thought goes to moral systems that universalise an action, such that if everyone did it and it makes the world worse, then it's something that you should not do. That would be an example of a system that goes counter to what you say. Since morals are personal, you can still have that conclusion even if other people do not subscribe to the same set of moral beliefs that you have. Something can be immoral to you, and you will refuse to do it even if everyone else does.

> But if nobody ever agreed to it [...] there is no reasonable ethical principle you could propose that would prevent me from grazing all my cattle too.

Why not? I don't quite understand your conclusion. Why could the conclusion not be "I feel what everyone else is doing is wrong, and I will not do it myself"? Is it because it puts you at a disadvantage, and you believe that is unfair? Perhaps this is the "reasonable" aspect?


Your confusion is understandable. The way the terms "moral" and "ethical" are thrown around is sloppy in most vernacular. Generally, ethics refers to system-wide morality. E.g., I may feel that personal morality compels me to offer lower rates to clients, even though a higher rate may be acceptable under legal ethics. I tried to make that distinction clear in my post ("moral principle in any system") but perhaps I didn't do a good enough job.

The original poster was not referring to individual moral feelings, but to formal ethical systems subject to systematized logical thinking: "classic example of an ethically unsound argument."

There is no religious tradition, no system of ethics, no school of thought in moral philosophy, that is consistent with that position. The closest you might come is Aristotelian virtue ethics. But it would be a really strained reading that would result in the position that opting out of commons mismanagement is required. Aristotle specifically said that being a fool is not a virtue. If anything, a virtue ethics lens would compel someone to try to establish formal community rules to prevent the tragedy of the commons.


I think this argument would justify slavery: no one (white people) has decided that holding others as slaves is bad, therefore I can hold slaves.

But let me entertain it for a moment: prior to knowing, e.g., that plastics or CO2 are bad for the environment, how should one know that they are bad for the environment. Fred, the first person to realize this would run around saying "hey guys, this is bad".

And here is where I think it gets interesting: the folks making all the $ producing the CO2 and plastics are highly motivated to say "sorry Fred, your science is wrong". So when it finally turns out that Fred was right, were the plastics/CO2 companies morally wrong in hindsight?

You are arguing that morality is entirely socially determined. This may be partially true, but IMO, only economically. If I must choose between hurting someone else and dying, I do not think there is a categorically moral choice there. (Though Mengzi/ Mencius would say that you should prefer death -- see fish and the bear's paw in 告子上). So, to the extent that your life or life-preserving business (i.e. source of food/housing) demands hurting others (producing plastics, CO2), then perhaps it is moral to do so. But to the extent that your desire for fancy cars and first class plane tickets demands producing CO2...well (ibid.).

The issue is that the people who benefit economically are highly incentivized to object to any new moral reckoning (i.e. tracking people is bad; privacy is good; selling drugs is bad; building casinos is bad). To the extent that we care about morality (and we seem to), those folks benefitting from these actions can effectively lobby against moral change with propaganda. And this is, in fact, exactly what happens politically. Politics is, after all, an attempt to produce a kind of morality. It may depend on whom you follow, but my view would be that politics should be an approach to utilitarian management of resources, in service of the people. But others might say we need to be concerned for the well-being of animals. And still others, would say that we must be concerned with the well-being of capital, or even AIs! In any case, large corporations effectively lobby against any moral reckoning against their activities and thus avoid regulation.

The problem with your "socially determined morality" (though admittedly, I increasingly struggle to see a practical way around this) is that, though in some ways true (since society is economics and therefore impacts one's capacity to live) is that you end up in a world in which everyone can exploit everyone else maximally. There is no inherent truth in what the crowd believes (though again, crowd beliefs do affect short-term and even intermediate-term economics, especially in a hyper-connected world). The fact that most white people in the 1700s believed that it was not wrong to enslave black people does not make that right. The fact that many people believed tulips were worth millions of dollars does not make it true in the long run.

Are we running up against truth vs practicality? I think so. It may be impractical to enforce morality, but that doesn't make Google moral.

Overall, your arguments are compatible with a kind of nihilism: there is no universal morality; I can adopt whatever morality is most suitable to my ends.

I make one final point: how should slavery and plastics be handled? It takes a truly unfeeling sort of human to enslave another human being. It is hard to imagine that none of these people felt that something was wrong. Though google is not enslaving people nor are its actions tantamount to Nazism, there is plenty of recent writing about the rise of technofascism. The EAs would certainly sacrifice the "few" of today's people for the nebulous "many" of the future over which they will rule. But they have constructed a narrative in which the future's many need protection. There are moral philosophies (e.g. utilitarianism) that would justify this. And this is partially because we have insufficient knowledge of the future, and also because the technologies of today make highly variable the possible futures of tomorrow.

I propose instead that---especially in this era of extreme individual power (i.e. the capacity to be "loud" -- see below)---a different kind of morality is useful: the wielding of power is bad. As your power grows, so to does the responsibility to consider its impact on others and to more aggressively judge every action one takes under the Veil of Ignorance. Any time we affect the lives of others around us, we are at greater risk of violating this morality. See eg., Tools for Conviviality or Silence is a Commons (https://news.ycombinator.com/item?id=44609969). Google and the tech companies are being extremely loud, and you'd have to be an idiot to see that it's not harmful. If your mental contortions allow you to say "harm is moral because the majority don't object," well, that looks like nihilism and certainly doesn't get us anywhere "good". But my "good" cannot be measured, and your good is GDP, so I suppose I will lose.


It is definitely ethically unsound and it is definitely a common example even related to Nazis. Similar to "just following orders". Which I'll remind everyone, will not save you in a court of law[0]...

You are abdicating your own moral responsibility on the assumption of a deterministic reality.

The literal textbook version of this ethical issue, one you'll find in literally any intro to ethics class is

  If I don't do this job then somebody else will. The only difference is that I will not get paid and if I get paid I will do good with that money where as if somebody else gets paid they might not.
Sometimes a variant will be introduced with a direct acknowledgement of like donating 10% of your earnings to charity to "offset" your misgivings (ᶜᵒᵘᵍʰ ᴱᶠᶠᵉᶜᵗᶦᵛᵉ ᴬˡᵗʳᵘᶦˢᵐ ᶜᵒᵘᵍʰ).

But either way, it is you abdicating your personal responsibility and making the assumption that the job will be done regardless. But think about the logic here. If people do not think like you then the employer must then start offering higher wages in order to entice others. As there is some function describing people's individual moral lines and their desire for money. Even if the employer must pay more you are then helping deter that behavior because you are making it harder to implement. Alternatively the other person that does the job might not be as good at the job as you, making the damage done less than had you done the job. It's not hard to see that often this will result in the job not even existing as truthfully these immoral jobs are scraping the bottom of the barrel. Even if you are making the assumption that the job will be done it would be more naive to assume the job is done to the same quality. (But kudos on you for the lack of ego and thinking you aren't better than other devs)

[0] https://en.wikipedia.org/wiki/Superior_orders


Most of those convicted at the Nuremberg trials eventually had their sentences commuted and only served a fraction of their time. Only a few were convicted and executed. Justice rarely prevails.

Objectively incorrect. There is no reasonable argument that it's ethically unsound. The fact that you immediately Godwin'd should have been your first clue.

  > There is no reasonable argument that it's ethically unsound.
I didn't claim the argument was reasonable.

  > The fact that you immediately Godwin'd
Well it is a classic example.

Considering you're a military lawyer I'm absolutely certain you've heard this example before and its connection to Nazi Germany. I'm not dating anyone is a Nazi for making that argument, but it is a classic example when pointing to how Ordinary Men can do atrocities. And no, I didn't make a grammatical mistake there.


> will not save you in a court of law

Not in the USA. LEO or ICE - or even some judges misuse and never are punished. Qualified immunity.

Moral is different story. Too many people in HN work in Google or Apple. That by itself if immoral.


  > even some
Some is a keyword.

Some doesn't change the law.

You're right to push back in case I intended something different. But I'll state this clearly: those LEO, ICE agents, and judges are committing crimes.

But the fact that not all criminals are punished or prosecuted does not change the laws either.

What I'm concerned about is people becoming disenfranchised and apathetic. Dismissing the laws we have that does punish LEO, ICE agents, and judges for breaking the laws. To take a defeatist attitude. Especially in this more difficult time where that power is being abused more than ever. But a big reason it is being able to be abused is because a growing apathetic attitude by people. By people giving up.

So I don't know about you and your positions. I don't know if you're apathetic or invested. All I know is a random comment from a random person. It isn't much to go on. But I hope you aren't and I hope you don't spread apathy, intentionally or not.


> Sinking half a dozen ships in international waters is a crime.

Citation needed.


This is awesome!

(Just so you know, RTL doesn't work. حبيبي comes out as ي ب ي ب ح. See https://imgur.com/a/HiXxqZ2 )


> C isn't not a high level assembler

Hmm.

The text following this heading seems to take the opposite view. I suspect this is a typo.

However, I think the heading is accurate as written. The "C is not a high level assembler" crowd, in my view, is making a category error, conflating C itself with an ISO standard and abstract machine concept coming decades later.

By the same token, "C is a high level assembler" is a gross oversimplification.

"C isn't not a high level assembler" indeed.


> The "C is not a high level assembler" crowd, in my view, is making a category error, conflating C itself with an ISO standard and abstract machine concept coming decades later.

"C isn't not a high level assembler" captures it almost perfectly, and it also captures the documented intent of the people who created the ANSI C standard, which was that ANSI C should not preclude the (common) use of C as a high-level assembly language.

Here the quote:

C code can be non-portable. Although it strove to give programmers the opportunity to write truly portable programs, the C89 Committee did not want to force programmers into writing portably, to preclude the use of C as a “high-level assembler”: the ability to write machine- specific code is one of the strengths of C. It is this principle which largely motivates drawing the distinction between strictly conforming program and conforming program (§4).

https://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.1...

(bottom of page 2)


What would you say C is beyond the high-level assembler ? genuinely curious (i kinda hold that belief personally but i'm not a c programmer by trade)

I see a huge semantic gap between assembly language and C.

An assembly language program specifies a sequence of CPU instructions. The mapping between lines of code and generated instructions is one-to-one, or nearly so.

A C program specifies run-time behavior, without regard to what CPU instructions might be used to achieve that.

C is at a lower level than a lot of other languages, but it's not an assembly language.


And yet modern assembly does not correspond 1:1 to the micro-ops the CPU runs or even necessarily the order in which they run.

Both ISA-level assembly and C are targeting an abstract machine model, even if the former is somewhat further removed from hardware reality.


Java also targets an abstract machine model (JVM) - such statement really doesn't mean much.

Assembly is not about corresponding to exactly which gates open when in the CPU. It's just the human writable form of whatever the CPU ingests, whereas C is an early take on a language reasonable capable of expressing higher level ideas with less low-level noise.

I seriously doubt anyone who has written projects in assembly would make such comparisons...


>I seriously doubt anyone who has written projects in assembly would make such comparisons...

With genuine respect, I believe this type of insinuation is rarely productive.

Someone might still have silly opinions, even if they have been paid to write assembly for 8-24-64 bit cisc, risc, ordered and out of order ISAs, and maybe compilers too. Peace :)


Yes but someone might also have silly opinions from having no experience how production assembly actually looks, such as underestimating just how different working with that is to working in high-level languages like C and why such languages were quite revolutionary. :)

This should not be mistaken as appeal to authority, it is merely reasonable discrimination between those speaking from experience, and those forming opinions without experience.

If one believes those with experience has poorly informed opinions, they're always free to gain experience and associated perspective. They will then either have the fundamentals to properly push their viewpoint, or end up better understanding and aligning with the common viewpoint.


Sure but from software POV assembly is the lowest level you can target

Which assembly? Assembly with macros? Assembly with synthetic instructions?

If you use

    mov %i0, %l0
instead of

    or %g0, %i0, %l0
Then that isn't "the lowest level you can target."

I was thinking of x86 when I wrote that, also I am not sure macros count as an abstraction level since they are just preprocessors?

What I meant to say is that since there is no way to directly write microcode, assembly is the lowest level software can target.


Yes and no, you can use c in situations where there's no "assembly", for instance when synthesizing FPGAs. You target flow graphs directly in that case IIRC.

> And yet modern assembly does not correspond 1:1 to the micro-ops the CPU runs or even necessarily the order in which they run.

Nobody claimed that. It corresponds to the instructions the CPU runs and their observable order.

Also it's really only x86 that uses micro-ops (in the way that you mean), and there are still plenty of in-order CPUs.


sure, I was thinking of large OO cores. "Correspondd to the instructions the cpu runs and their observable order" is how I'd characterize C as well, but to each their own.

> And yet modern assembly does not correspond 1:1 to the micro-ops the CPU runs or even necessarily the order in which they run.

It's still much closer to the input machine code compared to what compiler optimizer passes do to your input C code ;)


I have empathy for this having written compiler passes for 10ish years of my career. But as I've studied register renaming, speculative branch prediction and trace caches I would no longer agree with your last sentence. It's fine though, totally just an opinion.

C is a programming language. It makes for a very shitty high level assembler.

Here's a trivial example clang will often implement differently on different systems, producing two different results. Clang x64 will generally mul+add, while clang arm64 is aggressive about fma.

    x = 3.0f*x+1.0f;
But that's just the broad strategy. Depending on the actual compiler flags, the assembly generated might include anything up to multiple function calls under the hood (sanitizers, soft floats, function profiling, etc).

I don't think clang is being "aggressive" on ARM, it's just that all aarch64 targets support fma. You'll get similar results with vfmadd213ss on x86-64 with -march=haswell (13 years old at this point, probably a safe bet).

    float fma(float x) {
        return 3.0f * x + 1.0f;
    }
Clang armv8 21.1.0:

    fma(float):
        sub     sp, sp, #16
        str     s0, [sp, #12]
        ldr     s1, [sp, #12]
        fmov    s2, #1.00000000
        fmov    s0, #3.00000000
        fmadd   s0, s0, s1, s2
        add     sp, sp, #16
        ret
Clang x86-64 21.1.0:

    .LCPI0_0:
        .long   0x3f800000
    .LCPI0_1:
        .long   0x40400000
    fma(float):
        push    rbp
        mov     rbp, rsp
        vmovss  dword ptr [rbp - 4], xmm0
        vmovss  xmm1, dword ptr [rbp - 4]
        vmovss  xmm2, dword ptr [rip + .LCPI0_0]
        vmovss  xmm0, dword ptr [rip + .LCPI0_1]
        vfmadd213ss     xmm0, xmm1, xmm2
        pop     rbp
        ret

The point is that there are multiple, meaningfully different implementations for the same line, not that either is wrong. Sometimes compilers will even produce both implementations and call one or the other based on runtime checks, as this ICC example does:

https://godbolt.org/z/KnErdebM5


I don't understand the argument you're trying to make. You seem to be arguing that C isn't a high-level assembler because some compilers generate different machine code for the same source code. But (a) that doesn't contradict the claim in any way; and (b) this happens in assembly all the time too—some synthetic instructions generate different machine code depending on circumstances.

I'm saying that "C is not a high level assembler" because it doesn't have any of the characteristics that make a good assembler. Your original post made a distinction between C as practically implemented vs the ISO standard, so the example was chosen as a practical example of something an assembler should never do: change the precision and rounding of arithmetic expressions.

Now let's say you're working on a game with deterministic lockstep. How do you guarantee precision and rounding with an assembler? Well, you just write the instructions or pseudoinstructions that do what you want. Worst case, you write a thin macro to generate the right instructions based on something else that you also control. In C or C++, you either abuse the compiler or rely on a library to do that for you ([0], [1]).

This is the raison d'etre of modern assemblers: precise control over the instruction stream. C doesn't give you that and it makes a lot of things difficult (e.g. constant time cryptography). It's also not fundamental to language design. There's a long history of lisp assemblers that do give you this kind of precise control, it's just not a guarantee provided by any modern C implementations unless you use the assembly escape hatches. The only portable guarantees you can rely on are those in the standard, hence the original link.

Low level control over the instruction stream is ultimately a spectrum. On one end you can write entirely in hex, then you have simple and macro assemblers. At the far end you have the high level languages. Somewhere in the middle is C and however you want to categorize FASM.

[0] https://github.com/sixitbb/sixit-dmath

[1] https://github.com/J-Montgomery/rfloat


I think I understand now. That's reasonably fair. I don't necessarily share in your ultimate conclusion, but I can see how your opinion is well-reasoned.

This was only the case when the machine code generated from C compilers was almost 1:1 to PDP-11, or similar 16 bit home computers.

Since optmizing compilers became a thing in the C world, and the WG14 never considered modern CPU architectures on what hardware features C should expose, this idea lost meaning.

However many people hold on to old beliefs that C is still the same kind of C that they learnt with the first edition of K&R C book.

This ACM article might be interesting to you, https://queue.acm.org/detail.cfm?id=3212479

Before dismissing it as the author having no idea what he is talking about, David Chisnall used to be a GCC contributor, one of the main GNUStep contributors back in the original days, and one of the key researchers behind the CHERI project.


David is quite accomplished, but in this instance he is simply wrong. For two reasons:

1. All the reasons he cites that depend on "what the metal does" being different and quite a bit more complex than what is surfaced in C apply equally to machine/assembly language. So the CPU's instruction set is not a low-level language? Interesting take, but I don't think so: it is the lowest level language that is exposed by the CPU.

2. The other reasons boil down to "I would like to do this optimization", and that is simply inapplicable.


Look at the compiler assembly output after optimization kicks in. The resulting assembly code is usually significantly different from the input source code. With modern optimizer passes, C is much closer to any other high level programming language than to handwritten assembly code.

I'm finding A Deepness in the Sky pretty drudging to be honest.


It gets slow after the merging of the two competing factions at the beginning and then builds momentum after the anti-hero's back story half way through. It just might be my most favorite book. I found the building dominance of the anti-hero to be similar but less epic than that of Raistlin Majere from DragonLance.


Strongly second Exhalation by Ted Chiang. "The Life Cycle of Software Objects" is especially compelling.


That's what seat belts are for. Making unbreakable glass is morally repugnant.


This law is intended to protect belted occupants as well. The target here is rollover crashes where belted occupants may still be jostled partially free from the belt and be partially ejected.


Not relevant. Safety designs that kill people are indefensible.


> Safety designs that kill people are indefensible.

Then it logically follows that either the only defensible approach is to not have any safety solutions, or that there simply isn’t a defensible approach.

The tradeoffs are unavoidable, a seatbelt or airbag might very well kill someone despite saving countless lives. Even tech like lane departure warnings will almost inevitably distract and kill someone.


I'm going to guess that you don't work on safety engineering. All safety designs have tradeoffs. Airbags can kill you but we still use them because the probable benefits outweigh the risks.


Airbags do not kill people. There were fewer than 300 airbag-related deaths of the course of two decades, and the vast majority of those deaths were caused by not wearing a seatbelt.


> Airbags do not kill people.

> fewer than 300 airbag-related deaths

So, they do kill people.

They kill people at a low enough rate that make them both worth installing, and mandating, compared to the alternatives.


Frontal airbags, generally speaking, make people who would've died survive and make people who would've walked away with nothing look like they went a few rounds with a professional boxer. It's a flattening effect.


And in that time how many deaths were attributed to laminate glass?


This is literally the logic anti-seatbelt folks use. “I don’t wear a seatbelt because if I’m in a crash, the seatbelt could end up trapping me in a fire.”

Safety design very often involves trade offs. The chances you get partially ejected and killed during a rollover are meaningfully higher than the chances you die because you can’t break the glass to get out. Do you even keep a glass breaker in your car or do you imagine after surviving a wreck that’s trapped you inside your car that you will have the strength to just punch through a glass window?


Wait till someone tells this guy about the trolley problem.


What ramp up? It's been less than a year since they discontinued the SE 2022.

Apple could have kept improving the CPU and camera and not much else and would have had a steady stream of income from those of us who want to use our actual pockets (not a weird swaddle) to carry our phones.

The iPhone SE accounted for 5-12% of the market, depending on year. The iPhone mini accounted for about 5%. Let's conservatively call it 13%.

Apple had iPhone revenue of $205bn in 2022. The average smaller iPhone is about .5-.67 the cost of a flagship model.

So fuzzy math, but .13 * .5 * 205000000000 = a $1.3bn market for iPhones you can use with one hand.

Thats nothing to sneeze at. Way more of a market than something like a Magic Trackpad.


Apple is making like 100bn a quarter. 102.4bn last quarter to be exact. 1.3bn in a whole year is indeed something for apple to sneeze at.

And the ramp up is to design and organise manufacture of a whole new phone line. They also would likely have received a hit in sales in general if they didn’t upgrade the design as people would feel insulted and also it would stick out like an ignored pig in the lineup, which isn’t good for apples brand either.

The truth is, you’d likely make the same decision if you were CEO, especially if you have to justify it to shareholders.


Font generally looks nice, but I really hate the trend of overly-curly curly braces.

(Also, I'm judging the C code. No check on the fopen()? fclose() on a possibly invalid FILE *? No return from int main()? "FILE *f"?!?!)


thanks for the feedback. a few people have expressed the same criticism. i'm open to producing a variant with less-curly curly brances. please raise an issue, if you want to use it.

as is expected, all codes in the illustrations, especially the C code, are to be judged superficially, ie, by their covers, not content :)


Anyone who determines language solely from IP is per se incompetent and needs to be completely blacklisted from the industry. The Accept-Language header exists for a reason.


Yeah! Why can't it just check the OPERATING SYSTEM LANGUAGE????

It's literally there!! My OS is in English, my browser is in English, don't fkn show me everything in Klingon just because I happen to be a prisoner on their ship!


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: