{"exhaustive":{"nbHits":false,"typo":false},"exhaustiveNbHits":false,"exhaustiveTypo":false,"hits":[{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"LeCompteSftware"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"&quot;Yes they crashed into a wall and all died, whereas you steered around it, but you must acknowledge that they crashed twice as quickly as you didn't crash. If you were driving their car, you would have just slowed them down.&quot;<p>People should have read to the end of &quot;Building a <em>C</em> <em>compiler</em> with a team of <em>parallel</em> <em>Claudes</em>&quot;[1]:<p><pre><code>  The resulting <em>compiler</em> has nearly reached the limits of Opus [4.6]\u2019s abilities. I tried (hard!) to fix several of the above limitations but wasn\u2019t fully successful. New features and bugfixes frequently broke existing functionality.\n</code></pre>\n&quot;tried (hard!)&quot; is very ominous. I wonder how Mythos would fare. Presumably it would get further, maybe much further. But I strongly doubt the &quot;frequently broke existing functionality&quot; problem was solved. Eventually humans have to understand the most difficult parts of the code. Good luck with that!<p>[1] <a href=\"https://www.anthropic.com/engineering/building-c-compiler\" rel=\"nofollow\">https://www.anthropic.com/engineering/building-<em>c</em>-<em>compiler</em></a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"I\u2019m spending months coding the old way"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://miguelconner.substack.com/p/im-coding-by-hand"}},"_tags":["comment","author_LeCompteSftware","story_47807583"],"author":"LeCompteSftware","comment_text":"&quot;Yes they crashed into a wall and all died, whereas you steered around it, but you must acknowledge that they crashed twice as quickly as you didn&#x27;t crash. If you were driving their car, you would have just slowed them down.&quot;<p>People should have read to the end of &quot;Building a C compiler with a team of parallel Claudes&quot;[1]:<p><pre><code>  The resulting compiler has nearly reached the limits of Opus [4.6]\u2019s abilities. I tried (hard!) to fix several of the above limitations but wasn\u2019t fully successful. New features and bugfixes frequently broke existing functionality.\n</code></pre>\n&quot;tried (hard!)&quot; is very ominous. I wonder how Mythos would fare. Presumably it would get further, maybe much further. But I strongly doubt the &quot;frequently broke existing functionality&quot; problem was solved. Eventually humans have to understand the most difficult parts of the code. Good luck with that!<p>[1] <a href=\"https:&#x2F;&#x2F;www.anthropic.com&#x2F;engineering&#x2F;building-c-compiler\" rel=\"nofollow\">https:&#x2F;&#x2F;www.anthropic.com&#x2F;engineering&#x2F;building-c-compiler</a>","created_at":"2026-04-18T14:39:27Z","created_at_i":1776523167,"objectID":"47816271","parent_id":47813625,"story_id":47807583,"story_title":"I\u2019m spending months coding the old way","story_url":"https://miguelconner.substack.com/p/im-coding-by-hand","updated_at":"2026-04-19T22:51:27Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"underdeserver"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"&gt; when agents started to compile the Linux kernel, they got stuck. [...] Every agent would hit the same bug, fix that bug, and then overwrite each other's changes.<p>&gt; [...] The fix was to use GCC as an online known-good <em>compiler</em> oracle to compare against. I wrote a new test harness that randomly compiled most of the kernel using GCC, and only the remaining files with <em>Claude's</em> <em>C</em> <em>Compiler</em>. If the kernel worked, then the problem wasn\u2019t in <em>Claude\u2019s</em> subset of the files. If it broke, then it could further refine by re-compiling some of these files with GCC. This let each agent work in <em>parallel</em><p>This is a remarkably creative solution! Nicely done."},"story_title":{"fullyHighlighted":false,"matchLevel":"partial","matchedWords":["c","compiler"],"value":"We tasked Opus 4.6 using agent teams to build a <em>C</em> <em>Compiler</em>"},"story_url":{"fullyHighlighted":false,"matchLevel":"partial","matchedWords":["c","compiler"],"value":"https://www.anthropic.com/engineering/building-<em>c</em>-<em>compiler</em>"}},"_tags":["comment","author_underdeserver","story_46903616"],"author":"underdeserver","comment_text":"&gt; when agents started to compile the Linux kernel, they got stuck. [...] Every agent would hit the same bug, fix that bug, and then overwrite each other&#x27;s changes.<p>&gt; [...] The fix was to use GCC as an online known-good compiler oracle to compare against. I wrote a new test harness that randomly compiled most of the kernel using GCC, and only the remaining files with Claude&#x27;s C Compiler. If the kernel worked, then the problem wasn\u2019t in Claude\u2019s subset of the files. If it broke, then it could further refine by re-compiling some of these files with GCC. This let each agent work in parallel<p>This is a remarkably creative solution! Nicely done.","created_at":"2026-02-05T22:03:51Z","created_at_i":1770329031,"objectID":"46906028","parent_id":46903616,"story_id":46903616,"story_title":"We tasked Opus 4.6 using agent teams to build a C Compiler","story_url":"https://www.anthropic.com/engineering/building-c-compiler","updated_at":"2026-03-05T23:30:43Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"cataflam"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"&gt; Nicholas Carlini, a researcher at Anthropic, orchestrated 16 <em>parallel</em> <em>Claude</em> agents to write a production <em>C</em> <em>compiler</em> in Rust.<p>To write a proof-of-concept <em>C</em> <em>compiler</em>, not a production-grade one...<p>Hard to take the article seriously after this"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"If AI writes your code, why use Python?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://medium.com/@NMitchem/if-ai-writes-your-code-why-use-python-bf8c4ba1a055"}},"_tags":["comment","author_cataflam","story_48100433"],"author":"cataflam","children":[48108459,48108573],"comment_text":"&gt; Nicholas Carlini, a researcher at Anthropic, orchestrated 16 parallel Claude agents to write a production C compiler in Rust.<p>To write a proof-of-concept C compiler, not a production-grade one...<p>Hard to take the article seriously after this","created_at":"2026-05-12T13:55:51Z","created_at_i":1778594151,"objectID":"48108375","parent_id":48100433,"story_id":48100433,"story_title":"If AI writes your code, why use Python?","story_url":"https://medium.com/@NMitchem/if-ai-writes-your-code-why-use-python-bf8c4ba1a055","updated_at":"2026-05-12T16:50:49Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"claudeCfail"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"I wouldn't overthink TFA. I mean, look at one of the examples of progress they gave:<p>&gt; Nicholas Carlini, a researcher at Anthropic, orchestrated 16 <em>parallel</em> <em>Claude</em> agents to write a production <em>C</em> <em>compiler</em> in Rust. 100,000 lines. It boots Linux 6.9 on x86, ARM, and RISC-V. It compiles QEMU, FFmpeg, SQLite, PostgreSQL, and Redis. It runs Doom. Total cost: just under $20,000 across nearly 2,000 <em>Claude</em> Code sessions.<p>Anyone who spends even 10% of an unhealthy tome on Hackernews should be able to confidentially say: It didn't boot, it didn't compile, and it did not run a Hello World, much less doom. It was a 20 thousand dollar fiasco and a joke.<p><a href=\"https://news.ycombinator.com/item?id=46941603\">https://news.ycombinator.com/item?id=46941603</a><p>Of course you want code you can read. You live in the real world, and have a real world use case. One where you haven't yet learned to review Rust code. TFA does not live there."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"If AI writes your code, why use Python?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://medium.com/@NMitchem/if-ai-writes-your-code-why-use-python-bf8c4ba1a055"}},"_tags":["comment","author_claudeCfail","story_48100433"],"author":"claudeCfail","comment_text":"I wouldn&#x27;t overthink TFA. I mean, look at one of the examples of progress they gave:<p>&gt; Nicholas Carlini, a researcher at Anthropic, orchestrated 16 parallel Claude agents to write a production C compiler in Rust. 100,000 lines. It boots Linux 6.9 on x86, ARM, and RISC-V. It compiles QEMU, FFmpeg, SQLite, PostgreSQL, and Redis. It runs Doom. Total cost: just under $20,000 across nearly 2,000 Claude Code sessions.<p>Anyone who spends even 10% of an unhealthy tome on Hackernews should be able to confidentially say: It didn&#x27;t boot, it didn&#x27;t compile, and it did not run a Hello World, much less doom. It was a 20 thousand dollar fiasco and a joke.<p><a href=\"https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=46941603\">https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=46941603</a><p>Of course you want code you can read. You live in the real world, and have a real world use case. One where you haven&#x27;t yet learned to review Rust code. TFA does not live there.","created_at":"2026-05-12T07:53:06Z","created_at_i":1778572386,"objectID":"48105443","parent_id":48105166,"story_id":48100433,"story_title":"If AI writes your code, why use Python?","story_url":"https://medium.com/@NMitchem/if-ai-writes-your-code-why-use-python-bf8c4ba1a055","updated_at":"2026-05-12T08:10:00Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"deng"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"&gt; Nicholas Carlini, a researcher at Anthropic, orchestrated 16 <em>parallel</em> <em>Claude</em> agents to write a production <em>C</em> <em>compiler</em> in Rust.<p>No he didn't. The <em>compiler</em> is bascially useless as it produces vastly inferior code than gcc/clang."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"If AI writes your code, why use Python?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://medium.com/@NMitchem/if-ai-writes-your-code-why-use-python-bf8c4ba1a055"}},"_tags":["comment","author_deng","story_48100433"],"author":"deng","comment_text":"&gt; Nicholas Carlini, a researcher at Anthropic, orchestrated 16 parallel Claude agents to write a production C compiler in Rust.<p>No he didn&#x27;t. The compiler is bascially useless as it produces vastly inferior code than gcc&#x2F;clang.","created_at":"2026-05-12T05:41:40Z","created_at_i":1778564500,"objectID":"48104623","parent_id":48100433,"story_id":48100433,"story_title":"If AI writes your code, why use Python?","story_url":"https://medium.com/@NMitchem/if-ai-writes-your-code-why-use-python-bf8c4ba1a055","updated_at":"2026-05-12T10:57:46Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"vbcherepanov"},"title":{"fullyHighlighted":false,"matchLevel":"partial","matchedWords":["parallel","claudes"],"value":"What 16 <em>Parallel</em> <em>Claude</em> Agents Built Around Themselves"},"url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"https://medium.com/@vbcherepanov/what-16-<em>parallel</em>-<em>claude</em>-agents-built-around-themselves-deconstructing-anthropics-<em>c</em>-<em>compiler</em>-f2fa6335b1ca"}},"_tags":["story","author_vbcherepanov","story_48075986"],"author":"vbcherepanov","children":[48075987],"created_at":"2026-05-09T15:58:11Z","created_at_i":1778342291,"num_comments":1,"objectID":"48075986","points":3,"story_id":48075986,"title":"What 16 Parallel Claude Agents Built Around Themselves","updated_at":"2026-05-09T16:33:07Z","url":"https://medium.com/@vbcherepanov/what-16-parallel-claude-agents-built-around-themselves-deconstructing-anthropics-c-compiler-f2fa6335b1ca"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"Syzygies"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"I started with SML in the 1980's, implementing a core math algorithm (Grobner bases) used in my K&amp;R <em>C</em> computer algebra system Macaulay. Then I got this idea there should be a related algorithm in a different problem domain (Hilbert bases) and I managed to convert my code in twenty minutes. It ran. This completely blew my mind, on par with switching from punched card Fortran to an APL terminal in the 1970's.<p>Everyone talks a good line about more powerful, expressive programming languages till they need to put in the work. Ten years effort to program like ten people the rest of your life? I'm 69 now, I can see how such an investment pays off.<p>I moved to OCaml. Studying their library source code is the best intro ever to functional programming, but I felt your &quot;all the way&quot; pull and switched to Haskell. (Monads make explicit what a <em>C</em> program is doing anyway. Explicit means the <em>compiler</em> can better help. What it comes down to is making programming feel like thinking about algebra. This is only an advantage if one is receptive to the experience.)<p>I'm about to commit to Lean 4 as &quot;going all the way&quot;. Early in AI pair programming, I tested a dozen languages including these with a challenging <em>parallel</em> test project, and concluded that AI couldn't handle Lean 4. It keeps trying to write proofs, despite Lean's excellence as a general purpose programming language, better than Haskell. That would be like asking for help with Ruby, and AI assuming you want to write a web server.<p>I now pay $200 a month for Anthropic Max access to <em>Claude</em> Code Opus 4 (regularly hitting limits) having committed to Swift (<em>C</em> meets Ruby, again not just for macOS apps, same category error) so I could have first class access to macOS graphics for my 3-manifold topology research. Alas, you can only build so high a building with stone, I need the abstraction leverage of best-in-category functional languages.<p>It turns out that Opus 4 can program in Lean 4, which I find more beautiful than any of the dozens of languages I've tried over a lifetime. Even Scheme with parentheses removal done right, and with far more powerful abstractions."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"OCaml Programming: Correct and Efficient and Beautiful"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://cs3110.github.io/textbook/cover.html"}},"_tags":["comment","author_Syzygies","story_44696979"],"author":"Syzygies","children":[44698161],"comment_text":"I started with SML in the 1980&#x27;s, implementing a core math algorithm (Grobner bases) used in my K&amp;R C computer algebra system Macaulay. Then I got this idea there should be a related algorithm in a different problem domain (Hilbert bases) and I managed to convert my code in twenty minutes. It ran. This completely blew my mind, on par with switching from punched card Fortran to an APL terminal in the 1970&#x27;s.<p>Everyone talks a good line about more powerful, expressive programming languages till they need to put in the work. Ten years effort to program like ten people the rest of your life? I&#x27;m 69 now, I can see how such an investment pays off.<p>I moved to OCaml. Studying their library source code is the best intro ever to functional programming, but I felt your &quot;all the way&quot; pull and switched to Haskell. (Monads make explicit what a C program is doing anyway. Explicit means the compiler can better help. What it comes down to is making programming feel like thinking about algebra. This is only an advantage if one is receptive to the experience.)<p>I&#x27;m about to commit to Lean 4 as &quot;going all the way&quot;. Early in AI pair programming, I tested a dozen languages including these with a challenging parallel test project, and concluded that AI couldn&#x27;t handle Lean 4. It keeps trying to write proofs, despite Lean&#x27;s excellence as a general purpose programming language, better than Haskell. That would be like asking for help with Ruby, and AI assuming you want to write a web server.<p>I now pay $200 a month for Anthropic Max access to Claude Code Opus 4 (regularly hitting limits) having committed to Swift (C meets Ruby, again not just for macOS apps, same category error) so I could have first class access to macOS graphics for my 3-manifold topology research. Alas, you can only build so high a building with stone, I need the abstraction leverage of best-in-category functional languages.<p>It turns out that Opus 4 can program in Lean 4, which I find more beautiful than any of the dozens of languages I&#x27;ve tried over a lifetime. Even Scheme with parentheses removal done right, and with far more powerful abstractions.","created_at":"2025-07-26T23:26:42Z","created_at_i":1753572402,"objectID":"44697725","parent_id":44697474,"story_id":44696979,"story_title":"OCaml Programming: Correct and Efficient and Beautiful","story_url":"https://cs3110.github.io/textbook/cover.html","updated_at":"2025-07-27T14:24:13Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"Locke1689"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"It depends on what you mean by <em>parallel</em>.<p>Certainly the Roslyn <em>C</em># <em>compiler</em> is highly <em>parallel</em>. All files are parsed in <em>parallel</em>, then all <em>classes</em> are bound (semantically analyzed) in <em>parallel</em>, then the IL serialization phase is sequential."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Testing LLVM"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://blog.regehr.org/archives/1450"}},"_tags":["comment","author_Locke1689","story_13394437"],"author":"Locke1689","children":[13407966],"comment_text":"It depends on what you mean by parallel.<p>Certainly the Roslyn C# compiler is highly parallel. All files are parsed in parallel, then all classes are bound (semantically analyzed) in parallel, then the IL serialization phase is sequential.","created_at":"2017-01-14T07:32:28Z","created_at_i":1484379148,"objectID":"13397385","parent_id":13396184,"story_id":13394437,"story_title":"Testing LLVM","story_url":"http://blog.regehr.org/archives/1450","updated_at":"2024-09-20T00:18:47Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"pbr_rob"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"Class of '04, Computer Science<p>- Programming I in <em>C</em><p>- Programming II in <em>C</em>++<p>- Data Structures in <em>C</em>++<p>- Theory of PL rotated languages every semester and project had to be in a language you didn't know coming into the class. (<em>C</em>#, php, pl/sql)<p>- Software Engineering divided into groups, each group assigned a stack to implement (mine was LAMP)<p>- Databases pl/sql<p>- <em>Compilers</em> <em>C</em>/lex/yacc<p>- OS projects in <em>C</em> and assembly<p>- <em>Parallel</em> projects in <em>C</em>, python and mpi<p>- Python language class<p>- Scripting languages survey was always python and ruby, but rotated in something new or interesting each section.<p>- A COBOL section with old mainframe<p>- Assembly class was in MASM<p>No FP for undergrads. No one had to learn Java or <em>C</em>#, you were given the opportunity to be exposed to them through User Groups or electives, but directed <em>classes</em> in them were reserved for the Information Systems people over in the Business school.<p>--- edit: formatting"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: What programming languages are used in CS courses these days?"}},"_tags":["comment","author_pbr_rob","story_7950439"],"author":"pbr_rob","comment_text":"Class of &#x27;04, Computer Science<p>- Programming I in C<p>- Programming II in C++<p>- Data Structures in C++<p>- Theory of PL rotated languages every semester and project had to be in a language you didn&#x27;t know coming into the class. (C#, php, pl&#x2F;sql)<p>- Software Engineering divided into groups, each group assigned a stack to implement (mine was LAMP)<p>- Databases pl&#x2F;sql<p>- Compilers C&#x2F;lex&#x2F;yacc<p>- OS projects in C and assembly<p>- Parallel projects in C, python and mpi<p>- Python language class<p>- Scripting languages survey was always python and ruby, but rotated in something new or interesting each section.<p>- A COBOL section with old mainframe<p>- Assembly class was in MASM<p>No FP for undergrads. No one had to learn Java or C#, you were given the opportunity to be exposed to them through User Groups or electives, but directed classes in them were reserved for the Information Systems people over in the Business school.<p>--- edit: formatting","created_at":"2014-06-26T17:28:43Z","created_at_i":1403803723,"objectID":"7950685","parent_id":7950439,"story_id":7950439,"story_title":"Ask HN: What programming languages are used in CS courses these days?","updated_at":"2024-09-19T20:56:49Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"tjoff"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"<i>Additionally there are not many <em>classes</em> with <em>C</em> at all these days.</i><p>Depends on what you are studying. While I never had any specific \"learn <em>C</em>\" courses it is by far the most used language in other courses (OS programming, <em>parallel</em> programming, <em>compiler</em> construction, network programming, micro-controllers, graphics and game programming, security courses etc.). No other language comes close (a lot of the time a <em>C</em>++ <em>compiler</em> is used but the <em>C</em> subset is what ultimately has been used)."},"story_title":{"fullyHighlighted":false,"matchLevel":"partial","matchedWords":["c"],"value":"Interesting <em>C</em> Interview Questions and Answers"},"story_url":{"fullyHighlighted":false,"matchLevel":"partial","matchedWords":["c"],"value":"http://www.thegeekstuff.com/2012/08/<em>c</em>-interview-questions/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+TheGeekStuff+%28The+Geek+Stuff%29"}},"_tags":["comment","author_tjoff","story_4445701"],"author":"tjoff","comment_text":"<i>Additionally there are not many classes with C at all these days.</i><p>Depends on what you are studying. While I never had any specific \"learn C\" courses it is by far the most used language in other courses (OS programming, parallel programming, compiler construction, network programming, micro-controllers, graphics and game programming, security courses etc.). No other language comes close (a lot of the time a C++ compiler is used but the C subset is what ultimately has been used).","created_at":"2012-08-28T21:52:22Z","created_at_i":1346190742,"objectID":"4446063","parent_id":4445950,"points":null,"story_id":4445701,"story_title":"Interesting C Interview Questions and Answers","story_url":"http://www.thegeekstuff.com/2012/08/c-interview-questions/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+TheGeekStuff+%28The+Geek+Stuff%29","updated_at":"2023-09-06T21:03:23Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"acuozzo"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"It's a shame &quot;<em>C</em> with <em>classes</em>&quot;, as <em>C</em>++ originally was, didn't stick around for <em>parallel</em> development.<p>I work with <em>C</em> daily and I'm well aware of its many shortcomings (e.g. its huge list of undefined behavior and its PDP11-centric view of modern architectures), but with some effort I believe it could function as a semi-portable second-level intermediate representation. Nim uses it as such, IIRC.<p>Compiling to <em>C</em> first would introduce some of its own issues, for sure, but I imagine doing so would alleviate the pressure the <em>C</em>++ standards committee puts on <em>compiler</em> vendors each time they expand the size of the kitchen sink."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Java 20 / JDK 20: General Availability"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://mail.openjdk.org/pipermail/jdk-dev/2023-March/007517.html"}},"_tags":["comment","author_acuozzo","story_35246710"],"author":"acuozzo","children":[35250790],"comment_text":"It&#x27;s a shame &quot;C with classes&quot;, as C++ originally was, didn&#x27;t stick around for parallel development.<p>I work with C daily and I&#x27;m well aware of its many shortcomings (e.g. its huge list of undefined behavior and its PDP11-centric view of modern architectures), but with some effort I believe it could function as a semi-portable second-level intermediate representation. Nim uses it as such, IIRC.<p>Compiling to C first would introduce some of its own issues, for sure, but I imagine doing so would alleviate the pressure the C++ standards committee puts on compiler vendors each time they expand the size of the kitchen sink.","created_at":"2023-03-21T17:32:56Z","created_at_i":1679419976,"objectID":"35249522","parent_id":35249065,"story_id":35246710,"story_title":"Java 20 / JDK 20: General Availability","story_url":"https://mail.openjdk.org/pipermail/jdk-dev/2023-March/007517.html","updated_at":"2024-09-20T13:38:22Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"fouric"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"I did something <i>kind of</i> like this for a college project. We were taking a course on FPGA soft-processors, and for our final project, we had to build A Thing.<p>My team chose to reimplement Space Invaders. The soft-core was supported by a <em>C</em> <em>compiler</em>, so we wrote the game in <em>C</em>, with carefully-chosen functions for graphics rendering containing #ifdefs that gated either direct memory accesses (for the FPGA VGA hardware) or SDL calls.<p>Our &quot;init()&quot; function would initialize the VGA hardware on the FPGA, and create an SDL window when compiled on a computer with an OS.<p>Using this, the hardware and software people were able to work together in <em>parallel</em>, and we won best project for our class, with a grand prize of &quot;we'll show your cool project to the next <em>classes</em>&quot;.<p>As I recall, we wrote most of the game using SDL backend, and only tested it on &quot;real&quot; hardware a few days before the final project. We found a single bug (during the integration) that took us on the order of half an hour to debug, and that was that."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Verilog Simulation with Verilator and SDL"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://projectf.io/posts/verilog-sim-verilator-sdl/"}},"_tags":["comment","author_fouric","story_28929994"],"author":"fouric","comment_text":"I did something <i>kind of</i> like this for a college project. We were taking a course on FPGA soft-processors, and for our final project, we had to build A Thing.<p>My team chose to reimplement Space Invaders. The soft-core was supported by a C compiler, so we wrote the game in C, with carefully-chosen functions for graphics rendering containing #ifdefs that gated either direct memory accesses (for the FPGA VGA hardware) or SDL calls.<p>Our &quot;init()&quot; function would initialize the VGA hardware on the FPGA, and create an SDL window when compiled on a computer with an OS.<p>Using this, the hardware and software people were able to work together in parallel, and we won best project for our class, with a grand prize of &quot;we&#x27;ll show your cool project to the next classes&quot;.<p>As I recall, we wrote most of the game using SDL backend, and only tested it on &quot;real&quot; hardware a few days before the final project. We found a single bug (during the integration) that took us on the order of half an hour to debug, and that was that.","created_at":"2021-10-20T17:45:23Z","created_at_i":1634751923,"objectID":"28933593","parent_id":28929994,"story_id":28929994,"story_title":"Verilog Simulation with Verilator and SDL","story_url":"https://projectf.io/posts/verilog-sim-verilator-sdl/","updated_at":"2024-09-20T09:38:48Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"CharlieDigital"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"I would just like to understand specific threats or issues with using <em>C</em># as a language.  I've used it for 20 years at this point without issue and the latest IEEE language survey shows that it remains one of the top languages[0]; I'm wondering if you have some insight into why .NET and <em>C</em># are a bad choice for engineering teams that I've somehow overlooked in my 20 years of working with it.<p>It sounds like your argument is &quot;because Microsoft&quot;.<p>If you are using VS Code, GitHub, or TypeScript -- well, <i>all those are also controlled by Microsoft, aren't they</i>? Microsoft is the biggest investor in OpenAI and in fact offers their own Azure labeled OpenAI -- are you going to give up on OpenAI because it's Microsoft controlled?  React is controlled by Facebook.  Go is controlled by Google.  So what?<p>Why use <em>C</em>#?<p><pre><code>    - It's a very small step from TypeScript to <em>C</em># if a team needs higher throughput on the backend[1][2]\n    - `System.Linq` provides a superset of JS Array methods and is easy to map from one to the other.\n    - It's performance is on par or superior to Go[3] and competitive with Rust[4] while being much easier to adopt because of the language similarity to JS and TS.\n    - It is an object-functional hybrid language owing to its influence from F#[5]; discriminated unions are on the roadmap and available today with packages like Dunet and OneOf, it has pattern matching like Rust, extension methods provide flexibility in modelling, named tuples in <em>C</em># 12 converge even more with TS, it supports destructuring record types and <em>classes</em>, it has immutable record types\n    - Minimal APIs are very familiar for teams using Express but need more performance.  I'd actually say that it's a bit simpler than Express on Node for common use cases since there's nothing to import when setting up minimal APIs since it's all first-party Microsoft.\n    - Platform support for source generators are a revelation; it removes a lot of boilerplate code while actually improving performance over reflection.\n    - Many of the things teams love about modern JS actually have influence from <em>C</em>#.  Lambda expressions in JavaScript, `async/await`, and more.  In fact, <em>C</em># and JS/TS have been converging (see the linked repo).\n    - It's relatively easy to write high throughput code in <em>C</em># with support for both concurrency (Tasks + Channels) and high level abstractions for parallelism (Task <em>Parallel</em> Library) as well as full access to threading.\n    - <em>C</em># allows easy access to underlying low-level primitives; you can program with high level abstractions for productivity but still have access to call `unsafe` code if needed.\n    - EF Core is possibly the best ORM on the market right now in terms of performance, ease of use, maturity, and database engine support.\n    - A benefit of a language and runtime backed by Microsoft and used in the enterprise is that security issues get addressed by a team of professional engineers; you don't see the same types of security issues that pop up in the Node/NPM ecosystem.\n    - This is a big boon particularly because of the broad standard libraries and first-party libraries for many use cases.  Rather than importing unknown dependencies for common use cases, you end up with a baseline of professionally maintained, OSS code.\n    - GitHub's State of the Octoverse report in 2020[6] showed that <em>C</em># had the least Dependabot alerts and has the least transitive dependencies (less prone to security issues via package managers).\n    - As a general purpose language, it can be used in many domains from desktop to devices to web to gaming (both Godot and Unity; RyujinX).\n    - It's also quite mature and stable while languages like Rust are still ironing out async and Go just released generics.  <em>C</em># has been there; done that.\n</code></pre>\nMy personal opinion is that <em>C</em># is the language that most teams want but don't know enough about it or have a bad taste from the .NET Framework days. While the runtime is more complex than Node, the language is very similar to TypeScript owing to its lineage from Anders Hejlsberg. <em>C</em># and .NET in its current form is a great language and platform to build on.<p>Besides, if a team is already using VS Code, GitHub, and TypeScript, <i>they're already in the Microsoft controlled ecosystem</i>.<p><pre><code>    [0] https://spectrum.ieee.org/the-top-programming-languages-2023\n    [1] https://github.com/CharlieDigital/playwright-scrape-api\n    [2] https://github.com/CharlieDigital/js-ts-csharp\n    [3] https://medium.com/servicetitan-engineering/go-vs-<em>c</em>-part-3-<em>compiler</em>-runtime-type-system-modules-and-everything-else-faa423dddb34\n    [4] https://www.techempower.com/benchmarks/#section=data-r21&amp;test=composite&amp;hw=cl\n    [5] https://itnext.io/getting-functional-with-<em>c</em>-6c74bf279616\n    [6] https://arxiv.org/ftp/arxiv/papers/2110/2110.10246.pdf</code></pre>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Why isn\u2019t dotnet core popular among startups?"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://old.reddit.com/r/dotnet/login/"}},"_tags":["comment","author_CharlieDigital","story_37480478"],"author":"CharlieDigital","children":[37488574],"comment_text":"I would just like to understand specific threats or issues with using C# as a language.  I&#x27;ve used it for 20 years at this point without issue and the latest IEEE language survey shows that it remains one of the top languages[0]; I&#x27;m wondering if you have some insight into why .NET and C# are a bad choice for engineering teams that I&#x27;ve somehow overlooked in my 20 years of working with it.<p>It sounds like your argument is &quot;because Microsoft&quot;.<p>If you are using VS Code, GitHub, or TypeScript -- well, <i>all those are also controlled by Microsoft, aren&#x27;t they</i>? Microsoft is the biggest investor in OpenAI and in fact offers their own Azure labeled OpenAI -- are you going to give up on OpenAI because it&#x27;s Microsoft controlled?  React is controlled by Facebook.  Go is controlled by Google.  So what?<p>Why use C#?<p><pre><code>    - It&#x27;s a very small step from TypeScript to C# if a team needs higher throughput on the backend[1][2]\n    - `System.Linq` provides a superset of JS Array methods and is easy to map from one to the other.\n    - It&#x27;s performance is on par or superior to Go[3] and competitive with Rust[4] while being much easier to adopt because of the language similarity to JS and TS.\n    - It is an object-functional hybrid language owing to its influence from F#[5]; discriminated unions are on the roadmap and available today with packages like Dunet and OneOf, it has pattern matching like Rust, extension methods provide flexibility in modelling, named tuples in C# 12 converge even more with TS, it supports destructuring record types and classes, it has immutable record types\n    - Minimal APIs are very familiar for teams using Express but need more performance.  I&#x27;d actually say that it&#x27;s a bit simpler than Express on Node for common use cases since there&#x27;s nothing to import when setting up minimal APIs since it&#x27;s all first-party Microsoft.\n    - Platform support for source generators are a revelation; it removes a lot of boilerplate code while actually improving performance over reflection.\n    - Many of the things teams love about modern JS actually have influence from C#.  Lambda expressions in JavaScript, `async&#x2F;await`, and more.  In fact, C# and JS&#x2F;TS have been converging (see the linked repo).\n    - It&#x27;s relatively easy to write high throughput code in C# with support for both concurrency (Tasks + Channels) and high level abstractions for parallelism (Task Parallel Library) as well as full access to threading.\n    - C# allows easy access to underlying low-level primitives; you can program with high level abstractions for productivity but still have access to call `unsafe` code if needed.\n    - EF Core is possibly the best ORM on the market right now in terms of performance, ease of use, maturity, and database engine support.\n    - A benefit of a language and runtime backed by Microsoft and used in the enterprise is that security issues get addressed by a team of professional engineers; you don&#x27;t see the same types of security issues that pop up in the Node&#x2F;NPM ecosystem.\n    - This is a big boon particularly because of the broad standard libraries and first-party libraries for many use cases.  Rather than importing unknown dependencies for common use cases, you end up with a baseline of professionally maintained, OSS code.\n    - GitHub&#x27;s State of the Octoverse report in 2020[6] showed that C# had the least Dependabot alerts and has the least transitive dependencies (less prone to security issues via package managers).\n    - As a general purpose language, it can be used in many domains from desktop to devices to web to gaming (both Godot and Unity; RyujinX).\n    - It&#x27;s also quite mature and stable while languages like Rust are still ironing out async and Go just released generics.  C# has been there; done that.\n</code></pre>\nMy personal opinion is that C# is the language that most teams want but don&#x27;t know enough about it or have a bad taste from the .NET Framework days. While the runtime is more complex than Node, the language is very similar to TypeScript owing to its lineage from Anders Hejlsberg. C# and .NET in its current form is a great language and platform to build on.<p>Besides, if a team is already using VS Code, GitHub, and TypeScript, <i>they&#x27;re already in the Microsoft controlled ecosystem</i>.<p><pre><code>    [0] https:&#x2F;&#x2F;spectrum.ieee.org&#x2F;the-top-programming-languages-2023\n    [1] https:&#x2F;&#x2F;github.com&#x2F;CharlieDigital&#x2F;playwright-scrape-api\n    [2] https:&#x2F;&#x2F;github.com&#x2F;CharlieDigital&#x2F;js-ts-csharp\n    [3] https:&#x2F;&#x2F;medium.com&#x2F;servicetitan-engineering&#x2F;go-vs-c-part-3-compiler-runtime-type-system-modules-and-everything-else-faa423dddb34\n    [4] https:&#x2F;&#x2F;www.techempower.com&#x2F;benchmarks&#x2F;#section=data-r21&amp;test=composite&amp;hw=cl\n    [5] https:&#x2F;&#x2F;itnext.io&#x2F;getting-functional-with-c-6c74bf279616\n    [6] https:&#x2F;&#x2F;arxiv.org&#x2F;ftp&#x2F;arxiv&#x2F;papers&#x2F;2110&#x2F;2110.10246.pdf</code></pre>","created_at":"2023-09-12T13:46:32Z","created_at_i":1694526392,"objectID":"37481186","parent_id":37480930,"story_id":37480478,"story_title":"Why isn\u2019t dotnet core popular among startups?","story_url":"https://old.reddit.com/r/dotnet/login/","updated_at":"2024-09-20T15:06:42Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"Locke1689"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"<i>You are making four big mistakes:\nFirst you are angry. You are not so much attacking PL/I as attacking me personally.</i><p>Nope. Besides noting that you have very little knowledge in PL research at the end, I made no comments about you personally.<p><i>Second you are pursuing religious arguments about programming languages.</i><p>Nope, I specifically mentioned practical things that matter.<p><i>Third you are arguing things about PL/I that are really not part of the language.</i><p>If you're talking about things like, \"no one knows PL/I,\" so what? This is entirely relevant from an engineering standpoint. Just because it's not \"really part of the language\" is irrelevant because we're not debating whether or not PL/I is better than <em>C</em>/<em>C</em>++ in the 1950s in a perfect world, we're talking about practical engineering <i>right now</i> on <i>real systems.</i><p><i>Fourth much of what you say about PL/I is technically wrong.</i><p>Not a one.<p><i>What PL/I <em>compilers</em> are awful? As far as I know, there aren't very many and the more common ones there are, essentially all from IBM, are highly polished.</i><p>Only if you're using <em>compiler</em> benchmarks from the 90's. I'm looking for things like packrat parsing and partial and incremental linking. Auto SSE/SIMD would be nice. If you're so convinced that IBM PL/I is good enough, why don't you benchmark it against GCC (on Intel ICC often outperforms GCC but I'm confident even GCC will far outperform PL/I).<p><i>That it's my 'favorite' doesn't mean that I suggest that others use it. I used the IBM PL/I on OS/2 a few times; I have the IBM PL/I for Windows but don't even have it installed. On Windows I use Visual Basic .NET, if only because it has such good access to .NET, ADO.NET, and ASP.NET. In many ways, I would prefer PL/I, but it is not a practical option.</i><p>My entire post was about how it's not a practical option and how you shouldn't be surprised when no one wants to use PL/I in production...<p><i>PL/I has some features that were deliberately included to make learning it relatively easy. E.g., PL/I has no reserved words! That is, all the 'key' words in the language can be used by programmers for their own identifier names. So, a beginner doesn't have to worry about using a reserved word. I taught some elementary parts of PL/I to some not very good students in the business school at Georgetown University, and they learned fine.</i><p>This is unimportant. Arguably it's worse than having reserved words because it allows for inadvertent shadowing, but really it's just a back-and-forth thing that no one cares about.<p><i>For 3, the only serious problem with 'type safety' is for pointers. True, in PL/I, pointers do not have 'types' based on what they point to. That is, any pointer can point to anything. But, then, using pointers in PL/I is not nearly as necessary or common as in <em>C</em>/<em>C</em>++, is quite advanced, and is not common. I liked using pointers because can really work with the memory and, at times, write some 'polymorphic' functions. Tricky work with pointers is always tricky, and that the pointers in PL/I are not 'strongly typed' didn't make the work harder. Again, PL/I is not nearly as dependent on pointers as <em>C</em>; a <em>C</em> programmer is forced to used pointers frequently, and PL/I programmer can do fine using pointers only rarely.</i><p>You completely misunderstood -- <em>C</em> and <em>C</em>++ are the standards. If you want people to use something not-standard you need to provide something which is <i>far better</i> in your own language than in the standards in order to compel people to switch. Being a little bit better isn't good enough, you need to be a <i>lot</i> better. Strong typing, garbage collection, and higher-order functions are all things which <i>suck</i> in <em>C</em>/<em>C</em>++. If you want people to adopt your language you should offer full support for these things because that gives you a compelling reason to switch.<p><i>Otherwise on types, PL/I took the attitude...</i><p>Read more about strong typing and read about type or category theory (preferably both). <em>C</em> and Java types are not strong typing, they're typing done in probably the worst possible way. Learn ML.<p><i>Or can do a calculation, enter a Begin-End block and do the automatic allocation inside that block.</i><p>Welcome to RAII, circa 2000.<p><i>To get around the problem, end up using <em>C</em> structures or <em>C</em>++ <em>classes</em>, both of which are much less efficient.</i><p>Only in <em>C</em> or <em>C</em>++ <em>compilers</em> from 1995...<p><i>Actually, can claim that for some years Rexx, with a few extensions for some lower level OS access, basically 'ran' all of IBM: There were about 4000 mainframes around the world connected with simple bisync lines. In the end, it all looked much like the Internet today. So, the mainframes were acting as both the servers and the routers. The hard work of the routing, security, etc. was done with 'server virtual machines' programmed mostly in Rexx with a few routines for some lower level access. It worked surprisingly well. Rexx was no toy.</i><p>It really is. IBM hasn't even come close to building what would be termed a modern distributed system infrastructure. There's no PL/I equivalent for MapReduce, BigTable, GFS, etc.<p><i>A lot of nonsense. On IBM, PL/I used standard OS calling sequences. Calling Fortran, Cobol, assembler, and <em>C</em> was routine. I wrote a collection of routines in PL/I to call <em>C</em> to call the TCP/IP routines. Occasionally I called assembler from PL/I.</i><p>OS calling sequences are the bare-minimum. If I wanted to optimize my Python code by dropping down and rewriting the code in a systems language, <em>C</em> has my back. Good luck with PL/I.<p>You seem to be using a lot of examples from HPC but they're not really relevant. HPC is a pretty easy target because you get to make a lot of assumptions about the DS you're architecting and the software that will be run on it. PL/I is just a dead language -- there's no reason to ever switch to it and while it may have been slightly better than <em>C</em>++ during IBM's heyday, the world has moved on. Even scientific computing prefers <em>parallel</em> Fortran, which ever since the latest version is incredibly fast."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"A note to Google recruiters (and on Google hiring practices)"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://infotrope.net/2011/07/21/a-note-to-google-recruiters/"}},"_tags":["comment","author_Locke1689","story_2800538"],"author":"Locke1689","children":[2806812],"comment_text":"<i>You are making four big mistakes:\nFirst you are angry. You are not so much attacking PL/I as attacking me personally.</i><p>Nope. Besides noting that you have very little knowledge in PL research at the end, I made no comments about you personally.<p><i>Second you are pursuing religious arguments about programming languages.</i><p>Nope, I specifically mentioned practical things that matter.<p><i>Third you are arguing things about PL/I that are really not part of the language.</i><p>If you're talking about things like, \"no one knows PL/I,\" so what? This is entirely relevant from an engineering standpoint. Just because it's not \"really part of the language\" is irrelevant because we're not debating whether or not PL/I is better than C/C++ in the 1950s in a perfect world, we're talking about practical engineering <i>right now</i> on <i>real systems.</i><p><i>Fourth much of what you say about PL/I is technically wrong.</i><p>Not a one.<p><i>What PL/I compilers are awful? As far as I know, there aren't very many and the more common ones there are, essentially all from IBM, are highly polished.</i><p>Only if you're using compiler benchmarks from the 90's. I'm looking for things like packrat parsing and partial and incremental linking. Auto SSE/SIMD would be nice. If you're so convinced that IBM PL/I is good enough, why don't you benchmark it against GCC (on Intel ICC often outperforms GCC but I'm confident even GCC will far outperform PL/I).<p><i>That it's my 'favorite' doesn't mean that I suggest that others use it. I used the IBM PL/I on OS/2 a few times; I have the IBM PL/I for Windows but don't even have it installed. On Windows I use Visual Basic .NET, if only because it has such good access to .NET, ADO.NET, and ASP.NET. In many ways, I would prefer PL/I, but it is not a practical option.</i><p>My entire post was about how it's not a practical option and how you shouldn't be surprised when no one wants to use PL/I in production...<p><i>PL/I has some features that were deliberately included to make learning it relatively easy. E.g., PL/I has no reserved words! That is, all the 'key' words in the language can be used by programmers for their own identifier names. So, a beginner doesn't have to worry about using a reserved word. I taught some elementary parts of PL/I to some not very good students in the business school at Georgetown University, and they learned fine.</i><p>This is unimportant. Arguably it's worse than having reserved words because it allows for inadvertent shadowing, but really it's just a back-and-forth thing that no one cares about.<p><i>For 3, the only serious problem with 'type safety' is for pointers. True, in PL/I, pointers do not have 'types' based on what they point to. That is, any pointer can point to anything. But, then, using pointers in PL/I is not nearly as necessary or common as in C/C++, is quite advanced, and is not common. I liked using pointers because can really work with the memory and, at times, write some 'polymorphic' functions. Tricky work with pointers is always tricky, and that the pointers in PL/I are not 'strongly typed' didn't make the work harder. Again, PL/I is not nearly as dependent on pointers as C; a C programmer is forced to used pointers frequently, and PL/I programmer can do fine using pointers only rarely.</i><p>You completely misunderstood -- C and C++ are the standards. If you want people to use something not-standard you need to provide something which is <i>far better</i> in your own language than in the standards in order to compel people to switch. Being a little bit better isn't good enough, you need to be a <i>lot</i> better. Strong typing, garbage collection, and higher-order functions are all things which <i>suck</i> in C/C++. If you want people to adopt your language you should offer full support for these things because that gives you a compelling reason to switch.<p><i>Otherwise on types, PL/I took the attitude...</i><p>Read more about strong typing and read about type or category theory (preferably both). C and Java types are not strong typing, they're typing done in probably the worst possible way. Learn ML.<p><i>Or can do a calculation, enter a Begin-End block and do the automatic allocation inside that block.</i><p>Welcome to RAII, circa 2000.<p><i>To get around the problem, end up using C structures or C++ classes, both of which are much less efficient.</i><p>Only in C or C++ compilers from 1995...<p><i>Actually, can claim that for some years Rexx, with a few extensions for some lower level OS access, basically 'ran' all of IBM: There were about 4000 mainframes around the world connected with simple bisync lines. In the end, it all looked much like the Internet today. So, the mainframes were acting as both the servers and the routers. The hard work of the routing, security, etc. was done with 'server virtual machines' programmed mostly in Rexx with a few routines for some lower level access. It worked surprisingly well. Rexx was no toy.</i><p>It really is. IBM hasn't even come close to building what would be termed a modern distributed system infrastructure. There's no PL/I equivalent for MapReduce, BigTable, GFS, etc.<p><i>A lot of nonsense. On IBM, PL/I used standard OS calling sequences. Calling Fortran, Cobol, assembler, and C was routine. I wrote a collection of routines in PL/I to call C to call the TCP/IP routines. Occasionally I called assembler from PL/I.</i><p>OS calling sequences are the bare-minimum. If I wanted to optimize my Python code by dropping down and rewriting the code in a systems language, C has my back. Good luck with PL/I.<p>You seem to be using a lot of examples from HPC but they're not really relevant. HPC is a pretty easy target because you get to make a lot of assumptions about the DS you're architecting and the software that will be run on it. PL/I is just a dead language -- there's no reason to ever switch to it and while it may have been slightly better than C++ during IBM's heyday, the world has moved on. Even scientific computing prefers parallel Fortran, which ever since the latest version is incredibly fast.","created_at":"2011-07-25T21:48:10Z","created_at_i":1311630490,"objectID":"2804839","parent_id":2804579,"story_id":2800538,"story_title":"A note to Google recruiters (and on Google hiring practices)","story_url":"http://infotrope.net/2011/07/21/a-note-to-google-recruiters/","updated_at":"2024-09-19T17:49:29Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"pjmlp"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"When I did my degree, we had ISO Pascal and <em>C</em>++ (proper <em>C</em>++ not <em>C</em> with <em>classes</em>) on the 2nd year (1st was a common year to all engineering degrees),<p>Followed by abstract logic, Prolog, Caml Light and Smalltalk on the 3rd.<p>By the 4 year, you would have used Prolog in a couple of <em>parallel</em> assignments that also required it, Lisp via ELisp, as Emacs was the &quot;IDE&quot; for the Prolog and Caml Light assignments and some TAs liked to spend an hour introduction to not using Emacs like Notepad.<p>UNIX systems programming, distributed computing, data structures and algorithms would make use of <em>C</em>, that by virtue of having already learned <em>C</em>++, no teacher would spend a second with an introduction to <em>C</em> lectures.<p>Those of us that took language design and <em>compilers</em>, would still delve into proper Lisp, Cobol, Fortran, Algol, Oberon, and a couple of others even less known. The teacher driving this lectures would switch back to Caml Light for several exercises.<p>Since I ended up graduating as Java came into the scene, the very last year I ended up doing several projects in Java as well, while taking place in the national championship of logic programming.<p>If anything what frustrated me was coming into the market place and having to deal with <em>C</em>, while having been exposed how much better the things could be. Thankfully using it alongside Tcl made it not so bad, given Tcl's lispy background.<p>The problem is not the intro courses, the problem are the teachers and the material been given to the students. It isn't a big deal if there aren't many books available, when there are teaching notes (of book like quality) given by the responsible professor, which one can question at any time unlike most book authors.<p>For me what made the difference weren't the books, rather the teachers I had the luck to meet during my university travel."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Basics of Haskell \u2013 Code and exercises"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/raviksharma/bartosz-basics-of-haskell"}},"_tags":["comment","author_pjmlp","story_23957388"],"author":"pjmlp","comment_text":"When I did my degree, we had ISO Pascal and C++ (proper C++ not C with classes) on the 2nd year (1st was a common year to all engineering degrees),<p>Followed by abstract logic, Prolog, Caml Light and Smalltalk on the 3rd.<p>By the 4 year, you would have used Prolog in a couple of parallel assignments that also required it, Lisp via ELisp, as Emacs was the &quot;IDE&quot; for the Prolog and Caml Light assignments and some TAs liked to spend an hour introduction to not using Emacs like Notepad.<p>UNIX systems programming, distributed computing, data structures and algorithms would make use of C, that by virtue of having already learned C++, no teacher would spend a second with an introduction to C lectures.<p>Those of us that took language design and compilers, would still delve into proper Lisp, Cobol, Fortran, Algol, Oberon, and a couple of others even less known. The teacher driving this lectures would switch back to Caml Light for several exercises.<p>Since I ended up graduating as Java came into the scene, the very last year I ended up doing several projects in Java as well, while taking place in the national championship of logic programming.<p>If anything what frustrated me was coming into the market place and having to deal with C, while having been exposed how much better the things could be. Thankfully using it alongside Tcl made it not so bad, given Tcl&#x27;s lispy background.<p>The problem is not the intro courses, the problem are the teachers and the material been given to the students. It isn&#x27;t a big deal if there aren&#x27;t many books available, when there are teaching notes (of book like quality) given by the responsible professor, which one can question at any time unlike most book authors.<p>For me what made the difference weren&#x27;t the books, rather the teachers I had the luck to meet during my university travel.","created_at":"2020-07-27T04:29:35Z","created_at_i":1595824175,"objectID":"23962242","parent_id":23959363,"story_id":23957388,"story_title":"Basics of Haskell \u2013 Code and exercises","story_url":"https://github.com/raviksharma/bartosz-basics-of-haskell","updated_at":"2024-09-20T06:38:24Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"jlokier"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"On the Jaguar, I was employed to write a custom engine for a 3d fighting and exploring game with some unusual art: <a href=\"https://en.wikipedia.org/wiki/Legions_of_the_Undead\" rel=\"nofollow\">https://en.wikipedia.org/wiki/Legions_of_the_Undead</a><p>My approach to squeezing the most out of the Jaguar was to start by getting a fairly complex fused tiled-polygon-and-texture rendering algorithm working on the 68000 first, written mostly in <em>C</em>++ for GCC, with some of the <em>classes</em> generated in Lisp.<p>To get all the geometry and other details right and focused on feeding calls to a texture-scan-line inner loop.<p>Then to switch the inner part to a fast, asynchronous command pipe, pushing commands to the GPU/blitter et al. which would read and execute those as fast as possible.  And then as needed optimise any bottlenecks on the 68000 using assembly.<p>The idea was to keep the GPU/blitter as busy as possible filling pixels from simple texture-line commands, with minimal logic to fetch and setup each new blit (i.e. no higher level geometry calculations during which the texturing would be idle), while the 68000 ran in <em>parallel</em> generating those commands and doing the higher level geometry, which was quite complex in our game.<p>I got everything running just right on the 68000 for a nice demo, with the graphics and maps we had ready by then.  It was visually perfect, and play speed was just about usable but not <i>smooth</i> like we were aiming for.<p>Unfortunately perhaps, that's when Atari called my boss in to do a milestone demo, so that version was shown.<p>When my boss returned, I was told whichever Tramiel was head of Atari at the time was &quot;angry&quot; as the game looked &quot;too slow&quot;, and the project was cancelled. :-(<p>Just as I was getting the GPU/blitter accelerated mode working, which was projected to be 2 weeks work (since everything up to that point had been aimed at this).<p>I never did get to complete or show off the fast version.  So close!<p>Atari was in trouble and collapsed very soon after, so maybe that wasn't the real reason.<p>We then started moving the project to the Fujitsu FM Towns: <a href=\"https://en.wikipedia.org/wiki/FM_Towns\" rel=\"nofollow\">https://en.wikipedia.org/wiki/FM_Towns</a><p>And then the PC using DJGPP.<p>The geometry, texturing and physics systems could be moved over because they were mostly GCC-compatible <em>C</em>++.  (At the time different <em>C</em>++ <em>compilers</em> accepted different dialects.)<p>But all the effort around optimising the engine around pushing pixels as fast as possible out of the Jaguar's hardware subsystems had to be abandoned.<p>Fortunately the pipeline architecture translated quite well to x86 texturing, first using awesome integer register tricks (very few registers on x86, but because you could address individual bytes and words inside dword registers you could &quot;vectorise&quot; some of the texturing and address arithmetic); later the FPU became faster.<p>This was in the days of Doom, Quake and Descent, when extremely hand-optimised assembly software rendering was normal on PCs, and consoles had very strange &quot;not quite right for 3D&quot; blitters.  (Ask about the Sega Saturn sometime.)  GPUs as we now know them were just starting to be created for PCs, and Microsoft launched DirectX a year or so later.<p>--<p>The Jaguar's CRY colour space was not great.  We had a very large graphics asset pipeline at the time, derived from hundreds or thousands of photos of real physical models made by the artists (a very different look than drawing), and all of it had to be scaled, alpha-clipped and quantized into CRY, which was not kind to the colours.  Adequate, but not great use of the colour bits available.<p>Somewhere I'm pretty sure I still have a &quot;pnmtocry&quot; executable in Linux a.out format :-)"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The Polygons of Another World: Atari Jaguar"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://fabiensanglard.net/another_world_polygons_Jaguar/index.html"}},"_tags":["comment","author_jlokier","story_22569641"],"author":"jlokier","children":[22573883,22575306,22575925],"comment_text":"On the Jaguar, I was employed to write a custom engine for a 3d fighting and exploring game with some unusual art: <a href=\"https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Legions_of_the_Undead\" rel=\"nofollow\">https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Legions_of_the_Undead</a><p>My approach to squeezing the most out of the Jaguar was to start by getting a fairly complex fused tiled-polygon-and-texture rendering algorithm working on the 68000 first, written mostly in C++ for GCC, with some of the classes generated in Lisp.<p>To get all the geometry and other details right and focused on feeding calls to a texture-scan-line inner loop.<p>Then to switch the inner part to a fast, asynchronous command pipe, pushing commands to the GPU&#x2F;blitter et al. which would read and execute those as fast as possible.  And then as needed optimise any bottlenecks on the 68000 using assembly.<p>The idea was to keep the GPU&#x2F;blitter as busy as possible filling pixels from simple texture-line commands, with minimal logic to fetch and setup each new blit (i.e. no higher level geometry calculations during which the texturing would be idle), while the 68000 ran in parallel generating those commands and doing the higher level geometry, which was quite complex in our game.<p>I got everything running just right on the 68000 for a nice demo, with the graphics and maps we had ready by then.  It was visually perfect, and play speed was just about usable but not <i>smooth</i> like we were aiming for.<p>Unfortunately perhaps, that&#x27;s when Atari called my boss in to do a milestone demo, so that version was shown.<p>When my boss returned, I was told whichever Tramiel was head of Atari at the time was &quot;angry&quot; as the game looked &quot;too slow&quot;, and the project was cancelled. :-(<p>Just as I was getting the GPU&#x2F;blitter accelerated mode working, which was projected to be 2 weeks work (since everything up to that point had been aimed at this).<p>I never did get to complete or show off the fast version.  So close!<p>Atari was in trouble and collapsed very soon after, so maybe that wasn&#x27;t the real reason.<p>We then started moving the project to the Fujitsu FM Towns: <a href=\"https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;FM_Towns\" rel=\"nofollow\">https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;FM_Towns</a><p>And then the PC using DJGPP.<p>The geometry, texturing and physics systems could be moved over because they were mostly GCC-compatible C++.  (At the time different C++ compilers accepted different dialects.)<p>But all the effort around optimising the engine around pushing pixels as fast as possible out of the Jaguar&#x27;s hardware subsystems had to be abandoned.<p>Fortunately the pipeline architecture translated quite well to x86 texturing, first using awesome integer register tricks (very few registers on x86, but because you could address individual bytes and words inside dword registers you could &quot;vectorise&quot; some of the texturing and address arithmetic); later the FPU became faster.<p>This was in the days of Doom, Quake and Descent, when extremely hand-optimised assembly software rendering was normal on PCs, and consoles had very strange &quot;not quite right for 3D&quot; blitters.  (Ask about the Sega Saturn sometime.)  GPUs as we now know them were just starting to be created for PCs, and Microsoft launched DirectX a year or so later.<p>--<p>The Jaguar&#x27;s CRY colour space was not great.  We had a very large graphics asset pipeline at the time, derived from hundreds or thousands of photos of real physical models made by the artists (a very different look than drawing), and all of it had to be scaled, alpha-clipped and quantized into CRY, which was not kind to the colours.  Adequate, but not great use of the colour bits available.<p>Somewhere I&#x27;m pretty sure I still have a &quot;pnmtocry&quot; executable in Linux a.out format :-)","created_at":"2020-03-14T04:38:28Z","created_at_i":1584160708,"objectID":"22573231","parent_id":22569641,"story_id":22569641,"story_title":"The Polygons of Another World: Atari Jaguar","story_url":"http://fabiensanglard.net/another_world_polygons_Jaguar/index.html","updated_at":"2024-09-20T05:54:01Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"Yttrill"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"As a whole program analyser, Felix does a lot of optimisations. The most important one is inlining. Felix pretty much inlines everything :)<p>When a function is inlined, there are two things you can do with the arguments: assign them to variables representing the parameters (eager evaluation) or just replace the parameters in the code with the arguments (lazy evaluation).<p>Substitution doesn't just apply to functions: a sequence of straight line code with assignments can be converted into an expression by replacing occurrences of the variables with the initialising expressions.<p>For a small number of uses, substitution is the usually the most efficient. For many uses, lifting the common expressions to a variable is more efficient. If we're dealing with a function (in <em>C</em>++ the model is a class) for which a closure is formed (in <em>C</em>++ the model is an object of the class) lazy evaluation is very expensive because the argument itself must be wrapped in an object to delay evaluation.<p>By default, Felix val's and function arguments use indeterminate evaluation semantics, meaning the <em>compiler</em> gets to choose the strategy. This leads to high performance, but it also means we need a way to enforce a particular strategy: for example vars and var parameters always trigger eager evaluation. This leads to some complication in the language.<p>Felix also does other optimisations, for example it does the usual self-tail call optimisation. This one works best if you do inlining at the right point to convert a non-self tail call (which cannot be represented for functions in <em>C</em>) into a self-tail call (which is replaced by a goto).<p>Felix also does <em>parallel</em> assignment optimisation.<p>It ensures type-<em>classes</em> have zero cost (unlike Haskell which, by supporting separate compilation, may have to pass dictionaries around).<p>There is quite a lot more: eliminating useless variables, functions, unused arguments, etc. There are even user specified optimisations based on semantics, such as<p><pre><code>  reduce idem[T]  (x:list[T]) : list[T] = x.rev.rev => x;\n</code></pre>\nwhich says reversing a list twice leaves the original list, so just get rid of these two calls.<p>Actually one important aspect to the optimisation process: by default a function is a <em>C</em>++ class with an apply() method. This allows forming a closure (object). The object is usually allocated on the heap. However Felix \"knows\" when it can get away with allocating such an object on the machine stack instead (saving a malloc and garbage collection). Furthermore, Felix \"knows\" when it can get away with a plain old <em>C</em> function, and generates one of those instead if it can. And all of that occurs only if the function wasn't entirely eliminated by inlining all the calls.<p>So although you should think of Felix functions and procedures as objects of <em>C</em>++ <em>classes</em> allocated on the heap and garbage collected, any significant program implemented with this model without optimisations would just drop dead."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Felix - a fast scripting language"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://felix-lang.org"}},"_tags":["comment","author_Yttrill","story_5007674"],"author":"Yttrill","children":[5015488],"comment_text":"As a whole program analyser, Felix does a lot of optimisations. The most important one is inlining. Felix pretty much inlines everything :)<p>When a function is inlined, there are two things you can do with the arguments: assign them to variables representing the parameters (eager evaluation) or just replace the parameters in the code with the arguments (lazy evaluation).<p>Substitution doesn't just apply to functions: a sequence of straight line code with assignments can be converted into an expression by replacing occurrences of the variables with the initialising expressions.<p>For a small number of uses, substitution is the usually the most efficient. For many uses, lifting the common expressions to a variable is more efficient. If we're dealing with a function (in C++ the model is a class) for which a closure is formed (in C++ the model is an object of the class) lazy evaluation is very expensive because the argument itself must be wrapped in an object to delay evaluation.<p>By default, Felix val's and function arguments use indeterminate evaluation semantics, meaning the compiler gets to choose the strategy. This leads to high performance, but it also means we need a way to enforce a particular strategy: for example vars and var parameters always trigger eager evaluation. This leads to some complication in the language.<p>Felix also does other optimisations, for example it does the usual self-tail call optimisation. This one works best if you do inlining at the right point to convert a non-self tail call (which cannot be represented for functions in C) into a self-tail call (which is replaced by a goto).<p>Felix also does parallel assignment optimisation.<p>It ensures type-classes have zero cost (unlike Haskell which, by supporting separate compilation, may have to pass dictionaries around).<p>There is quite a lot more: eliminating useless variables, functions, unused arguments, etc. There are even user specified optimisations based on semantics, such as<p><pre><code>  reduce idem[T]  (x:list[T]) : list[T] = x.rev.rev =&#62; x;\n</code></pre>\nwhich says reversing a list twice leaves the original list, so just get rid of these two calls.<p>Actually one important aspect to the optimisation process: by default a function is a C++ class with an apply() method. This allows forming a closure (object). The object is usually allocated on the heap. However Felix \"knows\" when it can get away with allocating such an object on the machine stack instead (saving a malloc and garbage collection). Furthermore, Felix \"knows\" when it can get away with a plain old C function, and generates one of those instead if it can. And all of that occurs only if the function wasn't entirely eliminated by inlining all the calls.<p>So although you should think of Felix functions and procedures as objects of C++ classes allocated on the heap and garbage collected, any significant program implemented with this model without optimisations would just drop dead.","created_at":"2013-01-05T08:43:39Z","created_at_i":1357375419,"objectID":"5012102","parent_id":5008796,"story_id":5007674,"story_title":"Felix - a fast scripting language","story_url":"http://felix-lang.org","updated_at":"2025-05-16T07:20:48Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"syspec"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"From the readme:<p><em>Parallel</em>-hashmap or GTL?<p>The observant among us may have noticed that I have two github repos, <em>parallel</em>-hashmap and gtl, which both provide very similar functionality. Indeed the hash tables in both are equivalent and the code mostly the same. The main difference is that <em>parallel</em>-hashmap only requires a <em>C</em>++11 <em>compiler</em>, while gtl requires a <em>C</em>++20 <em>compiler</em>.<p>My recommendation would be to use gtl if you are compiling with <em>C</em>++20 or higher, and <em>parallel</em>-hashmap otherwise. While the included hash maps are equivalent, gtl is where new development occurs, and it will include useful new <em>classes</em>."},"story_title":{"fullyHighlighted":false,"matchLevel":"partial","matchedWords":["parallel"],"value":"<em>Parallel</em>-hashmap: drop-in replacement for unordered_map, unordered_set"},"story_url":{"fullyHighlighted":false,"matchLevel":"partial","matchedWords":["parallel"],"value":"https://github.com/greg7mdp/<em>parallel</em>-hashmap"}},"_tags":["comment","author_syspec","story_42603199"],"author":"syspec","comment_text":"From the readme:<p>Parallel-hashmap or GTL?<p>The observant among us may have noticed that I have two github repos, parallel-hashmap and gtl, which both provide very similar functionality. Indeed the hash tables in both are equivalent and the code mostly the same. The main difference is that parallel-hashmap only requires a C++11 compiler, while gtl requires a C++20 compiler.<p>My recommendation would be to use gtl if you are compiling with C++20 or higher, and parallel-hashmap otherwise. While the included hash maps are equivalent, gtl is where new development occurs, and it will include useful new classes.","created_at":"2025-01-07T09:07:16Z","created_at_i":1736240836,"objectID":"42620696","parent_id":42603199,"story_id":42603199,"story_title":"Parallel-hashmap: drop-in replacement for unordered_map, unordered_set","story_url":"https://github.com/greg7mdp/parallel-hashmap","updated_at":"2025-01-08T12:53:59Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"pcwalton"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"&gt; I wonder have they fixed the performance? <a href=\"https://www.reddit.com/r/rust/comments/bto10h/update_a_scali\" rel=\"nofollow\">https://www.reddit.com/r/rust/comments/bto10h/update_a_scali</a>...<p>The comments point out a whole bunch of problems with that data. A better example would be <a href=\"https://parallel-rust-cpp.github.io/introduction.html\" rel=\"nofollow\">https://<em>parallel</em>-rust-cpp.github.io/introduction.html</a> which shows them as quite comparable, depending on the <em>compiler</em>.<p>&gt; In <em>C</em>++ I\u2019d usually use Eigen, because these expression templates are saving memory allocations and bandwidth storing/reloading temporary matrices. Sometimes much faster than BLAS libraries with <em>C</em> API. I\u2019m not sure Rust has an equivalent.<p>That equivalent would be ndarray.<p>&gt; For some applications of graphs and trees it\u2019s useful to have nodes polymorphic. An example is a visual tree in GUI: different nodes are instances of different <em>classes</em>. Array elements are of the same type.<p>And in that case you can use Box (or Rc/Arc).<p>&gt; Even when the elements are 8 bytes so the indexing can be merged, you need to either spend a register for the base address, or load it from memory with another instruction.<p>I've never seen this be a performance problem in practice; the cost of doing a shift and add is incredibly low compared to the cost of actually fetching the memory.<p>&gt; It\u2019s relatively expensive to split or merge linked lists/trees/graphs stored that way. If the tree/graph is long lived, mutable, and changes a lot, eventually you might need to compact or even garbage collect these arrays.<p>Which is the same thing modern thread-caching mallocs also have to do, except that compacting and garbage collecting is actually <i>possible</i> with the arena approach (not that I think it's terribly important either way)."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Scan HTML faster with SIMD instructions \u2013 Chrome edition"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://lemire.me/blog/2024/06/08/scan-html-faster-with-simd-instructions-chrome-edition/"}},"_tags":["comment","author_pcwalton","story_40644562"],"author":"pcwalton","children":[40679475],"comment_text":"&gt; I wonder have they fixed the performance? <a href=\"https:&#x2F;&#x2F;www.reddit.com&#x2F;r&#x2F;rust&#x2F;comments&#x2F;bto10h&#x2F;update_a_scali\" rel=\"nofollow\">https:&#x2F;&#x2F;www.reddit.com&#x2F;r&#x2F;rust&#x2F;comments&#x2F;bto10h&#x2F;update_a_scali</a>...<p>The comments point out a whole bunch of problems with that data. A better example would be <a href=\"https:&#x2F;&#x2F;parallel-rust-cpp.github.io&#x2F;introduction.html\" rel=\"nofollow\">https:&#x2F;&#x2F;parallel-rust-cpp.github.io&#x2F;introduction.html</a> which shows them as quite comparable, depending on the compiler.<p>&gt; In C++ I\u2019d usually use Eigen, because these expression templates are saving memory allocations and bandwidth storing&#x2F;reloading temporary matrices. Sometimes much faster than BLAS libraries with C API. I\u2019m not sure Rust has an equivalent.<p>That equivalent would be ndarray.<p>&gt; For some applications of graphs and trees it\u2019s useful to have nodes polymorphic. An example is a visual tree in GUI: different nodes are instances of different classes. Array elements are of the same type.<p>And in that case you can use Box (or Rc&#x2F;Arc).<p>&gt; Even when the elements are 8 bytes so the indexing can be merged, you need to either spend a register for the base address, or load it from memory with another instruction.<p>I&#x27;ve never seen this be a performance problem in practice; the cost of doing a shift and add is incredibly low compared to the cost of actually fetching the memory.<p>&gt; It\u2019s relatively expensive to split or merge linked lists&#x2F;trees&#x2F;graphs stored that way. If the tree&#x2F;graph is long lived, mutable, and changes a lot, eventually you might need to compact or even garbage collect these arrays.<p>Which is the same thing modern thread-caching mallocs also have to do, except that compacting and garbage collecting is actually <i>possible</i> with the arena approach (not that I think it&#x27;s terribly important either way).","created_at":"2024-06-14T02:35:13Z","created_at_i":1718332513,"objectID":"40677043","parent_id":40676647,"story_id":40644562,"story_title":"Scan HTML faster with SIMD instructions \u2013 Chrome edition","story_url":"https://lemire.me/blog/2024/06/08/scan-html-faster-with-simd-instructions-chrome-edition/","updated_at":"2024-09-20T17:18:04Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"lpage"},"story_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["parallel","claudes","c","compiler"],"value":"Hi HN\u2014we're Kelly and Steve, co-founders of OneChronos (<a href=\"https://www.onechronos.com\" rel=\"nofollow\">https://www.onechronos.com</a>). OneChronos is a &quot;Smart Market&quot; for US equities\u2014meaning we match counterparties using mathematical optimization instead of classical human auctioneer mechanics [1]. Our flavor of Smart Market\u2014combinatorial auctions\u2014lets users enter orders spanning multiple securities and specify matching preferences way beyond just price and quantity.<p>We didn't invent Smart Markets or combinatorial auctions. Roughly $1T/year flows through them in industries ranging from display advertising to telecommunications. The underlying theory was the subject of the 2020 Nobel Prize in Economic Sciences [2]. We're bringing them to capital markets, and we have both the customers and the regulatory clearance to do so. Our initial user base contains the household names cumulatively responsible for \u224870% of US equities trading volume.<p>Today's market structure costs institutional investors at least a trillion dollars annually. We'll go into the details below, but the big thing to understand is that mutual/pension/sovereign funds, 401K plans, and ETF managers pay the price, and ultimately it gets passed on to households. Given diverse investment time horizons and risk preferences, capital markets are not a zero-sum game, but the existing market structure makes it one. Any form of market friction that prevents mutually beneficial trades from happening is an economic loss. Our goal is to make a lot more mutually beneficial trades happen.<p>We started working on OneChronos as experienced traders and auction theorists. Even so, getting here has taken five years of iterating with customers, tackling two deep tech problems, and working through an involved regulatory process. We'll describe what's causing existing market friction, the solution, and why that solution is a significant technical lift.<p>When people hear about market friction and hidden costs, they usually think about low latency technology, market data, exchange fees, and predatory HFT practices. Those are significant, and yet they are rounding errors compared to others. The principal sources of market friction that we're attacking are bidders' inability to express economic complements (things that are worth more together than separately), substitutes (things with diminishing marginal utility that are replacements for each other) and non-price factors, and game-theoretic incentives against bidding &quot;truthfully&quot;\u2014that is, against specifying how many units of a good you have and the highest price at which you'd buy or the lowest at which you'd sell them (your supply and demand curve). The most commonly proposed market structure &quot;fixes,&quot; like single good periodic batch auctions and the IEX speed bump, don't address any of these.<p>Imagine that a buyer values two goods A and B at $10 for the package, but only $4 for each individually since they're complements. Similarly, a seller might unload the package for $8 while demanding $5 for each good individually. Both agents have &quot;exposure risk&quot; if A and B are bought and sold separately\u2014they might get stuck with an incomplete package. No trade happens if the risk is high enough (buy at $4, sell at $5, no cross). But if they can trade the package atomically, there's a mutual win of $2 in gains from trade. Similar missed opportunities happen if agents only want A XOR B or have different prices for different counterparties (price discrimination). This game of imperfect information and missed opportunities plays out every day in capital markets globally.<p>The straightforward solution to these problems is called &quot;Expressive Bidding&quot;\u2014the ability to communicate parametric bids to the auctioneer, e.g., buy at most one of {$10 for A and B, $4 for A, $4 for B} or sell at most two units of A, pricing it at $10 for counterparty <em>C</em>_1, $9 for <em>C</em>_2, or $8 for <em>C</em>_3. Given everyone's Expressive Bid and a well-chosen objective function, the auctioneer uses constrained optimization to clear the market and unlock efficiencies. Awesome. So why didn't this happen when markets first started going electronic?<p>General combinatorial auctions are isomorphic to weighted set packing. Clearing them is an NP-complete optimization problem. Finding feasible and near-optimal solutions at the speed and scale of capital markets is deep tech problem #1. Furthermore, bidding in combinatorial auctions can be challenging in both a computational and UX sense. Making it easy is deep tech problem #2.<p>We tackle problem #1 similarly to how game AI like AlphaZero and optimizers like AlphaFold work. The combination of deep learning, heuristics, and classical AI search techniques is powerful, and applying them to combinatorial auctions in novel ways is a core part of our IP. Problem #2 involves the magic of formal methods. Expressive Bidding users submit snippets of code (a functionally pure subset of OCaml/ReasonML) called a Proxy Bidder. These proxies are essentially functions mapping &quot;proposals&quot; (allocations of goods) to prices, e.g., f({2A, -B}) \u2192 -5, meaning that the bidder wants $5 for buying two units of A and selling one unit of B. Using formal methods, we turn Proxy Bidders into Expressive Bids that our optimizers can understand. You can see what that looks like here [3]. This approach is dead simple for end users, but it took years of collaborative R&amp;D with our friends and formal methods legends at Imandra [4] to enable.<p>Not everyone needs to write or use Expressive Bids. For common use cases, we're offering pre-canned/forkable Expressive Bids for things like pairs trades and factor neutral portfolios. That aside, users who don't use Expressive Bidding still benefit from those who use it and create unique liquidity that doesn't exist on other trading venues. Our economic mechanism prevents &quot;dark forest&quot; scenarios in which Expressive Bidding has adversarial uses that detract from overall match quality. &quot;Power users&quot; can only benefit those who treat us like a vanilla trading venue\u2014and each other.<p>We make money by charging a small commission in line with other venues ($0.0009) on each share traded. Longer-term, we're excited about a pricing model that balances computational resources used against liquidity contributed and compensates OneChronos based on how much value we add. Specifically, we'll measure how much notional dollar price improvement we generate for the market beyond what's generated by a &quot;vanilla&quot; double auction that we run in <em>parallel</em> (a neat trick enabled by Expressive Bidding\u2013we can run an arbitrary number of auctions with different rulesets in <em>parallel</em> to measure relative performance). This approach aligns our incentives with our customers and eliminates fixed costs (which cause market friction) from trading.<p>Only FINRA registered broker-dealers connect to OneChronos directly. If you work at one, and you're not yet a subscriber, please get in touch. We love talking to both subscribers and their customers, and we'd love to hear from institutional investors looking to leverage OneChronos through their existing broker algo and DMA workflows. Retail customers will eventually access us through brokers that choose to allow it (PFOF is its own thing). In the meantime, stay tuned for other more decentralized asset <em>classes</em> :) You can reach us at info (at) onechronos.com.<p>And we're hiring! If you're passionate about deeply technical problems ranging from mechanism design to applying ML to combinatorial optimization to writing <em>compilers</em> and engineering sophisticated distributed systems to HFT tolerances, get in touch \u2014 careers (at) onechronos.com.<p>Steve and I will be online today and would love to talk about our technical challenges, auctions/mechanism design, market structure, and the future of OneChronos.<p>[1] <a href=\"https://en.wikipedia.org/wiki/Smart_market\" rel=\"nofollow\">https://en.wikipedia.org/wiki/Smart_market</a><p>[2] <a href=\"https://news.stanford.edu/2020/11/19/bid-picture-nobel-prize-winners-explain-auction-theory-collaboration/\" rel=\"nofollow\">https://news.stanford.edu/2020/11/19/bid-picture-nobel-prize...</a> - Paul Milgrom, one of the laureates, is the Chair of OneChronos Labs, our research arm.<p>[3] <a href=\"https://www.onechronos.com/docs/expressive/bidding-guide/#intro-to-bidder-logic\" rel=\"nofollow\">https://www.onechronos.com/docs/expressive/bidding-guide/#in...</a><p>[4] <a href=\"https://www.imandra.ai/\" rel=\"nofollow\">https://www.imandra.ai/</a>"},"title":{"matchLevel":"none","matchedWords":[],"value":"Launch HN: OneChronos (YC S16) \u2013 Combinatorial auctions market for US equities"}},"_tags":["story","author_lpage","story_30247159","launch_hn"],"author":"lpage","children":[30247296,30247364,30247696,30247919,30247936,30247994,30248135,30248706,30249030,30249058,30249229,30249230,30249360,30249642,30249947,30250057,30250120,30250219,30250260,30250312,30250330,30250964,30250987,30251215,30252407,30253453,30253586,30254530,30254532,30254883,30256171,30256842,30257145,30258292,30263078,30266480,30268479],"created_at":"2022-02-07T16:36:09Z","created_at_i":1644251769,"num_comments":118,"objectID":"30247159","points":231,"story_id":30247159,"story_text":"Hi HN\u2014we&#x27;re Kelly and Steve, co-founders of OneChronos (<a href=\"https:&#x2F;&#x2F;www.onechronos.com\" rel=\"nofollow\">https:&#x2F;&#x2F;www.onechronos.com</a>). OneChronos is a &quot;Smart Market&quot; for US equities\u2014meaning we match counterparties using mathematical optimization instead of classical human auctioneer mechanics [1]. Our flavor of Smart Market\u2014combinatorial auctions\u2014lets users enter orders spanning multiple securities and specify matching preferences way beyond just price and quantity.<p>We didn&#x27;t invent Smart Markets or combinatorial auctions. Roughly $1T&#x2F;year flows through them in industries ranging from display advertising to telecommunications. The underlying theory was the subject of the 2020 Nobel Prize in Economic Sciences [2]. We&#x27;re bringing them to capital markets, and we have both the customers and the regulatory clearance to do so. Our initial user base contains the household names cumulatively responsible for \u224870% of US equities trading volume.<p>Today&#x27;s market structure costs institutional investors at least a trillion dollars annually. We&#x27;ll go into the details below, but the big thing to understand is that mutual&#x2F;pension&#x2F;sovereign funds, 401K plans, and ETF managers pay the price, and ultimately it gets passed on to households. Given diverse investment time horizons and risk preferences, capital markets are not a zero-sum game, but the existing market structure makes it one. Any form of market friction that prevents mutually beneficial trades from happening is an economic loss. Our goal is to make a lot more mutually beneficial trades happen.<p>We started working on OneChronos as experienced traders and auction theorists. Even so, getting here has taken five years of iterating with customers, tackling two deep tech problems, and working through an involved regulatory process. We&#x27;ll describe what&#x27;s causing existing market friction, the solution, and why that solution is a significant technical lift.<p>When people hear about market friction and hidden costs, they usually think about low latency technology, market data, exchange fees, and predatory HFT practices. Those are significant, and yet they are rounding errors compared to others. The principal sources of market friction that we&#x27;re attacking are bidders&#x27; inability to express economic complements (things that are worth more together than separately), substitutes (things with diminishing marginal utility that are replacements for each other) and non-price factors, and game-theoretic incentives against bidding &quot;truthfully&quot;\u2014that is, against specifying how many units of a good you have and the highest price at which you&#x27;d buy or the lowest at which you&#x27;d sell them (your supply and demand curve). The most commonly proposed market structure &quot;fixes,&quot; like single good periodic batch auctions and the IEX speed bump, don&#x27;t address any of these.<p>Imagine that a buyer values two goods A and B at $10 for the package, but only $4 for each individually since they&#x27;re complements. Similarly, a seller might unload the package for $8 while demanding $5 for each good individually. Both agents have &quot;exposure risk&quot; if A and B are bought and sold separately\u2014they might get stuck with an incomplete package. No trade happens if the risk is high enough (buy at $4, sell at $5, no cross). But if they can trade the package atomically, there&#x27;s a mutual win of $2 in gains from trade. Similar missed opportunities happen if agents only want A XOR B or have different prices for different counterparties (price discrimination). This game of imperfect information and missed opportunities plays out every day in capital markets globally.<p>The straightforward solution to these problems is called &quot;Expressive Bidding&quot;\u2014the ability to communicate parametric bids to the auctioneer, e.g., buy at most one of {$10 for A and B, $4 for A, $4 for B} or sell at most two units of A, pricing it at $10 for counterparty C_1, $9 for C_2, or $8 for C_3. Given everyone&#x27;s Expressive Bid and a well-chosen objective function, the auctioneer uses constrained optimization to clear the market and unlock efficiencies. Awesome. So why didn&#x27;t this happen when markets first started going electronic?<p>General combinatorial auctions are isomorphic to weighted set packing. Clearing them is an NP-complete optimization problem. Finding feasible and near-optimal solutions at the speed and scale of capital markets is deep tech problem #1. Furthermore, bidding in combinatorial auctions can be challenging in both a computational and UX sense. Making it easy is deep tech problem #2.<p>We tackle problem #1 similarly to how game AI like AlphaZero and optimizers like AlphaFold work. The combination of deep learning, heuristics, and classical AI search techniques is powerful, and applying them to combinatorial auctions in novel ways is a core part of our IP. Problem #2 involves the magic of formal methods. Expressive Bidding users submit snippets of code (a functionally pure subset of OCaml&#x2F;ReasonML) called a Proxy Bidder. These proxies are essentially functions mapping &quot;proposals&quot; (allocations of goods) to prices, e.g., f({2A, -B}) \u2192 -5, meaning that the bidder wants $5 for buying two units of A and selling one unit of B. Using formal methods, we turn Proxy Bidders into Expressive Bids that our optimizers can understand. You can see what that looks like here [3]. This approach is dead simple for end users, but it took years of collaborative R&amp;D with our friends and formal methods legends at Imandra [4] to enable.<p>Not everyone needs to write or use Expressive Bids. For common use cases, we&#x27;re offering pre-canned&#x2F;forkable Expressive Bids for things like pairs trades and factor neutral portfolios. That aside, users who don&#x27;t use Expressive Bidding still benefit from those who use it and create unique liquidity that doesn&#x27;t exist on other trading venues. Our economic mechanism prevents &quot;dark forest&quot; scenarios in which Expressive Bidding has adversarial uses that detract from overall match quality. &quot;Power users&quot; can only benefit those who treat us like a vanilla trading venue\u2014and each other.<p>We make money by charging a small commission in line with other venues ($0.0009) on each share traded. Longer-term, we&#x27;re excited about a pricing model that balances computational resources used against liquidity contributed and compensates OneChronos based on how much value we add. Specifically, we&#x27;ll measure how much notional dollar price improvement we generate for the market beyond what&#x27;s generated by a &quot;vanilla&quot; double auction that we run in parallel (a neat trick enabled by Expressive Bidding\u2013we can run an arbitrary number of auctions with different rulesets in parallel to measure relative performance). This approach aligns our incentives with our customers and eliminates fixed costs (which cause market friction) from trading.<p>Only FINRA registered broker-dealers connect to OneChronos directly. If you work at one, and you&#x27;re not yet a subscriber, please get in touch. We love talking to both subscribers and their customers, and we&#x27;d love to hear from institutional investors looking to leverage OneChronos through their existing broker algo and DMA workflows. Retail customers will eventually access us through brokers that choose to allow it (PFOF is its own thing). In the meantime, stay tuned for other more decentralized asset classes :) You can reach us at info (at) onechronos.com.<p>And we&#x27;re hiring! If you&#x27;re passionate about deeply technical problems ranging from mechanism design to applying ML to combinatorial optimization to writing compilers and engineering sophisticated distributed systems to HFT tolerances, get in touch \u2014 careers (at) onechronos.com.<p>Steve and I will be online today and would love to talk about our technical challenges, auctions&#x2F;mechanism design, market structure, and the future of OneChronos.<p>[1] <a href=\"https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Smart_market\" rel=\"nofollow\">https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Smart_market</a><p>[2] <a href=\"https:&#x2F;&#x2F;news.stanford.edu&#x2F;2020&#x2F;11&#x2F;19&#x2F;bid-picture-nobel-prize-winners-explain-auction-theory-collaboration&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;news.stanford.edu&#x2F;2020&#x2F;11&#x2F;19&#x2F;bid-picture-nobel-prize...</a> - Paul Milgrom, one of the laureates, is the Chair of OneChronos Labs, our research arm.<p>[3] <a href=\"https:&#x2F;&#x2F;www.onechronos.com&#x2F;docs&#x2F;expressive&#x2F;bidding-guide&#x2F;#intro-to-bidder-logic\" rel=\"nofollow\">https:&#x2F;&#x2F;www.onechronos.com&#x2F;docs&#x2F;expressive&#x2F;bidding-guide&#x2F;#in...</a><p>[4] <a href=\"https:&#x2F;&#x2F;www.imandra.ai&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;www.imandra.ai&#x2F;</a>","title":"Launch HN: OneChronos (YC S16) \u2013 Combinatorial auctions market for US equities","updated_at":"2026-03-26T15:10:49Z"}],"hitsPerPage":20,"nbHits":55,"nbPages":3,"page":0,"params":"query=parallel+Claudes+C+compiler&advancedSyntax=true&analyticsTags=backend","processingTimeMS":36,"processingTimingsMS":{"_request":{"queue":42,"roundTrip":17},"afterFetch":{"format":{"highlighting":5,"total":5},"merge":{"mergeLoop":{"prepareNextHit":10,"total":10},"total":10},"total":10},"fetch":{"query":13,"scanning":11,"total":25},"total":36},"query":"parallel Claudes C compiler","serverTimeMS":84}
