Whatever your recollection of "rank-and-file scientists" attitudes is, the narrative on record is to the contrary.
306 karma · joined February 6, 2011
Previously: Founder of Luma Camera (YC W12) Cocreator of Hyperlapse (hyperlapse.instagram.com) Stanford dropout
Twitter: @alexkarpenko
Whatever your recollection of "rank-and-file scientists" attitudes is, the narrative on record is to the contrary.
Source: I worked on an app with millions of paid subscribers.
And you would be able to do that just fine. All you'd need to do is include the JS compiler (helpfully hosted at http://cdn.google.com/ecmascript-2015.wasm) in the <head> of the HTML file's script tag, open a text editor and type away. Or, you know, include a more sane language like typescript, or python. Heck even lisp if you're so inclined. Or, and this is like totally crazy, but say you need performance, and want tight control over memory layout and allocations, then go for C or rust! Oh and no need to minify your JS. Just ship the WASM precompiled. Save on browser compilation time and network bytes at the same time. So long as you generate WASM that the browser understands use whatever lang makes you happy. Type it right into a text editor and include the compiler in the head of the HTML. Easy peasy.
It's without question that JS has held back web development for decades. Of course, people didn't know any better back then, and really JS was added as almost an afterthought, so we can't really blame them for getting it wrong.
We do know better now though. And still we get WGSL. Looking forward to 2041, when we finally get WGASM. The hottest new thing in web gpu technologies.
> When writing SPIR-V, you can’t have two integer types of the same width. Or two texture types that match. All non-composite types have to be unique for some reason. We don’t have this restriction in Naga IR, it just doesn’t seem to make any sense. For example, what if I’m writing a shader, and I basically want to use the same “int32” type for both indices and lengths. I may want to name these types differently
This doesn't really make sense for IR. IR is not meant to be human writeable. It's meant to be generated by a compiler. So, having a one to one mapping between concept and name in the IR is a feature, not a bug.
Honestly, WGSL just repeats the JavaScript mistake: where we should have started with something like WASM instead of JavaScript. And JS could have been just one of the many languages that targeted WASM.
We were this close to not repeating this mistake by adopting an IR language (SPIR-V) for WebGPU, but then that got abandoned mostly for political reasons. Too bad. Now we get to write transpilers and hacks for decades to come, just like web people have been trying to paper over JS problems for decades.
Some example implementations based on dual numbers: 1. http://www.ceres-solver.org/automatic_derivatives.html 2. http://www.imm.dtu.dk/~kajm/FADBAD/
Newer ML frameworks do source to source transformations, which allows calculating the derivative without changing the function signature, but the concepts used remain the same.
I really like the analogy in this talk about how Al-Khwarizmi's six quadratic equations simplify to just one, once we learn about negative numbers and zero.
In a lot of ways, geometric algebra (and dual numbers) are our discovery of "negative numbers and zero", but for the 21st century.
Edit: Also, run-time independent evaluation would need to handle branching differently. For example, in this expression: (if a b c). If `a` is not known at "compile time" then this expression remains in the AST, and run-time independent value propagation continues into `b` and `c`. If `a` is known at "compile time" then only `b` or `c` remain in the AST depending on whether `a` is true or false.
Specifically, I think that there exists a lisp with a set of axioms that split program execution into "compile-time" execution (facts known about the program that are invariant to input) and a second "runtime" execution pass (facts that depend on dynamic input).
For example, multiplying a 2d array that's defined to be MxN by an array that's defined to be NxO should yield a type that's known to be MxO (even if the values of the array are not yet known). Or if the first parameter is known to be an upper-triangular matrix, then we can optimize the multiplication operation by culling the multiplication AST at "compile-time". This compile-time optimized AST could then be lowered to machine code and executed by inputting "runtime" known facts.
I think that this is what's needed to create the most optimally efficient "compiled" language. Type systems in e.g. Haskell and Rust help with optimization when spitting out machine code, but they're often incomplete (e.g., we know more at compile time than what's often captured in the type system).
I've put "compilation" in quotes, because compilation here just means program execution with run-time invariant values in order to build an AST that can then be executed with run-time dependent values. Is anyone aware of a language that takes this approach?
So what's missing in your scooter use case is a loyalty mechanism rather than a lack of payment technology.
Sia's encryption doesn't protect the file hosts, if the uploader posts a link + decryption keys for pirated content to a public file sharing forum.
Does the take down notice go to everyone that hosts a fragment of the file? Who is liable if the uploader can't be traced?
I’ll let other people prognosticate as to what, if anything, that means for their future.
It's highly unlikely that the free market somehow sorts this out in the future, considering that it's the free market that gave rise to these power law distributions to begin with.
Some high profile C++ projects: LLVM, Webkit, v8 JavaScript engine, Chromium, Tensorflow, PyTorch, Eigen, OpenCV, Skia, Unreal Engine. C++ is a good fit for those projects: the right mix of expressiveness, portability & performance. It's not a good fit for other projects. Pick the right tool for the job. Move on with your life.
Shopify, Square and Stripe are poised to become direct competitors if you follow this inertia.
The network will, as a result, centralize over time to a select few that have access to cheap and plentiful energy. These "big energy" :) companies will control most of the hashing power.
You can already trace this with bitcoin by looking at who the early miners were versus who the miners are now.
I think that in reality, PoW systems become more centralized over time. You can already see that with Bitcoin. Eventually the gatekeepers become those with the largest energy resources available to them, and "we the people" will be in the noise when it comes to hashing power.
I'd rather take energy efficient centralization than faux decentralization that also happens to destroy the environment.
I would argue that the benefit of decentralization is not worth the price.
1. Use TAI-UT1 (International Atomic Time, monotonic, no leap seconds, with zero on 1958 Jan 1) for time keeping
2. Define conversion functions that map TAI-UT1 to/from UTC/UT1/etc
Use TAI-UT1 when you want to:
- synchronize the clocks of a network of computers
- calculate time elapsed
Convert to UTC/UT1/etc when you want to:
- Display a human readable date
- You're writing navigation or astronomy software
Introducing leap seconds into UTC would then just mean updating the TAI<->UTC mapping function. So all it would affect is how human-readable dates are displayed & navigation/astronomy software is re-aligned to celestial body positions.