Difference between revisions of "Computing"

From Things and Stuff Wiki
Jump to navigation Jump to search
 
(122 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
{{menu}}
 
{{menu}}
 +
 +
== General ==
 +
See also '''[[Maths#Computation]]''', [[Computer]], [[Emulation]], [[Virtualisation]], [[Data]], [[*nix]], [[Maths#Types]]
 +
  
 
to very much further sort and understand.
 
to very much further sort and understand.
  
== General ==
 
See also [[Computer#Emulation]], [[Virtualisation]], [[Data]], [[*nix]]
 
  
 
:A program is many things. It is a piece of text typed by a programmer, it is the directing force that makes the computer do what it does, it is data in the computer's memory, yet it controls the actions performed on this same memory. Analogies that try to compare programs to objects we are familiar with tend to fall short, but a superficially fitting one is that of a machine. The gears of a mechanical watch fit together ingeniously, and if the watchmaker was any good, it will accurately show the time for many years. The elements of a program fit together in a similar way, and if the programmer knows what he is doing, the program will run without crashing.
 
:A program is many things. It is a piece of text typed by a programmer, it is the directing force that makes the computer do what it does, it is data in the computer's memory, yet it controls the actions performed on this same memory. Analogies that try to compare programs to objects we are familiar with tend to fall short, but a superficially fitting one is that of a machine. The gears of a mechanical watch fit together ingeniously, and if the watchmaker was any good, it will accurately show the time for many years. The elements of a program fit together in a similar way, and if the programmer knows what he is doing, the program will run without crashing.
Line 13: Line 15:
  
 
=== Basics ===
 
=== Basics ===
* https://en.wikipedia.org/wiki/Computer_literacy
+
* https://en.wikipedia.org/wiki/Computer_literacy - defined as the knowledge and ability to use computers and related technology efficiently, with skill levels ranging from elementary use to computer programming and advanced problem solving. Computer literacy can also refer to the comfort level someone has with using computer programs and applications. Another valuable component is understanding how computers work and operate. An individual's level of computer literacy is measured on the scale of how skilled they are when it comes to using computers and other related tools to achieve a goal. Computer literacy may be distinguished from computer programming, which primarily focuses on the design and coding of computer programs rather than the familiarity and skill in their use. Various countries, including the United Kingdom and the United States, have created initiatives to improve national computer literacy rates.
 +
 
  
 
* https://en.wikipedia.org/wiki/List_of_important_publications_in_computer_science
 
* https://en.wikipedia.org/wiki/List_of_important_publications_in_computer_science
Line 27: Line 30:
  
 
* https://en.wikipedia.org/wiki/Script_(computing)
 
* https://en.wikipedia.org/wiki/Script_(computing)
 +
 +
 +
 +
* https://en.wikipedia.org/wiki/Interactive_computing - refers to software which accepts input from the user as it runs. Interactive software includes commonly used programs, such as word processors or spreadsheet applications. By comparison, non-interactive programs operate without user intervention; examples of these include compilers and batch processing applications that are pre-programmed to run independently.
 +
 +
 +
 +
* [https://cpu.land/ Intro | Putting the "You" in CPU] - A technical explainer of how your computer runs programs, from start to finish.Curious exactly what happens when you run a program on your computer? Read this article to learn how multiprocessing works, what system calls really are, how computers manage memory with hardware interrupts, and how Linux loads executables.
 +
** https://github.com/hackclub/putting-the-you-in-cpu
  
  
Line 47: Line 59:
  
 
* [http://www.linusakesson.net/programming/pipelogic/index.php Pipe Logic] - "In this model, a UNIX pipe acts like a wire, that is, a conductor with parasitic capacitance."
 
* [http://www.linusakesson.net/programming/pipelogic/index.php Pipe Logic] - "In this model, a UNIX pipe acts like a wire, that is, a conductor with parasitic capacitance."
 +
 +
 +
* https://github.com/dwmkerr/hacker-laws
 +
  
 
* [[Wikipedia:Algorithms + Data Structures = Programs]]
 
* [[Wikipedia:Algorithms + Data Structures = Programs]]
Line 70: Line 86:
  
 
* [http://www.computerscienceforeveryone.com/Course_1/Unit_1/Lesson_1/ Computer Science For Everyone]
 
* [http://www.computerscienceforeveryone.com/Course_1/Unit_1/Lesson_1/ Computer Science For Everyone]
 +
 +
  
 
* [http://matt.might.net/articles/intro-static-analysis/ What is static program analysis?]
 
* [http://matt.might.net/articles/intro-static-analysis/ What is static program analysis?]
 +
 +
 +
* [https://r2c.dev/blog/2020/introducing-semgrep-and-r2c/ r2c blog — Introducing Semgrep and r2c]
 +
** https://github.com/returntocorp/semgrep - a fast, open-source, static analysis tool that excels at expressing code standards — without complicated queries — and surfacing bugs early at editor, commit, and CI time. Precise rules look like the code you’re searching; no more traversing abstract syntax trees or wrestling with regexes.
 +
 +
 +
 +
 +
  
 
* [http://qaa.ath.cx/The5HardestThings.html The 5 Hardest Parts of Programming] - Optimization, Networking, Security, Reliability, Scalability
 
* [http://qaa.ath.cx/The5HardestThings.html The 5 Hardest Parts of Programming] - Optimization, Networking, Security, Reliability, Scalability
Line 85: Line 112:
  
 
* [http://slash7.com/2006/12/22/vampires/ slash7 with Amy Hoy » Blog Archive » Help Vampires: A Spotter’s Guide]
 
* [http://slash7.com/2006/12/22/vampires/ slash7 with Amy Hoy » Blog Archive » Help Vampires: A Spotter’s Guide]
 +
 +
 +
 +
* [https://suricrasia.online/iceberg/ The Cursed Computer Iceberg Meme] - the intent is to awaken you to many of the peculiarities and weirdness of computers. hopefully, after reading these articles, you will have learned a lot and will embrace chaos.
  
 
=== Reference ===
 
=== Reference ===
Line 102: Line 133:
 
* [http://rigaux.org/language-study/syntax-across-languages.html syntax across languages]
 
* [http://rigaux.org/language-study/syntax-across-languages.html syntax across languages]
 
* http://helloworldquiz.com/
 
* http://helloworldquiz.com/
 +
  
 
* [http://redmonk.com/dberkholz/2013/03/25/programming-languages-ranked-by-expressiveness/ Programming languages ranked by expressiveness]
 
* [http://redmonk.com/dberkholz/2013/03/25/programming-languages-ranked-by-expressiveness/ Programming languages ranked by expressiveness]
 
* [http://shootout.alioth.debian.org/ The Computer Language Benchmarks Game]
 
* [http://shootout.alioth.debian.org/ The Computer Language Benchmarks Game]
 +
  
 
* [http://www.cs.utexas.edu/users/EWD/transcriptions/EWD04xx/EWD498.html How do we tell truths that might hurt?] - E.W. Dijkstra
 
* [http://www.cs.utexas.edu/users/EWD/transcriptions/EWD04xx/EWD498.html How do we tell truths that might hurt?] - E.W. Dijkstra
 
* [http://wiki.theory.org/YourLanguageSucks YourLanguageSucks]
 
* [http://wiki.theory.org/YourLanguageSucks YourLanguageSucks]
 +
  
 
* [http://programmers.stackexchange.com/questions/154733/my-boss-decided-to-add-a-person-to-blame-field-to-every-bug-report-how-can-i My boss decided to add a “person to blame” field to every bug report. How can I convince him that it's a bad idea?]
 
* [http://programmers.stackexchange.com/questions/154733/my-boss-decided-to-add-a-person-to-blame-field-to-every-bug-report-how-can-i My boss decided to add a “person to blame” field to every bug report. How can I convince him that it's a bad idea?]
 +
  
 
* [http://news.ycombinator.com/item?id=4193479 Ask HN: Your favourite style guide?]
 
* [http://news.ycombinator.com/item?id=4193479 Ask HN: Your favourite style guide?]
 
* [http://ledgersmbdev.blogspot.co.uk/2012/08/patterns-and-anti-patterns-in-code.html Patterns and Anti-Patterns in Code Comments]
 
* [http://ledgersmbdev.blogspot.co.uk/2012/08/patterns-and-anti-patterns-in-code.html Patterns and Anti-Patterns in Code Comments]
 +
  
 
* [http://projecteuler.net/ Project Euler] is a series of challenging mathematical/computer programming problems that will require more than just mathematical insights to solve. Although mathematics will help you arrive at elegant and efficient methods, the use of a computer and programming skills will be required to solve most problems.
 
* [http://projecteuler.net/ Project Euler] is a series of challenging mathematical/computer programming problems that will require more than just mathematical insights to solve. Although mathematics will help you arrive at elegant and efficient methods, the use of a computer and programming skills will be required to solve most problems.
 
* [http://stackoverflow.com/questions/662283/websites-like-projecteuler-net Websites like projecteuler.net]
 
* [http://stackoverflow.com/questions/662283/websites-like-projecteuler-net Websites like projecteuler.net]
 
* [https://github.com/necolas/project-euler JavaScript solutions to the Project Euler problems.]
 
* [https://github.com/necolas/project-euler JavaScript solutions to the Project Euler problems.]
 +
  
 
* [http://blog.stephenwyattbush.com/2012/04/07/dad-and-the-ten-commandments-of-egoless-programming Dad and the Ten Commandments of Egoless Programming]
 
* [http://blog.stephenwyattbush.com/2012/04/07/dad-and-the-ten-commandments-of-egoless-programming Dad and the Ten Commandments of Egoless Programming]
Line 122: Line 159:
  
 
* [http://www.informit.com/articles/article.aspx?p=1941206 "The Best Programming Advice I Ever Got" with Rob Pike]
 
* [http://www.informit.com/articles/article.aspx?p=1941206 "The Best Programming Advice I Ever Got" with Rob Pike]
 +
  
  
Line 128: Line 166:
 
* [http://skillsmatter.com/podcast/agile-testing/bobs-last-language The Last Programming Language]
 
* [http://skillsmatter.com/podcast/agile-testing/bobs-last-language The Last Programming Language]
 
** [http://scottlocklin.wordpress.com/2012/09/12/not-all-programmers-alike Not all programmers are alike: a language rant]
 
** [http://scottlocklin.wordpress.com/2012/09/12/not-all-programmers-alike Not all programmers are alike: a language rant]
 +
  
 
* [http://typing.io/ Typing Practice for Programmers]
 
* [http://typing.io/ Typing Practice for Programmers]
Line 167: Line 206:
  
 
* http://showmedo.com/
 
* http://showmedo.com/
 +
 +
  
 
* http://lee-phillips.org/lispmath/
 
* http://lee-phillips.org/lispmath/
Line 173: Line 214:
  
  
=== Books ===
+
 
 +
* https://github.com/labuladong/fucking-algorithm/tree/english
 +
 
 +
 
 +
* https://github.com/sindresorhus/awesome
 +
 
 +
 
 +
* [https://beautiful.software/ Beautiful Software] - Christopher Alexander's research initiative on computing and the environment
 +
 
 +
=== Books ===
 
* https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md
 
* https://github.com/vhf/free-programming-books/blob/master/free-programming-books.md
 +
 
* http://hackershelf.com/
 
* http://hackershelf.com/
 +
  
 
* https://news.ycombinator.com/item?id=10715161
 
* https://news.ycombinator.com/item?id=10715161
 +
  
 
* http://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs
 
* http://en.wikipedia.org/wiki/Structure_and_Interpretation_of_Computer_Programs
Line 186: Line 239:
 
** http://www.posteriorscience.net/?p=206 [https://news.ycombinator.com/item?id=11628080]
 
** http://www.posteriorscience.net/?p=206 [https://news.ycombinator.com/item?id=11628080]
 
** https://news.ycombinator.com/item?id=13918465
 
** https://news.ycombinator.com/item?id=13918465
 +
  
 
* http://combinators.info/
 
* http://combinators.info/
 +
  
 
* https://gitorious.org/learn-x-the-hard-way/learn-x-the-hard-way/blobs/master/README
 
* https://gitorious.org/learn-x-the-hard-way/learn-x-the-hard-way/blobs/master/README
 +
  
 
* http://codingforinterviews.com/books
 
* http://codingforinterviews.com/books
 +
  
 
* http://en.wikibooks.org/wiki/Computer_Programming
 
* http://en.wikibooks.org/wiki/Computer_Programming
 
* WikiBooks: [http://en.wikibooks.org/wiki/A-level_Computing/AQA/Problem_Solving,_Programming,_Operating_Systems,_Databases_and_Networking/Programming_Concepts A-level Computing/AQA/Problem Solving, Programming, Operating Systems, Databases and Networking/Programming Concepts]
 
* WikiBooks: [http://en.wikibooks.org/wiki/A-level_Computing/AQA/Problem_Solving,_Programming,_Operating_Systems,_Databases_and_Networking/Programming_Concepts A-level Computing/AQA/Problem Solving, Programming, Operating Systems, Databases and Networking/Programming Concepts]
 +
  
 
* [http://www.cis.upenn.edu/~bcpierce/sf/toc.html Software Foundations]
 
* [http://www.cis.upenn.edu/~bcpierce/sf/toc.html Software Foundations]
 +
  
 
* http://eric.themoritzfamily.com/books-every-self-taught-computer-scientist-should-read.html
 
* http://eric.themoritzfamily.com/books-every-self-taught-computer-scientist-should-read.html
 +
 
* http://nlpwp.org/book/
 
* http://nlpwp.org/book/
 +
  
 
* http://stackoverflow.com/questions/194812/list-of-freely-available-programming-books/392926#392926
 
* http://stackoverflow.com/questions/194812/list-of-freely-available-programming-books/392926#392926
 +
 
* http://citizen428.net/blog/2010/08/12/30-free-programming-ebooks/
 
* http://citizen428.net/blog/2010/08/12/30-free-programming-ebooks/
 +
  
 
* http://natureofcode.com/book/
 
* http://natureofcode.com/book/
 +
  
 
* http://programmer.97things.oreilly.com/wiki/index.php/Contributions_Appearing_in_the_Book
 
* http://programmer.97things.oreilly.com/wiki/index.php/Contributions_Appearing_in_the_Book
 +
  
 
* https://news.ycombinator.com/item?id=8035332
 
* https://news.ycombinator.com/item?id=8035332
Line 294: Line 359:
  
 
* https://en.wikipedia.org/wiki/ENIAC
 
* https://en.wikipedia.org/wiki/ENIAC
 
 
* https://en.wikipedia.org/wiki/Setun - Russian, 1958
 
 
* https://dev.to/buntine/the-balanced-ternary-machines-of-soviet-russia
 
  
  
Line 395: Line 455:
  
  
=== People ===
 
  
* https://en.wikipedia.org/wiki/Alan_Turing
+
* https://news.ycombinator.com/item?id=25912241
  
  
* https://en.wikipedia.org/wiki/Konrad_Zuse
+
=== Ternary ===
** http://www.linuxvoice.com/konrad-zuse-nearly-the-german-turing-5 [https://news.ycombinator.com/item?id=9199500]
 
  
  
* https://en.wikipedia.org/wiki/John_von_Neumann
+
* https://en.wikipedia.org/wiki/Ternary_computer - also called trinary computer, is one that uses ternary logic (i.e., base 3) instead of the more common binary system (i.e., base 2) in its calculations. This means it uses trits (instead of bits, as most computers do).
** http://stepanov.lk.net/mnemo/legende.html
+
* https://en.wikipedia.org/wiki/Setun - Russian, 1958
  
 +
* https://dev.to/buntine/the-balanced-ternary-machines-of-soviet-russia
  
* https://en.wikipedia.org/wiki/Alonzo_Church
 
  
 +
* YouTube: [https://www.youtube.com/playlist?list=PL9MBW6e0V7UIvP2vY_aKwsu93wqYq5jXJ homebrew ternary computer]
 +
** https://github.com/ssloy/triador - Ternary computer emulator
  
* https://en.wikipedia.org/wiki/Alfred_Tarski
 
  
 +
* https://github.com/tedkotz/ternary - A storage place for my ternary experiments, including an emulator for a theoretical 27-trit CPU.
  
* https://en.wikipedia.org/wiki/Kurt_G%C3%B6del
 
  
  
* https://en.wikipedia.org/wiki/Emil_Leon_Post
+
=== People ===
  
  
* https://en.wikipedia.org/wiki/Stephen_Cole_Kleene
+
* https://en.wikipedia.org/wiki/Claude_Shannon - was an American mathematician, electrical engineer, and cryptographer known as "the father of information theory". Shannon is noted for having founded information theory with a landmark paper, "A Mathematical Theory of Communication", that he published in 1948.He is also well known for founding digital circuit design theory in 1937, when—as a 21-year-old master's degree student at the Massachusetts Institute of Technology (MIT)—he wrote his thesis demonstrating that electrical applications of Boolean algebra could construct any logical numerical relationship. Shannon contributed to the field of cryptanalysis for national defense during World War II, including his fundamental work on codebreaking and secure telecommunications.
  
 +
* PDF: [http://people.math.harvard.edu/~ctm/home/text/others/shannon/entropy/entropy.pdf A Mathematical Theory of Communication] - By C. E. SHANNON, 1948
  
* https://en.wikipedia.org/wiki/Erich_Bloch
 
  
  
 
+
* https://en.wikipedia.org/wiki/Alan_Turing
* https://news.ycombinator.com/item?id=17797003
 
  
  
* [https://www.hillelwayne.com/post/important-women-in-cs/ Important Women in CS Who Aren't Grace Hopper, Margaret Hamilton, or Ada Lovelace] - Hillel Wayne
+
* https://en.wikipedia.org/wiki/Konrad_Zuse
 +
** http://www.linuxvoice.com/konrad-zuse-nearly-the-german-turing-5 [https://news.ycombinator.com/item?id=9199500]
  
 
* https://en.wikipedia.org/wiki/Alan_Turing
 
 
* https://en.wikipedia.org/wiki/Konrad_Zuse
 
** http://www.linuxvoice.com/konrad-zuse-nearly-the-german-turing-5/ [https://news.ycombinator.com/item?id=9199500]
 
  
 
* https://en.wikipedia.org/wiki/John_von_Neumann
 
* https://en.wikipedia.org/wiki/John_von_Neumann
 
** http://stepanov.lk.net/mnemo/legende.html
 
** http://stepanov.lk.net/mnemo/legende.html
 +
  
 
* https://en.wikipedia.org/wiki/Alonzo_Church
 
* https://en.wikipedia.org/wiki/Alonzo_Church
 +
  
 
* https://en.wikipedia.org/wiki/Alfred_Tarski
 
* https://en.wikipedia.org/wiki/Alfred_Tarski
 +
  
 
* https://en.wikipedia.org/wiki/Kurt_G%C3%B6del
 
* https://en.wikipedia.org/wiki/Kurt_G%C3%B6del
  
* https://en.wikipedia.org/wiki/Claude_Shannon
 
  
 
* https://en.wikipedia.org/wiki/Emil_Leon_Post
 
* https://en.wikipedia.org/wiki/Emil_Leon_Post
 +
  
 
* https://en.wikipedia.org/wiki/Stephen_Cole_Kleene
 
* https://en.wikipedia.org/wiki/Stephen_Cole_Kleene
  
  
 +
* https://en.wikipedia.org/wiki/Erich_Bloch
  
* [https://news.ycombinator.com/item?id=5454399 Ask HN: Alan Kay says programing is pop culture. Where can I find the classics?]
 
  
* YouTube: [http://www.youtube.com/watch?v=Vt8jyPqsmxE Extracting Energy from the Turing Tarpit] - Alan C. Kay during the ACM A.M. Turing Centenary Celebration, June, 2012.
 
  
* [https://techland.time.com/2013/04/02/an-interview-with-computing-pioneer-alan-kay/ An Interview with Computing Pioneer Alan Kay | TIME.com] - Born in 1940, computer scientist Alan Curtis Kay is one of a handful of visionaries most responsible for the concepts which have propelled personal computing forward over the past thirty years.
 
  
 +
https://news.ycombinator.com/item?id=23869819
  
* Vimeo: [https://vimeo.com/36579366 Bret Victor - Inventing on Principle]
 
  
 +
* https://news.ycombinator.com/item?id=17797003
  
* [https://wiesmann.codiferes.net/wordpress/?p=15187&lang=en Falsehoods programmers believe about geography – Thias の blog]
 
  
 +
* [https://www.hillelwayne.com/post/important-women-in-cs/ Important Women in CS Who Aren't Grace Hopper, Margaret Hamilton, or Ada Lovelace] - Hillel Wayne
  
* [http://www.phrack.com/ .:: Phrack Magazine ::.]
 
  
  
== Computation ==
+
* [https://news.ycombinator.com/item?id=5454399 Ask HN: Alan Kay says programing is pop culture. Where can I find the classics?]
* https://en.wikipedia.org/wiki/Computer
 
  
* https://en.wikipedia.org/wiki/Computing
+
* YouTube: [http://www.youtube.com/watch?v=Vt8jyPqsmxE Extracting Energy from the Turing Tarpit] - Alan C. Kay during the ACM A.M. Turing Centenary Celebration, June, 2012.
  
* https://en.wikipedia.org/wiki/Digital_computer
+
* [https://techland.time.com/2013/04/02/an-interview-with-computing-pioneer-alan-kay/ An Interview with Computing Pioneer Alan Kay | TIME.com] - Born in 1940, computer scientist Alan Curtis Kay is one of a handful of visionaries most responsible for the concepts which have propelled personal computing forward over the past thirty years.
  
See also [[Maths#Logic]], [[Hardware]]
 
  
  
* http://ethw.org/Category:Computing_and_electronics [https://news.ycombinator.com/item?id=12519512]
+
* [https://ferd.ca/goodbye-joe.html Goodbye Joe]
  
  
* https://en.wikipedia.org/wiki/Theory_of_computation - branch that deals with how efficiently problems can be solved on a model of computation, using an algorithm. The field is divided into three major branches: automata theory and language, computability theory, and computational complexity theory.
 
  
* https://en.wikipedia.org/wiki/Model_of_computation - the definition of the set of allowable operations used in computation and their respective costs. It is used for measuring the complexity of an algorithm in execution time and or memory space: by assuming a certain model of computation, it is possible to analyze the computational resources required or to discuss the limitations of algorithms or computers.
+
* Vimeo: [https://vimeo.com/36579366 Bret Victor - Inventing on Principle]
  
* https://en.wikipedia.org/wiki/Abstract_machine - abstract machines are often used in thought experiments regarding computability or to analyze the complexity of algorithms (see computational complexity theory). A typical abstract machine consists of a definition in terms of input, output, and the set of allowable operations used to turn the former into the latter. The best-known example is the Turing machine.
 
  
 +
* [https://wiesmann.codiferes.net/wordpress/?p=15187&lang=en Falsehoods programmers believe about geography – Thias の blog]
  
  
 +
* [http://www.phrack.com/ .:: Phrack Magazine ::.]
  
 +
== Architecture ==
 +
See also [[Electronics]]
  
* https://en.wikipedia.org/wiki/File:Theoretical_computer_science.svg - Relationship between complexity theory, formal languages and computability theory.
+
* [https://www.youtube.com/watch?v=Tg5gJxXBh8s George Dyson on the Origins of the Digital Universe] - The talk focuses on the work done at The Institute for Advanced Study in Princeton New Jersey by such renowned scientists as John von Neumann and Kurt Godel.
  
* [http://www.cse.ohio-state.edu/~gurari/theory-bk/theory-bk.html An Introduction to the Theory of Computation] - book
+
* https://en.wikipedia.org/wiki/Computer_architecture
  
* [http://theoryofcomputing.org/ Theory of Computing] - An Open Access Electronic Journal in Theoretical Computer Science
+
* https://en.wikipedia.org/wiki/Harvard_architecture - a computer architecture with physically separate storage and signal pathways for instructions and data. The term originated from the Harvard Mark I relay-based computer, which stored instructions on punched tape (24 bits wide) and data in electro-mechanical counters. These early machines had data storage entirely contained within the central processing unit, and provided no access to the instruction storage as data. Programs needed to be loaded by an operator; the processor could not initialize itself.
  
  
* http://www.simplecpu.com/Binary.html [https://news.ycombinator.com/item?id=8478902]
+
* https://en.wikipedia.org/wiki/Von_Neumann_architecture - meaning has evolved to be any stored-program computer in which an instruction fetch and a data operation cannot occur at the same time because they share a common bus. This is referred to as the von Neumann bottleneck and often limits the performance of the system. The design of a von Neumann architecture is simpler than the more modern Harvard architecture which is also a stored-program system but has one dedicated set of address and data buses for reading data from and writing data to memory, and another set of address and data buses for fetching instructions.
  
* [https://www.youtube.com/watch?v=cNN_tTXABUA See How the CPU Works In One Lesson]
 
  
* http://www.buthowdoitknow.com
+
* https://en.wikipedia.org/wiki/Modified_Harvard_architecture - a variation of the Harvard computer architecture that allows the contents of the instruction memory to be accessed as if it were data. Most modern computers that are documented as Harvard architecture are, in fact, Modified Harvard architecture.
  
  
=== Automata theory ===
+
* https://en.wikipedia.org/wiki/Flynn's_taxonomy - a classification of computer architectures, proposed by Michael Flynn in 1966. The classification system has stuck, and has been used as a tool in design of modern processors and their functionalities.
* https://en.wikipedia.org/wiki/Automata_theory - the study of abstract machines and automata, as well as the computational problems that can be solved using them. It is a theory in theoretical computer science, under discrete mathematics (a subject of study in both mathematics and computer science). The word automata (the plural of automaton) comes from the Greek word αὐτόματα, which means "self-acting".
 
  
Automata theory is closely related to formal language theory. An automaton is a finite representation of a formal language that may be an infinite set. Automata are often classified by the class of formal languages they can recognize.
 
Automata play a major role in theory of computation, compiler construction, artificial intelligence, parsing and formal verification.
 
  
 +
* [http://www.cs.ucf.edu/courses/cda5106/summer02/reading.html CDA 5106 - Advanced Computer Architecture I Reading List]
  
* https://en.wikipedia.org/wiki/State_transition_table
+
* [https://opencores.org/ OpenCores] - Since 1999, OpenCores is the most prominent online community for the development of gateware IP (Intellectual Properties) Cores. It is the place where such cores are shared and promoted in the spirit of Free and Open Source collaboration.
 +
** http://opencores.org/projects - main objective is to design and publish core designs under a license for hardware modeled on the Lesser General Public License (LGPL) for software. We are committed to the ideal of freely available, freely usable and re-usable open source hardware.
  
  
* https://en.wikipedia.org/wiki/Finite-state_machine
+
* [https://erik-engheim.medium.com/microprocessors-running-on-air-a47a702dd41f Microprocessors Running on Air?. There was a time, now forgotten, where… | by Erik Engheim | Jan, 2021 | Medium] - [https://news.ycombinator.com/item?id=25697736]
** SE: [http://cstheory.stackexchange.com/questions/14811/what-is-the-enlightenment-im-supposed-to-attain-after-studying-finite-automata/14818#14818 What is the enlightenment I'm supposed to attain after studying finite automata?] [https://news.ycombinator.com/item?id=6789631]
 
  
An automaton can be said to recognize a string if we view the content of its tape as input. In other words, the automaton computes a function that maps strings into the set {0,1}. Alternatively, we can say that an automaton generates strings, which means viewing its tape as an output tape. On this view, the automaton generates a formal language, which is a set of strings. The two views of automata are equivalent: the function that the automaton computes is precisely the indicator function of the set of strings it generates. The class of languages generated by finite automata is known as the class of regular languages.
 
  
 +
=== Instructions ===
  
 +
* https://en.wikipedia.org/wiki/Instruction_set - or '''instruction set architecture''' ('''ISA'''), is the part of the computer architecture related to programming, including the native data types, instructions, registers, addressing modes, memory architecture, interrupt and exception handling, and external I/O. An ISA includes a specification of the set of opcodes (machine language), and the native commands implemented by a particular processor.
  
* https://en.wikipedia.org/wiki/Regular_grammar
 
  
  
* https://en.wikipedia.org/wiki/Regular_language
+
* https://en.wikipedia.org/wiki/First-generation_programming_language - a machine-level programming language. A first generation (programming) language (1GL) is a grouping of programming languages that are machine level languages used to program first-generation computers. Originally, no translator was used to compile or assemble the first-generation language. The first-generation programming instructions were entered through the front panel switches of the computer system.The instructions in 1GL are made of binary numbers, represented by 1s and 0s. This makes the language suitable for the understanding of the machine but far more difficult to interpret and learn by the human programmer.The main advantage of programming in 1GL is that the code can run very fast and very efficiently, precisely because the instructions are executed directly by the central processing unit (CPU). One of the main disadvantages of programming in a low level language is that when an error occurs, the code is not as easy to fix.First generation languages are very much adapted to a specific computer and CPU, and code portability is therefore significantly reduced in comparison to higher level languages.Modern day programmers still occasionally use machine level code, especially when programming lower level functions of the system, such as drivers, interfaces with firmware and hardware devices. Modern tools such as native-code compilers are used to produce machine level from a higher-level language.
  
* [http://matt.might.net/articles/grammars-bnf-ebnf/ The language of languages] - explains grammars and common notations for grammars, such as Backus-Naur Form (BNF), Extended Backus-Naur Form (EBNF) and regular extensions to BNF.
 
  
  
 +
* https://en.wikipedia.org/wiki/Microarchitecture - sometimes abbreviated to µarch or uarch, also called computer organization, is the way a given instruction set architecture (ISA) is implemented on a processor. A given ISA may be implemented with different microarchitectures; implementations may vary due to different goals of a given design or due to shifts in technology. Computer architecture is the combination of microarchitecture and instruction set design.
  
* YouTube: [https://www.youtube.com/watch?v=vhiiia1_hC4 Computers Without Memory - Computerphile] - They're called 'Finite State Automata" and occupy the centre of Chomsky's Hierarchy - Professor Brailsford explains the ultimate single purpose computer.
 
  
  
* https://en.wikipedia.org/wiki/Deterministic_finite_automaton
+
* https://en.wikipedia.org/wiki/List_of_instruction_sets
  
* https://en.wikipedia.org/wiki/Semiautomaton
 
  
* https://en.wikipedia.org/wiki/Nondeterministic_finite_automaton
+
* https://github.com/oowekyala/arm-cheatsheet - All ARM assembly commands on one pdf page
* https://en.wikipedia.org/wiki/Nondeterministic_finite_automaton_with_%CE%B5-moves
 
  
  
* https://en.wikipedia.org/wiki/Pushdown_automaton - type of automaton that employs a stack.
+
* PDF: [http://research.cs.wisc.edu/multifacet/papers/ieeemicro16_card_isa.pdf Proprietary versus open instruction sets] [https://news.ycombinator.com/item?id=12577024]
  
* https://en.wikipedia.org/wiki/Deterministic_pushdown_automaton
 
  
* https://en.wikipedia.org/wiki/Embedded_pushdown_automaton
 
  
 +
* https://en.wikipedia.org/wiki/Microcode - a layer of hardware-level instructions or data structures involved in the implementation of higher level machine code instructions in central processing units, and in the implementation of the internal logic of many channel controllers, disk controllers, network interface controllers, network processors, graphics processing units, and other hardware. It resides in special high-speed memory and translates machine instructions into sequences of detailed circuit-level operations. It helps separate the machine instructions from the underlying electronics so that instructions can be designed and altered more freely. It also makes it feasible to build complex multi-step instructions while still reducing the complexity of the electronic circuitry compared to other methods. Writing microcode is often called microprogramming and the microcode in a particular processor implementation is sometimes called a microprogram.
  
* https://en.wikipedia.org/wiki/%CE%A9-automaton
 
* https://en.wikipedia.org/wiki/Probabilistic_automaton
 
  
* https://en.wikipedia.org/wiki/Nested_stack_automaton - a finite automaton that can make use of a stack containing data which can be additional stacks. Like a stack automaton, a nested stack automaton may step up or down in the stack, and read the current symbol; in addition, it may at any place create a new stack, operate on that one, eventually destroy it, and continue operating on the old stack. This way, stacks can be nested recursively to an arbitrary depth; however, the automaton always operates on the innermost stack only.
+
* https://wiki.archlinux.org/index.php/Microcode
  
* https://en.wikipedia.org/wiki/Abstract_state_machines
+
* [https://downloadcenter.intel.com/download/27337?v=t Linux* Processor Microcode Data File]
  
* https://en.wikipedia.org/wiki/Register_machine - a generic class of abstract machines used in a manner similar to a Turing machine. All the models are Turing equivalent.
+
* [http://inertiawar.com/microcode/ Notes on Intel Microcode Updates]
  
* https://en.wikipedia.org/wiki/Mealy_machine
 
* https://en.wikipedia.org/wiki/Moore_machine - a finite-state machine whose output values are determined solely by its current state
 
  
* https://en.wikipedia.org/wiki/UML_state_machine
+
* https://www.bedroomlan.org/projects/mcasm [https://news.ycombinator.com/item?id=13515866]
  
  
* https://en.wikipedia.org/wiki/Non-deterministic_Turing_machine
 
  
* https://en.wikipedia.org/wiki/Linear_bounded_automaton
+
* https://en.wikipedia.org/wiki/Machine_code - a set of instructions executed directly by a computer's central processing unit (CPU). Each instruction performs a very specific task, such as a load, a jump, or an ALU operation on a unit of data in a CPU register or memory. Every program directly executed by a CPU is made up of a series of such instructions. Numerical machine code (i.e., not assembly code) may be regarded as the lowest-level representation of a compiled or assembled computer program or as a primitive and hardware-dependent programming language. While it is possible to write programs directly in numerical machine code, it is tedious and error prone to manage individual bits and calculate numerical addresses and constants manually. It is thus rarely done today, except for situations that require extreme optimization or debugging.
  
 +
* https://en.wikipedia.org/wiki/Word_(computer_architecture) - term for the natural unit of data used by a particular processor design. A word is basically a fixed-sized group of digits (binary or decimal) that are handled as a unit by the instruction set or the hardware of the processor. The number of digits in a word (the word size, word width, or word length) is an important characteristic of any specific processor design or computer architecture.
  
* https://en.wikipedia.org/wiki/Finite_state_transducer - a finite state machine with two tapes: an input tape and an output tape. This contrasts with an ordinary finite state automaton (or finite state acceptor), which has a single tape.
+
* https://en.wikipedia.org/wiki/Opcode - the portion of a machine language instruction that specifies the operation to be performed.
  
=== Computability theory ===
+
* https://en.wikipedia.org/wiki/Operand#Computer_science - the part of a computer instruction which specifies what data is to be manipulated or operated on, while at the same time representing the data itself. A computer instruction describes an operation such as add or multiply X, while the operand (or operands, as there can be more than one) specify on which X to operate as well as the value of X. Additionally, in assembly language, an operand is a value (an argument) on which the instruction, named by mnemonic, operates. The operand may be a processor register, a memory address, a literal constant, or a label.
to sort
 
  
See also [[Maths#Type theory]]
 
  
* https://en.wikipedia.org/wiki/Computability_theory - also called '''recursion theory''', is a branch of mathematical logic, of computer science, and of the theory of computation that originated in the 1930s with the study of computable functions and Turing degrees. The basic questions addressed by recursion theory are "What does it mean for a function on the natural numbers to be computable?" and "How can noncomputable functions be classified into a hierarchy based on their level of noncomputability?". The answers to these questions have led to a rich theory that is still being actively researched. The field has since grown to include the study of generalized computability and definability.
+
* https://en.wikipedia.org/wiki/Bytecode - also known as p-code (portable code), is a form of instruction set designed for efficient execution by a software interpreter. Unlike human-readable source code, bytecodes are compact numeric codes, constants, and references (normally numeric addresses) which encode the result of parsing and semantic analysis of things like type, scope, and nesting depths of program objects. They therefore allow much better performance than direct interpretation of source code.
  
 +
"fundamentally the same as machine code, in that it describes low level operations such as reading and writing memory, and basic calculations. Bytecode is typically conceived to be produced when COMPILING a higher level language, for example PHP or Java, and unlike machine code for many hardware based processors, may have operations to support specific features of the higher level language. A key difference is that the processor of bytecode is usually a program, though processors have been created for interpreting some bytecode specifications, e.g. a processor called SOAR (Smalltalk On A RISC) for Smalltalk bytecode. While you wouldn't typically call native machine code bytecode, for some types of processors such as CISC and EISC (e.g. Linn Rekursiv, from the people who made record players), the processor itself contains a program that is interpreting the machine instructions, so there are parallels." [http://stackoverflow.com/questions/17638888/difference-between-opcode-byte-code-mnemonics-machine-code-and-assembly]
  
* https://pressron.wordpress.com/2016/08/30/what-we-talk-about-when-we-talk-about-computation/ [https://news.ycombinator.com/item?id=12399580]
 
  
  
* https://en.wikipedia.org/wiki/Computable_function - the basic objects of study in computability theory. Computable functions are the formalized analogue of the intuitive notion of algorithm. They are used to discuss computability without referring to any concrete model of computation such as Turing machines or register machines. Any definition, however, must make reference to some specific model of computation but all valid definitions yield the same class of functions. Particular models of computability that give rise to the set of computable functions are the Turing-computable functions and the μ-recursive functions.
+
Machine data types - All data in computers based on digital electronics is represented as bits (alternatives 0 and 1) on the lowest level. The smallest addressable unit of data is usually a group of bits called a byte (usually an octet, which is 8 bits). The unit processed by machine code instructions is called a word (as of 2011, typically 32 or 64 bits). Most instructions interpret the word as a binary number, such that a 32-bit word can represent unsigned integer values from 0 to 2^{32}-1 or signed integer values from -2^{31} to 2^{31}-1. Because of two's complement, the machine language and machine doesn't need to distinguish between these unsigned and signed data types for the most part.
  
* https://en.wikipedia.org/wiki/Effective_method
+
There is a specific set of arithmetic instructions that use a different interpretation of the bits in word as a floating-point number.
 +
Machine data types need to be exposed or made available in systems or low-level programming languages, allowing fine-grained control over hardware. The C programming language, for instance, supplies integer types of various widths, such as short and long. If a corresponding native type does not exist on the target platform, the compiler will break them down into code using types that do exist. For instance, if a 32-bit integer is requested on a 16 bit platform, the compiler will tacitly treat it as an array of two 16 bit integers.
  
 +
* http://www.math.grin.edu/~rebelsky/Courses/152/97F/Readings/machine-data.html
  
* https://en.wikipedia.org/wiki/Church–Turing_thesis - states that recursion, lambda calculus and the Turing machine are equivalent
+
=== Processing ===
  
* https://en.wikipedia.org/wiki/Turing_degree - or degree of unsolvability of a set of natural numbers measures the level of algorithmic unsolvability of the set. The concept of Turing degree is fundamental in computability theory, where sets of natural numbers are often regarded as decision problems; the Turing degree of a set tells how difficult it is to solve the decision problem associated with the set. That is, to determine whether an arbitrary number is in the given set.
+
* https://en.wikipedia.org/wiki/Microelectronics
  
* PDF: [https://webspace.princeton.edu/users/jedwards/Turing%20Centennial%202012/Mudd%20Archive%20files/12285_AC100_Turing_1938.pdf Systems of Logic Based on Ordinals] https://news.ycombinator.com/item?id=8393953
 
  
 +
* https://en.wikipedia.org/wiki/Processor_(computing)#Computing
  
* https://en.wikipedia.org/wiki/Curry–Howard_correspondence - the direct relationship between computer programs and mathematical proofs. It is a generalization of a syntactic analogy between systems of formal logic and computational calculi that was first discovered by the American mathematician Haskell Curry and logician William Alvin Howard.
+
* https://en.wikipedia.org/wiki/Processor_design
** http://wadler.blogspot.co.uk/2014/08/howard-on-curry-howard.html [https://news.ycombinator.com/item?id=8246216]
 
  
* [https://stackoverflow.com/questions/2969140/what-are-the-most-interesting-equivalences-arising-from-the-curry-howard-isomorp What are the most interesting equivalences arising from the Curry-Howard Isomorphism?]
 
  
* YouTube: [https://www.youtube.com/watch?v=IOiZatlZtGU "Propositions as Types" by Philip Wadler]
+
* https://en.wikipedia.org/wiki/Voltage_regulator_module - VRM), sometimes called processor power module (PPM), is a buck converter that provides a microprocessor the appropriate supply voltage, converting +5 V or +12 V to a much lower voltage required by the CPU, allowing processors with different supply voltage to be mounted on the same motherboard.
  
  
  
 +
* [https://libresilicon.com/ Libre Silicon] - We develop a free (as in freedom, not as in free of charge) and open source semiconductor manufacturing process standard, including a full mixed signal PDK, and provide a quick, easy and inexpensive way for manufacturing. No NDAs will be required anywhere to get started, making it possible to build the designs in your basement if you wish so. We are aiming to revolutionize the market by breaking through the monopoly of proprietary closed source manufacturers! [https://news.ycombinator.com/item?id=37939764]
  
* YouTube: [https://www.youtube.com/watch?v=224plb3bCog Chomsky Hierarchy - Computerphile] - Uncomputable through to finite state - Professor Brailsford explains Chomsky's hierarchy.
 
  
* YouTube: [https://www.youtube.com/watch?v=RjOCRYdg8BY Same Story, Different Notation - Computerphile] - Finite State Automata meets Recursion. Professor Brailsford continues the story of computers without memory.
 
  
 +
==== CPU ====
 +
* https://en.wikipedia.org/wiki/Central_processing_unit
  
  
* YouTube: [https://www.youtube.com/watch?v=Mv9NEXX1VHc What on Earth is Recursion? - Computerphile]
+
* https://en.wikipedia.org/wiki/CPU_design
  
  
* https://en.wikipedia.org/wiki/Grzegorczyk_hierarchy - a hierarchy of functions used in computability theory (Wagner and Wechsung 1986:43). Every function in the Grzegorczyk hierarchy is a primitive recursive function, and every primitive recursive function appears in the hierarchy at some level. The hierarchy deals with the rate at which the values of the functions grow; intuitively, functions in lower level of the hierarchy grow slower than functions in the higher levels.
+
* https://github.com/larsbrinkhoff/awesome-cpus
  
  
* https://en.wikipedia.org/wiki/Primitive_recursive_function - class of functions defined using primitive recursion and composition as central operations, strict subset of the total µ-recursive functions
+
* https://en.wikipedia.org/wiki/Semiconductor_intellectual_property_core
  
  
* https://en.wikipedia.org/wiki/μ-recursive_function - '''general recursive functions''', a class of partial functions from natural numbers to natural numbers which are "computable" in an intuitive sense
+
* https://en.wikipedia.org/wiki/Uniprocessor_system
  
* https://en.wikipedia.org/wiki/Ackermann_function
 
  
* YouTube: [https://www.youtube.com/watch?v=i7sm9dzFtEI The Most Difficult Program to Compute? - Computerphile]
+
* https://en.wikipedia.org/wiki/List_of_CPU_architectures
  
 +
* https://news.ycombinator.com/item?id=8529658
  
 +
* [http://www.cpushack.com/CPU/cpu.html#tableofcontents Great Microprocessors of the Past and Present (V 13.4.0)] - [https://news.ycombinator.com/item?id=22017770]
  
  
* https://en.wikipedia.org/wiki/Recursion_(computer_science) - in computer science is a method where the solution to a problem depends on solutions to smaller instances of the same problem (as opposed to iteration). The approach can be applied to many types of problems, and recursion is one of the central ideas of computer science.
 
  
* https://en.wikipedia.org/wiki/Recursive_language
+
* https://en.wikipedia.org/wiki/Control_unit - a component of a computer's central processing unit (CPU) that directs operation of the processor. It controls communication and co-ordination between input/output devices. It reads and interprets instructions and determines the sequence for processing the data.
  
* https://en.wikipedia.org/wiki/Recursive_set - a set of natural numbers is called recursive, computable or decidable if there is an algorithm which terminates after a finite amount of time and correctly decides whether or not a given number belongs to the set. A more general class of sets consists of the recursively enumerable sets, also called semidecidable sets. For these sets, it is only required that there is an algorithm that correctly decides when a number is in the set; the algorithm may give no answer (but not the wrong answer) for numbers not in the set. A set which is not computable is called noncomputable or undecidable.
 
  
 +
* https://en.wikipedia.org/wiki/Control_store - the part of a CPU's control unit that stores the CPU's microprogram. It is usually accessed by a microsequencer.
  
* https://en.wikipedia.org/wiki/Recursively_enumerable_language - also '''recognizable''', '''partially decidable''', '''semidecidable''', '''Turing-acceptable''' or '''Turing-recognizable''', if it is a recursively enumerable subset in the set of all possible words over the alphabet of the language, i.e., if there exists a Turing machine which will enumerate all valid strings of the language. Recursively enumerable languages are known as '''type-0''' languages in the Chomsky hierarchy of formal languages. All regular, context-free, context-sensitive and recursive languages are recursively enumerable. The class of all recursively enumerable languages is called RE.
 
  
* https://en.wikipedia.org/wiki/RE_(complexity)
+
* https://en.wikipedia.org/wiki/Microsequencer
  
* https://en.wikipedia.org/wiki/Recursively_enumerable_set - a set S of natural numbers is called recursively enumerable, computably enumerable, semidecidable, provable or Turing-recognizable if: There is an algorithm such that the set of input numbers for which the algorithm halts is exactly S, or equivalently; There is an algorithm that enumerates the members of S. That means that its output is simply a list of the members of S: s1, s2, s3, ... . If necessary, this algorithm may run forever. The first condition suggests why the term semidecidable is sometimes used; the second suggests why computably enumerable is used. The abbreviations r.e. and c.e. are often used, even in print, instead of the full phrase. In computational complexity theory, the complexity class containing all recursively enumerable sets is RE.
+
* https://en.wikipedia.org/wiki/Processor_register
  
* https://existentialtype.wordpress.com/2016/02/22/it-is-what-it-is-and-nothing-else/ [https://news.ycombinator.com/item?id=11149392]
 
  
 +
* [https://lemire.me/blog/2018/09/07/avx-512-when-and-how-to-use-these-new-instructions/ AVX-512: when and how to use these new instructions – Daniel Lemire's blog] -
  
  
  
 +
* https://en.wikipedia.org/wiki/Memory_address_register
 +
* https://en.wikipedia.org/wiki/Memory_data_register
  
* [http://existentialtype.wordpress.com/2011/03/27/the-holy-trinity/ The Holy Trinity] - "The doctrine of computational trinitarianism holds that computation manifests itself in three forms: proofs of propositions, programs of a type, and mappings between structures.  These three aspects give rise to three sects of worship: Logic, which gives primacy to proofs and propositions; Languages, which gives primacy to programs and types; Categories, which gives primacy to mappings and structures.  The central dogma of computational trinitarianism holds that Logic, Languages, and Categories are but three manifestations of one divine notion of computation.  There is no preferred route to enlightenment: each aspect provides insights that comprise the experience of computation in our lives." [https://news.ycombinator.com/item?id=13051057]
+
* WP: Register_renaming
 +
* http://www.mikeash.com/pyblog/friday-qa-2013-10-11-why-registers-are-fast-and-ram-is-slow.html
  
 +
* https://en.wikipedia.org/wiki/Accumulator_(computing)
  
* [http://arxiv.org/abs/0903.0340 Physics, Topology, Logic and Computation: A Rosetta Stone] [https://news.ycombinator.com/item?id=7928924] - "In physics, Feynman diagrams are used to reason about quantum processes. In the 1980s, it became clear that underlying these diagrams is a powerful analogy between quantum physics and topology: namely, a linear operator behaves very much like a "cobordism". Similar diagrams can be used to reason about logic, where they represent proofs, and computation, where they represent programs. With the rise of interest in quantum cryptography and quantum computation, it became clear that there is extensive network of analogies between physics, topology, logic and computation. In this expository paper, we make some of these analogies precise using the concept of "closed symmetric monoidal category". We assume no prior knowledge of category theory, proof theory or computer science."
 
  
* https://www.graphene-lda.com/resources/physics-of-triggering/theorems-for-automatic.html
 
  
 +
* https://en.wikipedia.org/wiki/Adder_(electronics)
  
* PDF: [http://www.logicmatters.net/resources/pdfs/Galois.pdf The Galois Connection between Syntax and Semantics] - Peter Smith, University of Cambridge]
+
* [https://giannitedesco.github.io/2019/06/15/abusing-add.html Abusing the CPU’s adder circuits | scaramanga] - [https://news.ycombinator.com/item?id=20190036]
  
  
 +
* https://en.wikipedia.org/wiki/Arithmetic_logic_unit
 +
** http://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html
  
 +
* http://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html
  
* https://en.wikipedia.org/wiki/Higher-order_function
 
  
* https://en.wikipedia.org/wiki/Fixed_point_combinator
+
* https://en.wikipedia.org/wiki/Execution_unit
  
* https://en.wikipedia.org/wiki/Successor_function
 
  
* https://en.wikipedia.org/wiki/Projection_(set_theory)
+
* https://en.wikipedia.org/wiki/Cache_coherence - the uniformity of shared resource data that ends up stored in multiple local caches. When clients in a system maintain caches of a common memory resource, problems may arise with incoherent data, which is particularly the case with CPUs in a multiprocessing system. In the illustration on the right, consider both the clients have a cached copy of a particular memory block from a previous read. Suppose the client on the bottom updates/changes that memory block, the client on the top could be left with an invalid cache of memory without any notification of the change. Cache coherence is intended to manage such conflicts by maintaining a coherent view of the data values in multiple caches.
  
  
 +
* https://en.wikipedia.org/wiki/CPU_cache
  
 +
* YouTube: [https://www.youtube.com/watch?v=6JpLD3PUAZk Why do CPUs Need Caches? - Computerphile]
  
* http://researchblogs.cs.bham.ac.uk/thelablunch/2015/06/types-computation-vs-interaction/ [https://news.ycombinator.com/item?id=9677758]
 
  
* https://en.wikipedia.org/wiki/Semi-Thue_system
 
* https://en.wikipedia.org/wiki/Markov_algorithm
 
  
* https://en.wikipedia.org/wiki/Post_canonical_system - Emil Post
+
* https://en.wikipedia.org/wiki/Instruction_pipeline
 +
* http://lolengine.net/blog/2011/9/17/playing-with-the-cpu-pipeline [https://news.ycombinator.com/item?id=7174251]
  
 +
* https://en.wikipedia.org/wiki/Pipeline_burst_cache
  
* [https://adereth.github.io/blog/2014/02/03/where-lisp-fits/ Where LISP Fits] - [https://news.ycombinator.com/item?id=7170663] - "These simplifications made LISP into a way of describing computable functions much neater than the Turing machines or the general recursive definitions used in recursive function theory. The fact that Turing machines constitute an awkward programming language doesn’t much bother recursive function theorists, because they almost never have any reason to write particular recursive definitions, since the theory concerns recursive functions in general. They often have reason to prove that recursive functions with specific properties exist, but this can be done by an informal argument without having to write them down explicitly. In the early days of computing, some people developed programming languages based on Turing machines; perhaps it seemed more scientific. Anyway, I decided to write a paper describing LISP both as a programming language and as a formalism for doing recursive function theory."
 
  
 +
* https://en.wikipedia.org/wiki/NX_bit - stands for No-eXecute, a technology used in CPUs to segregate areas of memory for use by either storage of processor instructions (code) or for storage of data, a feature normally only found in Harvard architecture processors. However, the NX bit is being increasingly used in conventional von Neumann architecture processors, for security reasons.
  
* [http://www.charlespetzold.com/code/ Code: The Hidden Language of Computer Hardware and Software]
 
  
* https://en.wikipedia.org/wiki/Machine_that_always_halts
+
* https://en.wikipedia.org/wiki/Branch_predictor
  
  
* https://en.wikipedia.org/wiki/Combinatorics
+
* https://en.wikipedia.org/wiki/Branch_predication - a strategy in computer architecture design for mitigating the costs usually associated with conditional branches, particularly branches to short sections of code. It does this by allowing each instruction to conditionally either perform an operation or do nothing.
** https://en.wikipedia.org/wiki/Thue-Morse_sequence - !dre!am!
 
* https://en.wikipedia.org/wiki/Combinatory_logic
 
  
  
* https://www.youtube.com/channel/UCG96LXNYz9x7eTqSRtQ2R9A/feed
 
  
* http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010/video-lectures/ [https://news.ycombinator.com/item?id=9311752]
 
** https://courses.csail.mit.edu/6.042/spring15/mcs.pdf
 
  
==== Turing machine ====
+
* https://en.wikipedia.org/wiki/MIMD
* http://en.wikipedia.org/wiki/Turing_machine - FSM with two stacks (left and right on tape)
 
  
* http://en.wikipedia.org/wiki/Turing_completeness
+
* https://en.wikipedia.org/wiki/SPMD
* http://www.felienne.com/?p=2974
 
* http://beza1e1.tuxen.de/articles/accidentally_turing_complete.html
 
* https://news.ycombinator.com/item?id=6693653
 
  
* https://news.ycombinator.com/item?id=10318729
 
  
* https://en.wikipedia.org/wiki/Universal_Turing_machine
 
  
* https://en.wikipedia.org/wiki/Machine_that_always_halts
+
* https://en.wikipedia.org/wiki/Vector_processor - a central processing unit (CPU) that implements an instruction set containing instructions that operate on one-dimensional arrays of data called vectors
  
* https://stackoverflow.com/questions/2497146/is-css-turing-complete [https://news.ycombinator.com/item?id=7683739]
+
* https://en.wikipedia.org/wiki/Scalar_processor
  
* https://en.wikipedia.org/wiki/Langton%27s_ant - a two-dimensional Turing machine with a very simple set of rules but complicated emergent behavior. It was invented by Chris Langton in 1986 and runs on a square lattice of black and white cells. The universality of Langton's ant was proven in 2000. The idea has been generalized in several different ways, such as turmites which add more colors and more states. [https://news.ycombinator.com/item?id=8265482]
 
** http://demoseen.com/langton/#.FP$!!!!!!!!!!!!!!!!!!!!~
 
  
* https://en.wikipedia.org/wiki/Turmite
+
* https://github.com/kragen/calculusvaporis
  
* https://en.wikipedia.org/wiki/Wolfram%27s_2-state_3-symbol_Turing_machine
 
  
* https://news.ycombinator.com/item?id=8488025
+
* https://news.ycombinator.com/item?id=11836728
* https://news.ycombinator.com/item?id=8487807
 
  
* http://lipas.uwasa.fi/stes/step96/step96/hyotyniemi1/ [https://news.ycombinator.com/item?id=8555036]
 
  
* https://news.ycombinator.com/item?id=9516327
+
* https://news.ycombinator.com/item?id=12933838
  
==== Lambda calculus ====
 
* https://en.wikipedia.org/wiki/Lambda_calculus - a formal system in mathematical logic for expressing computation based on function abstraction and application using variable binding and substitution. It is a universal model of computation that can be used to simulate any single-taped Turing machine and was first introduced by mathematician Alonzo Church in the 1930s as part of an investigation into the foundations of mathematics. Lambda calculus consists of constructing lambda terms and performing reduction operations on them.
 
  
Lambda calculus has applications in many different areas in mathematics, philosophy, linguistics, and computer science. Lambda calculus has played an important role in the development of the theory of programming languages. Functional programming languages implement the lambda calculus. Lambda calculus also is a current research topic in Category theory.
+
* http://2x-1.net/ob/gray1 [https://news.ycombinator.com/item?id=13559615]
  
* https://en.wikipedia.org/wiki/Lambda_calculus_definition
 
  
* https://en.wikipedia.org/wiki/Untyped_lambda_calculus
+
* https://en.wikipedia.org/wiki/Processor_affinity - or CPU pinning or "cache affinity", enables the binding and unbinding of a process or a thread to a central processing unit (CPU) or a range of CPUs, so that the process or thread will execute only on the designated CPU or CPUs rather than any CPU. This can be viewed as a modification of the native central queue scheduling algorithm in a symmetric multiprocessing operating system. Each item in the queue has a tag indicating its kin processor. At the time of resource allocation, each task is allocated to its kin processor in preference to others.
  
 +
==== Microprocessor ====
 +
* https://en.wikipedia.org/wiki/Microprocessor - a computer processor that incorporates the functions of a computer's central processing unit (CPU) on a single integrated circuit
  
* https://en.wikipedia.org/wiki/Church_encoding - a means of representing data and operators in the lambda calculus. The data and operators form a mathematical structure which is embedded in the lambda calculus. The Church numerals are a representation of the natural numbers using lambda notation. The method is named for Alonzo Church, who first encoded data in the lambda calculus this way.
+
* http://www.lighterra.com/papers/modernmicroprocessors/ [https://news.ycombinator.com/item?id=7174513]
  
Terms that are usually considered primitive in other notations (such as integers, booleans, pairs, lists, and tagged unions) are mapped to higher-order functions under Church encoding. The Church-Turing thesis asserts that any computable operator (and its operands) can be represented under Church encoding. In the untyped lambda calculus the only primitive data type is the function.
+
* https://news.ycombinator.com/item?id=10194221
  
 +
* http://www.righto.com/2015/05/the-texas-instruments-tmx-1795-first.html [https://news.ycombinator.com/item?id=9520210]
  
* https://en.wikipedia.org/wiki/μ-recursive_function - a class of partial functions from natural numbers to natural numbers that are "computable" in an intuitive sense. In fact, in computability theory it is shown that the μ-recursive functions are precisely the functions that can be computed by Turing machines. The μ-recursive functions are closely related to primitive recursive functions, and their inductive definition (below) builds upon that of the primitive recursive functions. However, not every μ-recursive function is a primitive recursive function—the most famous example is the Ackermann function. Other equivalent classes of functions are the λ-recursive functions and the functions that can be computed by Markov algorithms. The set of all recursive functions is known as R in computational complexity theory.
+
* http://queue.acm.org/detail.cfm?id=2687011 [https://news.ycombinator.com/item?id=8572123]
  
 +
==== Coprocessor ====
 +
* https://en.wikipedia.org/wiki/Coprocessor - a computer processor used to supplement the functions of the primary processor (the CPU). Operations performed by the coprocessor may be floating point arithmetic, graphics, signal processing, string processing, encryption or I/O Interfacing with peripheral devices. By offloading processor-intensive tasks from the main processor, coprocessors can accelerate system performance. Coprocessors allow a line of computers to be customized, so that customers who do not need the extra performance need not pay for it.
  
  
* http://c2.com/cgi/wiki?LambdaCalculus
+
* https://en.wikipedia.org/wiki/Floating-point_unit - FPU, colloquially a math coprocessor) is a part of a computer system specially designed to carry out operations on floating point numbers. Typical operations are addition, subtraction, multiplication, division, square root, bitshifting. Some systems (particularly older, microcode-based architectures) can also perform various transcendental functions such as exponential or trigonometric calculations, though in most modern processors these are done with software library routines. In a general purpose computer architectures, one or more FPUs may be integrated with the central processing unit; however many embedded processors do not have hardware support for floating-point operations.
 +
** http://www.eecs.berkeley.edu/~wkahan/ieee754status/754story.html
  
 +
* http://lemire.me/blog/2017/02/28/how-many-floating-point-numbers-are-in-the-interval-01/ [https://news.ycombinator.com/item?id=13759458]
  
* YouTube: [https://www.youtube.com/watch?v=eis11j_iGMs Lambda Calculus - Computerphile]
+
* https://en.wikipedia.org/wiki/Arithmetic_underflow - The term arithmetic underflow (also floating point underflow, or just underflow) is a condition in a computer program where the result of a calculation is a number of smaller absolute value than the computer can actually represent in memory on its central processing unit (CPU).
  
* YouTube: [https://www.youtube.com/watch?v=9T8A89jgeTI Essentials: Functional Programming's Y Combinator - Computerphile]
+
* https://en.wikipedia.org/wiki/Denormal_number - fill the underflow gap around zero in floating-point arithmetic. Any non-zero number with magnitude smaller than the smallest normal number is subnormal.
  
  
* PDF: [http://www.cs.bham.ac.uk/~axj/pub/papers/lambda-calculus.pdf A short introduction to the Lambda Calculus] - Achim Jung, March 18, 2004. The  lambda calculus can appear arcane on first encounter. Viewed purely as a “naming device”, however, it is a straighforward extension of ordinary mathematical notation.
 
  
* PDF: [http://www.inf.fu-berlin.de/lehre/WS03/alpi/lambda.pdf A Tutorial Introduction to the Lambda Calculus] [https://news.ycombinator.com/item?id=9300373]
+
* https://en.wikipedia.org/wiki/Controller_(computing) - a chip, an expansion card, or a stand-alone device that interfaces with a peripheral device. This may be a link between two parts of a computer (for example a memory controller that manages access to memory for the computer) or a controller on an external device that manages the operation of (and connection with) that device.
  
* http://plato.stanford.edu/entries/lambda-calculus/ [http://news.ycombinator.com/item?id=4932007]
+
The term is sometimes used in the opposite sense to refer to a device by which the user controls the operation of the computer, as in game controller.
 +
In desktop computers the controller may be a plug in board, a single integrated circuit on the motherboard, or an external device. In mainframes the controller is usually either a separate device attached to a channel or integrated into the peripheral.
  
* [http://t3x.org/clc/index.html Compiling Lambda Calculus] - This book introduces the theory and interpretation of lambda calculus. [https://news.ycombinator.com/item?id=17669993]
 
  
 +
* https://en.wikipedia.org/wiki/Memory_controller
  
* http://stackoverflow.com/questions/93526/what-is-a-y-combinator
 
* http://www.confreaks.com/videos/1287-rubyconf2012-y-not-adventures-in-functional-programming
 
  
 +
* https://en.wikipedia.org/wiki/Hardware_acceleration
  
* [http://mvanier.livejournal.com/2897.html The Y Combinator (Slight Return)]
 
  
  
* http://www.reddit.com/r/learnprogramming/comments/xzs76/lambda_calculus_explained_in_the_simplest_terms/c5r6otq
 
  
* http://worrydream.com/AlligatorEggs/
+
* some https://en.wikipedia.org/wiki/Digital_literacy
  
* http://www.reddit.com/r/compsci/comments/1t9yiv/does_anybody_know_of_a_good_text_book_for/
 
  
  
* https://en.wikipedia.org/wiki/SKI_combinator_calculus - a combinatory logic, a computational system that may be perceived as a reduced version of untyped lambda calculus. It can be thought of as a computer programming language, though it is not convenient for writing software. Instead, it is important in the mathematical theory of algorithms because it is an extremely simple Turing complete language. It was introduced by Moses Schönfinkel[1] and Haskell Curry. All operations in lambda calculus can be encoded via abstraction elimination into the SKI calculus as binary trees whose leaves are one of the three symbols S, K, and I (called combinators).
+
* https://en.wikipedia.org/wiki/Compute_kernel - a routine compiled for high throughput accelerators (such as GPUs), DSPs or FPGAs, separate from (but used by) a main program. They are sometimes called compute shaders, sharing execution units with vertex shaders and pixel shaders on GPUs, but are not limited to execution on one class of device, or graphics APIs.
  
 +
==== DSP ====
 +
* https://en.wikipedia.org/wiki/Digital_signal_processor
  
* https://en.wikipedia.org/wiki/Binary_lambda_calculus - a formulation of combinatory logic using only the symbols 0 and 1.
+
* https://en.wikipedia.org/wiki/Parallel_processing_(DSP_implementation)
  
* [http://tromp.github.io/cl/cl.html John's Lambda Calculus and Combinatory Logic Playground]
 
** http://www.ioccc.org/2012/tromp/hint.html tromp] - celebrating the close connection between obfuscation and conciseness, an implementaton of the most concise language known, Binary Lambda Calculus (BLC).
 
  
 +
* http://www.dspguru.com/ [https://news.ycombinator.com/item?id=10627476]
  
* https://en.wikipedia.org/wiki/Pattern_calculus
+
* http://diydsp.com/livesite/
  
* [http://dl.acm.org/citation.cfm?id=1034775/ The pattern calculus] - "There is a significant class of operations such as mapping that are common to all data structures. The goal of generic programming is to support these operations on arbitrary data types without having to recode for each new type. The pattern calculus and combinatory type system reach this goal by representing each data structure as a combination of names and a finite set of constructors. These can be used to define generic functions by pattern-matching programs in which each pattern has a different type. Evaluation is type-free. Polymorphism is captured by quantifying over type variables that represent unknown structures. A practical type inference algorithm is provided."
+
==== CISC ====
 +
* http://en.wikipedia.org/wiki/Complex_instruction_set_computing
  
 +
===== x86 =====
 +
* https://en.wikipedia.org/wiki/Intel_4004
  
===== Typed =====
 
* https://en.wikipedia.org/wiki/Typed_lambda_calculus
 
  
* https://en.wikipedia.org/wiki/Dependent_type
 
  
* https://en.wikipedia.org/wiki/Lambda_cube
+
* https://en.wikipedia.org/wiki/X86_assembly_language
  
  
* https://en.wikipedia.org/wiki/Simply_typed_lambda_calculus
 
  
 +
* https://en.wikipedia.org/wiki/x86
  
* https://en.wikipedia.org/wiki/Pure_type_system
 
  
  
* https://en.wikipedia.org/wiki/Lambda-mu_calculus - an extension of the lambda calculus introduced by M. Parigot. It introduces two new operators: the μ operator (which is completely different both from the μ operator found in computability theory and from the μ operator of modal μ-calculus) and the bracket operator. Semantically these operators correspond to continuations, found in some functional programming languages. Proof-theoretically, it provides a well-behaved formulation of classical natural deduction.
+
* https://en.wikipedia.org/wiki/Intel_8086
  
One of the main goals of this extended calculus is to be able to describe expressions corresponding to theorems in classical logic. According to the Curry–Howard isomorphism, lambda calculus on its own can express theorems in intuitionistic logic only, and several classical logical theorems can't be written at all. However with these new operators one is able to write terms that have the type of, for example, Peirce's law.
 
  
 +
* https://github.com/folkertvanheusden/8086-processor-emulation-validation-testset - This test set allows you to verify the correctness of the 8086 implementation you've put in your emulator.
  
* https://en.wikipedia.org/wiki/System_F - also known as the '''(Girard–Reynolds) polymorphic lambda calculus''' or the '''second-order lambda calculus''', is a typed lambda calculus that differs from the simply typed lambda calculus by the introduction of a mechanism of universal quantification over types. System F thus formalizes the notion of parametric polymorphism in programming languages, and forms a theoretical basis for languages such as Haskell and ML. System F was discovered independently by logician Jean-Yves Girard (1972) and computer scientist John C. Reynolds (1974).
+
* https://github.com/homebrew8088/8086-PC-Compatible - 8086 PC Compatible project developed in 2021. The Motherboard is built to be generally PC XT/AT compatible. THIS DOES NOT WORK CORRECTLY FOR REFERENCE ONLY
  
Whereas simply typed lambda calculus has variables ranging over functions, and binders for them, System F additionally has variables ranging over types, and binders for them. The upper-case Lambda character is traditionally used to denote type-level functions, as opposed to the lower-case lambda which is used for value-level functions.
 
  
  
* https://en.wikipedia.org/wiki/System_U - '''System U''' and '''System U−''' are pure type systems, i.e. special forms of a typed lambda calculus with an arbitrary number of sorts, axioms and rules (or dependencies between the sorts). They were both proved inconsistent by Jean-Yves Girard in 1972. This result led to the realization that Martin-Löf's original 1971 type theory was inconsistent as it allowed the same "Type in Type" behaviour that Girard's paradox exploits.
 
  
 +
* https://en.wikipedia.org/wiki/Intel_8088 - a variant of the Intel 8086. Introduced on June 1, 1979, the 8088 has an eight-bit external data bus instead of the 16-bit bus of the 8086. The 16-bit registers and the one megabyte address range are unchanged, however. In fact, according to the Intel documentation, the 8086 and 8088 have the same execution unit (EU)—only the bus interface unit (BIU) is different. The original IBM PC is based on the 8088, as are its clones.
  
===== to sort =====
 
* https://karczmarczuk.users.greyc.fr/Essays/church.html [https://news.ycombinator.com/item?id=8291905]
 
  
 +
* [https://www.homebrew8088.com/home homebrew8088.com] - 8088 Motherboard project. The Motherboard is built to be generally PC XT compatible. The schematics and source code can be found on my GitHub page. Features: -8088, NEC V20, or NEC V40 Processor -640k RAM (This can be changed) -8 Bit ISA sockets -PC Speaker -USB "Hard Drive" -PS/2 Keyboard -ATX form factor
 +
** https://github.com/homebrew8088/8088-PC-Compatible - 8088 PC Compatible project developed in 2021. The Motherboard is built to be generally PC XT compatible.
  
* [http://dkeenan.com/Lambda/index.htm To Dissect a Mockingbird: A Graphical Notation for the Lambda Calculus with Animated Reduction]
 
  
 +
* https://github.com/homebrew8088/Arduino-8088 - SPI library for Arduino to connect to 8088
  
* http://statusfailed.com/blog/2015/01/27/obfuscated-fibonacci.html [https://news.ycombinator.com/item?id=9026272]
 
  
 +
* https://github.com/homebrew8088/pi86 - Raspberry PI 8088 "hat"
  
* [http://www.learningclojure.com/2015/11/an-introduction-to-lambda-calculus.html An Introduction to the Lambda Calculus] - using Clojure [https://news.ycombinator.com/item?id=13258037]
 
  
* http://www.playingwithpointers.com/compiling-lambda.html [http://www.playingwithpointers.com/compiling-lambda.html]
 
  
* http://tadeuzagallo.com/blog/writing-a-lambda-calculus-interpreter-in-javascript/ [https://news.ycombinator.com/item?id=11961914]
 
  
 +
** https://en.wikipedia.org/wiki/Intel_80186
 +
*** https://www.jamieiles.com/80186 [https://news.ycombinator.com/item?id=16140330]
  
* YouTube: [https://www.youtube.com/watch?v=VUhlNx_-wYk Ruby Manor 3 - Programming with Nothing by Tom Stuart]
 
  
  
 +
* https://en.wikipedia.org/wiki/Intel_80286
  
* https://en.wikipedia.org/wiki/Process_calculus - or '''process algebras''' - are a diverse family of related approaches for formally modelling concurrent systems. Process calculi provide a tool for the high-level description of interactions, communications, and synchronizations between a collection of independent agents or processes. They also provide algebraic laws that allow process descriptions to be manipulated and analyzed, and permit formal reasoning about equivalences between processes (e.g., using bisimulation). Leading examples of process calculi include CSP, CCS, ACP, and LOTOS. More recent additions to the family include the π-calculus, the ambient calculus, PEPA, the fusion calculus and the join-calculus
 
  
  
* https://news.ycombinator.com/item?id=18293790
+
* https://en.wikipedia.org/wiki/Intel_80386
  
=== Computational complexity ===
 
* https://en.wikipedia.org/wiki/Computational_complexity_theory
 
  
  
* https://en.wikipedia.org/wiki/Computational_resource
+
* https://en.wikipedia.org/wiki/IA-32
  
  
* https://en.wikipedia.org/wiki/Asymptotic_analysis
 
  
 +
* https://en.wikipedia.org/wiki/X86-64
  
* https://en.wikipedia.org/wiki/Time_complexity - the time complexity of an algorithm quantifies the amount of time taken by an algorithm to run as a function of the length of the string representing the input. The time complexity of an algorithm is commonly expressed using big O notation, which excludes coefficients and lower order terms. When expressed this way, the time complexity is said to be described asymptotically, i.e., as the input size goes to infinity. For example, if the time required by an algorithm on all inputs of size n is at most 5n3 + 3n for any n (bigger than some n0), the asymptotic time complexity is O(n3).
 
  
  
 +
* https://lobste.rs/s/qtb4xg/x86_amd64_instruction_reference
  
* https://en.wikipedia.org/wiki/Big_O_notation - a mathematical notation that describes the limiting behavior of a function when the argument tends towards a particular value or infinity. It is a member of a family of notations invented by Edmund Landau and Paul Bachmann, collectively called Bachmann-Landau notation or asymptotic notation.
 
  
  
* http://bigocheatsheet.com
 
  
* [https://pbs.twimg.com/media/ESYenbKWAAIf43p?format=jpg&name=4096x4096 Big-O Notation in One Picture] [https://twitter.com/kamranahmedse/status/1235708842610212864/photo/1]
+
* https://news.ycombinator.com/item?id=13045558
 +
* https://news.ycombinator.com/item?id=13051137
 +
* https://news.ycombinator.com/item?id=7422703
 +
* http://mainisusuallyafunction.blogspot.co.uk/2014/02/x86-is-turing-complete-with-no-registers.html [https://news.ycombinator.com/item?id=7224061]
 +
* https://code.google.com/p/corkami/wiki/x86oddities
 +
* http://www.cl.cam.ac.uk/~sd601/papers/mov.pdf [https://news.ycombinator.com/item?id=6309631]
 +
* https://news.ycombinator.com/item?id=7680706
 +
* https://en.wikipedia.org/wiki/Advanced_Vector_Extensions
 +
** [http://agner.org/optimize/blog/read.php?i=288 Future instruction set: AVX-512]
  
* SO: [http://stackoverflow.com/questions/487258/plain-english-explanation-of-big-o Plain English explanation of Big O]
 
  
* https://rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation/ [https://news.ycombinator.com/item?id=11636002]
 
  
* [http://videolectures.net/mit6046jf05_demaine_lec02/ Lecture 2: Asymptotic Notation, Recurrences, Substitution, Master Method]
+
* http://0xax.blogspot.co.uk/2014/08/say-hello-to-x64-assembly-part-1.html [https://news.ycombinator.com/item?id=8245581]
  
  
  
* YouTube: [https://www.youtube.com/watch?v=u2DLlNQiPB4 What is complexity theory? (P vs. NP explained visually)]
+
* YouTube: [https://www.youtube.com/watch?v=75gBFiFtAb8 x86 Assembly Crash Course]
 +
* https://www.youtube.com/watch?v=yOyaJXpAYZQ
  
* YouTube: [http://www.youtube.com/watch?v=msp2y_Y5MLE Beyond Computation: The P vs NP Problem - Michael Sipser]
+
* http://www.flatassembler.net/ [https://news.ycombinator.com/item?id=10830255]
  
 +
* https://news.ycombinator.com/item?id=10704222
  
* https://en.wikipedia.org/wiki/Complexity_class
+
* http://www.nasm.us/
  
 +
* https://stefanheule.com/publications/pldi16-strata
  
* https://en.wikipedia.org/wiki/Decision_problem - a question in some formal system with a yes-or-no answer
+
* https://github.com/ghaerr/blink16 - Tiny visual 8086 emulator based on Blink
  
* https://en.wikipedia.org/wiki/List_of_complexity_classes
 
  
 +
* https://news.ycombinator.com/item?id=12581427
  
* https://en.wikipedia.org/wiki/Polynomial_expression
 
  
* https://en.wikipedia.org/wiki/NP_(complexity)
+
* https://en.wikipedia.org/wiki/Input/output_base_address
  
  
 +
* [http://mail.fsfeurope.org/pipermail/discussion/2016-April/010912.html Uncorrectable freedom and security issues on x86 platforms] [https://news.ycombinator.com/item?id=11422531]
  
* https://en.wikipedia.org/wiki/Halting_Problem
+
* https://news.ycombinator.com/item?id=13782477
* [http://www.lel.ed.ac.uk/~gpullum/loopsnoop.html Scooping The Loop Snooper] - A proof that the Halting Problem is undecidable
 
  
  
* [http://www.scottaaronson.com/blog/?p=735 Why Philosophers Should Care About Computational Complexity] [https://news.ycombinator.com/item?id=2861825]
+
* https://copy.sh/v86/
** http://www.scottaaronson.com/papers/philos.pdf
+
** https://github.com/copy/v86/blob/master/Readme.md
  
  
* http://blog.computationalcomplexity.org
+
* https://medium.com/@_neerajpal/explained-difference-between-x86-x64-disassembly-49e9678e1ae2
  
  
 +
* [https://blog.can.ac/2021/03/22/speculating-x86-64-isa-with-one-weird-trick/ Speculating the entire x86-64 Instruction Set In Seconds with This One Weird Trick – Can.ac]
 +
** [https://github.com/can1357/haruspex can1357/haruspex: Exploration of x86-64 ISA using speculative execution.] - a project attempting to explore and audit the x86-64 instruction set by (ab)using speculative execution and certain low-level performance counters Intel CPUs provide mainly for the identification of undocumented opcodes and deducing the pipeline properties of each instruction
  
* https://en.wikipedia.org/wiki/Parameterized_complexity - a branch of computational complexity theory that focuses on classifying computational problems according to their inherent difficulty with respect to multiple parameters of the input or output. The complexity of a problem is then measured as a function in those parameters. This allows the classification of NP-hard problems on a finer scale than in the classical setting, where the complexity of a problem is only measured by the number of bits in the input.
 
  
 +
* https://github.com/xoreaxeaxeax/sandsifter - The sandsifter audits x86 processors for hidden instructions and hardware bugs, by systematically generating machine code to search through a processor's instruction set, and monitoring execution for anomalies. Sandsifter has uncovered secret processor instructions from every major vendor; ubiquitous software bugs in disassemblers, assemblers, and emulators; flaws in enterprise hypervisors; and both benign and security-critical hardware bugs in x86 chips. With the multitude of x86 processors in existence, the goal of the tool is to enable users to check their own systems for hidden instructions and bugs.
  
 +
==== RISC ====
 +
* http://cs.stanford.edu/people/eroberts/courses/soco/projects/risc/risccisc/
  
* https://en.wikipedia.org/wiki/Average-case_complexity
+
* http://en.wikipedia.org/wiki/Reduced_instruction_set_computing
  
* https://en.wikipedia.org/wiki/Worst-case_complexity
+
* http://en.wikipedia.org/wiki/Classic_RISC_pipeline
  
 +
* http://blog.jwhitham.org/2016/02/risc-instruction-sets-i-have-known-and.html [https://news.ycombinator.com/item?id=11607119]
  
 +
===== MIPS =====
 +
* https://en.wikipedia.org/wiki/MIPS_instruction_set
  
  
* https://en.wikipedia.org/wiki/Function_problem
+
* EE Times: [https://www.eetimes.com/document.asp?doc_id=1334087 MIPS Goes Open Source] - [https://news.ycombinator.com/item?id=18701145]
  
  
* https://en.wikipedia.org/wiki/Blum_axioms
+
* [https://virtuallyfun.com/wordpress/2020/09/24/a-modern-risc-workstation-for-a-modern-government-era/ A modern RISC workstation for a modern (government) era. | Fun with virtualization]
  
* https://en.wikipedia.org/wiki/Gap_theorem
+
===== SPARC =====
 +
* https://en.wikipedia.org/wiki/SPARC
  
* https://en.wikipedia.org/wiki/Blum%27s_speedup_theorem
+
===== Power =====
 +
* https://en.wikipedia.org/wiki/Power_Architecture
  
 +
* https://en.wikipedia.org/wiki/IBM_POWER_microprocessors
  
 +
* https://en.wikipedia.org/wiki/IBM_POWER_Instruction_Set_Architecture - older POWER ISA
  
 +
* https://en.wikipedia.org/wiki/PowerPC
  
* https://en.wikipedia.org/wiki/Algorithmic_information_theory
+
* https://en.wikipedia.org/wiki/Cell_(microprocessor)
  
* https://en.wikipedia.org/wiki/Kolmogorov_complexity - the inherent complexity of a given piece of data is hos long the shortest program to make it is
 
  
* https://jeremykun.com/2012/04/21/kolmogorov-complexity-a-primer [https://news.ycombinator.com/item?id=12621018]
+
* http://www.tomshardware.com/news/ibm-power9-servers-supercomputers-nvidia,31567.html [https://www.reddit.com/r/linux/comments/4dwlar/ibms_power9_cpu_could_be_game_changer_in_servers/]
  
 +
===== Alpha =====
 +
* https://en.wikipedia.org/wiki/DEC_Alpha
  
* YouTube: [https://www.youtube.com/watch?v=Qg3XOfioapI "Kolmogorov music" by Christopher Ford]
+
===== ARM =====
 +
* https://en.wikipedia.org/wiki/ARM_architecture
  
 +
* YouTube: [https://www.youtube.com/watch?v=NNol7fRGo2E A tour of the ARM architecture and its Linux support] - Thomas Petazzoni
  
* http://informationtheory.weebly.com/uploads/2/4/6/2/24624554/kolmogorov_complexity.pdf [https://news.ycombinator.com/item?id=11721982]
+
===== RISC-V =====
 +
* http://riscv.org/
 +
** https://en.wikipedia.org/wiki/RISC-V
  
=== to sort ===
+
* http://gigaom.com/2014/08/19/risc-creator-is-pushing-open-source-chips-for-cloud-computing-and-the-internet-of-things/ [https://news.ycombinator.com/item?id=8201544]
  
  
* https://github.com/pervognsen/bitwise - Bitwise is an educational project where we create the software/hardware stack for a computer from scratch.
 
  
 +
* https://github.com/riscv/riscv-opcodes - enumerates standard RISC-V instruction opcodes and control and status registers. It also contains a script to convert them into several formats (C, Scala, LaTeX).
  
* https://news.ycombinator.com/item?id=19259364
 
  
 +
* [https://riscv-programming.org/ RISC-V Assembly Programming] -  This website contains a set of resources to support learning/teaching assembly programming using the RISC-V ISA. [https://news.ycombinator.com/item?id=36641423]
  
* https://en.wikipedia.org/wiki/Code_as_data - In computer science, the expressions code as data and data as code refer to the duality between code and data, that allows computers to treat instructions in a programming language as data handled by a running program.
 
  
  
 +
* [http://www.lowrisc.org/ lowRISC] - producing fully open hardware systems. From the processor core to the development board, our goal is to create a completely open computing eco-system. Our open-source SoC (System-on-a-Chip) designs will be based on the 64-bit RISC-V instruction set architecture. Volume silicon manufacture is planned as is a low-cost development board. There are more details on our plans in these slides from a recent talk [https://news.ycombinator.com/item?id=9227407] [https://news.ycombinator.com/item?id=13129076]
  
* https://en.wikipedia.org/wiki/Temporal_logic
 
  
* https://en.wikipedia.org/wiki/Coalgebra
+
* http://www.lowrisc.org/blog/2017/11/seventh-risc-v-workshop-day-one/ [https://news.ycombinator.com/item?id=15815247]
 +
* http://www.lowrisc.org/blog/2017/11/seventh-risc-v-workshop-day-two/
  
  
 +
* [http://pulp-platform.org/ PULP Platform] - What you will get is a competitive, state-of-the-art 32-bit processor based on the RISC-V architecture, with a rich set of peripherals, and full debug support. At ETH Zurich and Universita’ di Bologna we have put many of the ideas that we have developed through our research on ultra-low-power parallel processing (PULP project) into PULPino. It is the little hip brother to its more serious bigger brothers.
 +
** http://www.eetimes.com/document.asp?doc_id=1329327 [https://news.ycombinator.com/item?id=11422039]
  
* https://en.wikipedia.org/wiki/Informatics_(academic_field)
 
  
 +
* https://news.ycombinator.com/item?id=12715531
  
* https://en.wikipedia.org/wiki/Computer_science
+
* https://github.com/cliffordwolf/picorv32
** [http://i.stanford.edu/~ullman/focs.html Foundations of Computer Science]
 
  
  
* https://en.wikipedia.org/wiki/Theoretical_computer_science
+
* https://github.com/cnlohr/mini-rv32ima - A tiny C header-only risc-v emulator.
  
  
* https://github.com/papers-we-love/papers-we-love
 
  
* http://siek.blogspot.co.uk/2012/07/crash-course-on-notation-in-programming.html [https://news.ycombinator.com/item?id=7035655]
+
* https://www.crowdsupply.com/onchip/open-v https://news.ycombinator.com/item?id=13017478
  
 +
* https://news.ycombinator.com/item?id=13065044
  
* http://en.wikipedia.org/wiki/Programming_language_theory
+
* https://news.ycombinator.com/item?id=13381070
  
  
* https://en.wikipedia.org/wiki/Semantics_(computer_science) -  rigorous mathematical study of the meaning of programming languages by evaluating the meaning of syntactically legal strings
+
* https://www.crowdsupply.com/sifive/hifive1
  
 +
* https://www.sifive.com/products/hifive-unleashed/ [https://news.ycombinator.com/item?id=16298229]
 +
** https://www.crowdsupply.com/sifive/hifive-unleashed
  
 +
* https://fedoraproject.org/wiki/Architectures/RISC-V
  
  
* https://en.wikipedia.org/wiki/Denotational_semantics - approach of formalizing the meanings of programming languages by constructing mathematical objects (called denotations) that describe the meanings of expressions from the languages
+
* [https://twilco.github.io/riscv-from-scratch/2019/03/10/riscv-from-scratch-1.html RISC-V from scratch 1: Introduction, toolchain setup, and hello world!]
 +
* [https://twilco.github.io/riscv-from-scratch/2019/04/27/riscv-from-scratch-2.html RISC-V from scratch 2: Hardware layouts, linker scripts, and C runtimes] - [https://news.ycombinator.com/item?id=19949282]
  
* https://en.wikipedia.org/wiki/Operational_semantics - certain desired properties of a program, such as correctness, safety or security, are verified by constructing proofs from logical statements about its execution and procedures
 
  
* https://en.wikipedia.org/wiki/Axiomatic_semantics - define the meaning of a command in a program by describing its effect on assertions about the program state
+
* https://github.com/standardsemiconductor/lion - Where Lions Roam: RISC-V on the VELDT [https://news.ycombinator.com/item?id=26341055]
* https://en.wikipedia.org/wiki/Algebraic_semantics_(computer_science) - a form of axiomatic semantics based on algebraic laws for describing and reasoning about program semantics in a formal manner.
 
  
* https://en.wikipedia.org/wiki/Symbolic_computation
 
  
* https://news.ycombinator.com/item?id=7028714
+
* https://github.com/OpenXiangShan/XiangShan - Open-source high-performance RISC-V processor
  
* https://en.wikipedia.org/wiki/Predicate_transformer_semantics
+
===== Other =====
 +
* https://www.altera.com/products/processors/overview.html
 +
** http://free-electrons.com/blog/how-we-found-that-the-linux-nios2-memset-implementation-had-a-bug/ [https://news.ycombinator.com/item?id=11552626]
  
  
* https://en.wikipedia.org/wiki/Symbolic_execution - also ''symbolic evaluation'', is a means of analyzing a program to determine what inputs cause each part of a program to execute. An interpreter follows the program, assuming symbolic values for inputs rather than obtaining actual inputs as normal execution of the program would, a case of abstract interpretation. It thus arrives at expressions in terms of those symbols for expressions and variables in the program, and constraints in terms of those symbols for the possible outcomes of each conditional branch.
+
* https://en.wikipedia.org/wiki/SuperH
 +
* http://www.shared-ptr.com/sh_insns.html
 +
* http://j-core.org/ [https://news.ycombinator.com/item?id=12105913]
  
* https://news.ycombinator.com/item?id=16547814
 
  
 +
* https://news.ycombinator.com/item?id=12645661 - 64 bit, 1024 core
  
* https://en.wikipedia.org/wiki/Calculating_Space
 
  
* http://en.wikipedia.org/wiki/Chaitin's_constant
+
* https://github.com/ucb-bar/riscv-boom
  
* http://en.wikipedia.org/wiki/Programming_language_theory
+
* https://news.ycombinator.com/item?id=15342840 - boom2
* http://en.wikipedia.org/wiki/Automatic_programming
 
  
  
 +
* https://github.com/pulp-platform/ariane [https://news.ycombinator.com/item?id=16399759]
  
** http://blog.fogus.me/2011/09/08/10-technical-papers-every-programmer-should-read-at-least-twice/
+
==== GPU ====
* http://matt.might.net/articles/what-cs-majors-should-know/
+
* https://en.wikipedia.org/wiki/Graphics_processing_unit
  
  
* http://computationaltales.blogspot.co.uk/p/posts-by-topic.html
+
* https://en.wikipedia.org/wiki/Nvidia_PureVideo
  
  
* http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
+
* https://en.wikipedia.org/wiki/Unified_Video_Decoder
  
  
* https://www.youtube.com/watch?v=AD4b-52jtos&list=PL2FF649D0C4407B30
+
* http://www.cs.virginia.edu/~gfx/papers/paper.php?paper_id=59 [https://news.ycombinator.com/item?id=8752373]
* https://www.youtube.com/watch?v=2Op3QLzMgSY&list=PL8FE88AA54363BC46
 
* https://www.youtube.com/watch?v=EKWGGDXe5MA&feature=youtu.be
 
  
  
* http://media.ccc.de/browse/congress/2014/31c3_-_6574_-_en_-_saal_1_-_201412301245_-_why_are_computers_so_and_what_can_we_do_about_it_-_peter_sewell.html#video&t=2822
+
==== TPU ====
 +
* https://en.wikipedia.org/wiki/Tensor_processing_unit - are application-specific integrated circuits (ASIC) developed specifically for machine learning. Compared to graphics processing units (which as of 2016 are frequently used for the same tasks), they are designed explicitly for a higher volume of reduced precision computation with higher IOPS per watt (e.g. as little as 8-bit precision), and lack hardware for rasterisation/texture mapping. The chip has been specifically designed for Google's TensorFlow framework, however Google still uses CPUs and GPUs for other machine learning. Other AI accelerator designs are appearing from other vendors also and are aimed at embedded and robotics markets.
  
== Architecture ==
 
See also [[Electronics]]
 
  
* https://www.youtube.com/watch?v=Tg5gJxXBh8s George Dyson on the Origins of the Digital Universe] - The talk focuses on the work done at The Institute for Advanced Study in Princeton New Jersey by such renowned scientists as John von Neumann and Kurt Godel.
+
==== The Mill ====
 
+
* [http://ootbcomp.com/docs/belt/index.html The Belt | Mill computing] [https://news.ycombinator.com/item?id=6138011]
* https://en.wikipedia.org/wiki/Computer_architecture
+
* [https://www.youtube.com/watch?v=c_xaBfMqTPo The Mill] - summary of first three talks
 +
* http://ootbcomp.com/topic/introduction-to-the-mill-cpu-programming-model-2/ [https://news.ycombinator.com/item?id=7198792]
  
* https://en.wikipedia.org/wiki/Harvard_architecture - a computer architecture with physically separate storage and signal pathways for instructions and data. The term originated from the Harvard Mark I relay-based computer, which stored instructions on punched tape (24 bits wide) and data in electro-mechanical counters. These early machines had data storage entirely contained within the central processing unit, and provided no access to the instruction storage as data. Programs needed to be loaded by an operator; the processor could not initialize itself.
+
* https://news.ycombinator.com/item?id=7590377
  
 +
* http://laughtonelectronics.com/Arcana/One-bit%20computer/One-bit%20computer.html [https://news.ycombinator.com/item?id=7616831]
  
* https://en.wikipedia.org/wiki/Von_Neumann_architecture - meaning has evolved to be any stored-program computer in which an instruction fetch and a data operation cannot occur at the same time because they share a common bus. This is referred to as the von Neumann bottleneck and often limits the performance of the system. The design of a von Neumann architecture is simpler than the more modern Harvard architecture which is also a stored-program system but has one dedicated set of address and data buses for reading data from and writing data to memory, and another set of address and data buses for fetching instructions.
+
=== Parallel computing ===
 +
* https://en.wikipedia.org/wiki/Parallel_computing
  
  
* https://en.wikipedia.org/wiki/Modified_Harvard_architecture - a variation of the Harvard computer architecture that allows the contents of the instruction memory to be accessed as if it were data. Most modern computers that are documented as Harvard architecture are, in fact, Modified Harvard architecture.
+
* https://en.wikipedia.org/wiki/Amdahl's_law - a formula which gives the theoretical speedup in latency of the execution of a task at fixed workload that can be expected of a system whose resources are improved. It is named after computer scientist Gene Amdahl, and was presented at the AFIPS Spring Joint Computer Conference in 1967.Amdahl's law is often used in parallel computing to predict the theoretical speedup when using multiple processors. For example, if a program needs 20 hours to complete using a single thread, but a one hour portion of the program cannot be parallelized, therefore only the remaining 19 hours (p = 0.95) of execution time can be parallelized, then regardless of how many threads are devoted to a parallelized execution of this program, the minimum execution time cannot be less than one hour.
  
  
* https://en.wikipedia.org/wiki/Flynn's_taxonomy - a classification of computer architectures, proposed by Michael Flynn in 1966. The classification system has stuck, and has been used as a tool in design of modern processors and their functionalities.
+
* https://en.wikipedia.org/wiki/Automatic_parallelization
  
  
* [http://www.cs.ucf.edu/courses/cda5106/summer02/reading.html CDA 5106 - Advanced Computer Architecture I Reading List]
+
* https://en.wikipedia.org/wiki/Transputer
  
* [https://opencores.org/ OpenCores] - Since 1999, OpenCores is the most prominent online community for the development of gateware IP (Intellectual Properties) Cores. It is the place where such cores are shared and promoted in the spirit of Free and Open Source collaboration.
 
** http://opencores.org/projects - main objective is to design and publish core designs under a license for hardware modeled on the Lesser General Public License (LGPL) for software. We are committed to the ideal of freely available, freely usable and re-usable open source hardware.
 
  
=== Instructions ===
+
* https://en.wikipedia.org/wiki/SIMD - Single instruction, multiple data (SIMD) is a class of parallel computers in Flynn's taxonomy. It describes computers with multiple processing elements that perform the same operation on multiple data points simultaneously. Such machines exploit data level parallelism, but not concurrency: there are simultaneous (parallel) computations, but only a single process (instruction) at a given moment. SIMD is particularly applicable to common tasks such as adjusting the contrast in a digital image or adjusting the volume of digital audio. Most modern CPU designs include SIMD instructions to improve the performance of multimedia use. Not to be confused with SIMT which utilizes threads.
* https://en.wikipedia.org/wiki/Microarchitecture - sometimes abbreviated to µarch or uarch, also called computer organization, is the way a given instruction set architecture (ISA) is implemented on a processor. A given ISA may be implemented with different microarchitectures; implementations may vary due to different goals of a given design or due to shifts in technology. Computer architecture is the combination of microarchitecture and instruction set design.
 
  
* https://en.wikipedia.org/wiki/Instruction_set - or '''instruction set architecture''' ('''ISA'''), is the part of the computer architecture related to programming, including the native data types, instructions, registers, addressing modes, memory architecture, interrupt and exception handling, and external I/O. An ISA includes a specification of the set of opcodes (machine language), and the native commands implemented by a particular processor.
 
  
* https://en.wikipedia.org/wiki/List_of_instruction_sets
+
* [https://zeuxcg.org/2019/02/17/flavors-of-simd/ zeuxcg.org - Flavors of SIMD] - [https://news.ycombinator.com/item?id=19189401]
  
 +
* https://news.ycombinator.com/item?id=19198758
  
* PDF: [http://research.cs.wisc.edu/multifacet/papers/ieeemicro16_card_isa.pdf Proprietary versus open instruction sets] [https://news.ycombinator.com/item?id=12577024]
 
  
 +
* https://en.wikipedia.org/wiki/OpenMP
  
* https://en.wikipedia.org/wiki/Microcode - a layer of hardware-level instructions or data structures involved in the implementation of higher level machine code instructions in central processing units, and in the implementation of the internal logic of many channel controllers, disk controllers, network interface controllers, network processors, graphics processing units, and other hardware. It resides in special high-speed memory and translates machine instructions into sequences of detailed circuit-level operations. It helps separate the machine instructions from the underlying electronics so that instructions can be designed and altered more freely. It also makes it feasible to build complex multi-step instructions while still reducing the complexity of the electronic circuitry compared to other methods. Writing microcode is often called microprogramming and the microcode in a particular processor implementation is sometimes called a microprogram.
 
  
 +
* https://en.wikipedia.org/wiki/OpenACC
  
* https://wiki.archlinux.org/index.php/Microcode
 
  
* [https://downloadcenter.intel.com/download/27337?v=t Linux* Processor Microcode Data File]
 
  
* [http://inertiawar.com/microcode/ Notes on Intel Microcode Updates]
+
* https://github.com/taichi-dev/taichi - a parallel programming language for high-performance numerical computations. It is embedded in Python, and its just-in-time compiler offloads compute-intensive tasks to multi-core CPUs and massively parallel GPUs.
  
  
* https://www.bedroomlan.org/projects/mcasm [https://news.ycombinator.com/item?id=13515866]
 
  
 +
==== GPGPU ====
 +
* http://en.wikipedia.org/wiki/General-purpose_computing_on_graphics_processing_units
  
  
* https://en.wikipedia.org/wiki/Machine_code - a set of instructions executed directly by a computer's central processing unit (CPU). Each instruction performs a very specific task, such as a load, a jump, or an ALU operation on a unit of data in a CPU register or memory. Every program directly executed by a CPU is made up of a series of such instructions. Numerical machine code (i.e., not assembly code) may be regarded as the lowest-level representation of a compiled or assembled computer program or as a primitive and hardware-dependent programming language. While it is possible to write programs directly in numerical machine code, it is tedious and error prone to manage individual bits and calculate numerical addresses and constants manually. It is thus rarely done today, except for situations that require extreme optimization or debugging.
+
* http://gpgpu.org/
  
* https://en.wikipedia.org/wiki/Word_(computer_architecture) - term for the natural unit of data used by a particular processor design. A word is basically a fixed-sized group of digits (binary or decimal) that are handled as a unit by the instruction set or the hardware of the processor. The number of digits in a word (the word size, word width, or word length) is an important characteristic of any specific processor design or computer architecture.
 
  
* https://en.wikipedia.org/wiki/Opcode - the portion of a machine language instruction that specifies the operation to be performed.
 
  
* https://en.wikipedia.org/wiki/Operand#Computer_science - the part of a computer instruction which specifies what data is to be manipulated or operated on, while at the same time representing the data itself. A computer instruction describes an operation such as add or multiply X, while the operand (or operands, as there can be more than one) specify on which X to operate as well as the value of X. Additionally, in assembly language, an operand is a value (an argument) on which the instruction, named by mnemonic, operates. The operand may be a processor register, a memory address, a literal constant, or a label.
 
  
 +
* https://github.com/Meinersbur/ppcg - Using PPCG to generate CUDA or OpenCL code
  
* https://en.wikipedia.org/wiki/Bytecode - also known as p-code (portable code), is a form of instruction set designed for efficient execution by a software interpreter. Unlike human-readable source code, bytecodes are compact numeric codes, constants, and references (normally numeric addresses) which encode the result of parsing and semantic analysis of things like type, scope, and nesting depths of program objects. They therefore allow much better performance than direct interpretation of source code.
 
  
"fundamentally the same as machine code, in that it describes low level operations such as reading and writing memory, and basic calculations. Bytecode is typically conceived to be produced when COMPILING a higher level language, for example PHP or Java, and unlike machine code for many hardware based processors, may have operations to support specific features of the higher level language. A key difference is that the processor of bytecode is usually a program, though processors have been created for interpreting some bytecode specifications, e.g. a processor called SOAR (Smalltalk On A RISC) for Smalltalk bytecode. While you wouldn't typically call native machine code bytecode, for some types of processors such as CISC and EISC (e.g. Linn Rekursiv, from the people who made record players), the processor itself contains a program that is interpreting the machine instructions, so there are parallels." [http://stackoverflow.com/questions/17638888/difference-between-opcode-byte-code-mnemonics-machine-code-and-assembly]
 
  
==== Assembly ====
+
* https://en.wikipedia.org/wiki/Load-link/store-conditional - '''LL/SC''', sometimes known as '''load-reserved/store-conditional''' ('''LR/SC'''), are a pair of instructions used in multithreading to achieve synchronization. Load-link returns the current value of a memory location, while a subsequent store-conditional to the same memory location will store a new value only if no updates have occurred to that location since the load-link. Together, this implements a lock-free atomic read-modify-write operation. "Load-linked" is also known as load-link, load-reserved, and load-locked.
* https://en.wikipedia.org/wiki/Assembly_language - Human readable instructors to the assembler + data bytes + operators
 
  
  
* [http://www.hanshq.net/ones-and-zeros.html Programming With Ones and Zeros] [https://news.ycombinator.com/item?id=8933807]
 
  
 +
==== CUDA ====
 +
* https://en.wikipedia.org/wiki/CUDA - ('''Compute Unified Device Architecture''') is a parallel computing platform and application programming interface (API) model created by Nvidia. It allows software developers and software engineers to use a CUDA-enabled graphics processing unit (GPU) for general purpose processing – an approach termed GPGPU (General-Purpose computing on Graphics Processing Units). The CUDA platform is a software layer that gives direct access to the GPU's virtual instruction set and parallel computational elements, for the execution of compute kernels. The CUDA platform is designed to work with programming languages such as C, C++, and Fortran. This accessibility makes it easier for specialists in parallel programming to use GPU resources, in contrast to prior APIs like Direct3D and OpenGL, which required advanced skills in graphics programming. CUDA-powered GPUs also support programming frameworks such as OpenACC and OpenCL; and HIP by compiling such code to CUDA. When CUDA was first introduced by Nvidia, the name was an acronym for Compute Unified Device Architecture, but Nvidia subsequently dropped the common use of the acronym.
  
* [http://users.ox.ac.uk/~uzdm0006/scans/1kchess/ 1K ZX-81 chess program]
 
** http://thad.frogley.info/archive/the_greatest_program.html [https://news.ycombinator.com/item?id=9151552]
 
  
* [https://github.com/yrp604/rappel Rappel] - assembly REPL. It works by creating a shell ELF, starting it under ptrace, then continiously rewriting/running the .text section, while showing the register states. It's maybe half done right now, and supports Linux x86, amd64, and armv7 (no thumb) at the moment. [https://news.ycombinator.com/item?id=11214868]
+
* https://github.com/NVIDIA/libcudacxx - libcu++, the NVIDIA C++ Standard Library, is the C++ Standard Library for your entire system. It provides a heterogeneous implementation of the C++ Standard Library that can be used in and between CPU and GPU code.
  
 +
* https://github.com/ogiroux/freestanding - A freestanding Standard C++ library for GPU programs.
  
* http://www.corewars.org/
 
  
* http://juhakiili.com/box256/manual/ [https://news.ycombinator.com/item?id=11411449]
 
  
* http://blog.codinghorror.com/heres-the-programming-game-you-never-asked-for/ [https://news.ycombinator.com/item?id=11503194]
+
* [https://dl.acm.org/doi/10.1145/2400682.2400713 Polyhedral parallel code generation for CUDA | ACM Transactions on Architecture and Code Optimization (TACO)]
  
* https://microcorruption.com/login
 
  
* https://www.stockfighter.io/
+
* https://news.ycombinator.com/item?id=13171182
  
* http://boundvariable.org/task.shtml
 
  
* http://www.zachtronics.com/the-codex-of-alchemical-engineering/
 
  
* http://laughtonelectronics.com/Arcana/One-bit%20computer/One-bit%20computer.html [https://news.ycombinator.com/item?id=12469790]
+
* https://github.com/vosen/ZLUDA - CUDA on Intel GPUs
  
  
https://github.com/osandov/asmase - a REPL for assembly language using an LLVM backend. It provides an accurate interactive environment for several architectures.
+
* https://github.com/jgbit/vuda - a header-only library based on Vulkan that provides a CUDA Runtime API interface for writing GPU-accelerated applications.
  
  
* https://en.wikipedia.org/wiki/Disassembler a computer program that translates machine language into assembly language—the inverse operation to that of an assembler. A disassembler differs from a decompiler, which targets a high-level language rather than an assembly language. Disassembly, the output of a disassembler, is often formatted for human-readability rather than suitability for input to an assembler, making it principally a reverse-engineering tool.
+
* https://github.com/rogerallen/raytracinginoneweekendincuda The code for the ebook Ray Tracing in One Weekend by Peter Shirley translated to CUDA by Roger Allen. This work is in the public domain.
  
* [https://emily.st/2015/01/27/reverse-engineering/ A Gentle Primer on Reverse Engineering] - [https://news.ycombinator.com/item?id=8961820]
+
==== OpenCL ====
 +
* https://en.wikipedia.org/wiki/OpenCL - a framework for writing programs that execute across heterogeneous platforms consisting of central processing units (CPUs), graphics processing units (GPUs), digital signal processors (DSPs), field-programmable gate arrays (FPGAs) and other processors or hardware accelerators. OpenCL specifies programming languages (based on C99 and C++11) for programming these devices and application programming interfaces (APIs) to control the platform and execute programs on the compute devices. OpenCL provides a standard interface for parallel computing using task- and data-based parallelism.  
  
  
* http://www.capstone-engine.org/
+
* [https://www.anandtech.com/show/15746/opencl-30-announced-hitting-reset-on-compute-frameworks Khronos Announces OpenCL 3.0: Hitting the Reset Button on Compute Frameworks] -
  
* https://github.com/zyantific/zyan-disassembler-engine [https://news.ycombinator.com/item?id=11434405]
 
  
* https://panopticon.re/ [https://news.ycombinator.com/item?id=11661313]
 
  
 +
* https://github.com/Oblomov/clinfo - Print all known information about all available OpenCL platforms and devices in the system
  
* [http://yasp.me/ yasp] - a fully functional web-based assembler development environment, including a real assembler, emulator and debugger. The assembler dialect is custom and very simple so as to keep the learning curve as shallow as possible. It also features some hardware-elements (LED, Potentiometer, Button, etc.). The goal of this project is to create an environment in which students can learn the assembly language so that they understand computers better. Furthermore it allows them to experiment without the fear of breaking something. The original project team of yasp consists of Robert Fischer and Michael "luto" Lutonsky. For more information take a look at the about-section in the IDEs menu. [https://news.ycombinator.com/item?id=7272652]
 
  
 +
* YouTube: [https://www.youtube.com/watch?v=ZTq8wKnVUZ8 But Mummy I don't want to use CUDA - Open source GPU compute]
  
* https://en.wikipedia.org/wiki/MOS_Technology_6502
 
  
* [http://monster6502.com/ MOnSter 6502] - A new dis-integrated circuit project to make a complete, working transistor-scale replica of the classic MOS 6502 microprocessor. [https://news.ycombinator.com/item?id=11703596]
+
* https://en.wikipedia.org/wiki/SYCL - a higher-level programming model for OpenCL as a single-source domain specific embedded language (DSEL) based on pure C++11 for SYCL 1.2.1 to improve programming productivity. This is a standard developed by Khronos Group, announced in March 2014.
** YouTube: [https://www.youtube.com/watch?v=HDMkw6lnzmI MOnSter 6502 Update #1]
 
  
* [http://skilldrick.github.io/easy6502/ Easy 6502] - how to get started writing 6502 assembly language. The 6502 processor was massive in the seventies and eighties, powering famous computers like the BBC Micro, Atari 2600, Commodore 64, Apple II, and the Nintendo Entertainment System. Bender in Futurama has a 6502 processor for a brain. Even the Terminator was programmed in 6502.
+
==== ROCm ====
 +
* [https://rocm.github.io/ ROCm] - the first open-source HPC/Hyperscale-class platform for GPU computing that’s also programming-language independent. We are bringing the UNIX philosophy of choice, minimalism and modular software development to GPU computing. The new ROCm foundation lets you choose or even develop tools and a language run time for your application.ROCm is built for scale; it supports multi-GPU computing in and out of server-node communication through RDMA. It also simplifies the stack when the driver directly incorporates RDMA peer-sync support.ROCm has a rich system run time with the critical features that large-scale application, compiler and language-run-time development requires.HSA Compliant Runtime and Driver for AMD RADEON GPU’s
  
* http://www.visual6502.org/ [https://news.ycombinator.com/item?id=6372889]
 
  
* https://en.wikipedia.org/wiki/Action!_(programming_language)
+
* AMD [https://docs.amd.com/category/libraries libraries]
  
* http://www.dwheeler.com/6502/a-lang.txt [https://news.ycombinator.com/item?id=12536211]
+
=== Microcontroller ===
  
* [https://jborza.github.io/emulation/2019/10/20/fantasy-console-on-a-console.html Fantasy console on a console | Juraj’s Blog] - [https://news.ycombinator.com/item?id=21309907]
+
* https://en.wikipedia.org/wiki/Microcontroller - a small computer (SoC) on a single integrated circuit containing a processor core, memory, and programmable input/output peripherals. Program memory in the form of Ferroelectric RAM, NOR flash or OTP ROM is also often included on chip, as well as a typically small amount of RAM. Microcontrollers are designed for embedded applications, in contrast to the microprocessors used in personal computers or other general purpose applications consisting of various discrete chips.
  
* https://github.com/jborza/gba-6502
 
  
* [https://floooh.github.io/visual6502remix/ Visual 6502 Remix]
+
* https://en.wikipedia.org/wiki/PIC_microcontroller
** [https://floooh.github.io/2019/12/13/cycle-stepped-6502.html A new cycle-stepped 6502 CPU emulator] - [https://news.ycombinator.com/item?id=21795479]
 
  
* https://floooh.github.io/visual6502remix
 
** https://github.com/floooh/v6502r - Visual6502 Remixed. TL;DR: Take the visual6502 project and turn it into a native+wasm app via perfect6502, Dear ImGui and Sokol.
 
  
 +
* https://news.ycombinator.com/item?id=13902377
  
* https://github.com/gregjames/Sim2600 - Visual6502.org transistor-level simulation of the Atari 2600 game console
 
  
  
  
* https://en.wikipedia.org/wiki/Endianness
+
* https://en.wikipedia.org/wiki/System_on_a_chip
  
 +
* https://en.wikipedia.org/wiki/MPSoC
  
* [https://wordsandbuttons.online/lexical_differential_highlighting_instead_of_syntax_highlighting.html Lexical differential highlighting instead of syntax highlighting]
 
  
=== Processing ===
+
* https://news.ycombinator.com/item?id=13330034
  
* https://en.wikipedia.org/wiki/Microelectronics
 
  
 +
=== ASIC ===
 +
* https://en.wikipedia.org/wiki/Application-specific_integrated_circuit
  
* https://en.wikipedia.org/wiki/Processor_(computing)#Computing
 
  
* https://en.wikipedia.org/wiki/Processor_design
+
* https://en.wikipedia.org/wiki/Application-specific_standard_product
  
  
* https://en.wikipedia.org/wiki/Voltage_regulator_module - VRM), sometimes called processor power module (PPM), is a buck converter that provides a microprocessor the appropriate supply voltage, converting +5 V or +12 V to a much lower voltage required by the CPU, allowing processors with different supply voltage to be mounted on the same motherboard.  
+
=== PAL ===
 +
* https://en.wikipedia.org/wiki/Programmable_Array_Logic - a family of programmable logic device semiconductors used to implement logic functions in digital circuits introduced by Monolithic Memories, Inc. (MMI, in March 1978. MMI obtained a registered trademark on the term PAL for use in "Programmable Semiconductor Logic Circuits". The trademark is currently held by Lattice Semiconductor. PAL devices consisted of a small PROM (programmable read-only memory) core and additional output logic used to implement particular desired logic functions with few components.
  
  
==== CPU ====
+
=== CPLD ===
* https://en.wikipedia.org/wiki/Central_processing_unit
+
* https://en.wikipedia.org/wiki/Complex_programmable_logic_device - '''CPLD''', is a programmable logic device with complexity between that of PALs and FPGAs, and architectural features of both. The main building block of the CPLD is a macrocell, which contains logic implementing disjunctive normal form expressions and more specialized logic operations.
  
 +
=== FPGA ===
 +
* https://en.wikipedia.org/wiki/Field-programmable_gate_array
  
* https://en.wikipedia.org/wiki/CPU_design
 
  
 +
* http://forums.xilinx.com/t5/Embedded-Development-Tools/GPUs-vs-FPGAs/td-p/60112
 +
* https://news.ycombinator.com/item?id=6305113
  
* https://github.com/larsbrinkhoff/awesome-cpus
+
* [http://homes.cs.washington.edu/~asampson/blog/fpga.html An FPGA is an Impoverished Accelerator] [https://news.ycombinator.com/item?id=8665174]
  
  
* https://en.wikipedia.org/wiki/Semiconductor_intellectual_property_core
 
  
 +
* https://github.com/amaranth-lang/amaranth - The Amaranth project provides an open-source toolchain for developing hardware based on synchronous digital logic using the Python programming language, as well as evaluation board definitions, a System on Chip toolkit, and more. It aims to be easy to learn and use, reduce or eliminate common coding mistakes, and simplify the design of complex hardware with reusable components. The Amaranth toolchain consists of the Amaranth hardware definition language, the standard library, the simulator, and the build system, covering all steps of a typical FPGA development workflow. At the same time, it does not restrict the designer’s choice of tools: existing industry-standard (System)Verilog or VHDL code can be integrated into an Amaranth-based design flow, or, conversely, Amaranth code can be integrated into an existing Verilog-based design flow. [https://news.ycombinator.com/item?id=28955377]
  
* https://en.wikipedia.org/wiki/Uniprocessor_system
+
* [https://amaranth-lang.org/docs/amaranth/latest/ Language & toolchain — Amaranth HDL toolchain 0.4.dev223 documentation]
  
  
* https://en.wikipedia.org/wiki/List_of_CPU_architectures
 
  
* https://news.ycombinator.com/item?id=8529658
+
** https://github.com/csboling/pixtolic
  
* [http://www.cpushack.com/CPU/cpu.html#tableofcontents Great Microprocessors of the Past and Present (V 13.4.0)] - [https://news.ycombinator.com/item?id=22017770]
+
=== Memory ===
 +
* https://en.wikipedia.org/wiki/Computer_memory
  
  
 +
* https://en.wikipedia.org/wiki/Create,_read,_update_and_delete
  
* https://en.wikipedia.org/wiki/Control_unit - a component of a computer's central processing unit (CPU) that directs operation of the processor. It controls communication and co-ordination between input/output devices. It reads and interprets instructions and determines the sequence for processing the data.
+
* https://en.wikipedia.org/wiki/Computer_data_storage
  
  
* https://en.wikipedia.org/wiki/Control_store - the part of a CPU's control unit that stores the CPU's microprogram. It is usually accessed by a microsequencer.
+
* https://en.wikipedia.org/wiki/Memory_hierarchy
  
 +
There are four major storage levels:
 +
# Internal – Processor registers and cache.
 +
# Main – the system RAM and controller cards.
 +
# On-line mass storage – Secondary storage.
 +
# Off-line bulk storage – Tertiary and Off-line storage.
  
* https://en.wikipedia.org/wiki/Microsequencer
 
  
* https://en.wikipedia.org/wiki/Processor_register
+
* https://en.wikipedia.org/wiki/Memory_storage_density
  
  
* [https://lemire.me/blog/2018/09/07/avx-512-when-and-how-to-use-these-new-instructions/ AVX-512: when and how to use these new instructions – Daniel Lemire's blog] -
 
  
 +
* https://en.wikipedia.org/wiki/Auxiliary_memory
  
 +
* https://en.wikipedia.org/wiki/Main_memory
  
* https://en.wikipedia.org/wiki/Memory_address_register
 
* https://en.wikipedia.org/wiki/Memory_data_register
 
  
* https://en.wikipedia.org/wiki/Register_renaming
+
* https://en.wikipedia.org/wiki/Non-volatile_memory
* http://www.mikeash.com/pyblog/friday-qa-2013-10-11-why-registers-are-fast-and-ram-is-slow.html
 
  
* https://en.wikipedia.org/wiki/Accumulator_(computing)
+
* https://en.wikipedia.org/wiki/NVDIMM NVDIMM -  a type of random-access memory for computers. Non-volatile memory is memory that retains its contents even when electrical power is removed, for example from an unexpected power loss, system crash, or normal shutdown. "Dual in-line" identifies the memory as using the DIMM package. NVDIMMs improve application performance and system crash recovery time. They enhance solid-state drive (SSD) endurance and reliability. "Non-volatile" products may use volatile memory during normal operation and dump the contents into non-volatile memory if the power fails, using an on-board backup power source. Volatile memory is faster than non-volatile; it is byte-addressable; and it can be written to arbitrarily, without concerns about wear and device lifespan. However, including a second memory to achieve non-volatility (and the on-board backup power source) increases the product cost compared to volatile memory.
  
  
* https://en.wikipedia.org/wiki/Adder_(electronics)
 
  
* https://en.wikipedia.org/wiki/Arithmetic_logic_unit
+
* https://en.wikipedia.org/wiki/Read-only_memory
** http://www.righto.com/2013/09/the-z-80-has-4-bit-alu-heres-how-it.html
 
  
* http://www.righto.com/2017/03/inside-vintage-74181-alu-chip-how-it.html
+
* [http://tubetime.us/index.php/2018/06/04/a-vacuum-tube-rom/ A Vacuum Tube ROM?] - [https://news.ycombinator.com/item?id=17224329]
  
  
* https://en.wikipedia.org/wiki/Execution_unit
 
  
 +
* https://en.wikipedia.org/wiki/ECC_memory - Error correction code memory (ECC memory, is a type of computer data storage that uses an error correction code[a] (ECC) to detect and correct n-bit data corruption which occurs in memory. ECC memory is used in most computers where data corruption cannot be tolerated, like industrial control applications, critical databases, and infrastructural memory caches. Typically, ECC memory maintains a memory system immune to single-bit errors: the data that is read from each word is always the same as the data that had been written to it, even if one of the bits actually stored has been flipped to the wrong state. Most non-ECC memory cannot detect errors, although some non-ECC memory with parity support allows detection but not correction.
  
* https://en.wikipedia.org/wiki/Cache_coherence - the uniformity of shared resource data that ends up stored in multiple local caches. When clients in a system maintain caches of a common memory resource, problems may arise with incoherent data, which is particularly the case with CPUs in a multiprocessing system. In the illustration on the right, consider both the clients have a cached copy of a particular memory block from a previous read. Suppose the client on the bottom updates/changes that memory block, the client on the top could be left with an invalid cache of memory without any notification of the change. Cache coherence is intended to manage such conflicts by maintaining a coherent view of the data values in multiple caches.
+
* [https://sunshowers.io/posts/am5-ryzen-7000-ecc-ram/ ECC RAM on AMD Ryzen 7000 desktop CPUs :: sunshowers] [https://news.ycombinator.com/item?id=37826842]
  
  
* https://en.wikipedia.org/wiki/CPU_cache
 
  
* YouTube: [https://www.youtube.com/watch?v=6JpLD3PUAZk Why do CPUs Need Caches? - Computerphile]
 
  
 +
* https://en.wikipedia.org/wiki/EEPROM
  
  
* https://en.wikipedia.org/wiki/Instruction_pipeline
+
* [https://www.homebrew8088.com/home/28c256-eeprom-writer 28C256 EEPROM Writer] - a simple homemade EEPROM writer that any one can make. The code is written in python. I have included my Kicad Files where you can find the schematics and PCB layout. This was developed to be a cheap alternative for writing 32k EEPROMs for my 8088 projects. You can compile and upload code in the application or just upload a precompiled file. When using the application to compile the JMP code for an 8088 is automatically inserted at address 0x7FF0.
* http://lolengine.net/blog/2011/9/17/playing-with-the-cpu-pipeline [https://news.ycombinator.com/item?id=7174251]
+
** https://github.com/homebrew8088/Raspberry-Pi-32k-EEPROM-Programmer - Rapberry Pi 32k EEPROM Programmer.
  
* https://en.wikipedia.org/wiki/Pipeline_burst_cache
 
  
  
* https://en.wikipedia.org/wiki/NX_bit - stands for No-eXecute, a technology used in CPUs to segregate areas of memory for use by either storage of processor instructions (code) or for storage of data, a feature normally only found in Harvard architecture processors. However, the NX bit is being increasingly used in conventional von Neumann architecture processors, for security reasons.
 
  
  
* https://en.wikipedia.org/wiki/Branch_predictor
+
* https://en.wikipedia.org/wiki/Flash_memory
  
 +
* https://en.wikipedia.org/wiki/Volatile_memory
  
* https://en.wikipedia.org/wiki/Branch_predication - a strategy in computer architecture design for mitigating the costs usually associated with conditional branches, particularly branches to short sections of code. It does this by allowing each instruction to conditionally either perform an operation or do nothing.
+
* https://en.wikipedia.org/wiki/Delay_line_memory
  
  
 +
* https://en.wikipedia.org/wiki/Random-access_memory
  
 +
* https://en.wikipedia.org/wiki/Static_random-access_memory
  
* https://en.wikipedia.org/wiki/MIMD
 
  
* https://en.wikipedia.org/wiki/SPMD
+
* https://en.wikipedia.org/wiki/Dynamic_random-access_memory
  
 +
* https://en.wikipedia.org/wiki/Memory_rank - a set of DRAM chips connected to the same chip select, which are therefore accessed simultaneously. In practice all DRAM chips share all of the other command and control signals, and only the chip select pins for each rank are separate (the data pins are shared across ranks).
  
 +
* https://en.wikipedia.org/wiki/Synchronous_dynamic_random-access_memory
  
* https://en.wikipedia.org/wiki/Vector_processor - a central processing unit (CPU) that implements an instruction set containing instructions that operate on one-dimensional arrays of data called vectors
+
* https://en.wikipedia.org/wiki/DDR_SDRAM
  
* https://en.wikipedia.org/wiki/Scalar_processor
 
  
 +
* https://en.wikipedia.org/wiki/Scratchpad_memory
  
* https://github.com/kragen/calculusvaporis
 
  
  
* https://news.ycombinator.com/item?id=11836728
+
* https://en.wikipedia.org/wiki/Address_space - defines a range of discrete addresses, each of which may correspond to a network host, peripheral device, disk sector, a memory cell or other logical or physical entity.
  
 +
* https://en.wikipedia.org/wiki/Memory_address
  
* https://news.ycombinator.com/item?id=12933838
+
* https://en.wikipedia.org/wiki/Memory_map
  
  
* http://2x-1.net/ob/gray1 [https://news.ycombinator.com/item?id=13559615]
+
* https://en.wikipedia.org/wiki/Memory_management
  
 +
* https://en.wikipedia.org/wiki/Memory_management_unit
  
* https://en.wikipedia.org/wiki/Processor_affinity - or CPU pinning or "cache affinity", enables the binding and unbinding of a process or a thread to a central processing unit (CPU) or a range of CPUs, so that the process or thread will execute only on the designated CPU or CPUs rather than any CPU. This can be viewed as a modification of the native central queue scheduling algorithm in a symmetric multiprocessing operating system. Each item in the queue has a tag indicating its kin processor. At the time of resource allocation, each task is allocated to its kin processor in preference to others.
+
* https://en.wikipedia.org/wiki/Memory_management_(operating_systems)
  
==== Microprocessor ====
 
* https://en.wikipedia.org/wiki/Microprocessor - a computer processor that incorporates the functions of a computer's central processing unit (CPU) on a single integrated circuit
 
  
* http://www.lighterra.com/papers/modernmicroprocessors/ [https://news.ycombinator.com/item?id=7174513]
+
* http://www.memorymanagement.org/
  
* https://news.ycombinator.com/item?id=10194221
+
* https://en.wikipedia.org/wiki/Direct_memory_access
  
* http://www.righto.com/2015/05/the-texas-instruments-tmx-1795-first.html [https://news.ycombinator.com/item?id=9520210]
 
  
* http://queue.acm.org/detail.cfm?id=2687011 [https://news.ycombinator.com/item?id=8572123]
+
* http://nommu.org/ [https://news.ycombinator.com/item?id=12675388]
  
==== Coprocessor ====
+
* http://nommu.org/memory-faq.txt [https://news.ycombinator.com/item?id=12678571]
* https://en.wikipedia.org/wiki/Coprocessor - a computer processor used to supplement the functions of the primary processor (the CPU). Operations performed by the coprocessor may be floating point arithmetic, graphics, signal processing, string processing, encryption or I/O Interfacing with peripheral devices. By offloading processor-intensive tasks from the main processor, coprocessors can accelerate system performance. Coprocessors allow a line of computers to be customized, so that customers who do not need the extra performance need not pay for it.
 
  
  
* https://en.wikipedia.org/wiki/Floating-point_unit - FPU, colloquially a math coprocessor) is a part of a computer system specially designed to carry out operations on floating point numbers. Typical operations are addition, subtraction, multiplication, division, square root, bitshifting. Some systems (particularly older, microcode-based architectures) can also perform various transcendental functions such as exponential or trigonometric calculations, though in most modern processors these are done with software library routines. In a general purpose computer architectures, one or more FPUs may be integrated with the central processing unit; however many embedded processors do not have hardware support for floating-point operations.
+
* https://en.wikipedia.org/wiki/Bank_switching - a technique used in computer design to increase the amount of usable memory beyond the amount directly addressable by the processor. It can be used to configure a system differently at different times; for example, a ROM required to start a system from diskette could be switched out when no longer needed.
** http://www.eecs.berkeley.edu/~wkahan/ieee754status/754story.html
 
  
* http://lemire.me/blog/2017/02/28/how-many-floating-point-numbers-are-in-the-interval-01/ [https://news.ycombinator.com/item?id=13759458]
 
  
 +
* https://en.wikipedia.org/wiki/Slab_allocation - a memory management mechanism intended for the efficient memory allocation of kernel objects. It eliminates fragmentation caused by allocations and deallocations. The technique is used to retain allocated memory that contains a data object of a certain type for reuse upon subsequent allocations of objects of the same type. It is analogous to an object pool, but only applies to memory, not other resources. Slab allocation was first introduced in the Solaris 5.4 kernel by Jeff Bonwick. It is now widely used by many Unix and Unix-like operating systems including FreeBSD and Linux.
  
* https://en.wikipedia.org/wiki/Controller_(computing) - a chip, an expansion card, or a stand-alone device that interfaces with a peripheral device. This may be a link between two parts of a computer (for example a memory controller that manages access to memory for the computer) or a controller on an external device that manages the operation of (and connection with) that device.
 
  
The term is sometimes used in the opposite sense to refer to a device by which the user controls the operation of the computer, as in game controller.
+
* https://en.wikipedia.org/wiki/Memory_segmentation
In desktop computers the controller may be a plug in board, a single integrated circuit on the motherboard, or an external device. In mainframes the controller is usually either a separate device attached to a channel or integrated into the peripheral.
 
  
* https://en.wikipedia.org/wiki/Memory_controller
+
* https://en.wikipedia.org/wiki/Segmentation_fault
  
  
* https://en.wikipedia.org/wiki/Hardware_acceleration
+
* https://en.wikipedia.org/wiki/Memory_protection
  
 +
* https://en.wikipedia.org/wiki/Executable_space_protection -  the marking of memory regions as non-executable, such that an attempt to execute machine code in these regions will cause an exception. It makes use of hardware features such as the NX bit, or in some cases software emulation of those features.
  
* some https://en.wikipedia.org/wiki/Digital_literacy
 
  
 +
* https://en.wikipedia.org/wiki/Virtual_memory - a memory management technique that is implemented using both hardware and software. It maps memory addresses used by a program, called virtual addresses, into physical addresses in computer memory.
  
 +
* https://en.wikipedia.org/wiki/Virtual_address_space
  
* https://en.wikipedia.org/wiki/Compute_kernel - a routine compiled for high throughput accelerators (such as GPUs), DSPs or FPGAs, separate from (but used by) a main program. They are sometimes called compute shaders, sharing execution units with vertex shaders and pixel shaders on GPUs, but are not limited to execution on one class of device, or graphics APIs.
 
  
==== DSP ====
 
* https://en.wikipedia.org/wiki/Digital_signal_processor
 
  
* https://en.wikipedia.org/wiki/Parallel_processing_(DSP_implementation)
+
* https://en.wikipedia.org/wiki/Paging - a memory management scheme by which a computer stores and retrieves data from secondary storage[a] for use in main memory.
  
 +
* https://en.wikipedia.org/wiki/Page_(computer_memory) - '''memory page''', or '''virtual page''' is a fixed-length contiguous block of virtual memory, described by a single entry in the page table. It is the smallest unit of data for memory management in a virtual memory operating system.
  
* http://www.dspguru.com/ [https://news.ycombinator.com/item?id=10627476]
+
* https://en.wikipedia.org/wiki/Page_table - the data structure used by a virtual memory system in a computer operating system to store the mapping between virtual addresses and physical addresses. Virtual addresses are used by the accessing process, while physical addresses are used by the hardware, or more specifically, by the RAM subsystem.
  
* http://diydsp.com/livesite/
 
  
==== FPGA ====
+
* [https://offlinemark.com/2020/10/14/demand-paging/ What they don't tell you about demand paging in school - offlinemark]
* https://en.wikipedia.org/wiki/Field-programmable_gate_array
 
  
* http://forums.xilinx.com/t5/Embedded-Development-Tools/GPUs-vs-FPGAs/td-p/60112
 
* https://news.ycombinator.com/item?id=6305113
 
  
* [http://homes.cs.washington.edu/~asampson/blog/fpga.html An FPGA is an Impoverished Accelerator] [https://news.ycombinator.com/item?id=8665174]
+
* https://en.wikipedia.org/wiki/Page_fault - a type of interrupt, called trap, raised by computer hardware when a running program accesses a memory page that is mapped into the virtual address space, but not actually loaded into main memory. When handling a page fault, the operating system generally tries to make the required page accessible at the location in physical memory, or terminates the program in case of an illegal memory access. Contrary to what "fault" might suggest, valid page/hard faults are not errors, and are common and necessary to increase the amount of memory available to programs in any operating system that utilizes virtual memory,
  
  
==== CISC ====
 
* http://en.wikipedia.org/wiki/Complex_instruction_set_computing
 
  
===== x86 =====
+
* https://en.wikipedia.org/wiki/Thrashing_(computer_science) -  occurs when a computer's virtual memory subsystem is in a constant state of paging, rapidly exchanging data in memory for data on disk, to the exclusion of most application-level processing
* https://en.wikipedia.org/wiki/Intel_4004
 
  
* https://en.wikipedia.org/wiki/X86_assembly_language
 
  
* https://en.wikipedia.org/wiki/x86
 
** https://en.wikipedia.org/wiki/Intel_8086
 
** https://en.wikipedia.org/wiki/Intel_80186
 
*** https://www.jamieiles.com/80186 [https://news.ycombinator.com/item?id=16140330]
 
** https://en.wikipedia.org/wiki/Intel_80286
 
** https://en.wikipedia.org/wiki/Intel_80386
 
** https://en.wikipedia.org/wiki/IA-32
 
** https://en.wikipedia.org/wiki/X86-64
 
  
* https://lobste.rs/s/qtb4xg/x86_amd64_instruction_reference
 
  
* https://news.ycombinator.com/item?id=13045558
+
* http://en.wikipedia.org/wiki/Call_stack - a stack data structure that stores information about the active subroutines of a computer program. This kind of stack is also known as an execution stack, control stack, run-time stack, or machine stack, and is often shortened to just "the stack". Although maintenance of the call stack is important for the proper functioning of most software, the details are normally hidden and automatic in high-level programming languages. Many computer instruction sets provide special instructions for manipulating stacks.
* https://news.ycombinator.com/item?id=13051137
+
A call stack is used for several related purposes, but the main reason for having one is to keep track of the point to which each active subroutine should return control when it finishes executing.
* https://news.ycombinator.com/item?id=7422703
 
* http://mainisusuallyafunction.blogspot.co.uk/2014/02/x86-is-turing-complete-with-no-registers.html [https://news.ycombinator.com/item?id=7224061]
 
* https://code.google.com/p/corkami/wiki/x86oddities
 
* http://www.cl.cam.ac.uk/~sd601/papers/mov.pdf [https://news.ycombinator.com/item?id=6309631]
 
* https://news.ycombinator.com/item?id=7680706
 
* https://en.wikipedia.org/wiki/Advanced_Vector_Extensions
 
** [http://agner.org/optimize/blog/read.php?i=288 Future instruction set: AVX-512]
 
  
* http://0xax.blogspot.co.uk/2014/08/say-hello-to-x64-assembly-part-1.html [https://news.ycombinator.com/item?id=8245581]
+
* https://en.wikipedia.org/wiki/Stack-based_memory_allocation - because data is added and removed to the stack in a last-in-first-out manner, stack-based memory allocation is very simple and typically faster than heap-based memory allocation (also known as dynamic memory allocation).
 +
 
 +
* http://jvns.ca/blog/2016/03/01/a-few-notes-on-the-stack/ [https://news.ycombinator.com/item?id=11214799]
  
* YouTube: [https://www.youtube.com/watch?v=75gBFiFtAb8 x86 Assembly Crash Course]
+
* http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap/80113#80113
* https://www.youtube.com/watch?v=yOyaJXpAYZQ
 
  
* http://www.flatassembler.net/ [https://news.ycombinator.com/item?id=10830255]
+
* https://news.ycombinator.com/item?id=6848415
  
* https://news.ycombinator.com/item?id=10704222
+
* https://news.ycombinator.com/item?id=6879212
  
* http://www.nasm.us/
+
* https://en.wikipedia.org/wiki/Heap_(data_structure)
  
* https://stefanheule.com/publications/pldi16-strata/
 
  
  
* https://news.ycombinator.com/item?id=12581427
+
* https://en.wikipedia.org/wiki/Non-uniform_memory_access - a computer memory design used in multiprocessing, where the memory access time depends on the memory location relative to the processor. Under NUMA, a processor can access its own local memory faster than non-local memory (memory local to another processor or memory shared between processors). The benefits of NUMA are limited to particular workloads, notably on servers where the data are often associated strongly with certain tasks or users.
  
 +
* http://linux.die.net/man/8/numactl
  
* https://en.wikipedia.org/wiki/Input/output_base_address
 
  
  
* [http://mail.fsfeurope.org/pipermail/discussion/2016-April/010912.html Uncorrectable freedom and security issues on x86 platforms] [https://news.ycombinator.com/item?id=11422531]
+
* http://en.wikipedia.org/wiki/Pointer_(computer_programming) - a programming language object, whose value refers to (or "points to") another value stored elsewhere in the computer memory using its address. A pointer references a location in memory, and obtaining the value stored at that location is known as dereferencing the pointer.  
  
* https://news.ycombinator.com/item?id=13782477
 
  
 +
* r/learnprogramming: [http://www.reddit.com/r/learnprogramming/comments/kzbn6/ What's the point of pointers?]
 +
** http://www.reddit.com/r/learnprogramming/comments/1ehg69/
  
* https://copy.sh/v86/
+
* https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html
** https://github.com/copy/v86/blob/master/Readme.md
 
  
 +
* https://en.wikipedia.org/wiki/Pointer_aliasing - refers to the situation where the same memory location can be accessed using different names.
  
* https://medium.com/@_neerajpal/explained-difference-between-x86-x64-disassembly-49e9678e1ae2
 
  
==== RISC ====
+
* https://en.wikipedia.org/wiki/Smart_pointer
* http://cs.stanford.edu/people/eroberts/courses/soco/projects/risc/risccisc/
 
  
* http://en.wikipedia.org/wiki/Reduced_instruction_set_computing
 
  
* http://en.wikipedia.org/wiki/Classic_RISC_pipeline
+
* https://lwn.net/Articles/219983/
  
* http://blog.jwhitham.org/2016/02/risc-instruction-sets-i-have-known-and.html [https://news.ycombinator.com/item?id=11607119]
 
  
===== MIPS =====
 
* https://en.wikipedia.org/wiki/MIPS_instruction_set
 
  
  
* EE Times: [https://www.eetimes.com/document.asp?doc_id=1334087 MIPS Goes Open Source] - [https://news.ycombinator.com/item?id=18701145]
 
  
===== SPARC =====
+
* [https://www.cheatengine.org/ Cheat Engine]
* https://en.wikipedia.org/wiki/SPARC
 
  
===== Power =====
 
* https://en.wikipedia.org/wiki/Power_Architecture
 
  
* https://en.wikipedia.org/wiki/IBM_POWER_microprocessors
+
* https://github.com/Hexorg/Rampage - Linux memory scanner/editor written in python. Similar to scanmem, artmoney, or cheat engine in concept. Allows you to find values of programs in RAM and then change them. Made to be used inside of a python shell. You don't need to know python to use this, but it can help with some automation.
  
* https://en.wikipedia.org/wiki/IBM_POWER_Instruction_Set_Architecture - older POWER ISA
 
  
* https://en.wikipedia.org/wiki/PowerPC
 
  
* https://en.wikipedia.org/wiki/Cell_(microprocessor)
+
* https://en.wikipedia.org/wiki/Test_and_test-and-set - the test-and-set CPU instruction is used to implement mutual exclusion in multiprocessor environments. Although a correct lock can be implemented with test-and-set, it can lead to resource contention in busy lock (caused by bus locking and cache invalidation when test-and-set operation needs to access memory atomically).To lower the overhead a more elaborate locking protocol test and test-and-set is used. The main idea is to reduce writeback that can create resource contention when two separate threads want the same lock. If n threads are competing for the lock, they will attempt to acquire it as soon as it is released if only using test and set, causing each thread to invalidate the lock flag, meaning it must be propagated through the cache of the remaining processors n times, before any one thread may safely read it. By adding the check-yield step, only the first thread of execution to notice the lock is free will attempt to obtain it, eliminating the writeback.
  
 +
=== Storage ===
 +
See [[Storage]]
  
* http://www.tomshardware.com/news/ibm-power9-servers-supercomputers-nvidia,31567.html [https://www.reddit.com/r/linux/comments/4dwlar/ibms_power9_cpu_could_be_game_changer_in_servers/]
+
* https://en.wikipedia.org/wiki/Persistence_(computer_science)
  
===== Alpha =====
 
* https://en.wikipedia.org/wiki/DEC_Alpha
 
  
===== ARM =====
+
=== Interrupts ===
* https://en.wikipedia.org/wiki/ARM_architecture
+
* https://en.wikipedia.org/wiki/Interrupt - a signal to the processor emitted by hardware or software indicating an event that needs immediate attention. An interrupt alerts the processor to a high-priority condition requiring the interruption of the current code the processor is executing. The processor responds by suspending its current activities, saving its state, and executing a function called an interrupt handler (or an interrupt service routine, ISR) to deal with the event. This interruption is temporary, and, after the interrupt handler finishes, the processor resumes normal activities.
  
* YouTube: [https://www.youtube.com/watch?v=NNol7fRGo2E A tour of the ARM architecture and its Linux support] - Thomas Petazzoni
 
  
===== RISC-V =====
+
* https://en.wikipedia.org/wiki/Interrupt_request_(PC_architecture) - or '''IRQ''', is a hardware signal sent to the processor that temporarily stops a running program and allows a special program, an interrupt handler, to run instead. Hardware interrupts are used to handle events such as receiving data from a modem or network card, key presses, or mouse movements.
* http://riscv.org/
 
** https://en.wikipedia.org/wiki/RISC-V
 
  
* http://gigaom.com/2014/08/19/risc-creator-is-pushing-open-source-chips-for-cloud-computing-and-the-internet-of-things/ [https://news.ycombinator.com/item?id=8201544]
+
Interrupt lines are often identified by an index with the format of IRQ followed by a number. For example, on the Intel 8259 family of PICs there are eight interrupt inputs commonly referred to as IRQ0 through IRQ7. In x86 based computer systems that use two of these PICs, the combined set of lines are referred to as IRQ0 through IRQ15. Technically these lines are named IR0 through IR7, and the lines on the ISA bus to which they were historically attached are named IRQ0 through IRQ15. Newer x86 systems integrate an Advanced Programmable Interrupt Controller (APIC) that conforms to the Intel APIC Architecture. These APICs support a programming interface for up to 255 physical hardware IRQ lines per APIC, with a typical system implementing support for only around 24 total hardware lines.
  
* [http://www.lowrisc.org/ lowRISC] - producing fully open hardware systems. From the processor core to the development board, our goal is to create a completely open computing eco-system. Our open-source SoC (System-on-a-Chip) designs will be based on the 64-bit RISC-V instruction set architecture. Volume silicon manufacture is planned as is a low-cost development board. There are more details on our plans in these slides from a recent talk [https://news.ycombinator.com/item?id=9227407] [https://news.ycombinator.com/item?id=13129076]
+
* https://en.wikipedia.org/wiki/Interrupt_handler - also known as an '''interrupt service routine''' or '''ISR''', a callback function in microcontroller firmware, an operating system or a device driver, whose execution is triggered by the reception of an interrupt. In general, interrupts and their handlers are used to handle high-priority conditions that require the interruption of the current code the processor is executing.
  
 +
Interrupt handlers have a multitude of functions, which vary based on the reason the interrupt was generated and the speed at which the interrupt handler completes its task. For example, pressing a key on a computer keyboard, or moving the mouse, triggers interrupts that call interrupt handlers which read the key, or the mouse's position, and copy the associated information into the computer's memory.
 +
An interrupt handler is a low-level counterpart of event handlers. These handlers are initiated by either hardware interrupts or interrupt instructions in software, and are used for servicing hardware devices and transitions between protected modes of operation such as system calls.
  
* http://www.lowrisc.org/blog/2017/11/seventh-risc-v-workshop-day-one/ [https://news.ycombinator.com/item?id=15815247]
 
* http://www.lowrisc.org/blog/2017/11/seventh-risc-v-workshop-day-two/
 
  
 +
* https://en.wikipedia.org/wiki/Exception_handling -  the process of responding to the occurrence, during computation, of exceptions – anomalous or exceptional conditions requiring special processing – often changing the normal flow of program execution. It is provided by specialized programming language constructs or computer hardware mechanisms.
  
* [http://pulp-platform.org/ PULP Platform] - What you will get is a competitive, state-of-the-art 32-bit processor based on the RISC-V architecture, with a rich set of peripherals, and full debug support. At ETH Zurich and Universita’ di Bologna we have put many of the ideas that we have developed through our research on ultra-low-power parallel processing (PULP project) into PULPino. It is the little hip brother to its more serious bigger brothers.
 
** http://www.eetimes.com/document.asp?doc_id=1329327 [https://news.ycombinator.com/item?id=11422039]
 
  
 +
* https://en.wikipedia.org/wiki/Programmable_Interrupt_Controller
  
* https://news.ycombinator.com/item?id=12715531
+
* https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller
  
* https://github.com/cliffordwolf/picorv32
+
* https://en.wikipedia.org/wiki/Message_Signaled_Interrupts - an alternative in-band method of signaling an interrupt, using special in-band messages to replace traditional out-of-band assertion of dedicated interrupt lines. While more complex to implement in a device, message signaled interrupts have some significant advantages over pin-based out-of-band interrupt signaling. Message signaled interrupts are supported in PCI bus since its version 2.2, and in later available PCI Express bus. Some non-PCI architectures also use message signaled interrupts.
  
 +
* https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/PCI/MSI-HOWTO.txt?id=HEAD
  
* https://www.crowdsupply.com/onchip/open-v https://news.ycombinator.com/item?id=13017478
+
* http://stackoverflow.com/questions/10894702/diff-between-io-apic-level-and-pci-msi-x
  
* https://news.ycombinator.com/item?id=13065044
 
  
* https://news.ycombinator.com/item?id=13381070
+
* https://github.com/Irqbalance/irqbalance - a daemon to help balance the cpu load generated by interrupts across all of a systems cpus. Irqbalance identifies the highest volume interrupt sources, and isolates them to a single unique cpu, so that load is spread as much as possible over an entire processor set, while minimizing cache miss rates for irq handlers.
 +
 
  
  
* https://www.crowdsupply.com/sifive/hifive1
+
=== Other ===
 +
* https://news.ycombinator.com/item?id=8773114
  
* https://www.sifive.com/products/hifive-unleashed/ [https://news.ycombinator.com/item?id=16298229]
 
** https://www.crowdsupply.com/sifive/hifive-unleashed
 
  
* https://fedoraproject.org/wiki/Architectures/RISC-V
+
=== Security ===
 +
* https://en.wikipedia.org/wiki/CPU_modes
  
 +
* https://en.wikipedia.org/wiki/Protection_ring
  
* [https://twilco.github.io/riscv-from-scratch/2019/03/10/riscv-from-scratch-1.html RISC-V from scratch 1: Introduction, toolchain setup, and hello world!]
 
* [https://twilco.github.io/riscv-from-scratch/2019/04/27/riscv-from-scratch-2.html RISC-V from scratch 2: Hardware layouts, linker scripts, and C runtimes] - [https://news.ycombinator.com/item?id=19949282]
 
  
===== Other =====
 
* https://www.altera.com/products/processors/overview.html
 
** http://free-electrons.com/blog/how-we-found-that-the-linux-nios2-memset-implementation-had-a-bug/ [https://news.ycombinator.com/item?id=11552626]
 
  
 +
* https://en.wikipedia.org/wiki/Capability-based_security
  
* https://en.wikipedia.org/wiki/SuperH
 
* http://www.shared-ptr.com/sh_insns.html
 
* http://j-core.org/ [https://news.ycombinator.com/item?id=12105913]
 
  
 +
== Runtime ==
  
* https://news.ycombinator.com/item?id=12645661 - 64 bit, 1024 core
 
  
 +
* https://en.wikipedia.org/wiki/Computing_platform - or '''digital platform''' or '''software platform''' is an environment in which a piece of software is executed. It may be the hardware or the operating system (OS), even a web browser and associated application programming interfaces, or other underlying software, as long as the program code is executed with it. Computing platforms have different abstraction levels, including a computer architecture, an OS, or runtime libraries. A computing platform is the stage on which computer programs can run. A platform can be seen both as a constraint on the software development process, in that different platforms provide different functionality and restrictions; and as an assistant to the development process, in that they provide low-level functionality ready-made. For example, an OS may be a platform that abstracts the underlying differences in hardware and provides a generic command for saving files or accessing the network.
  
* https://github.com/ucb-bar/riscv-boom
 
  
* https://news.ycombinator.com/item?id=15342840 - boom2
 
  
 +
* https://en.wikipedia.org/wiki/Runtime_system - or '''runtime environment''' is a sub-system that exists both in the computer where a program is created, as well as in the computers where the program is intended to be run. The name comes from the compile time and runtime division from compiled languages, which similarly distinguishes the computer processes involved in the creation of a program (compilation) and its execution in the target machine (the run time). Most programming languages have some form of runtime system that provides an environment in which programs run. This environment may address a number of issues including the management of application memory, how the program accesses variables, mechanisms for passing parameters between procedures, interfacing with the operating system, and otherwise. The compiler makes assumptions depending on the specific runtime system to generate correct code. Typically the runtime system will have some responsibility for setting up and managing the stack and heap, and may include features such as garbage collection, threads or other dynamic features built into the language.
  
* https://github.com/pulp-platform/ariane [https://news.ycombinator.com/item?id=16399759]
 
  
==== GPU ====
 
* https://en.wikipedia.org/wiki/Graphics_processing_unit
 
  
  
* https://en.wikipedia.org/wiki/Nvidia_PureVideo
+
* https://en.wikipedia.org/wiki/Interpreted_language
  
  
* https://en.wikipedia.org/wiki/Unified_Video_Decoder
 
  
 +
* https://en.wikipedia.org/wiki/Interpreter_(computing)
  
* http://www.cs.virginia.edu/~gfx/papers/paper.php?paper_id=59 [https://news.ycombinator.com/item?id=8752373]
 
  
 +
* https://en.wikipedia.org/wiki/Scripting_language
  
==== TPU ====
 
* https://en.wikipedia.org/wiki/Tensor_processing_unit - are application-specific integrated circuits (ASIC) developed specifically for machine learning. Compared to graphics processing units (which as of 2016 are frequently used for the same tasks), they are designed explicitly for a higher volume of reduced precision computation with higher IOPS per watt (e.g. as little as 8-bit precision), and lack hardware for rasterisation/texture mapping. The chip has been specifically designed for Google's TensorFlow framework, however Google still uses CPUs and GPUs for other machine learning. Other AI accelerator designs are appearing from other vendors also and are aimed at embedded and robotics markets.
 
  
  
==== The Mill ====
+
* https://en.wikipedia.org/wiki/Read-eval-print_loop - '''REPL''', also termed an '''interactive toplevel''' or '''language shell''', is a simple interactive computer programming environment that takes single user inputs, executes them, and returns the result to the user; a program written in a REPL environment is executed piecewise. The term usually refers to programming interfaces similar to the classic Lisp machine interactive environment. Common examples include command-line shells and similar environments for programming languages, and the technique is very characteristic of scripting languages.
* [http://ootbcomp.com/docs/belt/index.html The Belt | Mill computing] [https://news.ycombinator.com/item?id=6138011]
 
* [https://www.youtube.com/watch?v=c_xaBfMqTPo The Mill] - summary of first three talks
 
* http://ootbcomp.com/topic/introduction-to-the-mill-cpu-programming-model-2/ [https://news.ycombinator.com/item?id=7198792]
 
  
* https://news.ycombinator.com/item?id=7590377
 
  
* http://laughtonelectronics.com/Arcana/One-bit%20computer/One-bit%20computer.html [https://news.ycombinator.com/item?id=7616831]
 
  
  
=== Parallel computing ===
 
* https://en.wikipedia.org/wiki/Parallel_computing
 
  
 +
* https://en.wikipedia.org/wiki/Green_threads - threads that are scheduled by a runtime library or virtual machine (VM) instead of natively by the underlying operating system. Green threads emulate multithreaded environments without relying on any native OS capabilities, and they are managed in user space instead of kernel space, enabling them to work in environments that do not have native thread support.
  
* https://en.wikipedia.org/wiki/Automatic_parallelization
+
== Programming ==
 +
See also [[Languages]], [[Development]], [[Maths#Software 2]]
  
 +
* https://en.wikipedia.org/wiki/Computer_programming
  
* https://en.wikipedia.org/wiki/Transputer
 
  
 +
=== Assembly ===
 +
* https://en.wikipedia.org/wiki/Assembly_language - Human-readable instructions to the assembler + data bytes + operators
 +
* https://en.wikipedia.org/wiki/Second-generation_programming_language - A generational way to categorize assembly languages.
 +
* https://en.wikipedia.org/wiki/Automatic_programming - A type of computer programming that allows higher abstraction levels.
  
* https://en.wikipedia.org/wiki/SIMD - Single instruction, multiple data (SIMD) is a class of parallel computers in Flynn's taxonomy. It describes computers with multiple processing elements that perform the same operation on multiple data points simultaneously. Such machines exploit data level parallelism, but not concurrency: there are simultaneous (parallel) computations, but only a single process (instruction) at a given moment. SIMD is particularly applicable to common tasks such as adjusting the contrast in a digital image or adjusting the volume of digital audio. Most modern CPU designs include SIMD instructions to improve the performance of multimedia use. Not to be confused with SIMT which utilizes threads.
+
==== Learning Assembly ====
 +
* [http://www.hanshq.net/ones-and-zeros.html Programming With Ones and Zeros] [https://news.ycombinator.com/item?id=8933807]
 +
* https://github.com/FFmpeg/asm-lessons - FFmpeg School of Assembly Language
 +
* [http://savannah.nongnu.org/projects/pgubook/ Programming from the Ground Up Book] [https://news.ycombinator.com/item?id=11702025]
 +
** http://ftp.igh.cnrs.fr/pub/nongnu//pgubook/ProgrammingGroundUp-1-0-lettersize.pdf
  
 +
==== Assembly Tools ====
 +
* [https://github.com/yrp604/rappel Rappel] - Assembly REPL [https://news.ycombinator.com/item?id=11214868]
 +
* https://github.com/osandov/asmase - A REPL for assembly language using an LLVM backend
 +
* [http://yasp.me/ yasp] - A web-based assembler development environment [https://news.ycombinator.com/item?id=7272652]
  
* [https://zeuxcg.org/2019/02/17/flavors-of-simd/ zeuxcg.org - Flavors of SIMD] - [https://news.ycombinator.com/item?id=19189401]
+
==== Assembly Programming Challenges ====
 +
* http://www.corewars.org/
 +
* http://juhakiili.com/box256/manual [https://news.ycombinator.com/item?id=11411449]
 +
* http://blog.codinghorror.com/heres-the-programming-game-you-never-asked-for/ [https://news.ycombinator.com/item?id=11503194]
 +
* https://microcorruption.com/login
 +
* https://www.stockfighter.io/
 +
* http://boundvariable.org/task.shtml
 +
* http://www.zachtronics.com/the-codex-of-alchemical-engineering/
 +
* http://laughtonelectronics.com/Arcana/One-bit%20computer/One-bit%20computer.html [https://news.ycombinator.com/item?id=12469790]
  
* https://news.ycombinator.com/item?id=19198758
+
==== 6502 Assembly ===
 +
* https://en.wikipedia.org/wiki/MOS_Technology_6502
 +
* [http://monster6502.com/ MOnSter 6502] [https://news.ycombinator.com/item?id=11703596]
 +
** YouTube: [https://www.youtube.com/watch?v=HDMkw6lnzmI MOnSter 6502 Update #1]
 +
* [http://skilldrick.github.io/easy6502/ Easy 6502]
 +
* http://www.visual6502.org/ [https://news.ycombinator.com/item?id=6372889]
 +
* [https://floooh.github.io/visual6502remix/ Visual 6502 Remix]
 +
** [https://floooh.github.io/2019/12/13/cycle-stepped-6502.html A new cycle-stepped 6502 CPU emulator] [https://news.ycombinator.com/item?id=21795479]
 +
* https://github.com/gregjames/Sim2600 - Atari 2600 transistor-level simulation
 +
* https://github.com/klynch71/6502sim - Near gate-level Verilog simulation of the 6502
 +
* [http://www.e-basteln.de/computing/65f02/65f02/ The 100 MHz 6502 · e-basteln] [https://news.ycombinator.com/item?id=28852857]
  
 +
=== Reverse Engineering & Disassembly ===
 +
* https://en.wikipedia.org/wiki/Disassembler
 +
* [https://emily.st/2015/01/27/reverse-engineering/ A Gentle Primer on Reverse Engineering] [https://news.ycombinator.com/item?id=8961820]
 +
* http://www.capstone-engine.org/
 +
* https://github.com/zyantific/zyan-disassembler-engine [https://news.ycombinator.com/item?id=11434405]
 +
* https://panopticon.re/ [https://news.ycombinator.com/item?id=11661313]
  
* https://en.wikipedia.org/wiki/OpenMP
+
=== Programming Concepts & Theory ===
 +
* https://en.wikipedia.org/wiki/Endianness
 +
* [https://wordsandbuttons.online/lexical_differential_highlighting_instead_of_syntax_highlighting.html Lexical differential highlighting instead of syntax highlighting]
 +
* [http://www.cs.yale.edu/homes/perlis-alan/quotes.html Epigrams in Programming] by Alan J. Perlis [https://news.ycombinator.com/item?id=8674919]
 +
* [http://www.bowdoin.edu/~ltoma/teaching/cs340/spring05/coursestuff/Bentley_BumperSticker.pdf Bumper-Sticker Computer Science (1985)] [https://news.ycombinator.com/item?id=8676982]
 +
* https://en.wikipedia.org/wiki/The_Elements_of_Programming_Style
 +
* https://github.com/droogans/unmaintainable-code
 +
* https://github.com/dwmkerr/hacker-laws#kernighans-law
  
 +
=== Software Development & Programming Practices ===
 +
* https://en.wikipedia.org/wiki/Dynamic_programming_language
 +
* [https://www.livecoding.tv/ Livecoding.tv] - Livestreaming for coders
 +
* https://en.wikipedia.org/wiki/Self-hosting_(compilers) - the use of a program as part of the toolchain or operating system that produces new versions of that same program—for example, a compiler that can compile its own source code. Self-hosting software is commonplace on personal computers and larger systems. Other programs that are typically self-hosting include kernels, assemblers, command-line interpreters and revision control software.
 +
* https://en.wikipedia.org/wiki/Program_lifecycle_phase
 +
* https://en.wikipedia.org/wiki/Execution_model
  
* https://en.wikipedia.org/wiki/OpenACC
+
=== Programming Cheats & References ===
 +
* [http://cheat.sh/ cheat.sh/:firstpage]
 +
** https://github.com/chubin/cheat.sh
 +
* https://github.com/gleitz/howdoi - Instant coding answers via CLI
  
 +
=== Programming Philosophy ===
 +
* [http://threevirtues.com/ The Three Virtues of a GREAT Programmer] by Larry Wall
 +
** Laziness, Impatience, Hubris
 +
* [http://www.wall.org/~larry/onion/onion.html 2nd State of the Onion]
  
==== GPGPU ====
+
=== Miscellaneous ===
* http://en.wikipedia.org/wiki/General-purpose_computing_on_graphics_processing_units
+
* https://github.com/cjbarber/ToolsOfTheTrade
 +
* StackOverflow: [http://stackoverflow.com/questions/141525/absolute-beginners-guide-to-bit-shifting Absolute Beginner's Guide to Bit Shifting?]
 +
* [http://web.archive.org/web/20160818222826/http://slidetocode.com/2012/05/06/the-perfect-programming-language The genesis of a perfect programming language]
 +
* [http://oredev.org/2012/sessions/its-not-you-its-them-why-programming-languages-are-hard-to-teach Session: It's Not You, It's Them: Why Programming Languages Are Hard To Teach]
 +
* [http://blog.appfog.com/what-the-obama-it-team-teaches-us-about-polyglot-programming/ What the Obama IT team teaches us about polyglot programming]
 +
* https://wg21.link - ISO Working Group document short URLs
  
 +
=== Syntax ===
 +
* https://en.wikipedia.org/wiki/Syntax_(programming_languages)
  
* http://gpgpu.org/
 
  
 +
* https://en.wikipedia.org/wiki/Lexical_grammar - the process of converting a sequence of characters (such as in a computer program or web page) into a sequence of tokens (strings with an identified "meaning"). A program that performs lexical analysis may be called a lexer, tokenizer, or scanner (though "scanner" is also used to refer to the first stage of a lexer). Such a lexer is generally combined with a parser, which together analyze the syntax of programming languages, web pages, and so forth.
  
 +
For instance, the lexical grammar for many programming languages specifies that a string literal starts with a " character and continues until a matching " is found (escaping makes this more complicated), that an identifier is an alphanumeric sequence (letters and digits, usually also allowing underscores, and disallowing initial digits), and that an integer literal is a sequence of digits. So in the following character sequence "abc" xyz1 23 the tokens are string, identifier and number (plus whitespace tokens) because the space character terminates the sequence of characters forming the identifier. Further, certain sequences are categorized as keywords – these generally have the same form as identifiers (usually alphabetical words), but are categorized separately; formally they have a different token type.
  
 +
* https://en.wikipedia.org/wiki/Lexical_analysis - the process of converting a sequence of characters (such as in a computer program or web page) into a sequence of tokens (strings with an identified "meaning"). A program that performs lexical analysis may be called a lexer, tokenizer, or scanner (though "scanner" is also used to refer to the first stage of a lexer). Such a lexer is generally combined with a parser, which together analyze the syntax of programming languages, web pages, and so forth.
  
* https://github.com/Meinersbur/ppcg - Using PPCG to generate CUDA or OpenCL code
 
  
 +
* https://en.wikipedia.org/wiki/Language_construct - a syntactically allowable part of a program that may be formed from one or more lexical tokens in accordance with the rules of a programming language. The term "language construct" is often used as a synonym for control structure, and should not be confused with a function.
  
==== CUDA ====
+
* https://en.wikipedia.org/wiki/Category:Programming_constructs
* https://en.wikipedia.org/wiki/CUDA - (Compute Unified Device Architecture) is a parallel computing platform and application programming interface (API) model created by Nvidia. It allows software developers and software engineers to use a CUDA-enabled graphics processing unit (GPU) for general purpose processing – an approach termed GPGPU (General-Purpose computing on Graphics Processing Units). The CUDA platform is a software layer that gives direct access to the GPU's virtual instruction set and parallel computational elements, for the execution of compute kernels. The CUDA platform is designed to work with programming languages such as C, C++, and Fortran. This accessibility makes it easier for specialists in parallel programming to use GPU resources, in contrast to prior APIs like Direct3D and OpenGL, which required advanced skills in graphics programming. CUDA-powered GPUs also support programming frameworks such as OpenACC and OpenCL; and HIP by compiling such code to CUDA. When CUDA was first introduced by Nvidia, the name was an acronym for Compute Unified Device Architecture, but Nvidia subsequently dropped the common use of the acronym.
 
  
  
* [https://dl.acm.org/doi/10.1145/2400682.2400713 Polyhedral parallel code generation for CUDA | ACM Transactions on Architecture and Code Optimization (TACO)]
 
  
 +
* https://en.wikipedia.org/wiki/Syntactic_noise - syntax within a programming language that makes the programming language more difficult to read and understand for humans. It fills the language with excessive clutter that makes it a hassle to write code. Syntactic noise is considered to be the opposite of syntactic sugar, which is syntax that makes a programming language more readable and enjoyable for the programmer.
  
* https://news.ycombinator.com/item?id=13171182
+
* [https://martinfowler.com/bliki/SyntacticNoise.html SyntacticNoise]
  
  
==== OpenCL ====
 
* https://en.wikipedia.org/wiki/OpenCL - a framework for writing programs that execute across heterogeneous platforms consisting of central processing units (CPUs), graphics processing units (GPUs), digital signal processors (DSPs), field-programmable gate arrays (FPGAs) and other processors or hardware accelerators. OpenCL specifies programming languages (based on C99 and C++11) for programming these devices and application programming interfaces (APIs) to control the platform and execute programs on the compute devices. OpenCL provides a standard interface for parallel computing using task- and data-based parallelism.
 
  
* https://github.com/Oblomov/clinfo - Print all known information about all available OpenCL platforms and devices in the system
+
* https://en.wikipedia.org/wiki/Catalan_number - a sequence of natural numbers that occur in various counting problems, often involving recursively-defined objects. They are named after the Belgian mathematician Eugène Charles Catalan (1814–1894).
  
 +
Using zero-based numbering, the nth Catalan number is given directly in terms of binomial coefficients. The first Catalan numbers for n = 0, 1, 2, 3, … are: 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, … (sequence A000108 in OEIS).
  
* YouTube: [https://www.youtube.com/watch?v=ZTq8wKnVUZ8 But Mummy I don't want to use CUDA - Open source GPU compute]
 
  
 +
* https://en.wikipedia.org/wiki/Dyck_language - the language consisting of balanced strings of square brackets [ and ]. It is important in the parsing of expressions that must have a correctly nested sequence of brackets, such as arithmetic or algebraic expressions.
  
* https://en.wikipedia.org/wiki/SYCL - a higher-level programming model for OpenCL as a single-source domain specific embedded language (DSEL) based on pure C++11 for SYCL 1.2.1 to improve programming productivity. This is a standard developed by Khronos Group, announced in March 2014.
 
  
 +
* http://interactivepython.org/runestone/static/pythonds/BasicDS/SimpleBalancedParentheses.html
  
==== ROCm ====
 
* [https://rocm.github.io/ ROCm] - the first open-source HPC/Hyperscale-class platform for GPU computing that’s also programming-language independent. We are bringing the UNIX philosophy of choice, minimalism and modular software development to GPU computing. The new ROCm foundation lets you choose or even develop tools and a language run time for your application.ROCm is built for scale; it supports multi-GPU computing in and out of server-node communication through RDMA. It also simplifies the stack when the driver directly incorporates RDMA peer-sync support.ROCm has a rich system run time with the critical features that large-scale application, compiler and language-run-time development requires.HSA Compliant Runtime and Driver for AMD RADEON GPU’s
 
  
=== Microcontroller ===
 
  
* https://en.wikipedia.org/wiki/Microcontroller - a small computer (SoC) on a single integrated circuit containing a processor core, memory, and programmable input/output peripherals. Program memory in the form of Ferroelectric RAM, NOR flash or OTP ROM is also often included on chip, as well as a typically small amount of RAM. Microcontrollers are designed for embedded applications, in contrast to the microprocessors used in personal computers or other general purpose applications consisting of various discrete chips.
+
* https://en.wikipedia.org/wiki/Reserved_word - also known as a '''reserved identifier''' is a word that cannot be used as an identifier, such as the name of a variable, function, or label – it is "reserved from use". This is a syntactic definition, and a reserved word may have no meaning.
  
 +
A closely related and often conflated notion is a '''keyword''' which is a word with special meaning in a particular context. This is a semantic definition. By contrast, names in a standard library but not built into the language are not considered reserved words or keywords. The terms "reserved word" and "keyword" are often used interchangeably – one may say that a reserved word is "reserved for use as a keyword" – and formal use varies from language to language; for this article we distinguish as above.
  
* https://en.wikipedia.org/wiki/PIC_microcontroller
+
In general reserved words and keywords need not coincide, but in most modern languages keywords are a subset of reserved words, as this makes parsing easier, since keywords cannot be confused with identifiers. In some languages, like C or Python, reserved words and keywords coincide, while in other languages, like Java, all keywords are reserved words, but some reserved words are not keywords – these are "reserved for future use". In yet other languages, such as ALGOL and PL/I there are keywords but no reserved words, with keywords being distinguished from identifiers by other means.
  
 +
* http://crasseux.com/books/ctutorial/Reserved-words-in-C.html
  
* https://news.ycombinator.com/item?id=13902377
 
  
 +
* [https://www.hillelwayne.com/post/equals-as-assignment/ Why Does "=" Mean Assignment?] - [https://news.ycombinator.com/item?id=16803874]
  
  
 +
* https://en.wikipedia.org/wiki/Identifier#In_computer_languages - are tokens (also called symbols) which name language entities. Some of the kinds of entities an identifier might denote include variables, types, labels, subroutines, and packages.
  
* https://en.wikipedia.org/wiki/System_on_a_chip
 
  
* https://en.wikipedia.org/wiki/MPSoC
+
* https://en.wikipedia.org/wiki/Declaration_(computer_programming) - specifies properties of an identifier: it declares what a word (identifier) means. Declarations are most commonly used for functions, variables, constants, and classes, but can also be used for other entities such as enumerations and type definitions. Beyond the name (the identifier itself) and the kind of entity (function, variable, etc.), declarations typically specify the data type (for variables and constants), or the type signature (for functions); types may also include dimensions, such as for arrays. A declaration is used to announce the existence of the entity to the compiler; this is important in those strongly typed languages that require functions, variables, and constants, and their types to be specified with a declaration before use, and is used in forward declaration. The term "declaration" is frequently contrasted with the term "definition", but meaning and usage varies significantly between languages
  
 +
* https://en.wikipedia.org/wiki/Initialization_(programming) - the assignment of an initial value for a data object or variable. The manner in which initialization is performed depends on programming language, as well as type, storage class, etc., of an object to be initialized. Programming constructs which perform initialization are typically called initializers and initializer lists. Initialization is distinct from (and preceded by) declaration, although the two can sometimes be conflated in practice. The complement of initialization is finalization, which is primarily used for objects, but not variables. Initialization is done either by statically embedding the value at compile time, or else by assignment at run time.
  
* https://news.ycombinator.com/item?id=13330034
+
* https://en.wikipedia.org/wiki/Finalization - the process of preparing an object for deallocation; strictly speaking, finalization is all parts of object destruction until memory deallocation itself. Finalization is formally complementary to initialization, which is the part of object creation that follows allocation, but differs significantly in practice
  
=== Memory ===
 
* https://en.wikipedia.org/wiki/Computer_memory
 
  
 +
* https://en.wikipedia.org/wiki/Directive_(programming) - a language construct that specifies how a compiler (or assembler or interpreter) should process its input. Directives are not part of the language proper – they are not part of the grammar, and may vary from compiler to compiler – but instead function either as an in-band form of a command-line option, specifying compiler behavior, or are processed by a preprocessor. In some cases directives specify global behavior, while in other cases they only affect a local section, such as a block of programming code. In some cases, such as some C pragmas, directives are optional compiler hints, and may be ignored, but normally they are prescriptive, and must be followed. However, a directive does not perform any action in the language itself, but rather only a change in the behavior of the compiler.
  
* https://en.wikipedia.org/wiki/Create,_read,_update_and_delete
+
This term could be used to refer to proprietary third party tags and commands (or markup) embedded in code that result in additional executable processing that extend the existing compiler, assembler and language constructs present in the development environment. The term "directive" is also applied in a variety of ways that are similar to the term command.
  
* https://en.wikipedia.org/wiki/Computer_data_storage
 
  
 +
* https://en.wikipedia.org/wiki/First-class_citizen - In programming language design, a first-class citizen (also type, object, entity, or value) in a given programming language is an entity which supports all the operations generally available to other entities. These operations typically include being passed as an argument, returned from a function, and assigned to a variable.
  
* https://en.wikipedia.org/wiki/Memory_hierarchy
 
  
There are four major storage levels:
+
* https://en.wikipedia.org/wiki/Free-form_language
# Internal – Processor registers and cache.
 
# Main – the system RAM and controller cards.
 
# On-line mass storage – Secondary storage.
 
# Off-line bulk storage – Tertiary and Off-line storage.
 
  
  
* https://en.wikipedia.org/wiki/Memory_storage_density
 
  
 +
* https://en.wikipedia.org/wiki/Indentation_style - a convention governing the indentation of blocks of code to convey the program's structure. This article largely addresses the free-form languages, such as C programming language and its descendants, but can be (and frequently is) applied to most other programming languages (especially those in the curly bracket family), where whitespace is otherwise insignificant. Indent style is just one aspect of programming style.
  
  
* https://en.wikipedia.org/wiki/Auxiliary_memory
 
  
* https://en.wikipedia.org/wiki/Main_memory
+
* https://en.wikipedia.org/wiki/Syntactic_sugar -  syntax within a programming language that is designed to make things easier to read or to express. It makes the language "sweeter" for human use: things can be expressed more clearly, more concisely, or in an alternative style that some may prefer.
  
 +
For example, many programming languages provide special syntax for referencing and updating array elements. Abstractly, an array reference is a procedure of two arguments: an array and a subscript vector, which could be expressed as get_array(Array, vector(i,j)). Instead, many languages provide syntax like Array[i,j]. Similarly an array element update is a procedure of three arguments, something like set_array(Array, vector(i,j), value), but many languages provide syntax like Array[i,j] = value.
  
* https://en.wikipedia.org/wiki/Non-volatile_memory
+
Specifically, a construct in a language is called syntactic sugar if it can be removed from the language without any effect on what the language can do: functionality and expressive power will remain the same. Language processors, including compilers, static analyzers, and the like, often expand sugared constructs into more fundamental constructs before processing, a process sometimes called "desugaring".
  
* https://en.wikipedia.org/wiki/NVDIMM NVDIMM -  a type of random-access memory for computers. Non-volatile memory is memory that retains its contents even when electrical power is removed, for example from an unexpected power loss, system crash, or normal shutdown. "Dual in-line" identifies the memory as using the DIMM package. NVDIMMs improve application performance and system crash recovery time. They enhance solid-state drive (SSD) endurance and reliability. "Non-volatile" products may use volatile memory during normal operation and dump the contents into non-volatile memory if the power fails, using an on-board backup power source. Volatile memory is faster than non-volatile; it is byte-addressable; and it can be written to arbitrarily, without concerns about wear and device lifespan. However, including a second memory to achieve non-volatility (and the on-board backup power source) increases the product cost compared to volatile memory.
 
  
  
* https://en.wikipedia.org/wiki/Read-only_memory
+
* https://en.wikipedia.org/wiki/Lex_(software)
  
* [http://tubetime.us/index.php/2018/06/04/a-vacuum-tube-rom/ A Vacuum Tube ROM?] - [https://news.ycombinator.com/item?id=17224329]
+
* https://en.wikipedia.org/wiki/Flex_(lexical_analyser_generator)
  
  
  
 +
* https://en.wikipedia.org/wiki/Syntax_analysis#Programming_languages
  
* https://en.wikipedia.org/wiki/EEPROM
 
  
* https://en.wikipedia.org/wiki/Flash_memory
 
  
* https://en.wikipedia.org/wiki/Volatile_memory
+
* https://en.wikipedia.org/wiki/Backus–Naur_Form - BNF (Backus Normal Form or Backus–Naur Form) is one of the two main notation techniques for context-free grammars, often used to describe the syntax of languages used in computing, such as computer programming languages, document formats, instruction sets and communication protocols; the other main technique for writing context-free grammars is the van Wijngaarden form. They are applied wherever exact descriptions of languages are needed: for instance, in official language specifications, in manuals, and in textbooks on programming language theory. Many extensions and variants of the original Backus–Naur notation are used; some are exactly defined, including Extended Backus–Naur Form (EBNF) and Augmented Backus–Naur Form (ABNF).
  
* https://en.wikipedia.org/wiki/Delay_line_memory
 
  
 +
* https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form
  
* https://en.wikipedia.org/wiki/Random-access_memory
+
* [https://obsidian.md/blog/free-for-work/ Obsidian is now free for work - Obsidian]
  
* https://en.wikipedia.org/wiki/Static_random-access_memory
 
  
 +
* [https://datatracker.ietf.org/doc/html/rfc4234 RFC 4234 - Augmented BNF for Syntax Specifications: ABNF] - Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity, with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order- independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.
  
* https://en.wikipedia.org/wiki/Dynamic_random-access_memory
+
* https://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_form - a metalanguage based on Backus–Naur form (BNF, but consisting of its own syntax and derivation rules. The motive principle for ABNF is to describe a formal system of a language to be used as a bidirectional communications protocol. It is defined by Internet Standard 68 ("STD 68", type case sic), which as of December 2010 was RFC 5234, and it often serves as the definition language for IETF communication protocols.
  
* https://en.wikipedia.org/wiki/Memory_rank - a set of DRAM chips connected to the same chip select, which are therefore accessed simultaneously. In practice all DRAM chips share all of the other command and control signals, and only the chip select pins for each rank are separate (the data pins are shared across ranks).
 
  
* https://en.wikipedia.org/wiki/Synchronous_dynamic_random-access_memory
 
  
* https://en.wikipedia.org/wiki/DDR_SDRAM
+
* https://en.wikipedia.org/wiki/Van_Wijngaarden_grammar
  
  
* https://en.wikipedia.org/wiki/Scratchpad_memory
 
  
 +
* https://en.wikipedia.org/wiki/Parsing_expression_grammar - or '''PEG''', is a type of analytic formal grammar, i.e. it describes a formal language in terms of a set of rules for recognizing strings in the language. The formalism was introduced by Bryan Ford in 2004 and is closely related to the family of top-down parsing languages introduced in the early 1970s. Syntactically, PEGs also look similar to context-free grammars (CFGs), but they have a different interpretation: the choice operator selects the first match in PEG, while it is ambiguous in CFG. This is closer to how string recognition tends to be done in practice, e.g. by a recursive descent parser. Unlike CFGs, PEGs cannot be ambiguous; if a string parses, it has exactly one valid parse tree. It is conjectured that there exist context-free languages that cannot be parsed by a PEG, but this is not yet proven. PEGs are well-suited to parsing computer languages, but not natural languages where their performance is comparable to general CFG algorithms such as the Earley algorithm
  
 +
Compared to pure regular expressions (i.e. without back-references), PEGs are strictly more powerful, but require significantly more memory. For example, a regular expression inherently cannot find an arbitrary number of matched pairs of parentheses, because it is not recursive, but a PEG can. However, a PEG will require an amount of memory proportional to the length of the input, while a regular expression matcher will require only a constant amount of memory.
  
* https://en.wikipedia.org/wiki/Address_space - defines a range of discrete addresses, each of which may correspond to a network host, peripheral device, disk sector, a memory cell or other logical or physical entity.
+
* [http://bford.info/packrat/ The Packrat Parsing and Parsing Expression Grammars Page]
  
* https://en.wikipedia.org/wiki/Memory_address
 
  
* https://en.wikipedia.org/wiki/Memory_map
+
* https://en.wikipedia.org/wiki/Recursive_descent_parser
  
 +
* https://en.wikipedia.org/wiki/Pratt_parser
  
* https://en.wikipedia.org/wiki/Memory_management
+
* https://tdop.github.io/
 +
* http://javascript.crockford.com/tdop/tdop.html
 +
* http://l-lang.org/blog/TDOP---Pratt-parser-in-pictures/
 +
* https://news.ycombinator.com/item?id=2344837
  
* https://en.wikipedia.org/wiki/Memory_management_unit
+
=== Data structures ===
 +
* http://en.wikipedia.org/wiki/Data_structure
  
* https://en.wikipedia.org/wiki/Memory_management_(operating_systems)
+
* http://opendatastructures.org/ [https://news.ycombinator.com/item?id=8904043]
 +
* https://news.ycombinator.com/item?id=12758176
  
 +
* https://en.wikipedia.org/wiki/Plain_old_data_structure
  
* http://www.memorymanagement.org/
 
  
* https://en.wikipedia.org/wiki/Direct_memory_access
+
* PDF: [https://stratos.seas.harvard.edu/files/stratos/files/periodictabledatastructures.pdf The Periodic Table of Data Structures] [https://news.ycombinator.com/item?id=18314555]
  
  
* http://nommu.org/ [https://news.ycombinator.com/item?id=12675388]
+
* http://www.cs.usfca.edu/~galles/visualization/Algorithms.html [https://news.ycombinator.com/item?id=6928904]
  
* http://nommu.org/memory-faq.txt [https://news.ycombinator.com/item?id=12678571]
 
  
 +
* http://en.wikipedia.org/wiki/Set_data_structure
  
* https://en.wikipedia.org/wiki/Bank_switching - a technique used in computer design to increase the amount of usable memory beyond the amount directly addressable by the processor. It can be used to configure a system differently at different times; for example, a ROM required to start a system from diskette could be switched out when no longer needed.
 
  
  
* https://en.wikipedia.org/wiki/Slab_allocation - a memory management mechanism intended for the efficient memory allocation of kernel objects. It eliminates fragmentation caused by allocations and deallocations. The technique is used to retain allocated memory that contains a data object of a certain type for reuse upon subsequent allocations of objects of the same type. It is analogous to an object pool, but only applies to memory, not other resources. Slab allocation was first introduced in the Solaris 5.4 kernel by Jeff Bonwick. It is now widely used by many Unix and Unix-like operating systems including FreeBSD and Linux.
+
* http://en.wikipedia.org/wiki/Abstract_semantic_graph
  
  
* https://en.wikipedia.org/wiki/Memory_segmentation
+
* http://en.wikipedia.org/wiki/Bit_string
  
* https://en.wikipedia.org/wiki/Segmentation_fault
 
  
  
* https://en.wikipedia.org/wiki/Memory_protection
+
=== Array ===
 +
* http://en.wikipedia.org/wiki/Array_data_structure
  
* https://en.wikipedia.org/wiki/Executable_space_protection -  the marking of memory regions as non-executable, such that an attempt to execute machine code in these regions will cause an exception. It makes use of hardware features such as the NX bit, or in some cases software emulation of those features.
 
  
 +
* http://en.wikipedia.org/wiki/Array_data_type
  
* https://en.wikipedia.org/wiki/Virtual_memory - a memory management technique that is implemented using both hardware and software. It maps memory addresses used by a program, called virtual addresses, into physical addresses in computer memory.
 
  
* https://en.wikipedia.org/wiki/Virtual_address_space
+
* http://en.wikipedia.org/wiki/Associative_array
  
  
* https://en.wikipedia.org/wiki/Paging - a memory management scheme by which a computer stores and retrieves data from secondary storage[a] for use in main memory.
+
* https://en.wikipedia.org/wiki/Lookup_table - an array that replaces runtime computation with a simpler array indexing operation. The savings in terms of processing time can be significant, since retrieving a value from memory is often faster than undergoing an "expensive" computation or input/output operation. The tables may be precalculated and stored in static program storage, calculated (or "pre-fetched") as part of a program's initialization phase (memoization), or even stored in hardware in application-specific platforms. Lookup tables are also used extensively to validate input values by matching against a list of valid (or invalid) items in an array and, in some programming languages, may include pointer functions (or offsets to labels) to process the matching input. FPGAs also make extensive use of reconfigurable, hardware-implemented, lookup tables to provide programmable hardware functionality.  
  
* https://en.wikipedia.org/wiki/Page_(computer_memory) - '''memory page''', or '''virtual page''' is a fixed-length contiguous block of virtual memory, described by a single entry in the page table. It is the smallest unit of data for memory management in a virtual memory operating system.
 
  
* https://en.wikipedia.org/wiki/Page_table - the data structure used by a virtual memory system in a computer operating system to store the mapping between virtual addresses and physical addresses. Virtual addresses are used by the accessing process, while physical addresses are used by the hardware, or more specifically, by the RAM subsystem.
 
  
* https://en.wikipedia.org/wiki/Page_fault - a type of interrupt, called trap, raised by computer hardware when a running program accesses a memory page that is mapped into the virtual address space, but not actually loaded into main memory. When handling a page fault, the operating system generally tries to make the required page accessible at the location in physical memory, or terminates the program in case of an illegal memory access. Contrary to what "fault" might suggest, valid page/hard faults are not errors, and are common and necessary to increase the amount of memory available to programs in any operating system that utilizes virtual memory,
+
* http://en.wikipedia.org/wiki/Hash_table
  
* https://en.wikipedia.org/wiki/Thrashing_(computer_science) -  occurs when a computer's virtual memory subsystem is in a constant state of paging, rapidly exchanging data in memory for data on disk, to the exclusion of most application-level processing
 
  
  
* http://en.wikipedia.org/wiki/Call_stack - a stack data structure that stores information about the active subroutines of a computer program. This kind of stack is also known as an execution stack, control stack, run-time stack, or machine stack, and is often shortened to just "the stack". Although maintenance of the call stack is important for the proper functioning of most software, the details are normally hidden and automatic in high-level programming languages. Many computer instruction sets provide special instructions for manipulating stacks.
+
=== Tree ===
A call stack is used for several related purposes, but the main reason for having one is to keep track of the point to which each active subroutine should return control when it finishes executing.
+
* http://en.wikipedia.org/wiki/Tree_(data_structure)
  
* https://en.wikipedia.org/wiki/Stack-based_memory_allocation - because data is added and removed to the stack in a last-in-first-out manner, stack-based memory allocation is very simple and typically faster than heap-based memory allocation (also known as dynamic memory allocation).
 
  
* http://jvns.ca/blog/2016/03/01/a-few-notes-on-the-stack/ [https://news.ycombinator.com/item?id=11214799]
+
* https://en.wikipedia.org/wiki/Tree_traversal
  
* http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap/80113#80113
+
* https://eugene-eeo.github.io/blog/tree-traversal-storage.html [https://news.ycombinator.com/item?id=12671306]
  
* https://news.ycombinator.com/item?id=6848415
 
  
* https://news.ycombinator.com/item?id=6879212
+
* http://en.wikipedia.org/wiki/Binary_tree
  
* https://en.wikipedia.org/wiki/Heap_(data_structure)
+
* http://en.wikipedia.org/wiki/Binary_search_tree
  
  
 +
=== B-tree ===
 +
* http://en.wikipedia.org/wiki/B-tree
  
* https://en.wikipedia.org/wiki/Non-uniform_memory_access - a computer memory design used in multiprocessing, where the memory access time depends on the memory location relative to the processor. Under NUMA, a processor can access its own local memory faster than non-local memory (memory local to another processor or memory shared between processors). The benefits of NUMA are limited to particular workloads, notably on servers where the data are often associated strongly with certain tasks or users.
 
  
* http://linux.die.net/man/8/numactl
+
* [http://stryku.pl/poetry/okon.php Stryku.pl - A journey to searching Have I Been Pwned database in 49μs (C++)] - [https://news.ycombinator.com/item?id=22459661]
  
 +
=== Radix tree ===
  
 +
* https://en.wikipedia.org/wiki/Radix_tree - (also radix trie or compact prefix tree) is a data structure that represents a space-optimized trie (prefix tree) in which each node that is the only child is merged with its parent. The result is that the number of children of every internal node is at most the radix r of the radix tree, where r is a positive integer and a power x of 2, having x ≥ 1. Unlike regular trees, edges can be labeled with sequences of elements as well as single elements. This makes radix trees much more efficient for small sets (especially if the strings are long) and for sets of strings that share long prefixes.
  
* http://en.wikipedia.org/wiki/Pointer_(computer_programming) - a programming language object, whose value refers to (or "points to") another value stored elsewhere in the computer memory using its address. A pointer references a location in memory, and obtaining the value stored at that location is known as dereferencing the pointer.
+
* https://github.com/fanf2/qp
  
 +
=== to sort ===
 +
* http://en.wikipedia.org/wiki/Rope_%28data_structure%29
  
* r/learnprogramming: [http://www.reddit.com/r/learnprogramming/comments/kzbn6/ What's the point of pointers?]
 
** http://www.reddit.com/r/learnprogramming/comments/1ehg69/
 
  
* https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html
+
* http://randomcomputation.blogspot.co.uk/2013/08/blog-post.html
  
* https://en.wikipedia.org/wiki/Pointer_aliasing - refers to the situation where the same memory location can be accessed using different names.
 
  
 +
* https://github.com/antirez/rax
 +
** https://news.ycombinator.com/item?id=101987
  
* https://en.wikipedia.org/wiki/Smart_pointer
 
  
 +
* http://courses.csail.mit.edu/6.851/spring12/
  
* https://lwn.net/Articles/219983/
 
  
=== Storage ===
 
* https://en.wikipedia.org/wiki/Persistence_(computer_science)
 
  
  
=== Other ===
+
* http://www.careerride.com/c-arrays-and-linked-list.aspx
* https://news.ycombinator.com/item?id=8773114
 
  
 +
The difference between arrays and linked lists are:
  
=== Security ===
+
- Arrays are linear data structures. Linked lists are linear and non-linear data structures.
* https://en.wikipedia.org/wiki/CPU_modes
+
- Linked lists are linear for accessing, and non-linear for storing in memory
 +
- Array has homogenous values. And each element is independent of each other positions. Each node in the linked list is connected with its previous node which is a pointer to the node.
 +
- Array elements can be modified easily by identifying the index value. It is a complex process for modifying the node in a linked list.
 +
- Array elements can not be added, deleted once it is declared. The nodes in the linked list can be added and deleted from the list.
  
* https://en.wikipedia.org/wiki/Protection_ring
 
  
  
  
* https://en.wikipedia.org/wiki/Capability-based_security
 
  
 +
* http://www.infoq.com/presentations/Data-Structures
  
=== ASIC ===
+
* [https://www.cs.unm.edu/~crowley/papers/sds.pdf Data Structures for Text Sequences] [https://news.ycombinator.com/item?id=9208381]
* https://en.wikipedia.org/wiki/Application-specific_integrated_circuit
 
  
  
* https://en.wikipedia.org/wiki/Application-specific_standard_product
+
* https://www.snellman.net/blog/archive/2016-12-13-ring-buffers/ [https://news.ycombinator.com/item?id=13175832]
  
  
== Interrupts ==
+
* http://algoviz.org/OpenDSA/
* https://en.wikipedia.org/wiki/Interrupt - a signal to the processor emitted by hardware or software indicating an event that needs immediate attention. An interrupt alerts the processor to a high-priority condition requiring the interruption of the current code the processor is executing. The processor responds by suspending its current activities, saving its state, and executing a function called an interrupt handler (or an interrupt service routine, ISR) to deal with the event. This interruption is temporary, and, after the interrupt handler finishes, the processor resumes normal activities.
 
  
 +
* http://www.brpreiss.com/books/opus5/html/book.html
  
* https://en.wikipedia.org/wiki/Interrupt_request_(PC_architecture) - or '''IRQ''', is a hardware signal sent to the processor that temporarily stops a running program and allows a special program, an interrupt handler, to run instead. Hardware interrupts are used to handle events such as receiving data from a modem or network card, key presses, or mouse movements.
+
* http://okasaki.blogspot.ru/2008/02/ten-years-of-purely-functional-data.html
  
Interrupt lines are often identified by an index with the format of IRQ followed by a number. For example, on the Intel 8259 family of PICs there are eight interrupt inputs commonly referred to as IRQ0 through IRQ7. In x86 based computer systems that use two of these PICs, the combined set of lines are referred to as IRQ0 through IRQ15. Technically these lines are named IR0 through IR7, and the lines on the ISA bus to which they were historically attached are named IRQ0 through IRQ15. Newer x86 systems integrate an Advanced Programmable Interrupt Controller (APIC) that conforms to the Intel APIC Architecture. These APICs support a programming interface for up to 255 physical hardware IRQ lines per APIC, with a typical system implementing support for only around 24 total hardware lines.
+
* http://www.xanadu.com/zigzag/
 +
* YouTube: [http://www.youtube.com/watch?v=WEj9vqVvHPc Ted Nelson on Zigzag data structures] - relationship vector, hyperthoginal
  
* https://en.wikipedia.org/wiki/Interrupt_handler - also known as an '''interrupt service routine''' or '''ISR''', a callback function in microcontroller firmware, an operating system or a device driver, whose execution is triggered by the reception of an interrupt. In general, interrupts and their handlers are used to handle high-priority conditions that require the interruption of the current code the processor is executing.
+
* https://news.ycombinator.com/item?id=13263038
  
Interrupt handlers have a multitude of functions, which vary based on the reason the interrupt was generated and the speed at which the interrupt handler completes its task. For example, pressing a key on a computer keyboard, or moving the mouse, triggers interrupts that call interrupt handlers which read the key, or the mouse's position, and copy the associated information into the computer's memory.
 
An interrupt handler is a low-level counterpart of event handlers. These handlers are initiated by either hardware interrupts or interrupt instructions in software, and are used for servicing hardware devices and transitions between protected modes of operation such as system calls.
 
  
 +
* [https://jerryyin.info/geometry-processing-algorithms/half-edge/ Half-Edge Data Structures] [https://news.ycombinator.com/item?id=37093365]
  
* https://en.wikipedia.org/wiki/Exception_handling -  the process of responding to the occurrence, during computation, of exceptions – anomalous or exceptional conditions requiring special processing – often changing the normal flow of program execution. It is provided by specialized programming language constructs or computer hardware mechanisms.
 
  
  
* https://en.wikipedia.org/wiki/Programmable_Interrupt_Controller
 
  
* https://en.wikipedia.org/wiki/Advanced_Programmable_Interrupt_Controller
 
  
* https://en.wikipedia.org/wiki/Message_Signaled_Interrupts - an alternative in-band method of signaling an interrupt, using special in-band messages to replace traditional out-of-band assertion of dedicated interrupt lines. While more complex to implement in a device, message signaled interrupts have some significant advantages over pin-based out-of-band interrupt signaling. Message signaled interrupts are supported in PCI bus since its version 2.2, and in later available PCI Express bus. Some non-PCI architectures also use message signaled interrupts.
 
  
* https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/PCI/MSI-HOWTO.txt?id=HEAD
+
* https://en.wikipedia.org/wiki/Semaphore_%28programming%29
  
* http://stackoverflow.com/questions/10894702/diff-between-io-apic-level-and-pci-msi-x
 
  
 +
* https://news.ycombinator.com/item?id=8761539
  
* https://github.com/Irqbalance/irqbalance - a daemon to help balance the cpu load generated by interrupts across all of a systems cpus. Irqbalance identifies the highest volume interrupt sources, and isolates them to a single unique cpu, so that load is spread as much as possible over an entire processor set, while minimizing cache miss rates for irq handlers.
 
  
  
  
== Runtime ==
+
* https://en.wikipedia.org/wiki/Continuation
 +
* https://en.wikipedia.org/wiki/Continuation-passing_style
 +
* http://matt.might.net/articles/cps-conversion/
  
* https://en.wikipedia.org/wiki/Runtime_system
+
* http://beautifulracket.com/explainer/continuations.html
  
 +
* [https://pavpanchekha.com/esp/continuations.html (call/cc this-class)] -
  
 +
* [https://leafac.com/understanding-the-type-of-call-cc/ Understanding the Type of call/cc · Leandro Facchinetti] - [https://news.ycombinator.com/item?id=18620943]
  
  
* https://en.wikipedia.org/wiki/Interpreted_language
 
  
  
  
* https://en.wikipedia.org/wiki/Interpreter_(computing)
 
  
 +
* https://en.wikipedia.org/wiki/Stack_(abstract_data_type)
  
* https://en.wikipedia.org/wiki/Scripting_language
 
  
 +
* https://en.wikipedia.org/wiki/Stack_register
  
  
* https://en.wikipedia.org/wiki/Green_threads - threads that are scheduled by a runtime library or virtual machine (VM) instead of natively by the underlying operating system. Green threads emulate multithreaded environments without relying on any native OS capabilities, and they are managed in user space instead of kernel space, enabling them to work in environments that do not have native thread support.
+
* https://en.wikipedia.org/wiki/Symbol_table
  
== Programming ==
+
* http://kukuruku.co/hub/cpp/lock-free-data-structures-the-evolution-of-a-stack [https://news.ycombinator.com/item?id=9099103]
See also [[Languages]], [[Development]], [[Maths#Software 2]]
 
  
 +
* [https://www.youtube.com/watch?v=2XH_q494U3U "Visualizing Persistent Data Structures" by Dann Toliver]
  
* https://en.wikipedia.org/wiki/Computer_programming
+
==== Mutability ====
 +
* http://en.wikipedia.org/wiki/Persistent_data_structure
  
 +
* http://davesquared.net/2013/03/reasoning-and-mutability.html
  
* https://en.wikipedia.org/wiki/Automatic_programming
+
=== Evaluation ===
 +
* http://en.wikipedia.org/wiki/Evaluation
  
 +
* http://en.wikipedia.org/wiki/Expression_(mathematics)
  
* [https://www.progsbase.com/blog/flow-charts-of-programming-language-constructs/ Flow-Charts of Programming Language Constructs – progsbase] -  [https://news.ycombinator.com/item?id=22326669]
+
* http://en.wikipedia.org/wiki/Expression_(computer_science)
  
 +
An expression evaluates to a value. A statement does something.
  
* [http://www.cs.yale.edu/homes/perlis-alan/quotes.html Epigrams in Programming], by Alan J. Perlis of Yale University, 1982 [https://news.ycombinator.com/item?id=8674919]
+
x = 1
 +
y = x + 1    # an expression
 +
print y      # a statement, prints 2
  
* PDF: [http://www.bowdoin.edu/~ltoma/teaching/cs340/spring05/coursestuff/Bentley_BumperSticker.pdf Bumper-Sticker Computer Science (1985] [https://news.ycombinator.com/item?id=8676982]
+
* http://en.wikipedia.org/wiki/Statement_(programming)
  
* https://en.wikipedia.org/wiki/The_Elements_of_Programming_Style
+
* [http://www.federicopereiro.com/expression/ Heuristic definition of an expression] [https://news.ycombinator.com/item?id=10919572]
  
* [http://mindprod.com/jgloss/unmain.html unmaintainable code]
+
* https://en.wikipedia.org/wiki/Evaluation_strategy
** https://github.com/Droogans/unmaintainable-code - alternative format
 
  
 +
* https://en.wikipedia.org/wiki/Expression-oriented_programming_language
  
* [https://lists.debian.org/debian-user/2004/02/msg00648.html Re: ABI vs. API] -  debian-user@lists.debian.org [https://news.ycombinator.com/item?id=12029321]
+
* https://en.wikipedia.org/wiki/Referential_transparency_(computer_science)
  
 +
* https://en.wikipedia.org/wiki/Side_effect_(computer_science)
  
* [http://savannah.nongnu.org/projects/pgubook/ Programming from the Ground Up Book] - an introductory book to programming and computer science using assembly language. It assumes the reader has never programmed before, and introduces the concepts of variables, functions, and flow control. The reason for using assembly language is to get the reader thinking in terms of how the computer actually works underneath. Knowing how the computer works from a "bare-metal" standpoint is often the difference between top-level programmers and programmers who can never quite master their art. [https://news.ycombinator.com/item?id=11702025]
+
* https://en.wikipedia.org/wiki/Information_hiding
** http://ftp.igh.cnrs.fr/pub/nongnu//pgubook/ProgrammingGroundUp-1-0-lettersize.pdf
 
  
* https://github.com/angrave/SystemProgramming/wiki [https://news.ycombinator.com/item?id=9088586]
 
  
* https://news.ycombinator.com/item?id=19382765
+
* https://en.wikipedia.org/wiki/Conditional_(computer_programming)
  
  
* https://en.wikipedia.org/wiki/Dynamic_programming_language - a term used in computer science to describe a class of high-level programming languages which, at runtime, execute many common programming behaviors that static programming languages perform during compilation. These behaviors could include extension of the program, by adding new code, by extending objects and definitions, or by modifying the type system. Although similar behaviours can be emulated in nearly any language, with varying degrees of difficulty, complexity and performance costs, dynamic languages provide direct tools to make use of them. Many of these features were first implemented as native features in the Lisp programming language. Most dynamic languages are also dynamically typed, but not all are. Dynamic languages are frequently (but not always) referred to as "scripting languages", although the term "scripting language" in its narrowest sense refers to languages specific to a given run-time environment.
 
  
 +
* https://en.wikipedia.org/wiki/Strict_function - in the denotational semantics of programming languages is a function f where f\left(\perp\right) = \perp. The entity \perp, called bottom, denotes an expression which does not return a normal value, either because it loops endlessly or because it aborts due to an error such as division by zero. A function which is not strict is called non-strict. A strict programming language is one in which user-defined functions are always strict.
  
 +
Intuitively, non-strict functions correspond to control structures. Operationally, a strict function is one which always evaluates its argument; a non-strict function is one which may not evaluate some of its arguments. Functions having more than one parameter may be strict or non-strict in each parameter independently, as well as jointly strict in several parameters simultaneously.
  
  
* [https://www.livecoding.tv/ Livecoding.tv] - A livestreaming platform for coders to share their code and hang out
+
* https://en.wikipedia.org/wiki/Non-strict_programming_language - A strict programming language is one in which only strict functions (functions whose parameters must be evaluated completely before they may be called) may be defined by the user. A non-strict programming language allows the user to define non-strict functions, and hence may allow lazy evaluation.
  
  
* https://en.wikipedia.org/wiki/Self-hosting
+
* https://en.wikipedia.org/wiki/Control_flow
  
* https://en.wikipedia.org/wiki/Program_lifecycle_phase
 
  
  
 +
* http://en.wikipedia.org/wiki/Scope_(computer_science)
 +
* http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope/6445794#6445794
  
* https://en.wikipedia.org/wiki/Execution_model
 
  
Semantics describe the logical entities of a programming language and their interactions. Syntax defines how these are expressed in characters.
 
  
 +
* https://en.wikipedia.org/wiki/Scope_resolution_operator - helps to identify and specify the context to which an identifier refers, particularly by specifying a namespace or class. The specific uses vary across different programming languages with the notions of scoping. In many languages, the scope resolution operator is written ::.
  
* https://wg21.link - ISO Working Group document short urls
 
  
 +
* http://en.wikipedia.org/wiki/Hooking
  
* [http://cheat.sh/ cheat.sh/:firstpage]
+
* http://en.wikipedia.org/wiki/Rewriting
** https://github.com/chubin/cheat.sh
 
  
 +
* http://en.wikipedia.org/wiki/Recursion_(computer_science)
 +
* [http://vanemden.wordpress.com/2014/06/18/how-recursion-got-into-programming-a-comedy-of-errors-3/ How recursion got into programming: a comedy of errors] [https://news.ycombinator.com/item?id=8073361]
 +
* http://en.wikipedia.org/wiki/Modulo_operation
  
* https://github.com/gleitz/howdoi - instant coding answers via the command line
+
* Vimeo: [https://vimeo.com/66849976 Impossible Programs] - Scottish Ruby Conf
  
 +
=== Operators ===
 +
* https://en.wikipedia.org/wiki/Operator_(programming) - constructs which behave generally like functions, but which differ syntactically or semantically from usual functions. Common simple examples include arithmetic (addition with +, comparison with >) and logical operations (such as AND or &&). More involved examples include assignment (usually = or :=), field access in a record or object (usually .), and the scope resolution operator (often ::). Languages usually define a set of built-in operators, and in some cases allow user-defined operators.
  
* [http://threevirtues.com/ The Three Virtues of a GREAT Programmer] - According to Larry Wall(1), the original author of the Perl programming language, there are three great virtues of a programmer; Laziness, Impatience and Hubris
+
* https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
  
* Laziness: The quality that makes you go to great effort to reduce overall energy expenditure. It makes you write labor-saving programs that other people will find useful and document what you wrote so you don't have to answer so many questions about it.
+
=== Functions ===
* Impatience: The anger you feel when the computer is being lazy. This makes you write programs that don't just react to your needs, but actually anticipate them. Or at least pretend to.
+
See [[Maths]]
* Hubris: The quality that makes you write (and maintain) programs that other people won't want to say bad things about.
 
  
* [http://www.wall.org/~larry/onion/onion.html 2nd State of the Onion] - "Most of you are familiar with the virtues of a programmer. There are three, of course: laziness, impatience, and hubris. These are virtues of passion. They are not, however, virtues of community. The virtues of community sound like their opposites: diligence, patience, and humility. They're not really opposites, because you can do them all at the same time. It's another matter of perspective. These are the virtues that have brought us this far. These are the virtues that will carry our community into the future, if we do not abandon them."
+
* http://en.wikipedia.org/wiki/Subroutine or '''function''' is a sequence of program instructions that perform a specific task, packaged as a unit. This unit can then be used in programs wherever that particular task should be performed. Subprograms may be defined within programs, or separately in libraries that can be used by multiple programs. In different programming languages a subroutine may be called a procedure, a function, a routine, a method, or a subprogram. The generic term callable unit is sometimes used.
  
  
* https://github.com/cjbarber/ToolsOfTheTrade
+
* http://en.wikipedia.org/wiki/Closure_(computer_science) - also '''lexical closures''' or '''function closures''' are a technique for implementing lexically scoped name binding in languages with first-class functions. Operationally, a closure is a record storing a function[a] together with an environment: a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or storage location to which the name was bound when the closure was created. A closure—unlike a plain function—allows the function to access those captured variables through the closure's reference to them, even when the function is invoked outside their scope.
  
 +
* [http://nathansjslessons.appspot.com/lesson?id=1000 What's a Closure?]
  
 +
* http://en.wikipedia.org/wiki/Currying
  
* Stackoverflow: [http://stackoverflow.com/questions/141525/absolute-beginners-guide-to-bit-shifting Absolute Beginner's Guide to Bit Shifting?]
 
  
* [http://web.archive.org/web/20160818222826/http://slidetocode.com/2012/05/06/the-perfect-programming-language The genesis of a perfect programming language]
+
* http://en.wikipedia.org/wiki/Call_site - a call site of a function or subroutine is the location (line of code) where the function is called (or may be called, through dynamic dispatch). A call site is where zero or more arguments are passed to the function, and zero or more return values are received.
  
* [http://oredev.org/2012/sessions/its-not-you-its-them-why-programming-languages-are-hard-to-teach Session: It's Not You, It's Them: Why Programming Languages Are Hard To Teach]
 
  
* [http://blog.appfog.com/what-the-obama-it-team-teaches-us-about-polyglot-programming/ What the Obama IT team teaches us about polyglot programming]
 
  
=== Syntax ===
+
* [https://matklad.github.io/2023/11/15/push-ifs-up-and-fors-down.html Push Ifs Up And Fors Down] - A short note on two related rules of thumb. [https://news.ycombinator.com/item?id=38282950]
* https://en.wikipedia.org/wiki/Syntax_(programming_languages)
 
  
  
* https://en.wikipedia.org/wiki/Lexical_grammar - the process of converting a sequence of characters (such as in a computer program or web page) into a sequence of tokens (strings with an identified "meaning"). A program that performs lexical analysis may be called a lexer, tokenizer, or scanner (though "scanner" is also used to refer to the first stage of a lexer). Such a lexer is generally combined with a parser, which together analyze the syntax of programming languages, web pages, and so forth.
 
  
For instance, the lexical grammar for many programming languages specifies that a string literal starts with a " character and continues until a matching " is found (escaping makes this more complicated), that an identifier is an alphanumeric sequence (letters and digits, usually also allowing underscores, and disallowing initial digits), and that an integer literal is a sequence of digits. So in the following character sequence "abc" xyz1 23 the tokens are string, identifier and number (plus whitespace tokens) because the space character terminates the sequence of characters forming the identifier. Further, certain sequences are categorized as keywords – these generally have the same form as identifiers (usually alphabetical words), but are categorized separately; formally they have a different token type.
 
  
* https://en.wikipedia.org/wiki/Lexical_analysis - the process of converting a sequence of characters (such as in a computer program or web page) into a sequence of tokens (strings with an identified "meaning"). A program that performs lexical analysis may be called a lexer, tokenizer, or scanner (though "scanner" is also used to refer to the first stage of a lexer). Such a lexer is generally combined with a parser, which together analyze the syntax of programming languages, web pages, and so forth.
+
* https://en.wikipedia.org/wiki/Language_binding - an application programming interface (API) that provides glue code specifically made to allow a programming language to use a foreign library or operating system service (one that is not native to that language).  
  
  
* https://en.wikipedia.org/wiki/Language_construct - a syntactically allowable part of a program that may be formed from one or more lexical tokens in accordance with the rules of a programming language. The term "language construct" is often used as a synonym for control structure, and should not be confused with a function.
+
* https://en.wikipedia.org/wiki/Foreign_function_interface
  
* https://en.wikipedia.org/wiki/Category:Programming_constructs
+
* https://en.wikipedia.org/wiki/Wrapper_function - a subroutine in a software library or a computer program whose main purpose is to call a second subroutine or a system call with little or no additional computation. Wrapper functions are used to make writing computer programs easier by abstracting away the details of a subroutine's underlying implementation.
  
 +
* https://en.wikipedia.org/wiki/Wrapper_library - or library wrappers) consist of a thin layer of code (a "shim") which translates a library's existing interface into a compatible interface.
  
  
* https://en.wikipedia.org/wiki/Syntactic_noise - syntax within a programming language that makes the programming language more difficult to read and understand for humans. It fills the language with excessive clutter that makes it a hassle to write code. Syntactic noise is considered to be the opposite of syntactic sugar, which is syntax that makes a programming language more readable and enjoyable for the programmer.
 
  
* [https://martinfowler.com/bliki/SyntacticNoise.html SyntacticNoise]
+
* http://en.wikipedia.org/wiki/Anonymous_function - also '''function literal''' or '''lambda abstraction''' is a function definition that is not bound to an identifier. Anonymous functions are often: arguments being passed to higher-order functions, or used for constructing the result of a higher-order function that needs to return a function. If the function is only used once, or a limited number of times, an anonymous function may be syntactically lighter than using a named function. Anonymous functions are ubiquitous in functional programming languages and other languages with first-class functions, where they fulfill the same role for the function type as literals do for other data types.
  
  
 +
* http://en.wikipedia.org/wiki/Function_type - the type of a variable or parameter to which a function has or can be assigned, or an argument or result type of a higher-order function taking or returning a function.
  
* https://en.wikipedia.org/wiki/Catalan_number - a sequence of natural numbers that occur in various counting problems, often involving recursively-defined objects. They are named after the Belgian mathematician Eugène Charles Catalan (1814–1894).
 
  
Using zero-based numbering, the nth Catalan number is given directly in terms of binomial coefficients. The first Catalan numbers for n = 0, 1, 2, 3, … are: 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, … (sequence A000108 in OEIS).
+
* https://en.wikipedia.org/wiki/Trailing_return_type
  
  
* https://en.wikipedia.org/wiki/Dyck_language - the language consisting of balanced strings of square brackets [ and ]. It is important in the parsing of expressions that must have a correctly nested sequence of brackets, such as arithmetic or algebraic expressions.
+
* http://en.wikipedia.org/wiki/Function_prototype - or '''function interface''' is a declaration of a function that specifies the function's name and type signature (arity, parameter types, and return type), but omits the function body. The term is particularly used in C and C++. While a function definition specifies how the function does what it does (the "implementation"), a function prototype merely specifies its interface, i.e. what data types go in and come out of it.
  
 +
In a prototype, parameter names are optional (and in C/C++ have function prototype scope, meaning their scope ends at the end of the prototype), however, the type is necessary along with all modifiers (e.g. if it is a pointer or a const parameter). In object-oriented programming, interfaces and abstract methods serve much the same purpose.
  
* http://interactivepython.org/runestone/static/pythonds/BasicDS/SimpleBalancedParentheses.html
 
  
  
 +
* http://en.wikipedia.org/wiki/Function_objects - allows an object to be invoked or called as if it were an ordinary function, usually with the same syntax (a function parameter that can also be a function).
  
* https://en.wikipedia.org/wiki/Reserved_word - also known as a '''reserved identifier''' is a word that cannot be used as an identifier, such as the name of a variable, function, or label – it is "reserved from use". This is a syntactic definition, and a reserved word may have no meaning.
 
  
A closely related and often conflated notion is a '''keyword''' which is a word with special meaning in a particular context. This is a semantic definition. By contrast, names in a standard library but not built into the language are not considered reserved words or keywords. The terms "reserved word" and "keyword" are often used interchangeably – one may say that a reserved word is "reserved for use as a keyword" – and formal use varies from language to language; for this article we distinguish as above.
 
  
In general reserved words and keywords need not coincide, but in most modern languages keywords are a subset of reserved words, as this makes parsing easier, since keywords cannot be confused with identifiers. In some languages, like C or Python, reserved words and keywords coincide, while in other languages, like Java, all keywords are reserved words, but some reserved words are not keywords – these are "reserved for future use". In yet other languages, such as ALGOL and PL/I there are keywords but no reserved words, with keywords being distinguished from identifiers by other means.
+
* http://journal.stuffwithstuff.com/2013/08/26/what-is-open-recursion/ [https://news.ycombinator.com/item?id=11099293]
  
* http://crasseux.com/books/ctutorial/Reserved-words-in-C.html
 
  
  
* [https://www.hillelwayne.com/post/equals-as-assignment/ Why Does "=" Mean Assignment?] - [https://news.ycombinator.com/item?id=16803874]
+
* http://en.wikipedia.org/wiki/Callback_(computer_science) - a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time. The invocation may be immediate as in a synchronous callback, or it might happen at a later time as in an asynchronous callback. In all cases, the intention is to specify a function or subroutine as an entity that is, depending on the language, more or less similar to a variable. Programming languages support callbacks in different ways, often implementing them with subroutines, lambda expressions, blocks, or function pointers.
  
  
* https://en.wikipedia.org/wiki/Identifier#In_computer_languages - are tokens (also called symbols) which name language entities. Some of the kinds of entities an identifier might denote include variables, types, labels, subroutines, and packages.
+
* http://en.wikipedia.org/wiki/Tail_call - a subroutine call performed as the final action of a procedure. If a tail call might lead to the same subroutine being called again later in the call chain, the subroutine is said to be tail-recursive, which is a special case of recursion. '''Tail recursion''' (or tail-end recursion) is particularly useful, and often easy to handle in implementations.
  
 +
* https://medium.com/binary-dreams/from-java-to-scala-tail-recursion-a6acdd71a94d
  
* https://en.wikipedia.org/wiki/Declaration_(computer_programming) - specifies properties of an identifier: it declares what a word (identifier) means. Declarations are most commonly used for functions, variables, constants, and classes, but can also be used for other entities such as enumerations and type definitions. Beyond the name (the identifier itself) and the kind of entity (function, variable, etc.), declarations typically specify the data type (for variables and constants), or the type signature (for functions); types may also include dimensions, such as for arrays. A declaration is used to announce the existence of the entity to the compiler; this is important in those strongly typed languages that require functions, variables, and constants, and their types to be specified with a declaration before use, and is used in forward declaration. The term "declaration" is frequently contrasted with the term "definition", but meaning and usage varies significantly between languages
 
  
* https://en.wikipedia.org/wiki/Initialization_(programming) - the assignment of an initial value for a data object or variable. The manner in which initialization is performed depends on programming language, as well as type, storage class, etc., of an object to be initialized. Programming constructs which perform initialization are typically called initializers and initializer lists. Initialization is distinct from (and preceded by) declaration, although the two can sometimes be conflated in practice. The complement of initialization is finalization, which is primarily used for objects, but not variables. Initialization is done either by statically embedding the value at compile time, or else by assignment at run time.
+
* http://en.wikipedia.org/wiki/Function_pointer - Instead of referring to data values, a function pointer points to executable code within memory. When dereferenced, a function pointer can be used to invoke the function it points to and pass it arguments just like a normal function call. Such an invocation is also known as an "indirect" call, because the function is being invoked indirectly through a variable instead of directly through a fixed name or address. Function pointers can be used to simplify code by providing a simple way to select a function to execute based on run-time values.
  
* https://en.wikipedia.org/wiki/Finalization - the process of preparing an object for deallocation; strictly speaking, finalization is all parts of object destruction until memory deallocation itself. Finalization is formally complementary to initialization, which is the part of object creation that follows allocation, but differs significantly in practice
 
  
 +
* http://en.wikipedia.org/wiki/Funarg_problem - refers to the difficulty in implementing first-class functions (functions as first-class objects) in programming language implementations so as to use stack-based memory allocation of the functions. The difficulty only arises if the body of a nested function refers directly (i.e., not via argument passing) to identifiers defined in the environment in which the function is defined, but not in the environment of the function call. To summarize the discussion below, two standard resolutions are to either forbid such references or to create closures.
  
* https://en.wikipedia.org/wiki/Directive_(programming) - a language construct that specifies how a compiler (or assembler or interpreter) should process its input. Directives are not part of the language proper – they are not part of the grammar, and may vary from compiler to compiler – but instead function either as an in-band form of a command-line option, specifying compiler behavior, or are processed by a preprocessor. In some cases directives specify global behavior, while in other cases they only affect a local section, such as a block of programming code. In some cases, such as some C pragmas, directives are optional compiler hints, and may be ignored, but normally they are prescriptive, and must be followed. However, a directive does not perform any action in the language itself, but rather only a change in the behavior of the compiler.
 
  
This term could be used to refer to proprietary third party tags and commands (or markup) embedded in code that result in additional executable processing that extend the existing compiler, assembler and language constructs present in the development environment. The term "directive" is also applied in a variety of ways that are similar to the term command.
 
  
  
* https://en.wikipedia.org/wiki/First-class_citizen - In programming language design, a first-class citizen (also type, object, entity, or value) in a given programming language is an entity which supports all the operations generally available to other entities. These operations typically include being passed as an argument, returned from a function, and assigned to a variable.
+
* https://en.wikipedia.org/wiki/Inline_expansion - or '''inlining''', is a manual or compiler optimization that replaces a function call site with the body of the called function. Inline expansion is similar to macro expansion, but occurs during compilation, without changing the source code (the text), while macro expansion occurs prior to compilation, and results in different text that is then processed by the compiler. Inlining is an important optimization, but has complicated effects on performance. As a rule of thumb, some inlining will improve speed at very minor cost of space, but excess inlining will hurt speed, due to inlined code consuming too much of the instruction cache, and also cost significant space.  
  
  
* https://en.wikipedia.org/wiki/Free-form_language
 
  
 +
* https://en.wikipedia.org/wiki/Defunctionalization - refers to a compile-time transformation which eliminates higher-order functions, replacing them by a single first-order apply function. The technique was first described by John C. Reynolds in his 1972 paper, "Definitional Interpreters for Higher-Order Programming Languages". Reynolds' observation was that a given program contains only finitely many function abstractions, so that each can be assigned (and replaced by) a unique identifier. Every function application within the program is then replaced by a call to the apply function with the function identifier as the first argument. The apply function's only job is to dispatch on this first argument, and then perform the instructions denoted by the function identifier on the remaining arguments.
  
  
* https://en.wikipedia.org/wiki/Indentation_style - a convention governing the indentation of blocks of code to convey the program's structure. This article largely addresses the free-form languages, such as C programming language and its descendants, but can be (and frequently is) applied to most other programming languages (especially those in the curly bracket family), where whitespace is otherwise insignificant. Indent style is just one aspect of programming style.
 
  
  
 +
* PDF: [https://www.math.upenn.edu/~wilf/gfologyLinked2.pdf Generating Functions] - this book is about generating functions and some of their uses indiscrete mathematics. [https://news.ycombinator.com/item?id=9324551]
  
* https://en.wikipedia.org/wiki/Syntactic_sugar -  syntax within a programming language that is designed to make things easier to read or to express. It makes the language "sweeter" for human use: things can be expressed more clearly, more concisely, or in an alternative style that some may prefer.
 
  
For example, many programming languages provide special syntax for referencing and updating array elements. Abstractly, an array reference is a procedure of two arguments: an array and a subscript vector, which could be expressed as get_array(Array, vector(i,j)). Instead, many languages provide syntax like Array[i,j]. Similarly an array element update is a procedure of three arguments, something like set_array(Array, vector(i,j), value), but many languages provide syntax like Array[i,j] = value.
 
  
Specifically, a construct in a language is called syntactic sugar if it can be removed from the language without any effect on what the language can do: functionality and expressive power will remain the same. Language processors, including compilers, static analyzers, and the like, often expand sugared constructs into more fundamental constructs before processing, a process sometimes called "desugaring".
 
  
 +
* [http://tech.pro/blog/6742/callback-to-future-functor-applicative-monad From callback to (Future -> Functor -> Monad)] [https://news.ycombinator.com/item?id=9325474]
  
  
* https://en.wikipedia.org/wiki/Lex_(software)
+
* https://dspace.mit.edu/bitstream/handle/1721.1/6090/AIM-378.pdf?sequence=2&isAllowed=y [https://news.ycombinator.com/item?id=22977966]
  
* https://en.wikipedia.org/wiki/Flex_(lexical_analyser_generator)
 
  
 +
* [https://philosophy.stackexchange.com/questions/25365/am-i-a-monad-are-we-a-monad-software-and-hardware philosophy of mind - Am I a monad? Are we a monad? (Software and hardware) - Philosophy Stack Exchange] - [https://www.reddit.com/r/programmingcirclejerk/comments/lvsycr/q_am_i_a_monad_a_i_would_argue_that_there_is_some/]
  
  
* https://en.wikipedia.org/wiki/Syntax_analysis#Programming_languages
+
==== Hash function ====
 +
* http://en.wikipedia.org/wiki/Hash_function - any function that can be used to map data of arbitrary size to data of fixed size. The values returned by a hash function are called hash values, hash codes, hash sums, or simply hashes. One use is a data structure called a hash table, widely used in computer software for rapid data lookup. Hash functions accelerate table or database lookup by detecting duplicated records in a large file. An example is finding similar stretches in DNA sequences. They are also useful in cryptography.
 +
** http://programmers.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed/145633#145633
 +
** http://www.hashids.org/
 +
** http://floodyberry.com/noncryptohashzoo/
  
 +
* [http://cyan4973.github.io/xxHash/ xxHash - Extremely fast non-cryptographic hash algorithm] - an extremely fast non-cryptographic hash algorithm, working at speeds close to RAM limits. It is proposed in two flavors, 32 and 64 bits.
 +
** https://github.com/Cyan4973/xxHash
  
* https://en.wikipedia.org/wiki/Backus–Naur_Form - BNF (Backus Normal Form or Backus–Naur Form) is one of the two main notation techniques for context-free grammars, often used to describe the syntax of languages used in computing, such as computer programming languages, document formats, instruction sets and communication protocols; the other main technique for writing context-free grammars is the van Wijngaarden form. They are applied wherever exact descriptions of languages are needed: for instance, in official language specifications, in manuals, and in textbooks on programming language theory. Many extensions and variants of the original Backus–Naur notation are used; some are exactly defined, including Extended Backus–Naur Form (EBNF) and Augmented Backus–Naur Form (ABNF).
 
  
* https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_Form
+
* [https://arxiv.org/abs/1406.2294v1 -1406.2294v1- A Fast, Minimal Memory, Consistent Hash Algorithm] -  [https://news.ycombinator.com/item?id=8136408] [https://news.ycombinator.com/item?id=9207999]
  
* https://en.wikipedia.org/wiki/Van_Wijngaarden_grammar
+
=== Algorithms ===
 +
See also [[Computing#Computational complexity]], [[Maths]]
  
 +
* http://en.wikipedia.org/wiki/Algorithm
  
* https://en.wikipedia.org/wiki/Parsing_expression_grammar - or '''PEG''', is a type of analytic formal grammar, i.e. it describes a formal language in terms of a set of rules for recognizing strings in the language. The formalism was introduced by Bryan Ford in 2004 and is closely related to the family of top-down parsing languages introduced in the early 1970s. Syntactically, PEGs also look similar to context-free grammars (CFGs), but they have a different interpretation: the choice operator selects the first match in PEG, while it is ambiguous in CFG. This is closer to how string recognition tends to be done in practice, e.g. by a recursive descent parser. Unlike CFGs, PEGs cannot be ambiguous; if a string parses, it has exactly one valid parse tree. It is conjectured that there exist context-free languages that cannot be parsed by a PEG, but this is not yet proven. PEGs are well-suited to parsing computer languages, but not natural languages where their performance is comparable to general CFG algorithms such as the Earley algorithm
 
  
Compared to pure regular expressions (i.e. without back-references), PEGs are strictly more powerful, but require significantly more memory. For example, a regular expression inherently cannot find an arbitrary number of matched pairs of parentheses, because it is not recursive, but a PEG can. However, a PEG will require an amount of memory proportional to the length of the input, while a regular expression matcher will require only a constant amount of memory.
+
* https://news.ycombinator.com/item?id=15469660
  
* [http://bford.info/packrat/ The Packrat Parsing and Parsing Expression Grammars Page]
 
  
 +
* http://en.wikipedia.org/wiki/Algorithm_characterizations
  
* https://en.wikipedia.org/wiki/Recursive_descent_parser
+
* [https://algs4.cs.princeton.edu/home/ Algorithms, 4th Edition by Robert Sedgewick and Kevin Wayne] -  surveys the most important algorithms and data structures in use today. We motivate each algorithm that we address by examining its impact on applications to science, engineering, and industry.
  
* https://en.wikipedia.org/wiki/Pratt_parser
+
* https://news.ycombinator.com/item?id=18805624
  
* https://tdop.github.io/
 
* http://javascript.crockford.com/tdop/tdop.html
 
* http://l-lang.org/blog/TDOP---Pratt-parser-in-pictures/
 
* https://news.ycombinator.com/item?id=2344837
 
  
== Values and types ==
 
  
* https://en.wikipedia.org/wiki/Value_(computer_science) - an expression which cannot be evaluated any further (a normal form). The members of a type are the values of that type. For example, the expression 1 + 2 is not a value as it can be reduced to the expression 3. This expression cannot be reduced any further (and is a member of the type Nat) and therefore is a value. The "value of a variable" is given by the corresponding mapping in the environment. In languages with assignable variables it becomes necessary to distinguish between the r-value (or contents) and the l-value (or location) of a variable. In declarative (high-level) languages, values have to be referentially transparent. This means that the resulting value is independent of the location in which a (sub-)expression needed to compute the value is stored. Only the contents of the location (the bits, whether they are 1 or 0) and their interpretation are significant.
+
* https://en.wikipedia.org/wiki/Algorithmic_information_theory - a subfield of information theory and computer science that concerns itself with the relationship between computation and information. According to Gregory Chaitin, it is "the result of putting Shannon's information theory and Turing's computability theory into a cocktail shaker and shaking vigorously."
  
 +
* http://www.jamisbuck.org/presentations/rubyconf2011/index.html
  
* YouTube: [https://www.youtube.com/watch?v=-6BsiVyC1kM The Value of Values with Rich Hickey]
+
* http://www3.cs.stonybrook.edu/~algorith/video-lectures/
  
  
* https://en.wikipedia.org/wiki/Data_type - simply type is a classification identifying one of various types of data, such as real, integer or Boolean, that determines the possible values for that type; the operations that can be done on values of that type; the meaning of the data; and the way values of that type can be stored.
+
* http://en.wikipedia.org/wiki/Memoization
  
 +
* http://interactivepython.org/runestone/static/pythonds/index.html [https://news.ycombinator.com/item?id=9111958]
  
* https://en.wikipedia.org/wiki/Type_theory - any of a class of formal systems, some of which can serve as alternatives to set theory as a foundation for all mathematics. In type theory, every "term" has a "type" and operations are restricted to terms of a certain type.
+
* http://www.nayuki.io/page/fast-fibonacci-algorithms [https://news.ycombinator.com/item?id=9315346]
  
* YouTube: [https://www.youtube.com/watch?v=jVyz3lWH2bA What type of thing is a type? by Ron Garcia]
+
* http://www.algosort.com/
 +
* https://en.wikipedia.org/wiki/List_of_algorithms
 +
* http://www.jjj.de/fxt/fxtpage.html#fxtbook [http://news.ycombinator.com/item?id=4957591]
 +
* [http://xlinux.nist.gov/dads/ Dictionary of Algorithms and Data Structures]
 +
* http://news.ycombinator.com/item?id=4961357
 +
* http://graphics.stanford.edu/~seander/bithacks.html
 +
* http://rosettacode.org/wiki/Category:Programming_Tasks
 +
* http://www.hackersdelight.org/
 +
* http://blog.notdot.net/tag/damn-cool-algorithms
 +
* http://aima.cs.berkeley.edu/
 +
* http://www.cleveralgorithms.com/
 +
* http://www.cs.sunysb.edu/~algorith/ [https://news.ycombinator.com/item?id=7456099]
 +
* http://www.comp.nus.edu.sg/~stevenha/visualization/ [https://news.ycombinator.com/item?id=8194662]
  
=== Type systems ===
+
* http://jasonpark.me/AlgorithmVisualizer/
 +
* https://news.ycombinator.com/item?id=12326806
  
* http://c2.com/cgi/wiki?TypingQuadrant
+
* http://visualgo.net/
  
 +
* https://idea-instructions.com [https://news.ycombinator.com/item?id=16383990]
  
* https://en.wikipedia.org/wiki/Type_system - a collection of rules that assign a property called a type to constructs such as variables, expressions, functions or modules—a computer program is composed of. reduces bugs by defining interfaces between different parts of a computer program, and then checking that the parts have been connected in a consistent way. This checking can happen statically (at compile time), dynamically (at run time), or as a combination thereof.
 
  
Type systems have other purposes as well, such as enabling certain compiler optimizations, allowing for multiple dispatch, providing a form of documentation, etc.
+
* http://bost.ocks.org/mike/algorithms/ [https://news.ycombinator.com/item?id=10216124]
A type system associates a type with each computed value and, by examining the flow of these values, attempts to ensure or prove that no type errors can occur. The particular type system in question determines exactly what constitutes a type error, but in general the aim is to prevent operations expecting a certain kind of value from being used with values for which that operation does not make sense (logic errors); memory errors will also be prevented. Type systems are often specified as part of programming languages, and built into the interpreters and compilers for them; although the type system of a language can be extended by optional tools that perform additional kinds of checks using the language's original type syntax and grammar.
 
  
 +
* https://news.ycombinator.com/item?id=8088842
  
* http://c2.com/cgi/wiki?TypeSystem
+
* http://justin.abrah.ms/computer-science/how-to-calculate-big-o.html
  
 +
* http://accidentallyquadratic.tumblr.com/
 +
** http://accidentallyquadratic.tumblr.com/post/113840433022/why-accidentally-quadratic [https://news.ycombinator.com/item?id=9217048]
  
* [http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html What to know before debating type systems]
+
* http://news.ycombinator.com/item?id=4783301
  
 +
* http://leftnode.com/entry/i-am-a-great-programmer-but-horrible-algorithmist.html
  
* [http://www.cl.cam.ac.uk/~srk31/blog/2014/10/07/ Seven deadly sins of talking about “types”] [https://news.ycombinator.com/item?id=8421594]
+
* http://jake.simvla.com/posts/531-mr-mrs-kipling
  
 +
* https://www.varnish-cache.org/trac/wiki/ArchitectNotes
  
* https://en.wikipedia.org/wiki/Type_safety - the extent to which a programming language discourages or prevents type errors.
+
* http://developers.memsql.com/blog/common-pitfalls-in-writing-lock-free-algorithms/
  
* http://c2.com/cgi/wiki?TypeSafe
+
* https://queue.acm.org/detail.cfm?id=1814327
  
 +
* http://compgeom.cs.uiuc.edu/~jeffe/teaching/algorithms/
  
* https://en.wikipedia.org/wiki/Type_signature - type annotation defines the inputs and outputs for a function, subroutine or method.
+
* http://keyj.emphy.de/balanced-shuffle/ [https://news.ycombinator.com/item?id=9396861]
* http://www.cs.unm.edu/~storm/C++/ProgrammingTerms/FunctionSignatures.html
 
  
 +
* http://www.eternallyconfuzzled.com/jsw_home.aspx [https://news.ycombinator.com/item?id=9395820]
  
* https://en.wikipedia.org/wiki/Type_conversion - '''typecasting''', and '''coercion''' are different ways of, implicitly or explicitly, changing an entity of one data type into another. This is done to take advantage of certain features of type hierarchies or type representations. One example would be small integers, which can be stored in a compact format and converted to a larger representation when used in arithmetic computations. In object-oriented programming, type conversion allows programs to treat objects of one type as one of their ancestor types to simplify interacting with them.
 
  
Type aliasing provides a way to redefine existing types as new type names. For example, type aliases may be used to define names for object types, effectively modeling interface types.
 
  
* [http://blog.regehr.org/archives/1307 The Strict Aliasing Situation is Pretty Bad] [https://news.ycombinator.com/item?id=11288665]
 
  
  
* https://en.wikipedia.org/wiki/Type_inference - automatic deduction of the type of an expression in a programming language. If some, but not all, type annotations are already present it is referred to as type reconstruction. The opposite operation of type inference is called type erasure.
+
* http://files.righto.com/calculator/sinclair_scientific_simulator.html
  
* http://c2.com/cgi/wiki?TypeInference
+
* http://planning.cs.uiuc.edu/
  
 +
* http://www.rockpapershotgun.com/2010/11/02/genetic-algorithms-find-build-order-from-hell/
  
* https://en.wikipedia.org/wiki/Strong_and_weak_typing - in general, a strongly typed language is more likely to generate an error or refuse to compile if the argument passed to a function does not closely match the expected type. On the other hand, a very weakly typed language may produce unpredictable results or may perform implicit type conversion. A different but related concept is latent typing.
+
* http://theory.stanford.edu/~amitp/GameProgramming/AStarComparison.html [https://news.ycombinator.com/item?id=7591119]
  
* https://en.wikipedia.org/wiki/Latent_typing - type system where types are associated with values and not variables, requires run-time type checking
+
* http://jimkang.com/quadtreevis/
  
 +
* https://news.ycombinator.com/item?id=7949995
 +
* https://news.ycombinator.com/item?id=13517597
  
* https://www.emacswiki.org/emacs/DynamicBindingVsLexicalBinding
+
* https://flafla2.github.io/2014/08/09/perlinnoise.html [https://news.ycombinator.com/item?id=8158572
  
 +
* https://en.wikipedia.org/wiki/Monte_Carlo_method
 +
* http://montepie.herokuapp.com/ [https://news.ycombinator.com/item?id=8159010]
 +
* https://news.ycombinator.com/item?id=12537043
  
 +
* http://katrinaeg.com/simulated-annealing.html [https://news.ycombinator.com/item?id=8916876]
  
* https://en.wikipedia.org/wiki/Structural_type_system - a major class of type system, in which type compatibility and equivalence are determined by the type's actual structure or definition, and not by other characteristics such as its name or place of declaration. Structural systems are used to determine if types are equivalent and whether a type is a subtype of another. It contrasts with nominative systems, where comparisons are based on the names of the types or explicit declarations, and duck typing, in which only the part of the structure accessed at runtime is checked for compatibility.
+
* https://en.wikipedia.org/wiki/Correctness_(computer_science)
  
* https://en.wikipedia.org/wiki/Nominative_type_system - or nominative type system (or name-based type system) is a major class of type system, in which compatibility and equivalence of data types is determined by explicit declarations and/or the name of the types. Nominal systems are used to determine if types are equivalent, as well as if a type is a subtype of another. It contrasts with structural systems, where comparisons are based on the structure of the types in question and do not require explicit declarations.
 
  
 +
* https://en.wikipedia.org/wiki/Hoare_logic
  
* https://en.wikipedia.org/wiki/Automatic_variable - a local variable which is allocated and deallocated automatically when program flow enters and leaves the variable's scope. The scope is the lexical context, particularly the function or block in which a variable is defined. Local data is typically (in most languages) invisible outside the function or lexical context where it is defined. Local data is also invisible and inaccessible to a called function,[note 1] but is not deallocated, coming back in scope as the execution thread returns to the caller.
 
  
 +
* https://en.wikipedia.org/wiki/Logical_assertion
  
 +
* https://en.wikipedia.org/wiki/Assertion_(software_development) - a statement that a predicate (Boolean-valued function, a true–false expression) is expected to always be true at that point in the code. If an assertion evaluates to false at run time, an assertion failure results, which typically causes the program to crash, or to throw an assertion exception.
  
* https://en.wikipedia.org/wiki/Principal_type - In type theory, a type system is said to have the principal type property if, given a term and an environment, there exists a principal type for this term in this environment, i.e. a type such that all other types for this term in this environment are an instance of the principal type.
+
* https://en.wikipedia.org/wiki/Invariant_%28computer_science%29 - a condition that can be relied upon to be true during execution of a program, or during some portion of it. It is a logical assertion that is held to always be true during a certain phase of execution. For example, a loop invariant is a condition that is true at the beginning and end of every execution of a loop.
  
* https://en.wikipedia.org/wiki/Duck_typing - style of typing in which an object's methods and properties determine the valid semantics, rather than its inheritance from a particular class or implementation of a specific interface
+
* https://en.wikipedia.org/wiki/Loop_invariant
  
 +
* https://en.wikipedia.org/wiki/Class_invariant
  
* https://en.wikipedia.org/wiki/Substructural_type_system - family of type systems analogous to substructural logics where one or more of the structural rules are absent or allowed under controlled circumstances. Such systems are useful for constraining access to system resources such as files, locks and memory by keeping track of changes of state that occur and preventing invalid states
 
  
* http://wphomes.soic.indiana.edu/jsiek/what-is-gradual-typing/ [https://news.ycombinator.com/item?id=8594079]
 
  
 +
* https://www.cs.princeton.edu/~rs/talks/AC11-Cardinality.pdf
  
* https://en.wikipedia.org/wiki/Type_constructor - a feature of a typed formal language that builds new types from old
 
  
* https://en.wikipedia.org/wiki/Kind_%28type_theory%29 - the type of a type constructor or, less commonly, the type of a higher-order type operator. A kind system is essentially a simply typed lambda calculus "one level up", endowed with a primitive type, denoted * and called "type", which is the kind of any data type which does not need any type parameters.
+
* [https://cp-algorithms.com/ Main Page - Algorithms for Competitive Programming] - The goal of this project is to translate the wonderful resource http://e-maxx.ru/algo which provides descriptions of many algorithms and data structures especially popular in field of competitive programming. Moreover we want to improve the collected knowledge by extending the articles and adding new articles to the collection.
 +
** https://github.com/e-maxx-eng/e-maxx-eng
  
 +
=== Sorting ===
 +
* [https://www.youtube.com/watch?v=t8g-iYGHpEA What different sorting algorithms sound like]
 +
* http://panthema.net/2013/sound-of-sorting/
 +
* http://preshing.com/20121026/1mb-sorting-explained
 +
* http://www.dangermouse.net/esoteric/bogobogosort.html
 +
* http://ljs.io/projects/rainbow/ [https://news.ycombinator.com/item?id=7291421]
 +
* http://sorting.at/ [https://news.ycombinator.com/item?id=7652333]
  
* https://en.wikipedia.org/wiki/Hindley%E2%80%93Milner_type_system - a classical type system for the lambda calculus with parametric polymorphism, first described by J. Roger Hindley and later rediscovered by Robin Milner. Luis Damas contributed a close formal analysis and proof of the method in his PhD thesis.mong HM's more notable properties is completeness and its ability to deduce the most general type of a given program without the need of any type annotations or other hints supplied by the programmer. Algorithm W is a fast algorithm, performing type inference in almost linear time with respect to the size of the source, making it practically usable to type large programs.[note 1] HM is preferably used for functional languages. It was first implemented as part of the type system of the programming language ML. Since then, HM has been extended in various ways, most notably by constrained types as used in Haskell.
+
* [https://gkoberger.github.io/stacksort/ stacksort]
  
  
* http://c2.com/cgi/wiki?HindleyMilnerTypeInference
+
* https://xosh.org/VisualizingSorts
  
* http://www.lispcast.com/Hindley-Milner-in-Clojure [https://news.ycombinator.com/item?id=7051611]
 
  
 +
* https://lobste.rs/s/gh1ngc/is_this_simplest_most_surprising_sorting
  
* https://en.wikipedia.org/wiki/Substructural_type_system
 
  
* http://blog.tweag.io/posts/2017-03-13-linear-types.html
+
* [https://www.nature.com/articles/s41586-023-06004-9 Faster sorting algorithms discovered using deep reinforcement learning | Nature] - [https://news.ycombinator.com/item?id=36228125]
  
 +
=== Bloom filter ===
 +
* https://news.ycombinator.com/item?id=6093777 - bloom filters
  
* [https://www.destroyallsoftware.com/talks/ideology Ideology] - Some people claim that unit tests make type systems unnecessary: "types are just simple unit tests written for you, and simple unit tests aren't the important ones". Other people claim that type systems make unit tests unnecessary: "dynamic languages only need unit tests because they don't have type systems." What's going on here? These can't both be right. We'll use this example and a couple others to explore the unknown beliefs that structure our understanding of the world.
+
* http://billmill.org/bloomfilter-tutorial/
  
=== Machine data ===
+
* https://news.ycombinator.com/item?id=12241332
Machine data types - All data in computers based on digital electronics is represented as bits (alternatives 0 and 1) on the lowest level. The smallest addressable unit of data is usually a group of bits called a byte (usually an octet, which is 8 bits). The unit processed by machine code instructions is called a word (as of 2011, typically 32 or 64 bits). Most instructions interpret the word as a binary number, such that a 32-bit word can represent unsigned integer values from 0 to 2^{32}-1 or signed integer values from -2^{31} to 2^{31}-1. Because of two's complement, the machine language and machine doesn't need to distinguish between these unsigned and signed data types for the most part.
 
  
There is a specific set of arithmetic instructions that use a different interpretation of the bits in word as a floating-point number.
+
* https://news.ycombinator.com/item?id=13056726
Machine data types need to be exposed or made available in systems or low-level programming languages, allowing fine-grained control over hardware. The C programming language, for instance, supplies integer types of various widths, such as short and long. If a corresponding native type does not exist on the target platform, the compiler will break them down into code using types that do exist. For instance, if a 32-bit integer is requested on a 16 bit platform, the compiler will tacitly treat it as an array of two 16 bit integers.
 
  
* http://www.math.grin.edu/~rebelsky/Courses/152/97F/Readings/machine-data.html
+
* [https://blog.cloudflare.com/when-bloom-filters-dont-bloom/ When Bloom filters don't bloom] - [https://news.ycombinator.com/item?id=22463979]
  
=== Boolean ===
+
* [https://gopiandcode.uk/logs/log-bloomfilters-debunked.html Gopiandcode > logs > Bloom filters debunked: Dispelling 30 Years of bad math with Coq!] - [https://news.ycombinator.com/item?id=23946793]
* https://en.wikipedia.org/wiki/Boolean_data_type - a data type, having two values (usually denoted true and false), intended to represent the truth values of logic and Boolean algebra. It is named after George Boole, who first defined an algebraic system of logic in the mid 19th century. The Boolean data type is primarily associated with conditional statements, which allow different actions and change control flow depending on whether a programmer-specified Boolean condition evaluates to true or false. It is a special case of a more general logical data type; logic does not always have to be Boolean.
 
  
1,0
+
* [https://lemire.me/blog/2021/10/03/word-aligned-bloom-filters/ Word-aligned Bloom filters – Daniel Lemire's blog] - da* https://news.ycombinator.com/item?id=28737910 -
  
=== Numbers ===
 
* https://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic - bignum
 
  
  
* https://en.wikipedia.org/wiki/Fixed-point_arithmetic
 
  
 +
=== Polymorphism ===
 +
* https://en.wikipedia.org/wiki/Polymorphism_(computer_science) -  the provision of a single interface to entities of different types. A '''polymorphic type''' is one whose operations can also be applied to values of some other type, or types
  
  
 +
* https://en.wikipedia.org/wiki/Ad_hoc_polymorphism - a kind of polymorphism in which polymorphic functions can be applied to arguments of different types, because a polymorphic function can denote a number of distinct and potentially heterogeneous implementations depending on the type of argument(s) to which it is applied. It is also known as function overloading or operator overloading. The term ad hoc in this context is not intended to be pejorative; it refers simply to the fact that this type of polymorphism is not a fundamental feature of the type system.
  
* https://en.wikipedia.org/wiki/Integer_(computer_science)
+
* https://en.wikipedia.org/wiki/Function_overloading
  
* https://en.wikipedia.org/wiki/Decimal_data_type
+
* https://en.wikipedia.org/wiki/Operator_overloading
  
* https://en.wikipedia.org/wiki/Real_data_type
 
  
* https://en.wikipedia.org/wiki/Rational_data_type
+
* https://en.wikipedia.org/wiki/Parametric_polymorphism - a way to make a language more expressive, while still maintaining full static type-safety. Using parametric polymorphism, a function or a data type can be written generically so that it can handle values identically without depending on their type. Such functions and data types are called '''generic functions''' and '''generic datatypes''' respectively and form the basis of generic programming.
  
* https://en.wikipedia.org/wiki/Complex_data_type
+
* https://en.wikipedia.org/wiki/Subtyping
  
* https://en.wikipedia.org/wiki/Signedness - a property of data types representing numbers in computer programs. A numeric variable is signed if it can represent both positive and negative numbers, and unsigned if it can only represent non-negative numbers (zero or positive numbers).
 
  
As signed numbers can represent negative numbers, they lose a range of positive numbers that can only be represented with unsigned numbers of the same size (in bits) because half the possible values are non-positive values (so if an 8-bit is signed, positive unsigned values 128 to 255 are gone while -128 to 127 are present). Unsigned variables can dedicate all the possible values to the positive number range. For example, a two's complement signed 16-bit integer can hold the values −32768 to 32767 inclusively, while an unsigned 16 bit integer can hold the values 0 to 65535. For this sign representation method, the leftmost bit (most significant bit) denotes whether the value is positive or negative (0 for positive, 1 for negative).
+
* https://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming
  
==== Floating point ====
 
* https://en.wikipedia.org/wiki/Floating_point
 
  
  
* https://en.wikipedia.org/wiki/IEEE_754 - a technical standard for floating-point computation established in 1985 by the Institute of Electrical and Electronics Engineers (IEEE). The standard addressed many problems found in the diverse floating point implementations that made them difficult to use reliably and portably. Many hardware floating point units now use the IEEE 754 standard.
+
* https://en.wikipedia.org/wiki/Dynamic_dispatch
  
 +
* https://en.wikipedia.org/wiki/Multiple_dispatch
  
  
* http://0.30000000000000004.com/ [https://news.ycombinator.com/item?id=10558871]
+
* http://eli.thegreenplace.net/2016/a-polyglots-guide-to-multiple-dispatch/ [https://news.ycombinator.com/item?id=11526923]
* [https://www.youtube.com/watch?v=PZRI1IfStY0 Floating Point - Computerphile]
 
* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/Babbfeda.html
 
* http://randomascii.wordpress.com/2014/01/27/theres-only-four-billion-floatsso-test-them-all/ [https://news.ycombinator.com/item?id=7135261]
 
  
* https://news.ycombinator.com/item?id=15359574
 
  
  
* https://lobste.rs/s/eiwnnj/eight_bit_floating_point
+
=== Control structures ===
 +
* https://en.wikipedia.org/wiki/Control_flow
  
* [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0907r0.html p0907r0: Signed Integers are Two’s Complement] - [https://news.ycombinator.com/item?id=17190864]
+
* https://en.wikipedia.org/wiki/Control_flow_diagram
 +
* https://en.wikipedia.org/wiki/Control_flow_graph
  
=== Strings ===
 
  
* https://en.wikipedia.org/wiki/String_(computer_science) - traditionally a sequence of characters, either as a literal constant or as some kind of variable. The latter may allow its elements to be mutated and the length changed, or it may be fixed (after creation). A string is generally considered a data type and is often implemented as an array data structure of bytes (or words) that stores a sequence of elements, typically characters, using some character encoding. String may also denote more general arrays or other sequence (or list) data types and structures.Depending on programming language and precise data type used, a variable declared to be a string may either cause storage in memory to be statically allocated for a predetermined maximum length or employ dynamic allocation to allow it to hold a variable number of elements.When a string appears literally in source code, it is known as a string literal or an anonymous string.[1]In formal languages, which are used in mathematical logic and theoretical computer science, a string is a finite sequence of symbols that are chosen from a set called an alphabet.
 
  
 +
* https://en.wikipedia.org/wiki/Conditional_(programming)
 +
* https://en.wikipedia.org/wiki/Switch_statement
  
* https://en.wikipedia.org/wiki/Comparison_of_programming_languages_(strings)
 
  
 +
* http://degoes.net/articles/destroy-all-ifs [https://news.ycombinator.com/item?id=12107495]
  
* https://github.com/minimaxir/big-list-of-naughty-strings [https://news.ycombinator.com/item?id=10035008] [https://news.ycombinator.com/item?id=13406119] [https://news.ycombinator.com/item?id=18466787]
 
  
=== to sort ===
+
* https://en.wikipedia.org/wiki/For_loop
 +
* https://en.wikipedia.org/wiki/While_loop
 +
* https://en.wikipedia.org/wiki/Do_while_loop
 +
* https://en.wikipedia.org/wiki/Foreach_loop
  
* https://en.wikipedia.org/wiki/Primitive_data_type - a basic type, often built-in, used as a building block for composite types
 
  
* https://en.wikipedia.org/wiki/Value_type - commonly used to refer to one of two kinds of data types: Types of values or Types of objects with deep copy semantics.
+
* https://en.wikipedia.org/wiki/Exception_handling
  
* https://en.wikipedia.org/wiki/Reference_type - a data type that refers to an object in memory. A pointer type on the other hand refers to a memory address. Reference types can be thought of as pointers that are implicitly dereferenced. The objects being referred to are dynamically allocated on the heap whereas value types are allocated automatically on the stack. In languages supporting garbage collection the objects being referred to are destroyed automatically after they become unreachable.
 
  
* https://en.wikipedia.org/wiki/Passive_data_structure - also termed a plain old data structure, or plain old data (POD)), is a term for a record, to contrast with objects. It is a data structure that is represented only as passive collections of field values (instance variables), without using object-oriented features. Passive data structures are appropriate when there is a part of a system where it should be clearly indicated that the detailed logic for data manipulation and integrity are elsewhere. PDSs are often found at the boundaries of a system, where information is being moved to and from other systems or persistent storage and the problem domain logic that is found in other parts of the system is irrelevant. For example, PDS would be convenient for representing the field values of objects that are being constructed from external data, in a part of the system where the semantic checks and interpretations needed for valid objects are not applied yet.
+
* https://en.wikipedia.org/wiki/Continuation
  
 +
* https://en.wikipedia.org/wiki/Container_(abstract_data_type)
  
* https://en.wikipedia.org/wiki/Reference_(computer_science) - a value that enables a program to indirectly access a particular datum, such as a variable or a record, in the computer's memory or in some other storage device. The reference is said to refer to the datum, and accessing the datum is called dereferencing the reference. A reference is distinct from the data itself. Typically, for references to data stored in memory on a given system, a reference is implemented as the physical address of where the data is stored in memory or in the storage device. For this reason, a reference is often erroneously confused with a pointer or address, and is said to "point to" the data. However a reference may also be implemented in other ways, such as the offset (difference) between the datum's address and some fixed "base" address, as an index into an array, or more abstractly as a handle. More broadly, in networking, references may be network addresses, such as URLs.
 
  
The concept of reference must not be confused with other values (keys or identifiers) that uniquely identify the data item, but give access to it only through a non-trivial lookup operation in some table data structure. References are widely used in programming, especially to efficiently pass large or mutable data as arguments to procedures, or to share such data among various uses. In particular, a reference may point to a variable or record that contains references to other data. This idea is the basis of indirect addressing and of many linked data structures, such as linked lists. References can cause significant complexity in a program, partially due to the possibility of dangling and wild references and partially because the topology of data with references is a directed graph, whose analysis can be quite complicated.
+
* https://en.wikipedia.org/wiki/Coroutines
  
 +
* https://en.wikipedia.org/wiki/Generator_(computer_science) - a special routine that can be used to control the iteration behaviour of a loop. In fact, all generators are iterators. A generator is very similar to a function that returns an array, in that a generator has parameters, can be called, and generates a sequence of values. However, instead of building an array containing all the values and returning them all at once, a generator yields the values one at a time, which requires less memory and allows the caller to get started processing the first few values immediately. In short, a generator looks like a function but behaves like an iterator.
  
 +
Generators can be implemented in terms of more expressive control flow constructs, such as coroutines or first-class continuations. Generators, also known as semicoroutines, are a special case of (and weaker than) coroutines, in that they always yield control back to the caller (when passing a value back), rather than specifying a coroutine to jump to
  
* https://en.wikipedia.org/wiki/Symbol_(programming) - a primitive datatype whose instances have a unique human-readable form. Symbols can be used as identifiers. In some programming languages, they are called atoms.In the most trivial implementation, they are essentially named integers (e.g. the enumerated type in C).
+
== Libraries ==
  
  
 +
* PDF: [https://www.archive.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf Reflections on Trusting Trust] - Ken Thompson, 1984
  
* https://en.wikipedia.org/wiki/Composite_data_type - any data type constructed using primitive data types and other composite types
 
  
 +
* PDF: [https://akkadia.org/drepper/dsohowto.pdf How To Write Shared Libraries] - Ulrich Drepper, December 10, 2011. Abstract: Today, shared libraries are ubiquitous.  Developers use them for multiple reasons and create them just as they would create application code.  This is a problem,  though,  since on many platforms some additional techniques must be applied even to generate decent code. Even more knowledge is needed to generate optimized code. This paper introduces the required rules and techniques. In addition, it introduces the concept of ABI (Application Binary Interface) stability and shows how to manage it.
  
  
 +
* http://depstack.io
  
* https://en.wikipedia.org/wiki/Literal_(computer_programming) - a notation for representing a fixed value in source code. Almost all programming languages have notations for atomic values such as integers, floating-point numbers, and strings, and usually for booleans and characters; some also have notations for elements of enumerated types and compound values such as arrays, records, and objects. An anonymous function is a literal for the function type.
 
  
In contrast to literals, variables or constants are symbols that can take on one of a class of fixed values, the constant being constrained not to change. Literals are often used to initialize variables, for example, in the following, 1 is an integer literal and the three letter string in "cat" is a string literal:
 
int a = 1;
 
String s = "cat";
 
  
In lexical analysis, literals of a given type are generally a token type, with a grammar rule, like "a string of digits" for an integer literal. Some literals are specific keywords, like true for the boolean literal "true". In some object-oriented languages (like ECMAScript), objects can also be represented by literals. Methods of this object can be specified in the object literal using function literals.  
+
* https://abi-laboratory.pro
 +
** https://abi-laboratory.pro/tracker
  
 +
* [https://lvc.github.io/abi-compliance-checker ABI Compliance Checker] -  A tool for checking backward API/ABI compatibility of a C/C++ library
  
* https://en.wikipedia.org/wiki/String_literal
 
  
* https://en.wikipedia.org/wiki/Variable_(programming)
+
* https://github.com/lvc/abi-dumper - ABI Dumper — a tool to dump ABI of an ELF object containing DWARF debug info.
  
* WP: Constant_(computer_science)
+
== System calls ==
 +
See [[*nix]]
  
 +
* https://en.wikipedia.org/wiki/System_call
  
 +
* http://stackoverflow.com/questions/10149621/where-can-i-find-system-call-source-code
  
* https://en.wikipedia.org/wiki/Record_(computer_science) - also called '''struct''' or '''compound data''', is a basic data structure. A record is a collection of fields, possibly of different data types, typically in fixed number and sequence. The fields of records may also be called elements, though these risk confusion with elements of a collection, or members, particularly in object-oriented programming. A tuple may or may not be considered a record, and vice versa, depending on conventions and the specific programming language.
+
* http://jvns.ca/blog/2016/01/23/sendfile-a-new-to-me-system-call/
  
 +
== Macros ==
 +
* http://en.wikipedia.org/wiki/Macro_(computer_science)
  
 +
* http://www.loper-os.org/?p=401
  
* https://en.wikipedia.org/wiki/Tuple
+
* http://www.wilfred.me.uk/blog/2014/09/15/comparative-macrology/ [https://news.ycombinator.com/item?id=8317364]
* https://en.wikipedia.org/wiki/Dependent_type - a type that depends on a value
 
  
* https://en.wikipedia.org/wiki/Algebraic_data_type
+
== Metaprogramming ==
* https://en.wikipedia.org/wiki/Product_type - a product of types is another, compounded, type in a structure. associated with logical conjunction (AND) in logic.
+
* https://en.wikipedia.org/wiki/Metaprogramming - the writing of computer programs with the ability to treat programs as their data. It means that a program could be designed to read, generate, analyse or transform other programs, and even modify itself while running. In some cases, this allows programmers to minimize the number of lines of code to express a solution (hence reducing development time), or it gives programs greater flexibility to efficiently handle new situations without recompilation. The language in which the metaprogram is written is called the metalanguage. The language of the programs that are manipulated is called the object language. The ability of a programming language to be its own metalanguage is called reflection or reflexivity
* https://en.wikipedia.org/wiki/Tagged_union - sum type. data structure used to hold a value that could take on several different, but fixed types. Only one of the types can be in use at any one time, and a tag field explicitly indicates which one is in use.
 
  
 +
* http://c2.com/cgi/wiki?MetaProgramming
  
* https://en.wikipedia.org/wiki/Recursive_data_type - inductive data type, a data type for values that may contain other values of the same type. Data of recursive types are usually viewed as directed graphs.
+
* https://hookrace.net/blog/introduction-to-metaprogramming-in-nim/ [https://news.ycombinator.com/item?id=11851234]
  
* http://stackoverflow.com/questions/47882/what-is-a-magic-number-and-why-is-it-bad
+
* http://weblog.therealadam.com/2011/12/09/why-metaprogram-when-you-can-program/
  
 +
== Events ==
 +
* http://en.wikipedia.org/wiki/Event_loop
  
 +
* http://en.wikipedia.org/wiki/Event_(computing)
  
 +
* http://en.wikipedia.org/wiki/Event-driven_programming
  
 +
* http://en.wikipedia.org/wiki/Futures_and_promises
  
* https://news.ycombinator.com/item?id=7188165
 
  
 +
* https://www.infoq.com/presentations/systems-event-driven
  
 +
== Messaging ==
 +
See also [[Network#Messaging]], [[Data#Serialization]]
  
  
* https://en.wikipedia.org/wiki/Queue_(abstract_data_type)
+
* https://en.wikipedia.org/wiki/Messaging_pattern - In software architecture, a messaging pattern is a network-oriented architectural pattern which describes how two different parts of a message passing system connect and communicate with each other. In telecommunications, a message exchange pattern (MEP) describes the pattern of messages required by a communications protocol to establish or use a communication channel. There are two major message exchange patterns — a request–response pattern, and a one-way pattern. For example, HTTP is a request–response pattern protocol, and UDP is a one-way pattern.
  
  
 +
* http://c2.com/cgi/wiki?AlanKayOnMessaging [https://news.ycombinator.com/item?id=9481074]
  
  
* https://en.wikipedia.org/wiki/Object_composition - a way to combine simple objects or data types into more complex ones
+
* https://en.wikipedia.org/wiki/Message_queue - and mailboxes are software-engineering components used for interprocess communication, or for inter-thread communication within the same process.
  
* http://cosmic.mearie.org/2014/01/periodic-table-of-rust-types/ [https://news.ycombinator.com/item?id=7060951]
 
  
* https://en.wikipedia.org/wiki/Type_constructor -  feature of a typed formal language that builds new types from old, such as product types, function types, power types and list types
 
  
 +
* https://en.wikipedia.org/wiki/Publish–subscribe_pattern
  
* https://en.wikipedia.org/wiki/Abstract_data_type - a mathematical model for data types where a data type is defined by its behavior (semantics) from the point of view of a user of the data, specifically in terms of possible values, possible operations on data of this type, and the behavior of these operations. This contrasts with data structures, which are concrete representations of data, and are the point of view of an implementer, not a user.
 
  
 +
* http://blog.iron.io/2012/12/top-10-uses-for-message-queue.html
  
* https://en.wikipedia.org/wiki/Semaphore_(programming) -  a variable or abstract data type that is used for controlling access, by multiple processes, to a common resource in a concurrent system such as a multiprogramming operating system. A trivial semaphore is a plain variable that is changed (for example, incremented or decremented, or toggled) depending on programmer-defined conditions. The variable is then used as a condition to control access to some system resource.
 
  
* [http://open.umn.edu/opentextbooks/BookDetail.aspx?bookId=83 The Little Book of Semaphores] - a free (in both senses of the word) textbook that introduces the principles of synchronization for concurrent programming. [https://news.ycombinator.com/item?id=8201191] [https://news.ycombinator.com/item?id=11277896]
 
  
== Data structures ==
+
* https://en.wikipedia.org/wiki/Interface_description_language - or '''interface definition language''' ('''IDL'''), is a generic term for a language that lets a program or object written in one language communicate with another program written in an unknown language. IDLs are usually used to describe data types and interfaces in a language-independent way, for example, between those written in C++ and those written in Java. IDLs are commonly used in remote procedure call software. In these cases the machines at either end of the link may be using different operating systems and computer languages. IDLs offer a bridge between the two different systems. Software systems based on IDLs include Sun's ONC RPC, The Open Group's Distributed Computing Environment, IBM's System Object Model, the Object Management Group's CORBA (which implements OMG IDL), an IDL based on DCE/RPC, and Data Distribution Service, Mozilla's XPCOM, Microsoft's Microsoft RPC (which evolved into COM and DCOM), Facebook's Thrift and WSDL for Web services.
* http://en.wikipedia.org/wiki/Data_structure
 
  
* http://opendatastructures.org/ [https://news.ycombinator.com/item?id=8904043]
 
* https://news.ycombinator.com/item?id=12758176
 
  
* https://en.wikipedia.org/wiki/Plain_old_data_structure
 
  
  
* PDF: [https://stratos.seas.harvard.edu/files/stratos/files/periodictabledatastructures.pdf The Periodic Table of Data Structures] [https://news.ycombinator.com/item?id=18314555]
 
  
 +
* https://en.wikipedia.org/wiki/Remote_procedure_call - when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction. That is, the programmer writes essentially the same code whether the subroutine is local to the executing program, or remote. This is a form of client–server interaction (caller is client, executor is server), typically implemented via a request–response message-passing system. In the object-oriented programming paradigm, RPC calls are represented by remote method invocation (RMI). The RPC model implies a level of location transparency, namely that calling procedures are largely the same whether they are local or remote, but usually they are not identical, so local calls can be distinguished from remote calls. Remote calls are usually orders of magnitude slower and less reliable than local calls, so distinguishing them is important.RPCs are a form of inter-process communication (IPC), in that different processes have different address spaces: if on the same host machine, they have distinct virtual address spaces, even though the physical address space is the same; while if they are on different hosts, the physical address space is different. Many different (often incompatible) technologies have been used to implement the concept.
  
* http://www.cs.usfca.edu/~galles/visualization/Algorithms.html [https://news.ycombinator.com/item?id=6928904]
 
  
  
* http://en.wikipedia.org/wiki/Set_data_structure
 
  
 +
* https://en.wikipedia.org/wiki/Request–response - or '''request–reply''', is one of the basic methods computers use to communicate with each other, in which the first computer sends a request for some data and the second responds to the request. Usually, there is a series of such interchanges until the complete message is sent; browsing a web page is an example of request–response communication. Request–response can be seen as a telephone call, in which someone is called and they answer the call.Request–response is a message exchange pattern in which a requestor sends a request message to a replier system which receives and processes the request, ultimately returning a message in response. This is a simple, but powerful messaging pattern which allows two applications to have a two-way conversation with one another over a channel. This pattern is especially common in client–server architectures. For simplicity, this pattern is typically implemented in a purely synchronous fashion, as in web service calls over HTTP, which holds a connection open and waits until the response is delivered or the timeout period expired. However, request–response may also be implemented asynchronously, with a response being returned at some unknown later time. When a synchronous system communicates with an asynchronous system, it is referred to as "sync over async" or "sync/async". This is common in enterprise application integration (EAI) implementations where slow aggregations, time-intensive functions, or human workflow must be performed before a response can be constructed and delivered.
  
  
* http://en.wikipedia.org/wiki/Abstract_semantic_graph
 
  
 +
=== Apache Thrift ===
 +
* [http://thrift.apache.org/ Apache Thrift] - framework for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages. Thrift allows you to define data types and service interfaces in a simple definition file. Taking that file as input, the compiler generates code to be used to easily build RPC clients and servers that communicate seamlessly across programming languages. Instead of writing a load of boilerplate code to serialize and transport your objects and invoke remote methods, you can get right down to business.
  
* http://en.wikipedia.org/wiki/Bit_string
 
  
  
 +
=== zeromq ===
 +
* [http://zeromq.org/ zeromq] - Distributed Messaging. Connect your code in any language, on any platform. Carries messages across inproc, IPC, TCP, TIPC, multicast. Smart patterns like pub-sub, push-pull, and router-dealer. High-speed asynchronous I/O engines, in a tiny library. Backed by a large and active open source community. Supports every modern language and platform. Build any architecture: centralized, distributed, small, or large. Free software with full commercial support.
 +
** [http://zguide.zeromq.org/py:all ØMQ - The Guide]
 +
** [http://zguide.zeromq.org/php:chapter8 Chapter Eight]
  
=== Array ===
+
=== hyperglyph ===
* http://en.wikipedia.org/wiki/Array_data_structure
+
* https://github.com/hyperglyph/hyperglyph - ducked typed ipc over http
 +
** Vimeo: [https://vimeo.com/45474360 Thomas Figg @iamtef - RESTful-RPC or how I learned to stop worrying and love hypermedia]
  
 +
=== MessagePack ===
 +
* [http://msgpack.org/ MessagePack] - an efficient binary serialization format. It lets you exchange data among multiple languages like JSON but it's faster and smaller. For example, small integers (like flags or error code) are encoded into a single byte, and typical short strings only require an extra byte in addition to the strings themselves.
  
* http://en.wikipedia.org/wiki/Array_data_type
+
=== AMQP ===
 +
* [http://www.amqp.org/about/what AMQP] - Advanced Message Queuing Protocol, an open standard for passing business messages between applications or organizations.  It connects systems, feeds business processes with the information they need and reliably transmits onward the instructions that achieve their goals.
  
 +
=== RabbitMQ ===
 +
* [http://www.rabbitmq.com/ RabbitMQ] - the most widely deployed open source message broker. RabbitMQ is lightweight and easy to deploy on premises and in the cloud. It supports multiple messaging protocols. RabbitMQ can be deployed in distributed and federated configurations to meet high-scale, high-availability requirements.
  
* http://en.wikipedia.org/wiki/Associative_array
+
=== tosort ===
  
 +
* https://news.ycombinator.com/item?id=8377345 - using a DB for messaging?
  
* https://en.wikipedia.org/wiki/Lookup_table - an array that replaces runtime computation with a simpler array indexing operation. The savings in terms of processing time can be significant, since retrieving a value from memory is often faster than undergoing an "expensive" computation or input/output operation. The tables may be precalculated and stored in static program storage, calculated (or "pre-fetched") as part of a program's initialization phase (memoization), or even stored in hardware in application-specific platforms. Lookup tables are also used extensively to validate input values by matching against a list of valid (or invalid) items in an array and, in some programming languages, may include pointer functions (or offsets to labels) to process the matching input. FPGAs also make extensive use of reconfigurable, hardware-implemented, lookup tables to provide programmable hardware functionality.
+
* https://blog.jooq.org/2014/09/26/using-your-rdbms-for-messaging-is-totally-ok/
  
 +
== Concurrency ==
 +
* https://en.wikipedia.org/wiki/Concurrent_computing - a form of computing in which several computations are executing during overlapping time periods—concurrently—instead of sequentially (one completing before the next starts). This is a property of a system—this may be an individual program, a computer, or a network—and there is a separate execution point or "thread of control" for each computation ("process"). A concurrent system is one where a computation can make progress without waiting for all other computations to complete—where more than one computation can make progress at "the same time".
  
  
* http://en.wikipedia.org/wiki/Hash_table
+
* https://en.wikipedia.org/wiki/Concurrency_(computer_science)
  
 +
* https://en.wikipedia.org/wiki/Concurrency_control
  
  
=== Tree ===
 
* http://en.wikipedia.org/wiki/Tree_(data_structure)
 
  
 +
* [https://blog.golang.org/concurrency-is-not-parallelism Concurrency is not parallelism - The Go Blog] - But when people hear the word concurrency they often think of parallelism, a related but quite distinct concept. In programming, concurrency is the composition of independently executing processes, while parallelism is the simultaneous execution of (possibly related) computations. Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once. With talk from Rob Pike on Go.
 +
** YouTube: [https://www.youtube.com/watch?v=cN_DpYBzKso Rob Pike - 'Concurrency Is Not Parallelism']
  
* WP: Tree_traversal
+
Hand wavey definition
 +
* Concurrency = dealing with a lot of thigns at one
 +
* Parallelism = doing a lot of things at once
  
* https://eugene-eeo.github.io/blog/tree-traversal-storage.html [https://news.ycombinator.com/item?id=12671306]
 
  
 +
* https://en.wikipedia.org/wiki/Communicating_sequential_processes - a formal language for describing patterns of interaction in concurrent systems. It is a member of the family of mathematical theories of concurrency known as process algebras, or process calculi, based on message passing via channels. CSP was highly influential in the design of the occam programming language, and also influenced the design of programming languages such as Limbo, RaftLib, Go, Crystal, and Clojure's core.async.CSP was first described in a 1978 paper by Tony Hoare, but has since evolved substantially. CSP has been practically applied in industry as a tool for specifying and verifying the concurrent aspects of a variety of different systems, such as the T9000 Transputer, as well as a secure ecommerce system. The theory of CSP itself is also still the subject of active research, including work to increase its range of practical applicability (e.g., increasing the scale of the systems that can be tractably analyzed)
  
* http://en.wikipedia.org/wiki/Binary_tree
 
  
* http://en.wikipedia.org/wiki/Binary_search_tree
 
  
 +
* https://en.wikipedia.org/wiki/Thread_(computing)
  
=== B-tree ===
 
* http://en.wikipedia.org/wiki/B-tree
 
  
 +
* http://250bpm.com/blog:81 [https://news.ycombinator.com/item?id=11653184]
  
* [http://stryku.pl/poetry/okon.php Stryku.pl - A journey to searching Have I Been Pwned database in 49μs (C++)] - [https://news.ycombinator.com/item?id=22459661]
 
  
=== to sort ===
 
* http://en.wikipedia.org/wiki/Rope_%28data_structure%29
 
  
  
* http://randomcomputation.blogspot.co.uk/2013/08/blog-post.html
+
* https://github.com/0xAX/linux-insides/blob/master/SyncPrim/sync-4.md [https://news.ycombinator.com/item?id=11654133]
  
*https://github.com/antirez/rax
+
* https://en.wikipedia.org/wiki/Mutual_exclusion - the requirement of ensuring that no two concurrent processes are in their critical section at the same time; it is a basic requirement in concurrency control, to prevent race conditions. Here, a critical section refers to a period when the process accesses a shared resource, such as shared memory. The requirement of mutual exclusion was first identified and solved by Edsger W. Dijkstra in his seminal 1965 paper titled Solution of a problem in concurrent programming control, and is credited as the first topic in the study of concurrent algorithms.
** https://news.ycombinator.com/item?id=101987
 
  
* http://courses.csail.mit.edu/6.851/spring12/
+
* https://en.wikipedia.org/wiki/Race_condition#Software
  
  
  
* http://www.careerride.com/c-arrays-and-linked-list.aspx
+
* https://en.wikipedia.org/wiki/Critical_section - a part of a multi-process program that may not be concurrently executed by more than one of the program's processes.[a] In other words, it is a piece of a program that requires mutual exclusion of access. Typically, the critical section accesses a shared resource, such as a data structure, a peripheral device, or a network connection, that does not allow multiple concurrent accesses.
  
The difference between arrays and linked lists are:
 
  
- Arrays are linear data structures. Linked lists are linear and non-linear data structures.
 
- Linked lists are linear for accessing, and non-linear for storing in memory
 
- Array has homogenous values. And each element is independent of each other positions. Each node in the linked list is connected with its previous node which is a pointer to the node.
 
- Array elements can be modified easily by identifying the index value. It is a complex process for modifying the node in a linked list.
 
- Array elements can not be added, deleted once it is declared. The nodes in the linked list can be added and deleted from the list.
 
  
  
 +
* https://en.wikipedia.org/wiki/Spinlock
  
* http://www.infoq.com/presentations/Data-Structures
 
  
* [https://www.cs.unm.edu/~crowley/papers/sds.pdf Data Structures for Text Sequences] [https://news.ycombinator.com/item?id=9208381]
 
  
  
* https://www.snellman.net/blog/archive/2016-12-13-ring-buffers/ [https://news.ycombinator.com/item?id=13175832]
+
* https://en.wikipedia.org/wiki/Concurrent_algorithm
  
 +
* https://drive.google.com/file/d/0B1n48l1C3eK8OWR5d0daTko2X2s/view [https://news.ycombinator.com/item?id=8745581]
  
* http://algoviz.org/OpenDSA/
 
  
* http://www.brpreiss.com/books/opus5/html/book.html
+
* https://en.wikipedia.org/wiki/Synchronization_(computer_science)#Thread_or_process_synchronization
  
* http://okasaki.blogspot.ru/2008/02/ten-years-of-purely-functional-data.html
 
  
* http://www.xanadu.com/zigzag/
 
* YouTube: [http://www.youtube.com/watch?v=WEj9vqVvHPc Ted Nelson on Zigzag data structures] - relationship vector, hyperthoginal
 
  
* https://news.ycombinator.com/item?id=13263038
 
  
 +
* https://en.wikipedia.org/wiki/Deadlock - a situation in which two or more competing actions are each waiting for the other to finish, and thus neither ever does.
  
 +
* https://en.wikipedia.org/wiki/Starvation_(computer_science) - where a process is perpetually denied necessary resources to process its work.
  
* https://en.wikipedia.org/wiki/Semaphore_%28programming%29
+
* https://en.wikipedia.org/wiki/Busy_waiting
  
  
* https://news.ycombinator.com/item?id=8761539
 
  
 +
* https://en.wikipedia.org/wiki/Lock_(computer_science) - or mutex (from mutual exclusion) is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.
  
* https://en.wikipedia.org/wiki/Continuation
 
* https://en.wikipedia.org/wiki/Continuation-passing_style
 
* http://matt.might.net/articles/cps-conversion/
 
  
* http://beautifulracket.com/explainer/continuations.html
+
* https://github.com/rigtorp/awesome-lockfree - A collection of resources on wait-free and lock-free programming.
  
  
* https://en.wikipedia.org/wiki/Stack_(abstract_data_type)
 
  
  
* https://en.wikipedia.org/wiki/Stack_register
 
  
 +
* https://en.wikipedia.org/wiki/Message_passing
  
* https://en.wikipedia.org/wiki/Symbol_table
+
* https://en.wikipedia.org/wiki/Channel_(programming)
  
* http://kukuruku.co/hub/cpp/lock-free-data-structures-the-evolution-of-a-stack [https://news.ycombinator.com/item?id=9099103]
+
=== Futures and promises ===
 +
* http://en.wikipedia.org/wiki/Futures_and_promises - future, promise, delay, and deferred refer to constructs used for synchronizing in some concurrent programming languages. They describe an object that acts as a proxy for a result that is initially unknown, usually because the computation of its value is yet incomplete.
  
* [https://www.youtube.com/watch?v=2XH_q494U3U "Visualizing Persistent Data Structures" by Dann Toliver]
+
* http://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/ [https://news.ycombinator.com/item?id=8984648]
 +
* https://lukasa.co.uk/2016/07/The_Function_Colour_Myth/
  
=== Mutability ===
+
* https://news.ycombinator.com/item?id=11526887
* http://en.wikipedia.org/wiki/Persistent_data_structure
 
  
* http://davesquared.net/2013/03/reasoning-and-mutability.html
+
== Parallelism ==
  
== Evaluation ==
+
* https://en.wikipedia.org/wiki/Parallel_computing - a type of computation in which many calculations or the execution of processes are carried out concurrently. Large problems can often be divided into smaller ones, which can then be solved at the same time. There are several different forms of parallel computing: bit-level, instruction-level, data, and task parallelism. Parallelism has long been employed in high-performance computing, but it's gaining broader interest due to the physical constraints preventing frequency scaling.[2] As power consumption (and consequently heat generation) by computers has become a concern in recent years, parallel computing has become the dominant paradigm in computer architecture, mainly in the form of multi-core processors.
* http://en.wikipedia.org/wiki/Evaluation
 
  
* http://en.wikipedia.org/wiki/Expression_(mathematics)
 
  
* http://en.wikipedia.org/wiki/Expression_(computer_science)
+
* https://en.wikipedia.org/wiki/Analysis_of_parallel_algorithms - Like in the analysis of "ordinary", sequential, algorithms, one is typically interested in asymptotic bounds on the resource consumption (mainly time spent computing), but the analysis is performed in the presence of multiple processor units that cooperate to perform computations. Thus, one can determine not only how many "steps" a computation takes, but also how much faster it becomes as the number of processors goes up.
  
An expression evaluates to a value. A statement does something.
 
  
x = 1
 
y = x + 1    # an expression
 
print y      # a statement, prints 2
 
  
* http://en.wikipedia.org/wiki/Statement_(programming)
 
  
* [http://www.federicopereiro.com/expression/ Heuristic definition of an expression] [https://news.ycombinator.com/item?id=10919572]
+
* https://en.wikipedia.org/wiki/Bit-level_parallelism - a form of parallel computing based on increasing processor word size. Increasing the word size reduces the number of instructions the processor must execute in order to perform an operation on variables whose sizes are greater than the length of the word. (For example, consider a case where an 8-bit processor must add two 16-bit integers. The processor must first add the 8 lower-order bits from each integer, then add the 8 higher-order bits, requiring two instructions to complete a single operation. A 16-bit processor would be able to complete the operation with single instruction.) Originally, all electronic computers were serial (single-bit) computers. The first electronic computer that was not a serial computer—the first bit-parallel computer—was the 16-bit Whirlwind from 1951. From the advent of very-large-scale integration (VLSI) computer chip fabrication technology in the 1970s until about 1986, advancements in computer architecture were done by increasing bit-level parallelism,[1] as 4-bit microprocessors were replaced by 8-bit, then 16-bit, then 32-bit microprocessors. This trend generally came to an end with the introduction of 32-bit processors, which have been a standard in general purpose computing for two decades. Only recently, with the advent of x86-64 architectures, have 64-bit processors become commonplace. On 32-bit processors, external data bus width continues to increase. For example, DDR1 SDRAM transfers 128 bits per clock cycle. DDR2 SDRAM transfers a minimum of 256 bits per burst.
  
* https://en.wikipedia.org/wiki/Evaluation_strategy
 
  
* https://en.wikipedia.org/wiki/Expression-oriented_programming_language
 
  
* https://en.wikipedia.org/wiki/Referential_transparency_(computer_science)
+
* https://en.wikipedia.org/wiki/Instruction-level_parallelism - a measure of how many of the instructions in a computer program can be executed simultaneously. There are two approaches to instruction level parallelism: in hardware and in software. Hardware level works upon dynamic parallelism whereas, the software level works on static parallelism. Dynamic parallelism means the processor decides at run time which instructions to execute in parallel, whereas static parallelism means the compiler decides which instructions to execute in parallel. The Pentium processor works on the dynamic sequence of parallel execution but the Itanium processor works on the static level parallelism.
  
* https://en.wikipedia.org/wiki/Side_effect_(computer_science)
 
  
* https://en.wikipedia.org/wiki/Information_hiding
 
  
 +
* https://en.wikipedia.org/wiki/Data_parallelism - a form of parallelization across multiple processors in parallel computing environments. It focuses on distributing the data across different nodes, which operate on the data in parallel. It can be applied on regular data structures like arrays and matrices by working on each element in parallel.
  
* https://en.wikipedia.org/wiki/Conditional_(computer_programming)
 
  
  
 +
* https://en.wikipedia.org/wiki/Task_parallelism - also known as '''function parallelism''' and '''control parallelism''', is a form of parallelization of computer code across multiple processors in parallel computing environments. Task parallelism focuses on distributing tasks—concurrently performed by processes or threads—across different processors. In contrast to data parallelism which involves running the same task on different components of data, task parallelism is distinguished by running many different tasks at the same time on the same data. A common type of task parallelism is pipelining which consists of moving a single set of data through a series of separate tasks where each task can execute independently of the others.
  
* https://en.wikipedia.org/wiki/Strict_function - in the denotational semantics of programming languages is a function f where f\left(\perp\right) = \perp. The entity \perp, called bottom, denotes an expression which does not return a normal value, either because it loops endlessly or because it aborts due to an error such as division by zero. A function which is not strict is called non-strict. A strict programming language is one in which user-defined functions are always strict.
+
== Garbage collection ==
 +
* https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
  
Intuitively, non-strict functions correspond to control structures. Operationally, a strict function is one which always evaluates its argument; a non-strict function is one which may not evaluate some of its arguments. Functions having more than one parameter may be strict or non-strict in each parameter independently, as well as jointly strict in several parameters simultaneously.
 
  
 +
* https://en.wikipedia.org/wiki/Cheney%27s_algorithm
  
* https://en.wikipedia.org/wiki/Non-strict_programming_language - A strict programming language is one in which only strict functions (functions whose parameters must be evaluated completely before they may be called) may be defined by the user. A non-strict programming language allows the user to define non-strict functions, and hence may allow lazy evaluation.
 
  
  
* https://en.wikipedia.org/wiki/Control_flow
+
* Old New Thing: [http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx Everybody thinks about garbage collection the wrong way]
  
 +
* http://xtzgzorex.wordpress.com/2012/10/11/demystifying-garbage-collectors/
  
 +
* https://news.ycombinator.com/item?id=10794026
  
* http://en.wikipedia.org/wiki/Scope_(computer_science)
+
* http://blog.brownplt.org/2013/02/19/teaching-gc.html
* http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope/6445794#6445794
 
  
* http://en.wikipedia.org/wiki/Side_effect_(computer_science)
+
* http://michaelrbernste.in/2013/06/03/real-time-garbage-collection-is-real.html
* http://en.wikipedia.org/wiki/Hooking
 
  
* http://en.wikipedia.org/wiki/Rewriting
+
* http://journal.stuffwithstuff.com/2013/12/08/babys-first-garbage-collector/ [https://news.ycombinator.com/item?id=6871202]
  
* WP: Recursion_(computer_science)
+
* https://news.ycombinator.com/item?id=7499101
* [http://vanemden.wordpress.com/2014/06/18/how-recursion-got-into-programming-a-comedy-of-errors-3/ How recursion got into programming: a comedy of errors] [https://news.ycombinator.com/item?id=8073361]
 
* http://en.wikipedia.org/wiki/Modulo_operation
 
  
* Vimeo: [https://vimeo.com/66849976 Impossible Programs] - Scottish Ruby Conf
+
* https://news.ycombinator.com/item?id=8263811
  
== Operators ==
+
== Paradigms ==
* https://en.wikipedia.org/wiki/Operator_(programming) - constructs which behave generally like functions, but which differ syntactically or semantically from usual functions. Common simple examples include arithmetic (addition with +, comparison with >) and logical operations (such as AND or &&). More involved examples include assignment (usually = or :=), field access in a record or object (usually .), and the scope resolution operator (often ::). Languages usually define a set of built-in operators, and in some cases allow user-defined operators.
+
* http://c2.com/cgi/wiki?BigIdea
  
* https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
+
* http://en.wikipedia.org/wiki/Programming_paradigm
 +
** http://upload.wikimedia.org/wikipedia/commons/f/f7/Programming_paradigms.svg
  
== Functions ==
 
  
  
* http://en.wikipedia.org/wiki/Subroutine or '''function''' is a sequence of program instructions that perform a specific task, packaged as a unit. This unit can then be used in programs wherever that particular task should be performed. Subprograms may be defined within programs, or separately in libraries that can be used by multiple programs. In different programming languages a subroutine may be called a procedure, a function, a routine, a method, or a subprogram. The generic term callable unit is sometimes used.
 
  
 +
* [https://www.infoq.com/presentations/We-Really-Dont-Know-How-To-Compute We Really Don't Know How To Compute!]
  
* http://en.wikipedia.org/wiki/Closure_(computer_science) - also '''lexical closures''' or '''function closures''' are a technique for implementing lexically scoped name binding in languages with first-class functions. Operationally, a closure is a record storing a function[a] together with an environment:[1] a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or storage location to which the name was bound when the closure was created.[b] A closure—unlike a plain function—allows the function to access those captured variables through the closure's reference to them, even when the function is invoked outside their scope.
 
  
* [http://nathansjslessons.appspot.com/lesson?id=1000 What's a Closure?]
 
  
* http://en.wikipedia.org/wiki/Currying
+
* [https://www.w3.org/2001/tag/doc/leastPower.html The Rule of Least Power] -  When designing computer systems, one is often faced with a choice between using a more or less powerful language for publishing information, for expressing constraints, or for solving some problem. This finding explores tradeoffs relating the choice of language to reusability of information. The "Rule of Least Power" suggests choosing the least powerful language suitable for a given purpose.
  
  
* http://en.wikipedia.org/wiki/Call_site - a call site of a function or subroutine is the location (line of code) where the function is called (or may be called, through dynamic dispatch). A call site is where zero or more arguments are passed to the function, and zero or more return values are received.
+
* [https://kevinmahoney.co.uk/articles/applying-misu/ Kevin Mahoney: Applying "Make Invalid States Unrepresentable"] - [https://news.ycombinator.com/item?id=24685772]
  
  
 +
=== Literate programming ===
 +
* https://en.wikipedia.org/wiki/Literate_programming
  
* https://en.wikipedia.org/wiki/Language_binding - an application programming interface (API) that provides glue code specifically made to allow a programming language to use a foreign library or operating system service (one that is not native to that language).  
+
* http://akkartik.name/post/literate-programming [https://news.ycombinator.com/item?id=11695498]
  
 +
* YouTube: [https://www.youtube.com/watch?v=Mr3WTR0a5SM Knuth on Literate Programming] - 2007
  
* https://en.wikipedia.org/wiki/Foreign_function_interface
+
* YouTube: [https://www.youtube.com/watch?v=pqiFYUqtDR4 Literate Programming] - Donald Knuth, 2018
  
* https://en.wikipedia.org/wiki/Wrapper_function - a subroutine in a software library or a computer program whose main purpose is to call a second subroutine[1] or a system call with little or no additional computation. Wrapper functions are used to make writing computer programs easier by abstracting away the details of a subroutine's underlying implementation.
 
  
* https://en.wikipedia.org/wiki/Wrapper_library - or library wrappers) consist of a thin layer of code (a "shim") which translates a library's existing interface into a compatible interface.
+
=== Imperative ===
 +
* http://en.wikipedia.org/wiki/Imperative_programming - a programming paradigm that uses statements that change a program's state. In much the same way that the imperative mood in natural languages expresses commands, an imperative program consists of commands for the computer to perform. Imperative programming focuses on describing how a program operates.
  
 +
* http://en.wikipedia.org/wiki/Procedural_programming - a programming paradigm, derived from structured programming, based upon the concept of the procedure call. Procedures, also known as routines, subroutines, or functions (not to be confused with mathematical functions, but similar to those used in functional programming), simply contain a series of computational steps to be carried out. Any given procedure might be called at any point during a program's execution, including by other procedures or itself. Procedural programming languages include C, Go, Fortran, Pascal, and BASIC. Computer processors provide hardware support for procedural programming through a stack register and instructions for calling procedures and returning from them. Hardware support for other types of programming is possible, but no attempt was commercially successful (for example Lisp machines or Java processors).
  
  
* http://en.wikipedia.org/wiki/Anonymous_function - also '''function literal''' or '''lambda abstraction''' is a function definition that is not bound to an identifier. Anonymous functions are often: arguments being passed to higher-order functions, or used for constructing the result of a higher-order function that needs to return a function. If the function is only used once, or a limited number of times, an anonymous function may be syntactically lighter than using a named function. Anonymous functions are ubiquitous in functional programming languages and other languages with first-class functions, where they fulfill the same role for the function type as literals do for other data types.
+
* http://en.wikipedia.org/wiki/Structured_programming - a programming paradigm aimed at improving the clarity, quality, and development time of a computer program by making extensive use of subroutines, block structures, for and while loops—in contrast to using simple tests and jumps such as the goto statement which could lead to "spaghetti code" which is difficult both to follow and to maintain. It emerged in the late 1950s with the appearance of the ALGOL 58 and ALGOL 60 programming languages, with the latter including support for block structures.
  
 +
Contributing factors to its popularity and widespread acceptance, at first in academia and later among practitioners, include the discovery of what is now known as the structured program theorem in 1966, and the publication of the influential "Go To Statement Considered Harmful" open letter in 1968 by Dutch computer scientist Edsger W. Dijkstra, who coined the term "structured programming". Structured programming is most frequently used with deviations that allow for clearer programs in some particular cases, such as when exception handling has to be performed.
  
* http://en.wikipedia.org/wiki/Function_type - the type of a variable or parameter to which a function has or can be assigned, or an argument or result type of a higher-order function taking or returning a function.
+
* http://c2.com/cgi/wiki?LasagnaCode
 +
* http://c2.com/cgi/wiki?RavioliCode
 +
* http://c2.com/cgi/wiki?CousCousCode
  
  
* http://en.wikipedia.org/wiki/Function_prototype - or '''function interface''' is a declaration of a function that specifies the function's name and type signature (arity, parameter types, and return type), but omits the function body. The term is particularly used in C and C++. While a function definition specifies how the function does what it does (the "implementation"), a function prototype merely specifies its interface, i.e. what data types go in and come out of it.
+
==== Recursive ====
 +
* [http://dl.acm.org/citation.cfm?id=367199 Recursive functions of symbolic expressions and their computation by machine, Part I]
  
In a prototype, parameter names are optional (and in C/C++ have function prototype scope, meaning their scope ends at the end of the prototype), however, the type is necessary along with all modifiers (e.g. if it is a pointer or a const parameter). In object-oriented programming, interfaces and abstract methods serve much the same purpose.
 
  
 +
==== Object orientated ====
 +
* http://en.wikipedia.org/wiki/Object-oriented_programming - OOP
  
 +
* https://news.ycombinator.com/item?id=11808551 - Alan Kay on objects ''et al''
  
* http://en.wikipedia.org/wiki/Function_objects - allows an object to be invoked or called as if it were an ordinary function, usually with the same syntax (a function parameter that can also be a function).
+
* http://lists.squeakfoundation.org/pipermail/squeak-dev/1998-October/017019.html [https://news.ycombinator.com/item?id=11966570]
  
 +
* http://c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent
  
  
* http://journal.stuffwithstuff.com/2013/08/26/what-is-open-recursion/ [https://news.ycombinator.com/item?id=11099293]
+
* [https://www.quora.com/What-is-the-difference-between-Alan-Kays-definition-of-OOP-and-Carl-Hewitts-Actor-Model What is the difference between Alan Kay's definition of OOP and Carl Hewitt's Actor Model? - Quora] -
  
  
 +
* https://www.cs.utexas.edu/users/wcook/papers/OOPvsADT/CookOOPvsADT90.pdf [https://news.ycombinator.com/item?id=12047245]
  
* http://en.wikipedia.org/wiki/Callback_(computer_science) - a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time. The invocation may be immediate as in a synchronous callback, or it might happen at a later time as in an asynchronous callback. In all cases, the intention is to specify a function or subroutine as an entity that is, depending on the language, more or less similar to a variable. Programming languages support callbacks in different ways, often implementing them with subroutines, lambda expressions, blocks, or function pointers.
+
* YouTube: [https://www.youtube.com/watch?v=KyTUN6_Z9TM Pong & Object Oriented Programming - Computerphile]
  
 +
* YouTube: [https://www.youtube.com/watch?v=2h2qckyDQi0 CS\M04\T01 - Classes, Objects, Properties and Method Concepts]
  
* http://en.wikipedia.org/wiki/Tail_call - a subroutine call performed as the final action of a procedure. If a tail call might lead to the same subroutine being called again later in the call chain, the subroutine is said to be tail-recursive, which is a special case of recursion. '''Tail recursion''' (or tail-end recursion) is particularly useful, and often easy to handle in implementations.
 
  
* https://medium.com/binary-dreams/from-java-to-scala-tail-recursion-a6acdd71a94d
 
  
 +
* https://en.wikipedia.org/wiki/Object_(computer_science)
  
* http://en.wikipedia.org/wiki/Function_pointer - Instead of referring to data values, a function pointer points to executable code within memory. When dereferenced, a function pointer can be used to invoke the function it points to and pass it arguments just like a normal function call. Such an invocation is also known as an "indirect" call, because the function is being invoked indirectly through a variable instead of directly through a fixed name or address. Function pointers can be used to simplify code by providing a simple way to select a function to execute based on run-time values.
+
* https://en.wikipedia.org/wiki/Class_(computer_science)
  
 +
* https://en.wikipedia.org/wiki/Instance_(computer_science)
  
* http://en.wikipedia.org/wiki/Funarg_problem - refers to the difficulty in implementing first-class functions (functions as first-class objects) in programming language implementations so as to use stack-based memory allocation of the functions. The difficulty only arises if the body of a nested function refers directly (i.e., not via argument passing) to identifiers defined in the environment in which the function is defined, but not in the environment of the function call. To summarize the discussion below, two standard resolutions are to either forbid such references or to create closures.
 
  
 +
* https://en.wikipedia.org/wiki/Method_(computer_programming) - a procedure associated with an object. An object is made up of data and behavior, which form the interface that an object presents to the outside world. Data is represented as properties of the object and behavior as methods. For example, a Window object would have methods such as open and close, while its state (whether it is opened or closed) would be a property.
  
  
  
* https://en.wikipedia.org/wiki/Inline_expansion - or '''inlining''', is a manual or compiler optimization that replaces a function call site with the body of the called function. Inline expansion is similar to macro expansion, but occurs during compilation, without changing the source code (the text), while macro expansion occurs prior to compilation, and results in different text that is then processed by the compiler. Inlining is an important optimization, but has complicated effects on performance.[1] As a rule of thumb, some inlining will improve speed at very minor cost of space, but excess inlining will hurt speed, due to inlined code consuming too much of the instruction cache, and also cost significant space.
+
* http://stackoverflow.com/questions/4203163/how-do-i-design-a-class-in-python/4203836#4203836
  
 +
* https://medium.com/@simplyianm/why-gos-structs-are-superior-to-class-based-inheritance-b661ba897c67 [https://news.ycombinator.com/item?id=11997764]
  
  
* https://en.wikipedia.org/wiki/Defunctionalization - refers to a compile-time transformation which eliminates higher-order functions, replacing them by a single first-order apply function. The technique was first described by John C. Reynolds in his 1972 paper, "Definitional Interpreters for Higher-Order Programming Languages". Reynolds' observation was that a given program contains only finitely many function abstractions, so that each can be assigned (and replaced by) a unique identifier. Every function application within the program is then replaced by a call to the apply function with the function identifier as the first argument. The apply function's only job is to dispatch on this first argument, and then perform the instructions denoted by the function identifier on the remaining arguments.
+
* https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
  
  
 +
* https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)
  
 +
* https://en.wikipedia.org/wiki/Multiple_inheritance
  
* PDF: [https://www.math.upenn.edu/~wilf/gfologyLinked2.pdf Generating Functions] - his  book  is  about  generating  functions  and  some  of  their  uses  indiscrete mathematics. [https://news.ycombinator.com/item?id=9324551]
+
* https://en.wikipedia.org/wiki/Prototype-based_programming
  
 +
* https://en.wikipedia.org/wiki/Differential_inheritance
  
  
 +
* https://news.ycombinator.com/item?id=16605831
 +
* https://lobste.rs/s/bb2dyo/why_inheritance_never_made_any_sense
  
* [http://tech.pro/blog/6742/callback-to-future-functor-applicative-monad From callback to (Future -> Functor -> Monad)] [https://news.ycombinator.com/item?id=9325474]
+
* https://en.wikipedia.org/wiki/Object_copy
 +
* https://en.wikipedia.org/wiki/Object_lifetime
  
  
=== Hash function ===
+
* https://en.wikipedia.org/wiki/Object_composition
* http://en.wikipedia.org/wiki/Hash_function - any function that can be used to map data of arbitrary size to data of fixed size. The values returned by a hash function are called hash values, hash codes, hash sums, or simply hashes. One use is a data structure called a hash table, widely used in computer software for rapid data lookup. Hash functions accelerate table or database lookup by detecting duplicated records in a large file. An example is finding similar stretches in DNA sequences. They are also useful in cryptography.
 
** http://programmers.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed/145633#145633
 
** http://www.hashids.org/
 
** http://floodyberry.com/noncryptohashzoo/
 
  
* [http://cyan4973.github.io/xxHash/ xxHash - Extremely fast non-cryptographic hash algorithm] - an extremely fast non-cryptographic hash algorithm, working at speeds close to RAM limits. It is proposed in two flavors, 32 and 64 bits.
+
* https://en.wikipedia.org/wiki/Composition_over_inheritance
** https://github.com/Cyan4973/xxHash
 
  
  
* [https://arxiv.org/abs/1406.2294v1 [1406.2294v1] A Fast, Minimal Memory, Consistent Hash Algorithm] - [https://news.ycombinator.com/item?id=8136408] [https://news.ycombinator.com/item?id=9207999]
+
* https://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
  
== Polymorphism ==
 
* https://en.wikipedia.org/wiki/Polymorphism_(computer_science) -  the provision of a single interface to entities of different types. A '''polymorphic type''' is one whose operations can also be applied to values of some other type, or types
 
  
  
* https://en.wikipedia.org/wiki/Ad_hoc_polymorphism - a kind of polymorphism in which polymorphic functions can be applied to arguments of different types, because a polymorphic function can denote a number of distinct and potentially heterogeneous implementations depending on the type of argument(s) to which it is applied. It is also known as function overloading or operator overloading. The term ad hoc in this context is not intended to be pejorative; it refers simply to the fact that this type of polymorphism is not a fundamental feature of the type system.
+
* https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization - a programming idiom used in several object-oriented languages to describe a particular language behavior. In RAII, holding a resource is a class invariant, and is tied to object lifetime: resource allocation (or acquisition) is done during object creation (specifically initialization), by the constructor, while resource deallocation (release) is done during object destruction (specifically finalization), by the destructor. Thus the resource is guaranteed to be held between when initialization finishes and finalization starts (holding the resources is a class invariant), and to be held only when the object is alive. Thus if there are no object leaks, there are no resource leaks.
  
* https://en.wikipedia.org/wiki/Function_overloading
 
  
* https://en.wikipedia.org/wiki/Operator_overloading
 
  
 +
* https://en.wikipedia.org/wiki/Mutator_method
 +
* https://en.wikipedia.org/wiki/Protocol_(object-oriented_programming)
  
* https://en.wikipedia.org/wiki/Parametric_polymorphism - a way to make a language more expressive, while still maintaining full static type-safety. Using parametric polymorphism, a function or a data type can be written generically so that it can handle values identically without depending on their type. Such functions and data types are called '''generic functions''' and '''generic datatypes''' respectively and form the basis of generic programming.
+
* https://en.wikipedia.org/wiki/Delegation_(programming)
 +
* https://en.wikipedia.org/wiki/Delegation_pattern
  
* https://en.wikipedia.org/wiki/Subtyping
+
* https://en.wikipedia.org/wiki/Mixin
  
 +
* https://en.wikipedia.org/wiki/Coupling_(computer_programming)
  
* https://en.wikipedia.org/wiki/Polymorphism_in_object-oriented_programming
+
* https://en.wikipedia.org/wiki/Observer_pattern
 +
* https://en.wikipedia.org/wiki/Template_method_pattern
 +
* https://en.wikipedia.org/wiki/Factory_method_pattern
 +
* https://en.wikipedia.org/wiki/Composite_pattern
 +
* https://en.wikipedia.org/wiki/Decorator_pattern
 +
* https://en.wikipedia.org/wiki/Mediator_pattern
 +
* https://en.wikipedia.org/wiki/Adapter_pattern
  
 +
* https://en.wikipedia.org/wiki/Member_variable
  
 +
* https://en.wikipedia.org/wiki/Command_pattern
  
* https://en.wikipedia.org/wiki/Dynamic_dispatch
+
* https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
  
* https://en.wikipedia.org/wiki/Multiple_dispatch
+
* https://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29 - Single responsibility, Open-closed, Liskov substitution, Interface segregation and Dependency inversion
  
  
* http://eli.thegreenplace.net/2016/a-polyglots-guide-to-multiple-dispatch/ [https://news.ycombinator.com/item?id=11526923]
+
* https://news.ycombinator.com/item?id=14660895
  
== Control structures ==
+
* https://en.wikipedia.org/wiki/Jeroo
* https://en.wikipedia.org/wiki/Control_flow
 
  
* https://en.wikipedia.org/wiki/Control_flow_diagram
+
* https://plus.google.com/101960720994009339267/posts/hoJdanihKwb - rob pike on oo
* https://en.wikipedia.org/wiki/Control_flow_graph
+
** http://www.csis.pace.edu/~bergin/patterns/ppoop.html
 +
* https://news.ycombinator.com/item?id=6909326
  
 +
* http://blog.ircmaxell.com/2012/07/oop-vs-procedural-code.html
  
 +
* http://harmful.cat-v.org/software/OO_programming/why_oo_sucks [http://news.ycombinator.com/item?id=4245737]
 +
** http://www.librador.com/2012/07/16/No-thats-not-why-OO-sucks/
 +
* http://prog21.dadgum.com/156.html
  
* https://en.wikipedia.org/wiki/Conditional_(programming)
+
* YouTube: [https://www.youtube.com/watch?v=QM1iUe6IofM Object-Oriented Programming is Bad] - Brian Will
* https://en.wikipedia.org/wiki/Switch_statement
 
  
 +
* http://raganwald.com/2014/03/10/writing-oop-using-oop.html
  
* http://degoes.net/articles/destroy-all-ifs [https://news.ycombinator.com/item?id=12107495]
+
* http://wcook.blogspot.co.uk/2012/07/proposal-for-simplified-modern.html
 +
* http://blog.codeclimate.com/blog/2012/11/28/your-objects-the-unix-way/
  
 +
* http://lwn.net/SubscriberLink/548560/16388a4dbede3884/
  
* https://en.wikipedia.org/wiki/For_loop
+
* https://en.wikipedia.org/wiki/Metaobject
* https://en.wikipedia.org/wiki/While_loop
+
* https://en.wikipedia.org/wiki/Metaclass
* https://en.wikipedia.org/wiki/Do_while_loop
 
* https://en.wikipedia.org/wiki/Foreach_loop
 
  
 +
* http://en.wikipedia.org/wiki/Aspect-oriented_software_development
  
* https://en.wikipedia.org/wiki/Exception_handling
+
* http://web.media.mit.edu/~lieber/Lieberary/OOP/Delegation/Delegation.html [http://dl.acm.org/citation.cfm?id=960112.28718]
  
 +
* http://steve-yegge.blogspot.co.uk/2006/03/execution-in-kingdom-of-nouns.html
  
* https://en.wikipedia.org/wiki/Continuation
+
* https://news.ycombinator.com/item?id=6932089
  
* https://en.wikipedia.org/wiki/Container_(abstract_data_type)
+
* http://raganwald.com/2014/03/31/class-hierarchies-dont-do-that.html [https://news.ycombinator.com/item?id=7496968]
  
 +
* https://news.ycombinator.com/item?id=8830794
  
* https://en.wikipedia.org/wiki/Coroutines
+
* http://wcook.blogspot.co.uk/2012/07/proposal-for-simplified-modern.html [https://news.ycombinator.com/item?id=8832211]
  
* https://en.wikipedia.org/wiki/Generator_(computer_science) - a special routine that can be used to control the iteration behaviour of a loop. In fact, all generators are iterators. A generator is very similar to a function that returns an array, in that a generator has parameters, can be called, and generates a sequence of values. However, instead of building an array containing all the values and returning them all at once, a generator yields the values one at a time, which requires less memory and allows the caller to get started processing the first few values immediately. In short, a generator looks like a function but behaves like an iterator.
+
* https://blog.inf.ed.ac.uk/sapm/2014/02/04/the-anaemic-domain-model-is-no-anti-pattern-its-a-solid-design/
  
Generators can be implemented in terms of more expressive control flow constructs, such as coroutines or first-class continuations. Generators, also known as semicoroutines, are a special case of (and weaker than) coroutines, in that they always yield control back to the caller (when passing a value back), rather than specifying a coroutine to jump to
 
  
== Algorithms ==
+
=== Data-orientated ===
See also [[Computing#Computational complexity]], [[Maths]]
 
  
* http://en.wikipedia.org/wiki/Algorithm
+
* https://en.wikipedia.org/wiki/Data-oriented_design - a program optimization approach motivated by efficient usage of the CPU cache, used in video game development. The approach is to focus on the data layout, separating and sorting fields according to when they are needed, and to think about transformations of data. Proponents include Mike Acton and Scott Meyers.
  
 +
The claim is that traditional object-oriented programming (OOP) design principles result in poor data locality, more so if runtime polymorphism (dynamic dispatch) is used (which is especially problematic on some processors). Although OOP does superficially seem to organise code around data, the practice is quite different. OOP is actually about organising source code around data types, rather than physically grouping individual fields and arrays in a format efficient for access by specific functions. It also often hides layout details under abstraction layers, while a data-oriented programmer wants to consider this first and foremost.
  
* https://news.ycombinator.com/item?id=15469660
 
  
 +
* https://news.ycombinator.com/item?id=20205694
  
* http://en.wikipedia.org/wiki/Algorithm_characterizations
 
  
* [https://algs4.cs.princeton.edu/home/ Algorithms, 4th Edition by Robert Sedgewick and Kevin Wayne] -  surveys the most important algorithms and data structures in use today. We motivate each algorithm that we address by examining its impact on applications to science, engineering, and industry.
+
* YouTube: [https://www.youtube.com/watch?v=rX0ItVEVjHc CppCon 2014: Mike Acton "Data-Oriented Design and C++"]
  
* https://news.ycombinator.com/item?id=18805624
+
* YouTube: [https://www.youtube.com/watch?v=yy8jQgmhbAU CppCon 2018: Stoyan Nikolov “OOP Is Dead, Long Live Data-oriented Design”]
  
  
  
* https://en.wikipedia.org/wiki/Algorithmic_information_theory - a subfield of information theory and computer science that concerns itself with the relationship between computation and information. According to Gregory Chaitin, it is "the result of putting Shannon's information theory and Turing's computability theory into a cocktail shaker and shaking vigorously."
+
* [https://cellperformance.beyond3d.com/articles/2008/03/three-big-lies.html Three Big Lies - CellPerformance]
  
* http://www.jamisbuck.org/presentations/rubyconf2011/index.html
+
=== Declarative ===
 +
* http://en.wikipedia.org/wiki/Declarative_programming - a programming paradigm—a style of building the structure and elements of computer programs—that expresses the logic of a computation without describing its control flow. Declarative programming often considers programs as theories of a formal logic, and computations as deductions in that logic space. Declarative programming may greatly simplify writing parallel programs. Common declarative languages include those of database query languages (e.g., SQL, XQuery), regular expressions, logic programming, functional programming, and configuration management systems.
  
* http://www3.cs.stonybrook.edu/~algorith/video-lectures/
+
* http://latentflip.com/imperative-vs-declarative
  
 +
We could do this in an imperative style like so:
  
* http://en.wikipedia.org/wiki/Memoization
+
var numbers = [1,2,3,4,5]
 +
var doubled = []
 +
 +
for(var i = 0; i < numbers.length; i++) {
 +
  var newNumber = numbers[i] * 2
 +
  doubled.push(newNumber)
 +
}
 +
console.log(doubled) //=> [2,4,6,8,10]
  
* http://interactivepython.org/runestone/static/pythonds/index.html [https://news.ycombinator.com/item?id=9111958]
+
We explicitly iterate over the length of the array, pull each element out of the array, double it, and add the doubled value to the new array, mutating the doubled array at each step until we are done. A more declarative approach might use the Array.map function and look like:
  
* http://www.nayuki.io/page/fast-fibonacci-algorithms [https://news.ycombinator.com/item?id=9315346]
+
var numbers = [1,2,3,4,5]
 +
 
 +
var doubled = numbers.map(function(n) {
 +
  return n * 2
 +
})
 +
console.log(doubled) //=> [2,4,6,8,10]
  
* http://www.algosort.com/
+
map creates a new array from an existing array, where each element in the new array is created by passing the elements of the original array into the function passed to map (function(n) { return n*2 } in this case). What the map function does is abstract away the process of explicitly iterating over the array, and lets us focus on what we want to happen. Note that the function we pass to map is pure; it doesn't have any side effects (change any external state), it just takes in a number and returns the number doubled.
* https://en.wikipedia.org/wiki/List_of_algorithms
 
* http://www.jjj.de/fxt/fxtpage.html#fxtbook [http://news.ycombinator.com/item?id=4957591]
 
* [http://xlinux.nist.gov/dads/ Dictionary of Algorithms and Data Structures]
 
* http://news.ycombinator.com/item?id=4961357
 
* http://graphics.stanford.edu/~seander/bithacks.html
 
* http://rosettacode.org/wiki/Category:Programming_Tasks
 
* http://www.hackersdelight.org/
 
* http://blog.notdot.net/tag/damn-cool-algorithms
 
* http://aima.cs.berkeley.edu/
 
* http://www.cleveralgorithms.com/
 
* http://www.cs.sunysb.edu/~algorith/ [https://news.ycombinator.com/item?id=7456099]
 
* http://www.comp.nus.edu.sg/~stevenha/visualization/ [https://news.ycombinator.com/item?id=8194662]
 
  
* http://jasonpark.me/AlgorithmVisualizer/
 
* https://news.ycombinator.com/item?id=12326806
 
  
* http://visualgo.net/
 
  
* https://idea-instructions.com [https://news.ycombinator.com/item?id=16383990]
+
* [http://www.infoq.com/presentations/Design-Composition-Performance Design, Composition and Performance] - Rich Hickey explores the nature of design and composition and how it impacts the software development practice and tools.
  
 +
* [http://lwn.net/Articles/191059/ Crash-only software: More than meets the eye] [https://news.ycombinator.com/item?id=8464573]
  
* [https://www.youtube.com/watch?v=t8g-iYGHpEA What different sorting algorithms sound like]
 
* http://panthema.net/2013/sound-of-sorting/
 
* http://preshing.com/20121026/1mb-sorting-explained
 
* http://www.dangermouse.net/esoteric/bogobogosort.html
 
* http://ljs.io/projects/rainbow/ [https://news.ycombinator.com/item?id=7291421]
 
* http://sorting.at/ [https://news.ycombinator.com/item?id=7652333]
 
  
* http://bost.ocks.org/mike/algorithms/ [https://news.ycombinator.com/item?id=10216124]
+
==== Functional ====
 +
* https://en.wikipedia.org/wiki/Functional_programming
  
* https://news.ycombinator.com/item?id=8088842
 
  
* http://justin.abrah.ms/computer-science/how-to-calculate-big-o.html
+
* https://en.wikipedia.org/wiki/Purely_functional
  
* http://accidentallyquadratic.tumblr.com/
 
** http://accidentallyquadratic.tumblr.com/post/113840433022/why-accidentally-quadratic [https://news.ycombinator.com/item?id=9217048]
 
  
* http://news.ycombinator.com/item?id=4783301
+
* http://en.wikipedia.org/wiki/First-class_function
  
* http://leftnode.com/entry/i-am-a-great-programmer-but-horrible-algorithmist.html
 
  
* http://jake.simvla.com/posts/531-mr-mrs-kipling
 
  
* https://www.varnish-cache.org/trac/wiki/ArchitectNotes
+
* http://maryrosecook.com/blog/post/a-practical-introduction-to-functional-programming [https://news.ycombinator.com/item?id=8943356]
  
* http://developers.memsql.com/blog/common-pitfalls-in-writing-lock-free-algorithms/
+
* [http://blog.gja.in/2014/01/functional-programming-101-with-haskell.html Functional Programming 101 - With Haskell] [https://news.ycombinator.com/item?id=7113259]
  
* https://queue.acm.org/detail.cfm?id=1814327
+
* [https://stevekrouse.github.io/hs.js/ λ Lessons] - Pattern matching, first-class functions, and abstracting over recursion in Haskell. This is a short, interactive lesson that teaches core functional programming concepts. It was designed to transform the way you think about performing operations on lists of things, by showing you how functions are executed. [https://news.ycombinator.com/item?id=8155703]
  
* http://compgeom.cs.uiuc.edu/~jeffe/teaching/algorithms/
+
* http://www.infoq.com/presentations/functional-pros-cons
  
* http://keyj.emphy.de/balanced-shuffle/ [https://news.ycombinator.com/item?id=9396861]
+
* http://peteratt.com/programming-thinking-functional-way/ [https://news.ycombinator.com/item?id=7711040]
  
* http://www.eternallyconfuzzled.com/jsw_home.aspx [https://news.ycombinator.com/item?id=9395820]
+
* https://fsharpforfunandprofit.com/posts/recipe-part2/ [https://news.ycombinator.com/item?id=11955917]
  
  
 +
* [https://chrisdone.com/posts/haskell-lisp-philosophy-difference/ A philosophical difference between Haskell and Lisp] - [https://news.ycombinator.com/item?id=24031376]
  
  
* https://news.ycombinator.com/item?id=6093777 - bloom filters
+
* http://en.wikipedia.org/wiki/Functional_reactive_programming
  
* http://billmill.org/bloomfilter-tutorial/
+
* [https://gist.github.com/staltz/868e7e9bc2a7b8c1f754 The introduction to Reactive Programming you've been missing] [https://news.ycombinator.com/item?id=7964873]
  
* https://news.ycombinator.com/item?id=12241332
 
  
* https://news.ycombinator.com/item?id=13056726
+
* http://stackoverflow.com/questions/327955/does-functional-programming-replace-gof-design-patterns
 +
* http://www.dev.gd/20121224-understanding-map-filter-and-fold.html
 +
* http://loup-vaillant.fr/tutorials/from-imperative-to-functional
  
* [https://blog.cloudflare.com/when-bloom-filters-dont-bloom/ When Bloom filters don't bloom] - [https://news.ycombinator.com/item?id=22463979]
+
* http://www.harukizaemon.com/blog/2010/03/01/functional-programming-in-object-oriented-languages/
 +
* DrupalCon Munich 2012: [http://munich2012.drupal.org/program/sessions/functional-php Functional PHP]
  
 +
* [https://www.youtube.com/watch?v=Agu6jipKfYw "Controlling Time and Space: understanding the many formulations of FRP" by Evan Czaplicki]
  
 +
* [https://github.com/keera-studios/haskell-game-programming/wiki/Functional-Reactive-Programming Functional Reactive Programming · keera-studios/haskell-game-programming Wiki]
  
  
* http://files.righto.com/calculator/sinclair_scientific_simulator.html
+
* YouTube: [https://www.youtube.com/watch?v=6mTbuzafcII "Transducers" by Rich Hickey] [https://news.ycombinator.com/item?id=8342718]
  
* http://planning.cs.uiuc.edu/
+
* [https://clojure.org/reference/transducers Clojure - Transducers]
  
* http://www.rockpapershotgun.com/2010/11/02/genetic-algorithms-find-build-order-from-hell/
 
  
* http://theory.stanford.edu/~amitp/GameProgramming/AStarComparison.html [https://news.ycombinator.com/item?id=7591119]
 
  
* http://jimkang.com/quadtreevis/
+
* http://en.wikipedia.org/wiki/Applicative_programming_language
  
* https://news.ycombinator.com/item?id=7949995
 
* https://news.ycombinator.com/item?id=13517597
 
  
* https://flafla2.github.io/2014/08/09/perlinnoise.html [https://news.ycombinator.com/item?id=8158572
 
  
* https://en.wikipedia.org/wiki/Monte_Carlo_method
 
* http://montepie.herokuapp.com/ [https://news.ycombinator.com/item?id=8159010]
 
* https://news.ycombinator.com/item?id=12537043
 
  
* http://katrinaeg.com/simulated-annealing.html [https://news.ycombinator.com/item?id=8916876]
 
  
* https://en.wikipedia.org/wiki/Correctness_(computer_science)
+
* http://en.wikipedia.org/wiki/Typed_lambda_calculus
  
  
* https://en.wikipedia.org/wiki/Hoare_logic
+
* https://github.com/orsinium-labs/rlci - crab λ Overly-documented Rust-powered Lambda Calculus Interpreter.
  
  
* https://en.wikipedia.org/wiki/Logical_assertion
+
* http://technicae.cogitat.io/2012/12/the-secret-history-of-lambda.html
 +
* https://gist.github.com/e000/1023982
 +
* http://stevelosh.com/blog/2013/03/list-out-of-lambda/
  
* https://en.wikipedia.org/wiki/Assertion_(software_development) - a statement that a predicate (Boolean-valued function, a true–false expression) is expected to always be true at that point in the code. If an assertion evaluates to false at run time, an assertion failure results, which typically causes the program to crash, or to throw an assertion exception.
 
  
* https://en.wikipedia.org/wiki/Invariant_%28computer_science%29 - a condition that can be relied upon to be true during execution of a program, or during some portion of it. It is a logical assertion that is held to always be true during a certain phase of execution. For example, a loop invariant is a condition that is true at the beginning and end of every execution of a loop.
+
* [http://www.infoq.com/presentations/Functional-Languages-101 Functional Languages 101: What’s All the Fuss About?]
 +
* [http://leanpub.com/fp-oo Functional Programming for the Object-Oriented Programmer]
 +
* [http://www.jmolly.com/2012/06/24/functional-and-object-oriented-programming.html Functional and Object-Oriented Programming]
  
* https://en.wikipedia.org/wiki/Loop_invariant
+
* [http://www.javaworld.com/javaworld/jw-07-2012/120705-what-s-wrong-with-functional-programming.html Functional programming: A step backward]
 +
* [http://richardminerich.com/2012/07/functional-programming-is-dead-long-live-expression-oriented-programming/ Functional Programming is Dead, Long Live Expression-Oriented Programming]
  
* https://en.wikipedia.org/wiki/Class_invariant
+
* [http://newartisans.com/2012/08/monads-in-pictures/ Monads in Pictures] - Aug 20th, 2012
  
 +
* Google Video: [http://video.google.com/videoplay?docid=-4991530385753299192 Type-driven testing in Haskell - Simon Peyton Jones]
  
 +
* http://www.ibm.com/developerworks/library/j-ft20/
  
* https://www.cs.princeton.edu/~rs/talks/AC11-Cardinality.pdf
+
* http://cstheory.stackexchange.com/questions/1539/whats-new-in-purely-functional-data-structures-since-okasaki
  
== Libraries ==
+
* https://en.wikipedia.org/wiki/Hindley%E2%80%93Milner_type_system
  
 +
* http://www.infoq.com/presentations/functional-category-theory [https://news.ycombinator.com/item?id=8143052]
  
* PDF: [https://www.archive.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf Reflections on Trusting Trust] - Ken Thompson, 1984
+
* http://www.chrisstucchio.com/blog/2014/computers_are_made_of_metal.html [https://news.ycombinator.com/item?id=8394420]
  
 +
* http://bartoszmilewski.com/2014/12/23/kleisli-categories/ [https://news.ycombinator.com/item?id=8792279]
  
* PDF: [https://akkadia.org/drepper/dsohowto.pdf How To Write Shared Libraries] - Ulrich Drepper, December 10, 2011. Abstract: Today, shared libraries are ubiquitous.  Developers use them for multiple reasons and create them just as they would create application code.  This is a problem,  though,  since on many platforms some additional techniques must be applied even to generate decent code. Even more knowledge is needed to generate optimized code. This paper introduces the required rules and techniques. In addition, it introduces the concept of ABI (Application Binary Interface) stability and shows how to manage it.
+
* http://www.jpaulmorrison.com/fbp/introduction.html
  
  
* http://depstack.io/
 
  
== System calls ==
+
* WP: Functional_logic_programming
See [[*nix]]
 
  
* https://en.wikipedia.org/wiki/System_call
+
* https://news.ycombinator.com/item?id=11729270
  
* http://stackoverflow.com/questions/10149621/where-can-i-find-system-call-source-code
+
* http://philipnilsson.github.io/Badness10k/posts/2016-08-10-functional-patterns-monoid-morphism.html [https://news.ycombinator.com/item?id=12609247]
  
* http://jvns.ca/blog/2016/01/23/sendfile-a-new-to-me-system-call/
 
  
== Macros ==
+
* [https://www.microsoft.com/en-us/research/publication/the-implementation-of-functional-programming-languages/ The Implementation of Functional Programming Languages - Microsoft Research]
* http://en.wikipedia.org/wiki/Macro_(computer_science)
 
  
* http://www.loper-os.org/?p=401
+
* [https://www.microsoft.com/en-us/research/publication/implementing-functional-languages-a-tutorial/ Implementing functional languages: a tutorial - Microsoft Research]
  
* http://www.wilfred.me.uk/blog/2014/09/15/comparative-macrology/ [https://news.ycombinator.com/item?id=8317364]
 
  
== Metaprogramming ==
 
* https://en.wikipedia.org/wiki/Metaprogramming - the writing of computer programs with the ability to treat programs as their data. It means that a program could be designed to read, generate, analyse or transform other programs, and even modify itself while running. In some cases, this allows programmers to minimize the number of lines of code to express a solution (hence reducing development time), or it gives programs greater flexibility to efficiently handle new situations without recompilation. The language in which the metaprogram is written is called the metalanguage. The language of the programs that are manipulated is called the object language. The ability of a programming language to be its own metalanguage is called reflection or reflexivity
 
  
* http://c2.com/cgi/wiki?MetaProgramming
+
* [https://ashwinram.org/1986/01/28/a-short-ballad-dedicated-to-the-growth-of-programs/ A Short Ballad Dedicated to the Growth of Programs | Cognitive Computing]
  
* https://hookrace.net/blog/introduction-to-metaprogramming-in-nim/ [https://news.ycombinator.com/item?id=11851234]
+
=== Concatenative ===
 +
* http://en.wikipedia.org/wiki/Concatenative_programming_language - a point-free computer programming language in which all expressions denote functions, and the juxtaposition of expressions denotes function composition. Concatenative programming replaces function application, which is common in other programming styles, with function composition as the default way to build subroutines.  
  
* http://weblog.therealadam.com/2011/12/09/why-metaprogram-when-you-can-program/
+
* http://concatenative.org/
  
== Monads ==
 
Aspect of functional. See Haskell, etc. for related.
 
  
* http://cs.coloradocollege.edu/~bylvisaker/MonadMotivation/ [https://news.ycombinator.com/item?id=8670312]
 
  
* http://gbracha.blogspot.com.au/2011/01/maybe-monads-might-not-matter.html
+
* [http://tunes.org/~iepos/joy.html The Theory of Concatenative Combinators] - This article attempts to outline, in informal terms, a new theory of combinators, related to the theory of Combinatory Logic pioneered by Moses Schonfinkel, Haskell Curry, and others in the 1930s. Although not essential, an understanding of the classical theory of combinators may be helpful (see the links at the bottom of this article for some introductory material to combinators). This topic is one which no doubt ought to be subjected to the rigor of modern mathematics; there are many theorems from classical combinatory logic (e.g., Church-Rosser) which we conjecture have analogues here. However, what follows is only a rough, but hopefully, friendly, introduction to the subject. The inspiration for this theory comes from the programming language Joy, designed by Manfred von Thun. It would be very helpful if the reader is basically familiar with Joy. In Joy, data is manipulated through a stack (there are no variables); in this way, it is similar to the programming language FORTH. However, Joy goes one step further and permits (and actively encourages) pushing programs themselves onto the stack, which can then be manipulated just like ordinary data. In fact, the theory here is basically a subset of Joy in which programs are the only kind of data (i.e., numbers, string literals, and other kinds of data are not part of the theory here). To someone unfamiliar with combinatory logic, it might seem that no useful computations could be done without numbers, but it will soon be seen that numeric data can be simulated using concatenative combinators, just as they could using classical combinators. [https://news.ycombinator.com/item?id=39203404]
  
* http://adit.io/posts/2013-06-10-three-useful-monads.html
 
  
* http://www.stephendiehl.com/posts/monads.html
+
==== Dataflow ====
 +
See [[Dataflow]]
  
* http://www.clojure.net/2013/02/02/Comonads/
+
* http://en.wikipedia.org/wiki/Dataflow_programming - a programming paradigm that models a program as a directed graph of the data flowing between operations, thus implementing dataflow principles and architecture. Dataflow programming languages share some features of functional languages, and were generally developed in order to bring some functional concepts to a language more suitable for numeric processing.
  
* http://marijnhaverbeke.nl/blog/common-lisp-monads.html [https://news.ycombinator.com/item?id=6398393]
+
===== Reactive =====
 +
* http://en.wikipedia.org/wiki/Reactive_programming - a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow.
  
* https://gist.github.com/kachayev/b5887f66e2985a21a466 [https://news.ycombinator.com/item?id=8246783]
+
* http://staltz.com/dont-react/ [https://news.ycombinator.com/item?id=8819115]
  
* http://rcrowley.org/2011/09/21/monads.html [https://news.ycombinator.com/item?id=8306667]
 
  
* http://roscidus.com/blog/blog/2014/10/27/visualising-an-asynchronous-monad/ [https://news.ycombinator.com/item?id=8514923]
+
===== Flow-based =====
 +
* https://en.wikipedia.org/wiki/Flow-based_programming - '''FBP''', a programming paradigm that defines applications as networks of "black box" processes, which exchange data across predefined connections by message passing, where the connections are specified externally to the processes. These black box processes can be reconnected endlessly to form different applications without having to be changed internally. FBP is thus naturally component-oriented. FBP is a particular form of dataflow programming based on bounded buffers, information packets with defined lifetimes, named ports, and separate definition of connections.
  
* http://okmij.org/ftp/Computation/IO-monad-history.html [https://news.ycombinator.com/item?id=10305936]
 
  
== Events ==
+
* https://news.ycombinator.com/item?id=25848542
* http://en.wikipedia.org/wiki/Event_loop
 
  
* http://en.wikipedia.org/wiki/Event_(computing)
 
  
* http://en.wikipedia.org/wiki/Event-driven_programming
 
  
* http://en.wikipedia.org/wiki/Futures_and_promises
+
* [https://nifi.apache.org/ Apache NiFi] is a dataflow system based on the concepts of flow-based programming. It supports powerful and scalable directed graphs of data routing, transformation, and system mediation logic. NiFi has a web-based user interface for design, control, feedback, and monitoring of dataflows. It is highly configurable along several dimensions of quality of service, such as loss-tolerant versus guaranteed delivery, low latency versus high throughput, and priority-based queuing. NiFi provides fine-grained data provenance for all data received, forked, joined cloned, modified, sent, and ultimately dropped upon reaching its configured end-state. [https://news.ycombinator.com/item?id=10190846]
  
 +
==== Constraint ====
 +
* https://en.wikipedia.org/wiki/Constraint_programming
  
* https://www.infoq.com/presentations/systems-event-driven
 
  
== Messaging ==
+
==== Logic ====
See also [[Network#Messaging]], [[Data#Serialization]]
+
* https://en.wikipedia.org/wiki/Logic_programming - a programming paradigm based on formal logic. A program written in a logic programming language is a set of sentences in logical form, expressing facts and rules about some problem domain. Major logic programming language families include Prolog, Answer set programming (ASP) and Datalog. In all of these languages, rules are written in the form of clauses and are read declaratively as logical implications.
  
 +
* [https://blog.algorexhealth.com/2018/11/a-practo-theoretical-introduction-to-logic-programming/ A Practo-Theoretical Introduction to Logic Programming] -
  
* https://en.wikipedia.org/wiki/Messaging_pattern - In software architecture, a messaging pattern is a network-oriented architectural pattern which describes how two different parts of a message passing system connect and communicate with each other. In telecommunications, a message exchange pattern (MEP) describes the pattern of messages required by a communications protocol to establish or use a communication channel. There are two major message exchange patterns — a request–response pattern, and a one-way pattern. For example, HTTP is a request–response pattern protocol, and UDP is a one-way pattern.
 
  
 +
==== Differentiable ====
 +
* https://en.wikipedia.org/wiki/Differentiable_programming - a programming paradigm in which a numeric computer program can be differentiated throughout via automatic differentiation. This allows for gradient-based optimization of parameters in the program, often via gradient descent, as well as other learning approaches that are based on higher order derivative information. Differentiable programming has found use in a wide variety of areas, particularly scientific computing and artificial intelligence. One of the early proposals to adopt such a framework in a systematic fashion to improve upon learning algorithms was made by the Advanced Concepts Team at the European Space Agency in early 2016.
  
* http://c2.com/cgi/wiki?AlanKayOnMessaging [https://news.ycombinator.com/item?id=9481074]
+
== Patterns ==
 +
See also [[Organisation#Patterns]], [[Development]]
  
  
* https://en.wikipedia.org/wiki/Message_queue - and mailboxes are software-engineering components used for interprocess communication, or for inter-thread communication within the same process.
+
* https://en.wikipedia.org/wiki/Design_pattern
  
  
 +
* https://github.com/kamranahmedse/design-patterns-for-humans/blob/master/README.md [https://news.ycombinator.com/item?id=13664127]
  
* https://en.wikipedia.org/wiki/Publish–subscribe_pattern
 
  
  
* http://blog.iron.io/2012/12/top-10-uses-for-message-queue.html
 
  
 +
* https://en.wikipedia.org/wiki/Software_design_pattern
  
* https://en.wikipedia.org/wiki/Interface_description_language - or '''interface definition language''' ('''IDL'''), is a specification language used to describe a software component's application programming interface (API). IDLs describe an interface in a language-independent way, enabling communication between software components that do not share one language, for example, between those written in C++ and those written in Java.IDLs are commonly used in remote procedure call software. In these cases the machines at either end of the link may be using different operating systems and computer languages. IDLs offer a bridge between the two different systems.
+
* https://news.ycombinator.com/item?id=12849757
  
  
=== Apache Thrift ===
 
* [http://thrift.apache.org/ Apache Thrift] - framework for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages. Thrift allows you to define data types and service interfaces in a simple definition file. Taking that file as input, the compiler generates code to be used to easily build RPC clients and servers that communicate seamlessly across programming languages. Instead of writing a load of boilerplate code to serialize and transport your objects and invoke remote methods, you can get right down to business.
 
  
 +
* https://en.wikipedia.org/wiki/Architectural_pattern
  
  
=== zeromq ===
 
* [http://zeromq.org/ zeromq] - Distributed Messaging. Connect your code in any language, on any platform. Carries messages across inproc, IPC, TCP, TIPC, multicast. Smart patterns like pub-sub, push-pull, and router-dealer. High-speed asynchronous I/O engines, in a tiny library. Backed by a large and active open source community. Supports every modern language and platform. Build any architecture: centralized, distributed, small, or large. Free software with full commercial support.
 
** [http://zguide.zeromq.org/py:all ØMQ - The Guide]
 
** [http://zguide.zeromq.org/php:chapter8 Chapter Eight]
 
  
=== hyperglyph ===
+
* [http://c2.com/cgi/wiki?WelcomeVisitors WikiWikiWeb] - aka Wards Wiki
* https://github.com/hyperglyph/hyperglyph - ducked typed ipc over http
 
** Vimeo: [https://vimeo.com/45474360 Thomas Figg @iamtef - RESTful-RPC or how I learned to stop worrying and love hypermedia]
 
  
=== MessagePack ===
+
* [http://c2.com/ppr/ Portland Pattern Repository]
* [http://msgpack.org/ MessagePack] - an efficient binary serialization format. It lets you exchange data among multiple languages like JSON but it's faster and smaller. For example, small integers (like flags or error code) are encoded into a single byte, and typical short strings only require an extra byte in addition to the strings themselves.
+
** https://en.wikipedia.org/wiki/Portland_Pattern_Repository
  
=== AMQP ===
+
* http://c2.com/cgi/wiki?PatternIndex
* [http://www.amqp.org/about/what AMQP] - Advanced Message Queuing Protocol, an open standard for passing business messages between applications or organizations.  It connects systems, feeds business processes with the information they need and reliably transmits onward the instructions that achieve their goals.
 
  
=== RabbitMQ ===
+
* http://c2.com/cgi/wiki?CategoryPattern
* [http://www.rabbitmq.com/ RabbitMQ] - the most widely deployed open source message broker. RabbitMQ is lightweight and easy to deploy on premises and in the cloud. It supports multiple messaging protocols. RabbitMQ can be deployed in distributed and federated configurations to meet high-scale, high-availability requirements.
 
  
=== tosort ===
+
* http://c2.com/cgi/wiki?CategoryAntiPattern
  
* https://news.ycombinator.com/item?id=8377345 - using a DB for messaging?
 
  
* https://blog.jooq.org/2014/09/26/using-your-rdbms-for-messaging-is-totally-ok/
 
  
== Concurrency ==
+
** http://c2.com/cgi/wiki?ExtremeProgrammingRoadmap
* https://en.wikipedia.org/wiki/Concurrent_computing - a form of computing in which several computations are executing during overlapping time periods—concurrently—instead of sequentially (one completing before the next starts). This is a property of a system—this may be an individual program, a computer, or a network—and there is a separate execution point or "thread of control" for each computation ("process"). A concurrent system is one where a computation can make progress without waiting for all other computations to complete—where more than one computation can make progress at "the same time".
 
  
 +
"ExtremeProgramming -- all programming is maintenance."
  
* https://en.wikipedia.org/wiki/Concurrency_(computer_science)
 
  
* https://en.wikipedia.org/wiki/Concurrency_control
 
  
 +
* [https://www.hillside.net/patterns Design Patterns Library] - a source for information about all aspects of software patterns and pattern languages. If you are new to patterns, James Coplien and Richard Gabriel have created a succinct pattern definition.Patterns and Pattern Languages are ways to describe best practices, good designs, and capture experience in a way that it is possible for others to reuse this experience. The Hillside Group takes pleasure in sponsoring many different PLoP conferences that are provided for the betterment of the pattern community.
  
  
* [https://blog.golang.org/concurrency-is-not-parallelism Concurrency is not parallelism - The Go Blog] - But when people hear the word concurrency they often think of parallelism, a related but quite distinct concept. In programming, concurrency is the composition of independently executing processes, while parallelism is the simultaneous execution of (possibly related) computations. Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once. With talk from Rob Pike on Go.
+
* http://stackoverflow.com/questions/92225/what-are-the-best-resources-for-design-patterns-and-their-uses
** YouTube: [https://www.youtube.com/watch?v=cN_DpYBzKso Rob Pike - 'Concurrency Is Not Parallelism']
 
  
Hand wavey definition
+
* http://perldesignpatterns.com/?HomePage
* Concurrency = dealing with a lot of thigns at one
 
* Parallelism = doing a lot of things at once
 
  
 +
* http://blog.plover.com/prog/design-patterns.html
  
* https://en.wikipedia.org/wiki/Communicating_sequential_processes - a formal language for describing patterns of interaction in concurrent systems. It is a member of the family of mathematical theories of concurrency known as process algebras, or process calculi, based on message passing via channels. CSP was highly influential in the design of the occam programming language, and also influenced the design of programming languages such as Limbo, RaftLib, Go, Crystal, and Clojure's core.async.CSP was first described in a 1978 paper by Tony Hoare, but has since evolved substantially. CSP has been practically applied in industry as a tool for specifying and verifying the concurrent aspects of a variety of different systems, such as the T9000 Transputer, as well as a secure ecommerce system. The theory of CSP itself is also still the subject of active research, including work to increase its range of practical applicability (e.g., increasing the scale of the systems that can be tractably analyzed)
+
* http://www.mcdonaldland.info/files/designpatterns/designpatternscard.pdf
  
  
 +
* http://en.wikipedia.org/wiki/Architectural_pattern_%28computer_science%29
  
* https://en.wikipedia.org/wiki/Thread_(computing)
+
* http://en.wikipedia.org/wiki/Common_layers_in_an_information_system_logical_architecture
  
  
* http://250bpm.com/blog:81 [https://news.ycombinator.com/item?id=11653184]
 
  
 +
* http://en.wikipedia.org/wiki/Module_pattern
  
 +
* http://modulecounts.com/
  
  
* https://github.com/0xAX/linux-insides/blob/master/SyncPrim/sync-4.md [https://news.ycombinator.com/item?id=11654133]
 
  
* https://en.wikipedia.org/wiki/Mutual_exclusion - the requirement of ensuring that no two concurrent processes are in their critical section at the same time; it is a basic requirement in concurrency control, to prevent race conditions. Here, a critical section refers to a period when the process accesses a shared resource, such as shared memory. The requirement of mutual exclusion was first identified and solved by Edsger W. Dijkstra in his seminal 1965 paper titled Solution of a problem in concurrent programming control, and is credited as the first topic in the study of concurrent algorithms.
+
* http://en.wikipedia.org/wiki/Singleton_pattern - restrict the instantiation of a class to one object.
  
* https://en.wikipedia.org/wiki/Race_condition#Software
+
* https://programmers.stackexchange.com/questions/40373/so-singletons-are-bad-then-what
  
  
* https://en.wikipedia.org/wiki/Critical_section - a part of a multi-process program that may not be concurrently executed by more than one of the program's processes.[a] In other words, it is a piece of a program that requires mutual exclusion of access.[1] Typically, the critical section accesses a shared resource, such as a data structure, a peripheral device, or a network connection, that does not allow multiple concurrent accesses.
 
  
 +
* http://en.wikipedia.org/wiki/Behavioral_pattern
  
* https://en.wikipedia.org/wiki/Spinlock
 
  
  
* https://en.wikipedia.org/wiki/Concurrent_algorithm
 
  
* https://drive.google.com/file/d/0B1n48l1C3eK8OWR5d0daTko2X2s/view [https://news.ycombinator.com/item?id=8745581]
+
* https://en.wikipedia.org/wiki/Actor_model
  
  
* https://en.wikipedia.org/wiki/Synchronization_(computer_science)#Thread_or_process_synchronization
 
  
  
* https://en.wikipedia.org/wiki/Deadlock - a situation in which two or more competing actions are each waiting for the other to finish, and thus neither ever does.
+
* https://news.ycombinator.com/item?id=26024085
  
* https://en.wikipedia.org/wiki/Starvation_(computer_science) - where a process is perpetually denied necessary resources to process its work.
 
  
* https://en.wikipedia.org/wiki/Busy_waiting
 
  
* https://en.wikipedia.org/wiki/Lock_(computer_science) - or mutex (from mutual exclusion) is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.
+
* https://en.wikipedia.org/wiki/Inversion_of_control
  
  
 +
* http://c2.com/cgi/wiki?CollectionOrientedProgramming
  
* https://en.wikipedia.org/wiki/Message_passing
 
  
* https://en.wikipedia.org/wiki/Channel_(programming)
+
* http://www.perldesignpatterns.com/?PerlDesignPatterns
  
=== Futures and promises ===
 
* http://en.wikipedia.org/wiki/Futures_and_promises - future, promise, delay, and deferred refer to constructs used for synchronizing in some concurrent programming languages. They describe an object that acts as a proxy for a result that is initially unknown, usually because the computation of its value is yet incomplete.
 
  
* http://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/ [https://news.ycombinator.com/item?id=8984648]
+
* http://www.embeddedrelated.com/showarticle/455.php
* https://lukasa.co.uk/2016/07/The_Function_Colour_Myth/
 
  
* https://news.ycombinator.com/item?id=11526887
 
  
== Parallelism ==
+
* http://www.jroller.com/landers/entry/the_design_pattern_facade_pattern
  
* https://en.wikipedia.org/wiki/Parallel_computing - a type of computation in which many calculations or the execution of processes are carried out concurrently. Large problems can often be divided into smaller ones, which can then be solved at the same time. There are several different forms of parallel computing: bit-level, instruction-level, data, and task parallelism. Parallelism has long been employed in high-performance computing, but it's gaining broader interest due to the physical constraints preventing frequency scaling.[2] As power consumption (and consequently heat generation) by computers has become a concern in recent years, parallel computing has become the dominant paradigm in computer architecture, mainly in the form of multi-core processors.
+
* https://news.ycombinator.com/item?id=6790392
  
 +
* http://ssdl-wiki.cs.technion.ac.il/wiki/index.php/Spartan_programming
  
* https://en.wikipedia.org/wiki/Analysis_of_parallel_algorithms - Like in the analysis of "ordinary", sequential, algorithms, one is typically interested in asymptotic bounds on the resource consumption (mainly time spent computing), but the analysis is performed in the presence of multiple processor units that cooperate to perform computations. Thus, one can determine not only how many "steps" a computation takes, but also how much faster it becomes as the number of processors goes up.
+
* http://meyerweb.com/eric/comment/chech.html
  
 +
* http://www.confreaks.com/videos/3337-railsconf-keynote-10-years - convention over configuration
  
 +
* YouTube: [https://www.youtube.com/watch?v=pOl4E8x3fmw Lambda Jam 2014 - Eric Meijer - The Lost Art of Denotational Semantics]
  
  
* https://en.wikipedia.org/wiki/Bit-level_parallelism - a form of parallel computing based on increasing processor word size. Increasing the word size reduces the number of instructions the processor must execute in order to perform an operation on variables whose sizes are greater than the length of the word. (For example, consider a case where an 8-bit processor must add two 16-bit integers. The processor must first add the 8 lower-order bits from each integer, then add the 8 higher-order bits, requiring two instructions to complete a single operation. A 16-bit processor would be able to complete the operation with single instruction.) Originally, all electronic computers were serial (single-bit) computers. The first electronic computer that was not a serial computer—the first bit-parallel computer—was the 16-bit Whirlwind from 1951. From the advent of very-large-scale integration (VLSI) computer chip fabrication technology in the 1970s until about 1986, advancements in computer architecture were done by increasing bit-level parallelism,[1] as 4-bit microprocessors were replaced by 8-bit, then 16-bit, then 32-bit microprocessors. This trend generally came to an end with the introduction of 32-bit processors, which have been a standard in general purpose computing for two decades. Only recently, with the advent of x86-64 architectures, have 64-bit processors become commonplace. On 32-bit processors, external data bus width continues to increase. For example, DDR1 SDRAM transfers 128 bits per clock cycle. DDR2 SDRAM transfers a minimum of 256 bits per burst.
+
* [https://programmingisterrible.com/post/176657481103/repeat-yourself-do-more-than-one-thing-and Repeat yourself, do more than one thing, and...] - [https://lobste.rs/s/rufml3/repeat_yourself_do_more_than_one_thing]
  
  
 +
* [https://refactoring.guru/design-patterns/catalog The Catalog of Design Patterns] - [https://news.ycombinator.com/item?id=30675182]
  
* https://en.wikipedia.org/wiki/Instruction-level_parallelism - a measure of how many of the instructions in a computer program can be executed simultaneously. There are two approaches to instruction level parallelism: in hardware and in software. Hardware level works upon dynamic parallelism whereas, the software level works on static parallelism. Dynamic parallelism means the processor decides at run time which instructions to execute in parallel, whereas static parallelism means the compiler decides which instructions to execute in parallel. The Pentium processor works on the dynamic sequence of parallel execution but the Itanium processor works on the static level parallelism.
 
  
  
 +
* https://en.wikipedia.org/wiki/Flyweight_pattern - software design pattern refers to an object that minimizes memory usage by sharing some of its data with other similar objects. The flyweight pattern is one of twenty-three well-known GoF design patterns. These patterns promote flexible object-oriented software design, which is easier to implement, change, test, and reuse.In other contexts, the idea of sharing data structures is called hash consing. The term was first coined, and the idea extensively explored, by Paul Calder and Mark Linton in 1990 to efficiently handle glyph information in a WYSIWYG document editor. Similar techniques were already used in other systems, however, as early as 1988.
  
* https://en.wikipedia.org/wiki/Data_parallelism - a form of parallelization across multiple processors in parallel computing environments. It focuses on distributing the data across different nodes, which operate on the data in parallel. It can be applied on regular data structures like arrays and matrices by working on each element in parallel.
 
  
  
 +
==== MV* ====
 +
* http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
 +
* http://c2.com/cgi/wiki?ModelViewController
 +
* http://puremvc.org/content/view/67/178/
 +
* https://news.ycombinator.com/item?id=6370343
  
* https://en.wikipedia.org/wiki/Task_parallelism - also known as '''function parallelism''' and '''control parallelism''', is a form of parallelization of computer code across multiple processors in parallel computing environments. Task parallelism focuses on distributing tasks—concurrently performed by processes or threads—across different processors. In contrast to data parallelism which involves running the same task on different components of data, task parallelism is distinguished by running many different tasks at the same time on the same data. A common type of task parallelism is pipelining which consists of moving a single set of data through a series of separate tasks where each task can execute independently of the others.
+
* http://mvc.givan.se/ [https://news.ycombinator.com/item?id=9324338]
  
== Garbage collection ==
+
* http://mikepackdev.com/blog_posts/34-a-review-of-mvc
* https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
 
  
 +
"create your views, express your models or develop a controller"
  
* https://en.wikipedia.org/wiki/Cheney%27s_algorithm
+
* http://martinfowler.com/eaaDev/PresentationModel.html
 +
* http://en.wikipedia.org/wiki/Model_View_ViewModel
  
 +
* http://russelleast.wordpress.com/2008/08/09/overview-of-the-modelview-viewmodel-mvvm-pattern-and-data-binding/
 +
* http://programmers.stackexchange.com/questions/114409/did-concept-of-viewmodel-exist-before-mvvm
  
 +
* http://gee.cs.oswego.edu/dl/acs/acs/acs.html?1 - reactive [https://news.ycombinator.com/item?id=9678943]
  
* Old New Thing: [http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx Everybody thinks about garbage collection the wrong way]
 
  
* http://xtzgzorex.wordpress.com/2012/10/11/demystifying-garbage-collectors/
+
==== Component-based ====
  
* https://news.ycombinator.com/item?id=10794026
+
* https://en.wikipedia.org/wiki/Component-based_software_engineering - CBSE), also called component-based development (CBD), is a style of software engineering that aims to build software out of loosely-coupled, modular components. It emphasizes the separation of concerns among different parts of a software system.
  
* http://blog.brownplt.org/2013/02/19/teaching-gc.html
 
  
* http://michaelrbernste.in/2013/06/03/real-time-garbage-collection-is-real.html
+
* https://en.wikipedia.org/wiki/Separation_of_concerns - a design principle for separating a computer program into distinct sections. Each section addresses a separate concern, a set of information that affects the code of a computer program. A concern can be as general as "the details of the hardware for an application", or as specific as "the name of which class to instantiate". A program that embodies SoC well is called a modular program. Modularity, and hence separation of concerns, is achieved by encapsulating information inside a section of code that has a well-defined interface. Encapsulation is a means of information hiding. Layered designs in information systems are another embodiment of separation of concerns (e.g., presentation layer, business logic layer, data access layer, persistence layer).
  
* http://journal.stuffwithstuff.com/2013/12/08/babys-first-garbage-collector/ [https://news.ycombinator.com/item?id=6871202]
 
  
* https://news.ycombinator.com/item?id=7499101
+
* https://en.wikipedia.org/wiki/Loose_coupling - In computing and systems design, a loosely coupled system is one; in which components are weakly associated (have breakable relationships, with each other, and thus changes in one component least affect existence or performance of another component, and/or; in which each of its components has, or makes use of, little or no knowledge of the definitions of other separate components. Subareas include the coupling of classes, interfaces, data, and services. Loose coupling is the opposite of tight coupling.
  
* https://news.ycombinator.com/item?id=8263811
 
  
== Paradigms ==
 
* http://c2.com/cgi/wiki?BigIdea
 
  
* http://en.wikipedia.org/wiki/Programming_paradigm
+
==== Service-orientated ====
** http://upload.wikimedia.org/wikipedia/commons/f/f7/Programming_paradigms.svg
+
See [[HTTP]], [[Chat]], [[Semantic]], [[Feeds]], etc.
  
  
 +
* https://en.wikipedia.org/wiki/Service-orientation - a design paradigm for computer software in the form of services. The principles of service-oriented design stress the separation of concerns in the software. Applying service-orientation results in units of software partitioned into discrete, autonomous, and network-accessible units, each designed to solve an individual concern. These units qualify as services.
  
* http://en.wikipedia.org/wiki/Concatenative_programming_language
 
  
* http://concatenative.org/
 
  
 +
* https://en.wikipedia.org/wiki/Service_(systems_architecture) - In the contexts of software architecture, service-orientation and service-oriented architecture, the term service refers to a software functionality, or a set of software functionalities (such as the retrieval of specified information or the execution of a set of operations, with a purpose that different clients can reuse for different purposes, together with the policies that should control its usage (based on the identity of the client requesting the service, for example).
 +
OASIS defines a service as "a mechanism to enable access to one or more capabilities, where the access is provided using a prescribed interface and is exercised consistent with constraints and policies as specified by the service description".
  
  
* [https://www.infoq.com/presentations/We-Really-Dont-Know-How-To-Compute We Really Don't Know How To Compute!]
 
  
 +
* https://en.wikipedia.org/wiki/Service_description - In computer science, a service description could be any of:
 +
** Interface description language – Computer language used to describe a software component's interface
 +
** Web Services Description Language – XML-based interface description language
 +
** RESTful Service Description Language – XML description of HTTP-based web APIs
 +
** SOAP Service Description Language – Messaging protocol for web services
 +
** Service Mapping Description – Proposed standard for describing web services available at a particular endpoint using JSON
  
  
* https://en.wikipedia.org/wiki/Literate_programming
 
  
* http://akkartik.name/post/literate-programming [https://news.ycombinator.com/item?id=11695498]
 
  
* YouTube: [https://www.youtube.com/watch?v=pqiFYUqtDR4 Literate Programming] - Donald Knuth, 2018
 
  
  
* [https://www.w3.org/2001/tag/doc/leastPower.html The Rule of Least Power] -  When designing computer systems, one is often faced with a choice between using a more or less powerful language for publishing information, for expressing constraints, or for solving some problem. This finding explores tradeoffs relating the choice of language to reusability of information. The "Rule of Least Power" suggests choosing the least powerful language suitable for a given purpose.
 
  
 +
* https://en.wikipedia.org/wiki/Service-oriented_architecture - an architectural style that focuses on discrete services instead of a monolithic design. By consequence, it is also applied in the field of software design where services are provided to the other components by application components, through a communication protocol over a network. A service is a discrete unit of functionality that can be accessed remotely and acted upon and updated independently, such as retrieving a credit card statement online. SOA is also intended to be independent of vendors, products and technologies.
  
=== Imperative ===
+
Service orientation is a way of thinking in terms of services and service-based development and the outcomes of services. A service has four properties according to one of many definitions of SOA:
* http://en.wikipedia.org/wiki/Imperative_programming - a programming paradigm that uses statements that change a program's state. In much the same way that the imperative mood in natural languages expresses commands, an imperative program consists of commands for the computer to perform. Imperative programming focuses on describing how a program operates.
+
* It logically represents a repeatable business activity with a specified outcome.
 +
* It is self-contained.
 +
* It is a black box for its consumers, meaning the consumer does not have to be aware of the service's inner workings.
 +
* It may be composed of other services.
  
* http://en.wikipedia.org/wiki/Procedural_programming - a programming paradigm, derived from structured programming, based upon the concept of the procedure call. Procedures, also known as routines, subroutines, or functions (not to be confused with mathematical functions, but similar to those used in functional programming), simply contain a series of computational steps to be carried out. Any given procedure might be called at any point during a program's execution, including by other procedures or itself. Procedural programming languages include C, Go, Fortran, Pascal, and BASIC. Computer processors provide hardware support for procedural programming through a stack register and instructions for calling procedures and returning from them. Hardware support for other types of programming is possible, but no attempt was commercially successful (for example Lisp machines or Java processors).
 
  
  
* http://en.wikipedia.org/wiki/Structured_programming - a programming paradigm aimed at improving the clarity, quality, and development time of a computer program by making extensive use of subroutines, block structures, for and while loops—in contrast to using simple tests and jumps such as the goto statement which could lead to "spaghetti code" which is difficult both to follow and to maintain. It emerged in the late 1950s with the appearance of the ALGOL 58 and ALGOL 60 programming languages, with the latter including support for block structures.
+
* https://en.wikipedia.org/wiki/OASIS_SOA_Reference_Model - The OASIS Reference Model for Service Oriented Architecture, SOA-RM, is an abstract framework for understanding significant entities and relationships between them within a service-oriented environment, and for the development of consistent standards or specifications supporting that environment. It is based on unifying concepts of SOA and may be used by architects developing specific service oriented architectures or in training and explaining SOA.
 +
In this context, a reference model is seen as a venue to provide a common semantics that can be used unambiguously across and between different SOA implementations. The relationship between the Reference Model and particular architectures, technologies and other aspects of SOA is illustrated below from the specification.
  
Contributing factors to its popularity and widespread acceptance, at first in academia and later among practitioners, include the discovery of what is now known as the structured program theorem in 1966, and the publication of the influential "Go To Statement Considered Harmful" open letter in 1968 by Dutch computer scientist Edsger W. Dijkstra, who coined the term "structured programming". Structured programming is most frequently used with deviations that allow for clearer programs in some particular cases, such as when exception handling has to be performed.
 
  
* http://c2.com/cgi/wiki?LasagnaCode
+
* [https://www.service-architecture.com/ Web Services, Service-Oriented Architectures, and Cloud Computing]
* http://c2.com/cgi/wiki?RavioliCode
 
* http://c2.com/cgi/wiki?CousCousCode
 
  
==== Recursive ====
+
==== Push/pull ====
* [http://dl.acm.org/citation.cfm?id=367199 Recursive functions of symbolic expressions and their computation by machine, Part I]
+
* http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern
  
==== Object orientated ====
+
* http://en.wikipedia.org/wiki/Push_technology
* http://en.wikipedia.org/wiki/Object-oriented_programming - OOP
 
  
* https://news.ycombinator.com/item?id=11808551 - Alan Kay on objects ''et al''
+
==== Graphics ====
 +
See [[Graphics]], [[UI]], [[GUI]], [[Wayland]], [[3D]]
  
* http://lists.squeakfoundation.org/pipermail/squeak-dev/1998-October/017019.html [https://news.ycombinator.com/item?id=11966570]
 
  
* http://c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent
+
* https://en.wikipedia.org/wiki/Layout_engine - a computer program that combines content and formatting information for electronic or printed display. It is not a stand-alone program but a core component of larger programs. There are different types of layout engines. One is the web browser engines used in web browsers and email clients. Another type is the layout managers used in widget toolkits.
  
  
* [https://www.quora.com/What-is-the-difference-between-Alan-Kays-definition-of-OOP-and-Carl-Hewitts-Actor-Model What is the difference between Alan Kay's definition of OOP and Carl Hewitt's Actor Model? - Quora] -
+
* https://en.wikipedia.org/wiki/List_of_layout_engines
  
 +
== to sort ==
  
* https://www.cs.utexas.edu/users/wcook/papers/OOPvsADT/CookOOPvsADT90.pdf [https://news.ycombinator.com/item?id=12047245]
 
  
* YouTube: [https://www.youtube.com/watch?v=KyTUN6_Z9TM Pong & Object Oriented Programming - Computerphile]
+
=== SDL ===
 +
* [https://tratt.net/laurie/blog/entries/an_editor_for_composed_programs.html Laurence Tratt: An Editor for Composed Programs] - [https://news.ycombinator.com/item?id=19622121]
  
* YouTube: [https://www.youtube.com/watch?v=2h2qckyDQi0 CS\M04\T01 - Classes, Objects, Properties and Method Concepts]
+
* [https://soft-dev.org/src/eco  Eco] - a prototype editor for editing composed languages. It is not feature complete, it is not intended for production, and it does have bugs. Eco is distributed under a BSD/MIT license.
  
  
  
* https://en.wikipedia.org/wiki/Object_(computer_science)
 
  
* https://en.wikipedia.org/wiki/Class_(computer_science)
+
=== Noise ===
  
* https://en.wikipedia.org/wiki/Instance_(computer_science)
+
* [https://ramesaliyev.com/visual-noises/ Visual Noises @ ramesaliyev] - [https://news.ycombinator.com/item?id=19121981]
  
  
* https://en.wikipedia.org/wiki/Method_(computer_programming) - a procedure associated with an object. An object is made up of data and behavior, which form the interface that an object presents to the outside world. Data is represented as properties of the object and behavior as methods. For example, a Window object would have methods such as open and close, while its state (whether it is opened or closed) would be a property.
+
* https://github.com/smcameron/open-simplex-noise-in-c - Port of Kurt Spencer's java implementation of open simplex noise to C -- Note: This is NOT Ken Perlin's Simplex noise algorithm.
  
 +
=== Optimisation ===
  
  
* http://stackoverflow.com/questions/4203163/how-do-i-design-a-class-in-python/4203836#4203836
+
* LWN.net: [https://lwn.net/Articles/793253/ Who's afraid of a big bad optimizing compiler?] - [https://lkml.org/lkml/2019/9/20/394]
  
* https://medium.com/@simplyianm/why-gos-structs-are-superior-to-class-based-inheritance-b661ba897c67 [https://news.ycombinator.com/item?id=11997764]
+
== Areas ==
 +
See also [[Games#Software]], [[AI]], [[Audio]], etc.
  
 +
* https://bithublab.org
  
* https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
+
=== Command-line ===
 +
* http://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop
  
 +
=== Compression ===
 +
* [http://mattmahoney.net/dc/dce.html?year=2011 Data Compression Explained] - Matt Mahoney
  
* https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)
+
=== Network ===
 +
* [http://www.beej.us/guide/bgnet/output/html/singlepage/bgnet.html Beej's Guide to Network Programming] - Using Internet Sockets
  
* https://en.wikipedia.org/wiki/Multiple_inheritance
+
* http://en.wikipedia.org/wiki/Distributed_hash_table
  
* https://en.wikipedia.org/wiki/Prototype-based_programming
+
* https://news.ycombinator.com/item?id=8565161
 +
 
 +
 
 +
* https://news.ycombinator.com/item?id=8674825
  
* https://en.wikipedia.org/wiki/Differential_inheritance
 
  
 +
=== Graphics ===
  
* https://news.ycombinator.com/item?id=16605831
+
* YouTube: [https://www.youtube.com/watch?v=Tfh0ytz8S0k How "oldschool" graphics worked.] [https://news.ycombinator.com/item?id=10082517]
* https://lobste.rs/s/bb2dyo/why_inheritance_never_made_any_sense
 
  
* https://en.wikipedia.org/wiki/Object_copy
+
* http://www.objc.io/issue-3/moving-pixels-onto-the-screen.html
* https://en.wikipedia.org/wiki/Object_lifetime
 
  
 +
* http://www.johncostella.com/magic/ [https://news.ycombinator.com/item?id=10404517]
  
* https://en.wikipedia.org/wiki/Object_composition
 
  
* https://en.wikipedia.org/wiki/Composition_over_inheritance
+
* http://devmag.org.za/2012/07/29/how-to-choose-colours-procedurally-algorithms/
  
 +
* https://www.libavg.de/site/projects/libavg/wiki
  
* https://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)
+
* http://pixelshaders.com/
 +
** http://pixelshaders.com/proposal/
  
 +
* http://doc-ok.org/?p=1057 [https://news.ycombinator.com/item?id=8297729]
  
 +
* http://opensurfaces.cs.cornell.edu/ [https://news.ycombinator.com/item?id=8310225]
  
* https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization - a programming idiom used in several object-oriented languages to describe a particular language behavior. In RAII, holding a resource is a class invariant, and is tied to object lifetime: resource allocation (or acquisition) is done during object creation (specifically initialization), by the constructor, while resource deallocation (release) is done during object destruction (specifically finalization), by the destructor. Thus the resource is guaranteed to be held between when initialization finishes and finalization starts (holding the resources is a class invariant), and to be held only when the object is alive. Thus if there are no object leaks, there are no resource leaks.
+
* http://mattdesl.svbtle.com/drawing-lines-is-hard [https://news.ycombinator.com/item?id=9179336]
  
 +
* http://patriciogonzalezvivo.com/2015/thebookofshaders/ [https://news.ycombinator.com/item?id=9215582]
  
 +
==== 3D ====
 +
* YouTube: [https://www.youtube.com/watch?v=IyUgHPs86XM Principles of Lighting and Rendering with John Carmack at QuakeCon 2013]
  
* https://en.wikipedia.org/wiki/Mutator_method
+
* http://fabiensanglard.net/rayTracing_back_of_business_card/index.php
* https://en.wikipedia.org/wiki/Protocol_(object-oriented_programming)
 
  
* https://en.wikipedia.org/wiki/Delegation_(programming)
+
* http://programmers.stackexchange.com/questions/60544/why-do-game-developers-prefer-windows/88055#88055
* https://en.wikipedia.org/wiki/Delegation_pattern
 
  
* https://en.wikipedia.org/wiki/Mixin
 
  
* https://en.wikipedia.org/wiki/Coupling_(computer_programming)
+
* http://adriansampson.net/blog/opengl.html [https://news.ycombinator.com/item?id=11615788]
  
* https://en.wikipedia.org/wiki/Observer_pattern
+
* http://antongerdelan.net/opengl/
* https://en.wikipedia.org/wiki/Template_method_pattern
 
* https://en.wikipedia.org/wiki/Factory_method_pattern
 
* https://en.wikipedia.org/wiki/Composite_pattern
 
* https://en.wikipedia.org/wiki/Decorator_pattern
 
* https://en.wikipedia.org/wiki/Mediator_pattern
 
* https://en.wikipedia.org/wiki/Adapter_pattern
 
  
* https://en.wikipedia.org/wiki/Member_variable
+
=== Virtual / augmented reality ===
  
* https://en.wikipedia.org/wiki/Command_pattern
 
  
* https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization
+
* http://www.hitl.washington.edu/people/person.php?name=tfurness
 +
** https://en.wikipedia.org/wiki/Thomas_A._Furness_III
  
* https://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29 - Single responsibility, Open-closed, Liskov substitution, Interface segregation and Dependency inversion
 
  
 +
* https://en.wikipedia.org/wiki/X_Reality_(XR) - defined as: a form of “mixed reality environment that comes from the fusion (union) of ... ubiquitous sensor/actuator networks and shared online virtual worlds....”. It encompasses a wide spectrum of hardware and software, including sensory interfaces, applications, and infrastructures, that enable content creation for virtual reality (VR), mixed reality (MR), augmented reality (AR), cinematic reality (CR). With these tools, users generate new forms of reality by bringing digital objects into the physical world and bringing physical world objects into the digital world.Its meaning has more recently been broadened to include technologies of extended ("cyborg" or wearable) intelligence in regards to the IEEE Council on Extended Intelligence (CXI).
  
* https://news.ycombinator.com/item?id=14660895
+
=== Distributed ===
 +
* https://en.wikipedia.org/wiki/Distributed_computing
  
* https://en.wikipedia.org/wiki/Jeroo
 
  
* https://plus.google.com/101960720994009339267/posts/hoJdanihKwb - rob pike on oo
+
* https://github.com/madd86/awesome-system-design - A curated list of awesome System Design (A.K.A. Distributed Computing) resources.  
** http://www.csis.pace.edu/~bergin/patterns/ppoop.html
 
* https://news.ycombinator.com/item?id=6909326
 
  
* http://blog.ircmaxell.com/2012/07/oop-vs-procedural-code.html
 
  
* http://harmful.cat-v.org/software/OO_programming/why_oo_sucks [http://news.ycombinator.com/item?id=4245737]
 
** http://www.librador.com/2012/07/16/No-thats-not-why-OO-sucks/
 
* http://prog21.dadgum.com/156.html
 
  
* YouTube: [https://www.youtube.com/watch?v=QM1iUe6IofM Object-Oriented Programming is Bad] - Brian Will
+
* https://en.wikipedia.org/wiki/Computer_cluster
  
* http://raganwald.com/2014/03/10/writing-oop-using-oop.html
+
* https://en.wikipedia.org/wiki/Single_system_image
  
* http://wcook.blogspot.co.uk/2012/07/proposal-for-simplified-modern.html
 
* http://blog.codeclimate.com/blog/2012/11/28/your-objects-the-unix-way/
 
  
* http://lwn.net/SubscriberLink/548560/16388a4dbede3884/
+
* https://en.wikipedia.org/wiki/CAP_theorem
  
* https://en.wikipedia.org/wiki/Metaobject
+
* https://github.com/henryr/cap-faq [https://news.ycombinator.com/item?id=10407314]
* https://en.wikipedia.org/wiki/Metaclass
 
  
* http://en.wikipedia.org/wiki/Aspect-oriented_software_development
+
* https://research.microsoft.com/en-us/people/mickens/thesaddestmoment.pdf [https://news.ycombinator.com/item?id=6905536]
  
* http://web.media.mit.edu/~lieber/Lieberary/OOP/Delegation/Delegation.html [http://dl.acm.org/citation.cfm?id=960112.28718]
+
* http://the-paper-trail.org/blog/distributed-systems-theory-for-the-distributed-systems-engineer/ [https://news.ycombinator.com/item?id=8158832]
  
* http://steve-yegge.blogspot.co.uk/2006/03/execution-in-kingdom-of-nouns.html
+
* https://www.youtube.com/watch?v=1eew8BngN7Y#t=3m14s
  
* https://news.ycombinator.com/item?id=6932089
 
  
* http://raganwald.com/2014/03/31/class-hierarchies-dont-do-that.html [https://news.ycombinator.com/item?id=7496968]
+
* https://news.ycombinator.com/item?id=10446835
  
* https://news.ycombinator.com/item?id=8830794
+
* http://jvns.ca/blog/2016/02/09/til-clock-skew-exists
  
* http://wcook.blogspot.co.uk/2012/07/proposal-for-simplified-modern.html [https://news.ycombinator.com/item?id=8832211]
+
* https://pdfs.semanticscholar.org/d00b/0af865c0ee7389ecbf0be09044e569dbcfee.pdf
  
* https://blog.inf.ed.ac.uk/sapm/2014/02/04/the-anaemic-domain-model-is-no-anti-pattern-its-a-solid-design/
+
=== Virus ===
 +
* http://www.symantec.com/avcenter/reference/hunting.for.metamorphic.pdf [https://news.ycombinator.com/item?id=9059672]
  
 +
* https://vxheaven.org/ [https://news.ycombinator.com/item?id=11645175]
  
=== Data-orientated ===
 
  
* https://en.wikipedia.org/wiki/Data-oriented_design - a program optimization approach motivated by efficient usage of the CPU cache, used in video game development. The approach is to focus on the data layout, separating and sorting fields according to when they are needed, and to think about transformations of data. Proponents include Mike Acton and Scott Meyers.
+
=== Social ===
 +
* http://snipplr.com/
  
The claim is that traditional object-oriented programming (OOP) design principles result in poor data locality, more so if runtime polymorphism (dynamic dispatch) is used (which is especially problematic on some processors). Although OOP does superficially seem to organise code around data, the practice is quite different. OOP is actually about organising source code around data types, rather than physically grouping individual fields and arrays in a format efficient for access by specific functions. It also often hides layout details under abstraction layers, while a data-oriented programmer wants to consider this first and foremost.
+
* https://couchdb.apache.org/conduct.html
  
  
* https://news.ycombinator.com/item?id=20205694
+
* https://en.wikipedia.org/wiki/Authorization
  
 +
* https://news.ycombinator.com/item?id=11151790
  
* YouTube: [https://www.youtube.com/watch?v=rX0ItVEVjHc CppCon 2014: Mike Acton "Data-Oriented Design and C++"]
 
  
* YouTube: [https://www.youtube.com/watch?v=yy8jQgmhbAU CppCon 2018: Stoyan Nikolov “OOP Is Dead, Long Live Data-oriented Design”]
+
=== to sort ===
 +
* https://github.com/grahamjenson/list_of_recommender_systems
  
 +
== For kids ==
 +
=== Scratch ===
 +
* http://scratch.mit.edu/
 +
* http://ase.tufts.edu/DevTech/ScratchJr/ScratchJrHome.asp
 +
* http://programmingisterrible.com/post/76953953784/programming-with-building-blocks
  
 +
* https://scratch.mit.edu/discuss/topic/326861 [https://news.ycombinator.com/item?id=18810216]
  
* [https://cellperformance.beyond3d.com/articles/2008/03/three-big-lies.html Three Big Lies - CellPerformance]
+
=== Snap ===
 +
* http://snap.berkeley.edu/
  
=== Declarative ===
+
* https://news.ycombinator.com/item?id=17056444
* http://en.wikipedia.org/wiki/Declarative_programming - a programming paradigm—a style of building the structure and elements of computer programs—that expresses the logic of a computation without describing its control flow. Declarative programming often considers programs as theories of a formal logic, and computations as deductions in that logic space. Declarative programming may greatly simplify writing parallel programs. Common declarative languages include those of database query languages (e.g., SQL, XQuery), regular expressions, logic programming, functional programming, and configuration management systems.
 
  
* http://latentflip.com/imperative-vs-declarative
+
=== to sort ===
 +
* http://www.robomind.net/en/index.html
 +
** http://www.in-the-attic.co.uk/2012/10/04/teaching-my-5-year-old-daughter-to-code/
 +
* http://dancali.io/blog/a-74-step-account-of-my-7-year-old-daughters-first-programming-experience [https://news.ycombinator.com/item?id=7542817]
  
We could do this in an imperative style like so:
 
  
var numbers = [1,2,3,4,5]
+
* http://www.sesameworkshop.org/our-blog/2012/12/17/sesames-best-practices-guide-for-childrens-app-development/
var doubled = []
 
 
for(var i = 0; i < numbers.length; i++) {
 
  var newNumber = numbers[i] * 2
 
  doubled.push(newNumber)
 
}
 
console.log(doubled) //=> [2,4,6,8,10]
 
  
We explicitly iterate over the length of the array, pull each element out of the array, double it, and add the doubled value to the new array, mutating the doubled array at each step until we are done. A more declarative approach might use the Array.map function and look like:
 
  
var numbers = [1,2,3,4,5]
+
* http://blog.minibloq.org/
 
 
var doubled = numbers.map(function(n) {
 
  return n * 2
 
})
 
console.log(doubled) //=> [2,4,6,8,10]
 
  
map creates a new array from an existing array, where each element in the new array is created by passing the elements of the original array into the function passed to map (function(n) { return n*2 } in this case). What the map function does is abstract away the process of explicitly iterating over the array, and lets us focus on what we want to happen. Note that the function we pass to map is pure; it doesn't have any side effects (change any external state), it just takes in a number and returns the number doubled.
 
  
 +
* http://squeak.org/ - smalltalk
  
  
* [http://www.infoq.com/presentations/Design-Composition-Performance Design, Composition and Performance] - Rich Hickey explores the nature of design and composition and how it impacts the software development practice and tools.
+
* https://en.wikipedia.org/wiki/ToonTalk
  
* [http://lwn.net/Articles/191059/ Crash-only software: More than meets the eye] [https://news.ycombinator.com/item?id=8464573]
 
  
 +
* https://www.alice.org/
  
==== Functional ====
 
* https://en.wikipedia.org/wiki/Functional_programming
 
  
 +
* http://www.aisforarray.com/
  
* https://en.wikipedia.org/wiki/Purely_functional
 
  
 +
* https://github.com/maryrosecook/islaclj
  
* http://maryrosecook.com/blog/post/a-practical-introduction-to-functional-programming [https://news.ycombinator.com/item?id=8943356]
 
  
* [http://blog.gja.in/2014/01/functional-programming-101-with-haskell.html Functional Programming 101 - With Haskell] [https://news.ycombinator.com/item?id=7113259]
+
* http://www.gethopscotch.com/
  
* [https://stevekrouse.github.io/hs.js/ λ Lessons] - Pattern matching, first-class functions, and abstracting over recursion in Haskell. This is a short, interactive lesson that teaches core functional programming concepts. It was designed to transform the way you think about performing operations on lists of things, by showing you how functions are executed. [https://news.ycombinator.com/item?id=8155703]
 
  
* http://www.infoq.com/presentations/functional-pros-cons
+
* https://www.makewonder.com/ - robot
  
* http://peteratt.com/programming-thinking-functional-way/ [https://news.ycombinator.com/item?id=7711040]
 
  
* https://fsharpforfunandprofit.com/posts/recipe-part2/ [https://news.ycombinator.com/item?id=11955917]
+
* https://news.ycombinator.com/item?id=8127491
  
  
 +
* http://www.bbc.co.uk/news/technology-28984411
  
  
* http://en.wikipedia.org/wiki/Functional_reactive_programming
+
* http://changelog.complete.org/archives/9269-my-boys-love-1986-computing [https://news.ycombinator.com/item?id=8651599]
  
* [https://gist.github.com/staltz/868e7e9bc2a7b8c1f754 The introduction to Reactive Programming you've been missing] [https://news.ycombinator.com/item?id=7964873]
 
  
 +
* http://www.nicolasbize.com/blog/30-years-later-qbasic-is-still-the-best/ [https://news.ycombinator.com/item?id=11636383]
  
* http://stackoverflow.com/questions/327955/does-functional-programming-replace-gof-design-patterns
+
* http://blog.makewonder.com/evolution-programming-for-kids/ [https://news.ycombinator.com/item?id=11709033]
* http://www.dev.gd/20121224-understanding-map-filter-and-fold.html
 
* http://loup-vaillant.fr/tutorials/from-imperative-to-functional
 
  
* http://www.harukizaemon.com/blog/2010/03/01/functional-programming-in-object-oriented-languages/
+
== Future ==
* DrupalCon Munich 2012: [http://munich2012.drupal.org/program/sessions/functional-php Functional PHP]
+
* [https://www.youtube.com/watch?v=0oonXT-gYjU Alan Kay: Doing with Images Makes Symbols Pt 1 (1987) 1 - 3]
  
* [https://www.youtube.com/watch?v=Agu6jipKfYw "Controlling Time and Space: understanding the many formulations of FRP" by Evan Czaplicki]
+
* [http://worrydream.com/LearnableProgramming/ Learnable Programming] - Designing a programming system for understanding programs - Bret Victor
  
* [https://github.com/keera-studios/haskell-game-programming/wiki/Functional-Reactive-Programming Functional Reactive Programming · keera-studios/haskell-game-programming Wiki]
+
* [http://worrydream.com/dbx/ "The Future of Programming"] - Bret Victor
 +
** http://glamour-and-discourse.blogspot.ch/p/the-future-of-programming-bret-victor.html
  
 +
* http://www.omarrizwan.com/cruncher/ [https://news.ycombinator.com/item?id=6984273] - bret victor inspired
  
* YouTube: [https://www.youtube.com/watch?v=6mTbuzafcII "Transducers" by Rich Hickey] [https://news.ycombinator.com/item?id=8342718]
+
* http://blog.comealive.io/Working-Toward-Bret-Victors-Learnable-Programming/ [https://news.ycombinator.com/item?id=10078089]
  
* [https://clojure.org/reference/transducers Clojure - Transducers]
+
* http://www.vpri.org/pdf/tr2014003_callbymeaning.pdf [https://news.ycombinator.com/item?id=8236054]
  
  
 +
* [http://alarmingdevelopment.org/?p=893 The Future Programming Manifesto] [https://news.ycombinator.com/item?id=8233954]
  
* http://en.wikipedia.org/wiki/Applicative_programming_language
+
* https://github.com/witheve/Eve
 +
** https://news.ycombinator.com/item?id=10073578
  
 +
* [https://news.ycombinator.com/item?id=10926038 Ask HN: Which people and groups are researching new approaches to programming?]
  
* http://en.wikipedia.org/wiki/Typed_lambda_calculus
+
* http://blog.csta.acm.org/2015/10/01/accesscs10k-quorum-programming-language-and-evidence-oriented-programming/ [https://news.ycombinator.com/item?id=11006513]
  
* http://en.wikipedia.org/wiki/First-class_function
+
* [http://alumni.cs.ucr.edu/~ratana/PaneRatanamahatanaMyers00.pdf Studying the Language and Structure in Non-Programmers’ Solutions to Programming Problems] [https://news.ycombinator.com/item?id=11508313] / https://news.ycombinator.com/item?id=11513818
  
  
* http://technicae.cogitat.io/2012/12/the-secret-history-of-lambda.html
+
* [http://pchiusano.blogspot.co.uk/2013/05/the-future-of-software-end-of-apps-and.html The future of software, the end of apps, and why UX designers should care about type theory] [https://news.ycombinator.com/item?id=11849698]
* https://gist.github.com/e000/1023982
 
* http://stevelosh.com/blog/2013/03/list-out-of-lambda/
 
  
 +
* http://unisonweb.org/2015-05-07/about.html#post-start
  
* [http://www.infoq.com/presentations/Functional-Languages-101 Functional Languages 101: What’s All the Fuss About?]
 
* [http://leanpub.com/fp-oo Functional Programming for the Object-Oriented Programmer]
 
* [http://www.jmolly.com/2012/06/24/functional-and-object-oriented-programming.html Functional and Object-Oriented Programming]
 
  
* [http://www.javaworld.com/javaworld/jw-07-2012/120705-what-s-wrong-with-functional-programming.html Functional programming: A step backward]
+
* https://blog.ycombinator.com/harc [https://news.ycombinator.com/item?id=11679680]
* [http://richardminerich.com/2012/07/functional-programming-is-dead-long-live-expression-oriented-programming/ Functional Programming is Dead, Long Live Expression-Oriented Programming]
 
  
* [http://newartisans.com/2012/08/monads-in-pictures/ Monads in Pictures] - Aug 20th, 2012
 
  
* Google Video: [http://video.google.com/videoplay?docid=-4991530385753299192 Type-driven testing in Haskell - Simon Peyton Jones]
+
* [https://phenomenalworld.org/metaresearch/the-next-big-thing-is-a-room The Phenomenal World | The "Next Big Thing" is a Room]
  
* http://www.ibm.com/developerworks/library/j-ft20/
 
  
* http://cstheory.stackexchange.com/questions/1539/whats-new-in-purely-functional-data-structures-since-okasaki
+
* https://github.com/pel-daniel/mind-bicycles - List of future of programming projects
 
 
* https://en.wikipedia.org/wiki/Hindley%E2%80%93Milner_type_system
 
  
* http://www.infoq.com/presentations/functional-category-theory [https://news.ycombinator.com/item?id=8143052]
 
  
* http://www.chrisstucchio.com/blog/2014/computers_are_made_of_metal.html [https://news.ycombinator.com/item?id=8394420]
+
* https://news.ycombinator.com/item?id=24581674
  
* http://bartoszmilewski.com/2014/12/23/kleisli-categories/ [https://news.ycombinator.com/item?id=8792279]
+
== Performance ==
 +
* http://www.networkperformancedaily.com/
  
* http://www.jpaulmorrison.com/fbp/introduction.html
 
  
* https://en.wikipedia.org/wiki/Functional_logic_programming
+
* http://searchenterpriselinux.techtarget.com/definition/high-performance-computing
  
* https://news.ycombinator.com/item?id=11729270
+
* http://flowvr.sourceforge.net/FlowVROverview.html
  
* http://philipnilsson.github.io/Badness10k/posts/2016-08-10-functional-patterns-monoid-morphism.html [https://news.ycombinator.com/item?id=12609247]
 
  
  
* [https://www.microsoft.com/en-us/research/publication/the-implementation-of-functional-programming-languages/ The Implementation of Functional Programming Languages - Microsoft Research]
+
* https://en.wikipedia.org/wiki/Cyclomatic_complexity - a software metric (measurement), used to indicate the complexity of a program. It is a quantitative measure of the number of linearly independent paths through a program's source code. It was developed by Thomas J. McCabe, Sr. in 1976.
  
* [https://www.microsoft.com/en-us/research/publication/implementing-functional-languages-a-tutorial/ Implementing functional languages: a tutorial - Microsoft Research]
 
  
==== Dataflow ====
 
See [[Dataflow]]
 
  
* http://en.wikipedia.org/wiki/Dataflow_programming - a programming paradigm that models a program as a directed graph of the data flowing between operations, thus implementing dataflow principles and architecture. Dataflow programming languages share some features of functional languages, and were generally developed in order to bring some functional concepts to a language more suitable for numeric processing.  
+
* https://en.wikipedia.org/wiki/LINPACK_benchmarks - a measure of a system's floating-point computing power. Introduced by Jack Dongarra, they measure how fast a computer solves a dense n by n system of linear equations Ax&nbsp;=&nbsp;b, which is a common task in engineering. The latest version of these benchmarks is used to build the TOP500 list, ranking the world's most powerful supercomputers. The aim is to approximate how fast a computer will perform when solving real problems. It is a simplification, since no single computational task can reflect the overall performance of a computer system. Nevertheless, the LINPACK benchmark performance can provide a good correction over the peak performance provided by the manufacturer. The peak performance is the maximal theoretical performance a computer can achieve, calculated as the machine's frequency, in cycles per second, times the number of operations per cycle it can perform. The actual performance will always be lower than the peak performance. The performance of a computer is a complex issue that depends on many interconnected variables. The performance measured by the LINPACK benchmark consists of the number of 64-bit floating-point operations, generally additions and multiplications, a computer can perform per second, also known as FLOPS. However, a computer's performance when running actual applications is likely to be far behind the maximal performance it achieves running the appropriate LINPACK benchmark.
  
  
* http://en.wikipedia.org/wiki/Reactive_programming - a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow.
 
  
* http://staltz.com/dont-react/ [https://news.ycombinator.com/item?id=8819115]
+
* [https://top500.org TOP500] - The TOP500 project was launched in 1993 to improve and renew the Mannheim supercomputer statistics, which had been in use for seven years. Our simple TOP500 approach does not define “supercomputer” as such, but we use a benchmark to rank systems and to decide on whether or not they qualify for the TOP500 list. The benchmark we decided on was Linpack, which means that systems are ranked only by their ability to solve a set of linear equations, A x = b, using a dense random matrix A. Therefore, any supercomputer – no matter what its architecture is – can make it into the TOP500 list, as long as it is able to solve a set of linear equations using floating point arithmetic. We have been criticized for this choice from the very beginning, but now, after 20 years, we can say that it was exactly this choice that has made TOP500 so successful – Linpack therefore was a good choice. And there was, and still is, no alternative to Linpack. Any other benchmark would have been similarly specific, but would not have been so easily available for all systems a very important factor, as compiling the TOP500 lists twice a year is a very complex process.
 
 
 
 
* https://en.wikipedia.org/wiki/Flow-based_programming - '''FBP''', a programming paradigm that defines applications as networks of "black box" processes, which exchange data across predefined connections by message passing, where the connections are specified externally to the processes. These black box processes can be reconnected endlessly to form different applications without having to be changed internally. FBP is thus naturally component-oriented. FBP is a particular form of dataflow programming based on bounded buffers, information packets with defined lifetimes, named ports, and separate definition of connections.
 
 
 
 
 
* [https://nifi.apache.org/ Apache NiFi] is a dataflow system based on the concepts of flow-based programming. It supports powerful and scalable directed graphs of data routing, transformation, and system mediation logic. NiFi has a web-based user interface for design, control, feedback, and monitoring of dataflows. It is highly configurable along several dimensions of quality of service, such as loss-tolerant versus guaranteed delivery, low latency versus high throughput, and priority-based queuing. NiFi provides fine-grained data provenance for all data received, forked, joined cloned, modified, sent, and ultimately dropped upon reaching its configured end-state. [https://news.ycombinator.com/item?id=10190846]
 
 
 
==== Constraint ====
 
* https://en.wikipedia.org/wiki/Constraint_programming
 
 
 
 
 
==== Logic ====
 
* https://en.wikipedia.org/wiki/Logic_programming - a programming paradigm based on formal logic. A program written in a logic programming language is a set of sentences in logical form, expressing facts and rules about some problem domain. Major logic programming language families include Prolog, Answer set programming (ASP) and Datalog. In all of these languages, rules are written in the form of clauses and are read declaratively as logical implications.
 
 
 
== Patterns ==
 
See also [[Organisation#Patterns]], [[Development]]
 
 
 
* https://en.wikipedia.org/wiki/Design_pattern
 
 
 
* https://github.com/kamranahmedse/design-patterns-for-humans/blob/master/README.md [https://news.ycombinator.com/item?id=13664127]
 
 
 
 
 
* https://en.wikipedia.org/wiki/Software_design_pattern
 
 
 
* https://news.ycombinator.com/item?id=12849757
 
 
 
* https://en.wikipedia.org/wiki/Architectural_pattern
 
 
 
 
 
* [http://c2.com/cgi/wiki?WelcomeVisitors WikiWikiWeb] - aka Wards Wiki
 
** http://c2.com/cgi/wiki?PatternIndex
 
** http://c2.com/cgi/wiki?CategoryPattern
 
** http://c2.com/cgi/wiki?CategoryAntiPattern
 
** http://c2.com/cgi/wiki?ExtremeProgrammingRoadmap
 
 
 
"ExtremeProgramming -- all programming is maintenance."
 
 
 
* [http://c2.com/ppr/ Portland Pattern Repository]
 
** https://en.wikipedia.org/wiki/Portland_Pattern_Repository
 
 
 
 
 
* [https://www.hillside.net/patterns Design Patterns Library] - a source for information about all aspects of software patterns and pattern languages. If you are new to patterns, James Coplien and Richard Gabriel have created a succinct pattern definition.Patterns and Pattern Languages are ways to describe best practices, good designs, and capture experience in a way that it is possible for others to reuse this experience. The Hillside Group takes pleasure in sponsoring many different PLoP conferences that are provided for the betterment of the pattern community.
 
 
 
 
 
* http://stackoverflow.com/questions/92225/what-are-the-best-resources-for-design-patterns-and-their-uses
 
 
 
* http://perldesignpatterns.com/?HomePage
 
 
 
* http://blog.plover.com/prog/design-patterns.html
 
 
 
* http://www.mcdonaldland.info/files/designpatterns/designpatternscard.pdf
 
 
 
 
 
* http://en.wikipedia.org/wiki/Architectural_pattern_%28computer_science%29
 
 
 
* http://en.wikipedia.org/wiki/Common_layers_in_an_information_system_logical_architecture
 
 
 
 
 
* http://en.wikipedia.org/wiki/Module_pattern
 
 
 
* http://modulecounts.com/
 
 
 
 
 
* http://en.wikipedia.org/wiki/Singleton_pattern - restrict the instantiation of a class to one object.
 
 
 
* https://programmers.stackexchange.com/questions/40373/so-singletons-are-bad-then-what
 
 
 
 
 
* http://en.wikipedia.org/wiki/Behavioral_pattern
 
 
 
 
 
* https://en.wikipedia.org/wiki/Actor_model
 
 
 
 
 
* https://en.wikipedia.org/wiki/Inversion_of_control
 
 
 
 
 
* http://c2.com/cgi/wiki?CollectionOrientedProgramming
 
 
 
 
 
* http://www.perldesignpatterns.com/?PerlDesignPatterns
 
 
 
 
 
* http://www.embeddedrelated.com/showarticle/455.php
 
 
 
 
 
* http://www.jroller.com/landers/entry/the_design_pattern_facade_pattern
 
 
 
* https://news.ycombinator.com/item?id=6790392
 
 
 
* http://ssdl-wiki.cs.technion.ac.il/wiki/index.php/Spartan_programming
 
 
 
* http://meyerweb.com/eric/comment/chech.html
 
 
 
* http://www.confreaks.com/videos/3337-railsconf-keynote-10-years - convention over configuration
 
 
 
* YouTube: [https://www.youtube.com/watch?v=pOl4E8x3fmw Lambda Jam 2014 - Eric Meijer - The Lost Art of Denotational Semantics]
 
 
 
 
 
* [https://programmingisterrible.com/post/176657481103/repeat-yourself-do-more-than-one-thing-and Repeat yourself, do more than one thing, and...] - [https://lobste.rs/s/rufml3/repeat_yourself_do_more_than_one_thing]
 
 
 
 
 
==== MV* ====
 
* http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
 
* http://c2.com/cgi/wiki?ModelViewController
 
* http://puremvc.org/content/view/67/178/
 
* https://news.ycombinator.com/item?id=6370343
 
 
 
* http://mvc.givan.se/ [https://news.ycombinator.com/item?id=9324338]
 
 
 
* http://mikepackdev.com/blog_posts/34-a-review-of-mvc
 
 
 
"create your views, express your models or develop a controller"
 
 
 
* http://martinfowler.com/eaaDev/PresentationModel.html
 
* http://en.wikipedia.org/wiki/Model_View_ViewModel
 
 
 
* http://russelleast.wordpress.com/2008/08/09/overview-of-the-modelview-viewmodel-mvvm-pattern-and-data-binding/
 
* http://programmers.stackexchange.com/questions/114409/did-concept-of-viewmodel-exist-before-mvvm
 
 
 
* http://gee.cs.oswego.edu/dl/acs/acs/acs.html?1 - reactive [https://news.ycombinator.com/item?id=9678943]
 
 
 
 
 
==== Push/pull ====
 
* http://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern
 
 
 
* http://en.wikipedia.org/wiki/Push_technology
 
 
 
 
 
==== Graphics ====
 
See [[Graphics]], [[UI]], [[GUI]], [[Wayland]], [[3D]]
 
 
 
 
 
* https://en.wikipedia.org/wiki/Layout_engine - a computer program that combines content and formatting information for electronic or printed display. It is not a stand-alone program but a core component of larger programs. There are different types of layout engines. One is the web browser engines used in web browsers and email clients. Another type is the layout managers used in widget toolkits.
 
 
 
 
 
* https://en.wikipedia.org/wiki/List_of_layout_engines
 
 
 
== to sort ==
 
 
 
 
 
=== SDL ===
 
* [https://tratt.net/laurie/blog/entries/an_editor_for_composed_programs.html Laurence Tratt: An Editor for Composed Programs] - [https://news.ycombinator.com/item?id=19622121]
 
 
 
* [https://soft-dev.org/src/eco  Eco] - a prototype editor for editing composed languages. It is not feature complete, it is not intended for production, and it does have bugs. Eco is distributed under a BSD/MIT license.
 
 
 
 
 
 
 
 
 
=== Noise ===
 
 
 
* [https://ramesaliyev.com/visual-noises/ Visual Noises @ ramesaliyev] - [https://news.ycombinator.com/item?id=19121981]
 
 
 
 
 
* https://github.com/smcameron/open-simplex-noise-in-c - Port of Kurt Spencer's java implementation of open simplex noise to C -- Note: This is NOT Ken Perlin's Simplex noise algorithm.
 
 
 
=== Optimisation ===
 
 
 
 
 
* LWN.net: [https://lwn.net/Articles/793253/ Who's afraid of a big bad optimizing compiler?] - [https://lkml.org/lkml/2019/9/20/394]
 
 
 
== Areas ==
 
See also [[Games#Software]], [[AI]], [[Audio]], etc.
 
 
 
* https://bithublab.org
 
 
 
=== Command-line ===
 
* http://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop
 
 
 
=== Compression ===
 
* [http://mattmahoney.net/dc/dce.html?year=2011 Data Compression Explained] - Matt Mahoney
 
 
 
=== Network ===
 
* [http://www.beej.us/guide/bgnet/output/html/singlepage/bgnet.html Beej's Guide to Network Programming] - Using Internet Sockets
 
 
 
* http://en.wikipedia.org/wiki/Distributed_hash_table
 
 
 
* https://news.ycombinator.com/item?id=8565161
 
 
 
 
 
* https://news.ycombinator.com/item?id=8674825
 
 
 
 
 
=== Graphics ===
 
 
 
* YouTube: [https://www.youtube.com/watch?v=Tfh0ytz8S0k How "oldschool" graphics worked.] [https://news.ycombinator.com/item?id=10082517]
 
 
 
* http://www.objc.io/issue-3/moving-pixels-onto-the-screen.html
 
 
 
* http://www.johncostella.com/magic/ [https://news.ycombinator.com/item?id=10404517]
 
 
 
 
 
* http://devmag.org.za/2012/07/29/how-to-choose-colours-procedurally-algorithms/
 
 
 
* https://www.libavg.de/site/projects/libavg/wiki
 
 
 
* http://pixelshaders.com/
 
** http://pixelshaders.com/proposal/
 
 
 
* http://doc-ok.org/?p=1057 [https://news.ycombinator.com/item?id=8297729]
 
 
 
* http://opensurfaces.cs.cornell.edu/ [https://news.ycombinator.com/item?id=8310225]
 
 
 
* http://mattdesl.svbtle.com/drawing-lines-is-hard [https://news.ycombinator.com/item?id=9179336]
 
 
 
* http://patriciogonzalezvivo.com/2015/thebookofshaders/ [https://news.ycombinator.com/item?id=9215582]
 
 
 
==== 3D ====
 
* YouTube: [https://www.youtube.com/watch?v=IyUgHPs86XM Principles of Lighting and Rendering with John Carmack at QuakeCon 2013]
 
 
 
* http://fabiensanglard.net/rayTracing_back_of_business_card/index.php
 
 
 
* http://programmers.stackexchange.com/questions/60544/why-do-game-developers-prefer-windows/88055#88055
 
 
 
 
 
* http://adriansampson.net/blog/opengl.html [https://news.ycombinator.com/item?id=11615788]
 
 
 
* http://antongerdelan.net/opengl/
 
 
 
=== Virtual / augmented reality ===
 
 
 
 
 
* http://www.hitl.washington.edu/people/person.php?name=tfurness
 
** https://en.wikipedia.org/wiki/Thomas_A._Furness_III
 
 
 
 
 
* https://en.wikipedia.org/wiki/X_Reality_(XR) - defined as: a form of “mixed reality environment that comes from the fusion (union) of ... ubiquitous sensor/actuator networks and shared online virtual worlds....”. It encompasses a wide spectrum of hardware and software, including sensory interfaces, applications, and infrastructures, that enable content creation for virtual reality (VR), mixed reality (MR), augmented reality (AR), cinematic reality (CR). With these tools, users generate new forms of reality by bringing digital objects into the physical world and bringing physical world objects into the digital world.Its meaning has more recently been broadened to include technologies of extended ("cyborg" or wearable) intelligence in regards to the IEEE Council on Extended Intelligence (CXI).
 
 
 
=== Distributed ===
 
* https://en.wikipedia.org/wiki/Distributed_computing
 
 
 
* https://en.wikipedia.org/wiki/Computer_cluster
 
 
 
* https://en.wikipedia.org/wiki/Single_system_image
 
 
 
 
 
* https://en.wikipedia.org/wiki/CAP_theorem
 
 
 
* https://github.com/henryr/cap-faq [https://news.ycombinator.com/item?id=10407314]
 
 
 
* https://research.microsoft.com/en-us/people/mickens/thesaddestmoment.pdf [https://news.ycombinator.com/item?id=6905536]
 
 
 
* http://the-paper-trail.org/blog/distributed-systems-theory-for-the-distributed-systems-engineer/ [https://news.ycombinator.com/item?id=8158832]
 
 
 
* https://www.youtube.com/watch?v=1eew8BngN7Y#t=3m14s
 
 
 
 
 
* https://news.ycombinator.com/item?id=10446835
 
 
 
* http://jvns.ca/blog/2016/02/09/til-clock-skew-exists
 
 
 
* https://pdfs.semanticscholar.org/d00b/0af865c0ee7389ecbf0be09044e569dbcfee.pdf
 
 
 
=== Virus ===
 
* http://www.symantec.com/avcenter/reference/hunting.for.metamorphic.pdf [https://news.ycombinator.com/item?id=9059672]
 
 
 
* https://vxheaven.org/ [https://news.ycombinator.com/item?id=11645175]
 
 
 
 
 
=== Social ===
 
* http://snipplr.com/
 
 
 
* https://couchdb.apache.org/conduct.html
 
 
 
 
 
* https://en.wikipedia.org/wiki/Authorization
 
 
 
* https://news.ycombinator.com/item?id=11151790
 
 
 
 
 
=== to sort ===
 
* https://github.com/grahamjenson/list_of_recommender_systems
 
 
 
== For kids ==
 
=== Scratch ===
 
* http://scratch.mit.edu/
 
* http://ase.tufts.edu/DevTech/ScratchJr/ScratchJrHome.asp
 
* http://programmingisterrible.com/post/76953953784/programming-with-building-blocks
 
 
 
* https://scratch.mit.edu/discuss/topic/326861 [https://news.ycombinator.com/item?id=18810216]
 
 
 
=== Snap ===
 
* http://snap.berkeley.edu/
 
 
 
* https://news.ycombinator.com/item?id=17056444
 
 
 
=== to sort ===
 
* http://www.robomind.net/en/index.html
 
** http://www.in-the-attic.co.uk/2012/10/04/teaching-my-5-year-old-daughter-to-code/
 
* http://dancali.io/blog/a-74-step-account-of-my-7-year-old-daughters-first-programming-experience [https://news.ycombinator.com/item?id=7542817]
 
 
 
 
 
* http://www.sesameworkshop.org/our-blog/2012/12/17/sesames-best-practices-guide-for-childrens-app-development/
 
 
 
 
 
* http://blog.minibloq.org/
 
 
 
 
 
* http://squeak.org/ - smalltalk
 
 
 
 
 
* https://en.wikipedia.org/wiki/ToonTalk
 
 
 
 
 
* https://www.alice.org/
 
 
 
 
 
* http://www.aisforarray.com/
 
 
 
 
 
* https://github.com/maryrosecook/islaclj
 
 
 
 
 
* http://www.gethopscotch.com/
 
 
 
 
 
* https://www.makewonder.com/ - robot
 
 
 
 
 
* https://news.ycombinator.com/item?id=8127491
 
 
 
 
 
* http://www.bbc.co.uk/news/technology-28984411
 
 
 
 
 
* http://changelog.complete.org/archives/9269-my-boys-love-1986-computing [https://news.ycombinator.com/item?id=8651599]
 
 
 
 
 
* http://www.nicolasbize.com/blog/30-years-later-qbasic-is-still-the-best/ [https://news.ycombinator.com/item?id=11636383]
 
 
 
* http://blog.makewonder.com/evolution-programming-for-kids/ [https://news.ycombinator.com/item?id=11709033]
 
 
 
== Future ==
 
* [https://www.youtube.com/watch?v=0oonXT-gYjU Alan Kay: Doing with Images Makes Symbols Pt 1 (1987) 1 - 3]
 
 
 
* [http://worrydream.com/LearnableProgramming/ Learnable Programming] - Designing a programming system for understanding programs - Bret Victor
 
 
 
* [http://worrydream.com/dbx/ "The Future of Programming"] - Bret Victor
 
** http://glamour-and-discourse.blogspot.ch/p/the-future-of-programming-bret-victor.html
 
 
 
* http://www.omarrizwan.com/cruncher/ [https://news.ycombinator.com/item?id=6984273] - bret victor inspired
 
 
 
* http://blog.comealive.io/Working-Toward-Bret-Victors-Learnable-Programming/ [https://news.ycombinator.com/item?id=10078089]
 
 
 
* http://www.vpri.org/pdf/tr2014003_callbymeaning.pdf [https://news.ycombinator.com/item?id=8236054]
 
 
 
 
 
* [http://alarmingdevelopment.org/?p=893 The Future Programming Manifesto] [https://news.ycombinator.com/item?id=8233954]
 
 
 
* https://github.com/witheve/Eve
 
** https://news.ycombinator.com/item?id=10073578
 
 
 
* [https://news.ycombinator.com/item?id=10926038 Ask HN: Which people and groups are researching new approaches to programming?]
 
 
 
* http://blog.csta.acm.org/2015/10/01/accesscs10k-quorum-programming-language-and-evidence-oriented-programming/ [https://news.ycombinator.com/item?id=11006513]
 
 
 
* [http://alumni.cs.ucr.edu/~ratana/PaneRatanamahatanaMyers00.pdf Studying the Language and Structure in Non-Programmers’ Solutions to Programming Problems] [https://news.ycombinator.com/item?id=11508313] / https://news.ycombinator.com/item?id=11513818
 
 
 
 
 
* [http://pchiusano.blogspot.co.uk/2013/05/the-future-of-software-end-of-apps-and.html The future of software, the end of apps, and why UX designers should care about type theory] [https://news.ycombinator.com/item?id=11849698]
 
 
 
* http://unisonweb.org/2015-05-07/about.html#post-start
 
 
 
 
 
* https://blog.ycombinator.com/harc [https://news.ycombinator.com/item?id=11679680]
 
 
 
 
 
* [https://phenomenalworld.org/metaresearch/the-next-big-thing-is-a-room The Phenomenal World | The "Next Big Thing" is a Room]
 
 
 
 
 
* https://github.com/pel-daniel/mind-bicycles - List of future of programming projects
 
 
 
== Performance ==
 
* http://www.networkperformancedaily.com/
 
 
 
 
 
* http://searchenterpriselinux.techtarget.com/definition/high-performance-computing
 
 
 
* http://flowvr.sourceforge.net/FlowVROverview.html
 
 
 
 
 
 
 
* https://en.wikipedia.org/wiki/Cyclomatic_complexity - a software metric (measurement), used to indicate the complexity of a program. It is a quantitative measure of the number of linearly independent paths through a program's source code. It was developed by Thomas J. McCabe, Sr. in 1976.
 
  
 
== Quantum computing ==
 
== Quantum computing ==

Latest revision as of 00:18, 18 March 2025

General

See also Maths#Computation, Computer, Emulation, Virtualisation, Data, *nix, Maths#Types


to very much further sort and understand.


A program is many things. It is a piece of text typed by a programmer, it is the directing force that makes the computer do what it does, it is data in the computer's memory, yet it controls the actions performed on this same memory. Analogies that try to compare programs to objects we are familiar with tend to fall short, but a superficially fitting one is that of a machine. The gears of a mechanical watch fit together ingeniously, and if the watchmaker was any good, it will accurately show the time for many years. The elements of a program fit together in a similar way, and if the programmer knows what he is doing, the program will run without crashing.
A computer is a machine built to act as a host for these immaterial machines. Computers themselves can only do stupidly straightforward things. The reason they are so useful is that they do these things at an incredibly high speed. A program can, by ingeniously combining many of these simple actions, do very complicated things. ... When a program works, it is beautiful. The art of programming is the skill of controlling complexity. The great program is subdued, made simple in its complexity.

-- http://eloquentjavascript.net/chapter1.html

Basics

  • WP: Computer_literacy - defined as the knowledge and ability to use computers and related technology efficiently, with skill levels ranging from elementary use to computer programming and advanced problem solving. Computer literacy can also refer to the comfort level someone has with using computer programs and applications. Another valuable component is understanding how computers work and operate. An individual's level of computer literacy is measured on the scale of how skilled they are when it comes to using computers and other related tools to achieve a goal. Computer literacy may be distinguished from computer programming, which primarily focuses on the design and coding of computer programs rather than the familiarity and skill in their use. Various countries, including the United Kingdom and the United States, have created initiatives to improve national computer literacy rates.






  • WP: Interactive_computing - refers to software which accepts input from the user as it runs. Interactive software includes commonly used programs, such as word processors or spreadsheet applications. By comparison, non-interactive programs operate without user intervention; examples of these include compilers and batch processing applications that are pre-programmed to run independently.







  • Pipe Logic - "In this model, a UNIX pipe acts like a wire, that is, a conductor with parasitic capacitance."



  • Simple Made Easy - Rich Hickey emphasizes simplicity’s virtues over easiness’, showing that while many choose easiness they may end up with complexity, and the better way is to choose easiness along the simplicity path. ]









  • The Cursed Computer Iceberg Meme - the intent is to awaken you to many of the peculiarities and weirdness of computers. hopefully, after reading these articles, you will have learned a lot and will embrace chaos.

Reference

  • WikiChip - a semiconductor and computer engineering technology website. We detail historical and modern electronic systems and technologies as well as related topics.















  • Beautiful Software - Christopher Alexander's research initiative on computing and the environment

Books














News and blogs





History






  • WP: Stepped_reckoner - a digital mechanical calculator invented by the German mathematician Gottfried Wilhelm Leibniz around 1672 and completed in 1694. The name comes from the translation of the German term for its operating mechanism, Staffelwalze, meaning 'stepped drum'. It was the first calculator that could perform all four arithmetic operations. Its intricate precision gearwork, however, was somewhat beyond the fabrication technology of the time; mechanical problems, in addition to a design flaw in the carry mechanism, prevented the machines from working reliably.





















  • WP: Altair_8800 - a microcomputer designed in 1975 based on the Intel 8080 CPU. Interest grew quickly after it was featured on the cover of the January 1975 issue (published in late November 1974) of Popular Electronics, and was sold by mail order through advertisements there, in Radio-Electronics, and in other hobbyist magazines. The designers hoped to sell a few hundred build-it-yourself kits to hobbyists, and were surprised when they sold thousands in the first month.











  • The Jargon File - a comprehensive compendium of hacker slang illuminating many aspects of hackish tradition, folklore, and humor.



Ternary

  • WP: Ternary_computer - also called trinary computer, is one that uses ternary logic (i.e., base 3) instead of the more common binary system (i.e., base 2) in its calculations. This means it uses trits (instead of bits, as most computers do).
  • WP: Setun - Russian, 1958




People

  • WP: Claude_Shannon - was an American mathematician, electrical engineer, and cryptographer known as "the father of information theory". Shannon is noted for having founded information theory with a landmark paper, "A Mathematical Theory of Communication", that he published in 1948.He is also well known for founding digital circuit design theory in 1937, when—as a 21-year-old master's degree student at the Massachusetts Institute of Technology (MIT)—he wrote his thesis demonstrating that electrical applications of Boolean algebra could construct any logical numerical relationship. Shannon contributed to the field of cryptanalysis for national defense during World War II, including his fundamental work on codebreaking and secure telecommunications.












https://news.ycombinator.com/item?id=23869819








Architecture

See also Electronics

  • WP: Harvard_architecture - a computer architecture with physically separate storage and signal pathways for instructions and data. The term originated from the Harvard Mark I relay-based computer, which stored instructions on punched tape (24 bits wide) and data in electro-mechanical counters. These early machines had data storage entirely contained within the central processing unit, and provided no access to the instruction storage as data. Programs needed to be loaded by an operator; the processor could not initialize itself.


  • WP: Von_Neumann_architecture - meaning has evolved to be any stored-program computer in which an instruction fetch and a data operation cannot occur at the same time because they share a common bus. This is referred to as the von Neumann bottleneck and often limits the performance of the system. The design of a von Neumann architecture is simpler than the more modern Harvard architecture which is also a stored-program system but has one dedicated set of address and data buses for reading data from and writing data to memory, and another set of address and data buses for fetching instructions.


  • WP: Modified_Harvard_architecture - a variation of the Harvard computer architecture that allows the contents of the instruction memory to be accessed as if it were data. Most modern computers that are documented as Harvard architecture are, in fact, Modified Harvard architecture.


  • WP: Flynn's_taxonomy - a classification of computer architectures, proposed by Michael Flynn in 1966. The classification system has stuck, and has been used as a tool in design of modern processors and their functionalities.


  • OpenCores - Since 1999, OpenCores is the most prominent online community for the development of gateware IP (Intellectual Properties) Cores. It is the place where such cores are shared and promoted in the spirit of Free and Open Source collaboration.
    • http://opencores.org/projects - main objective is to design and publish core designs under a license for hardware modeled on the Lesser General Public License (LGPL) for software. We are committed to the ideal of freely available, freely usable and re-usable open source hardware.



Instructions

  • WP: Instruction_set - or instruction set architecture (ISA), is the part of the computer architecture related to programming, including the native data types, instructions, registers, addressing modes, memory architecture, interrupt and exception handling, and external I/O. An ISA includes a specification of the set of opcodes (machine language), and the native commands implemented by a particular processor.


  • WP: First-generation_programming_language - a machine-level programming language. A first generation (programming) language (1GL) is a grouping of programming languages that are machine level languages used to program first-generation computers. Originally, no translator was used to compile or assemble the first-generation language. The first-generation programming instructions were entered through the front panel switches of the computer system.The instructions in 1GL are made of binary numbers, represented by 1s and 0s. This makes the language suitable for the understanding of the machine but far more difficult to interpret and learn by the human programmer.The main advantage of programming in 1GL is that the code can run very fast and very efficiently, precisely because the instructions are executed directly by the central processing unit (CPU). One of the main disadvantages of programming in a low level language is that when an error occurs, the code is not as easy to fix.First generation languages are very much adapted to a specific computer and CPU, and code portability is therefore significantly reduced in comparison to higher level languages.Modern day programmers still occasionally use machine level code, especially when programming lower level functions of the system, such as drivers, interfaces with firmware and hardware devices. Modern tools such as native-code compilers are used to produce machine level from a higher-level language.


  • WP: Microarchitecture - sometimes abbreviated to µarch or uarch, also called computer organization, is the way a given instruction set architecture (ISA) is implemented on a processor. A given ISA may be implemented with different microarchitectures; implementations may vary due to different goals of a given design or due to shifts in technology. Computer architecture is the combination of microarchitecture and instruction set design.





  • WP: Microcode - a layer of hardware-level instructions or data structures involved in the implementation of higher level machine code instructions in central processing units, and in the implementation of the internal logic of many channel controllers, disk controllers, network interface controllers, network processors, graphics processing units, and other hardware. It resides in special high-speed memory and translates machine instructions into sequences of detailed circuit-level operations. It helps separate the machine instructions from the underlying electronics so that instructions can be designed and altered more freely. It also makes it feasible to build complex multi-step instructions while still reducing the complexity of the electronic circuitry compared to other methods. Writing microcode is often called microprogramming and the microcode in a particular processor implementation is sometimes called a microprogram.




  • WP: Machine_code - a set of instructions executed directly by a computer's central processing unit (CPU). Each instruction performs a very specific task, such as a load, a jump, or an ALU operation on a unit of data in a CPU register or memory. Every program directly executed by a CPU is made up of a series of such instructions. Numerical machine code (i.e., not assembly code) may be regarded as the lowest-level representation of a compiled or assembled computer program or as a primitive and hardware-dependent programming language. While it is possible to write programs directly in numerical machine code, it is tedious and error prone to manage individual bits and calculate numerical addresses and constants manually. It is thus rarely done today, except for situations that require extreme optimization or debugging.
  • WP: Word_(computer_architecture) - term for the natural unit of data used by a particular processor design. A word is basically a fixed-sized group of digits (binary or decimal) that are handled as a unit by the instruction set or the hardware of the processor. The number of digits in a word (the word size, word width, or word length) is an important characteristic of any specific processor design or computer architecture.
  • WP: Opcode - the portion of a machine language instruction that specifies the operation to be performed.
  • WP: Operand#Computer_science - the part of a computer instruction which specifies what data is to be manipulated or operated on, while at the same time representing the data itself. A computer instruction describes an operation such as add or multiply X, while the operand (or operands, as there can be more than one) specify on which X to operate as well as the value of X. Additionally, in assembly language, an operand is a value (an argument) on which the instruction, named by mnemonic, operates. The operand may be a processor register, a memory address, a literal constant, or a label.


  • WP: Bytecode - also known as p-code (portable code), is a form of instruction set designed for efficient execution by a software interpreter. Unlike human-readable source code, bytecodes are compact numeric codes, constants, and references (normally numeric addresses) which encode the result of parsing and semantic analysis of things like type, scope, and nesting depths of program objects. They therefore allow much better performance than direct interpretation of source code.

"fundamentally the same as machine code, in that it describes low level operations such as reading and writing memory, and basic calculations. Bytecode is typically conceived to be produced when COMPILING a higher level language, for example PHP or Java, and unlike machine code for many hardware based processors, may have operations to support specific features of the higher level language. A key difference is that the processor of bytecode is usually a program, though processors have been created for interpreting some bytecode specifications, e.g. a processor called SOAR (Smalltalk On A RISC) for Smalltalk bytecode. While you wouldn't typically call native machine code bytecode, for some types of processors such as CISC and EISC (e.g. Linn Rekursiv, from the people who made record players), the processor itself contains a program that is interpreting the machine instructions, so there are parallels." [19]


Machine data types - All data in computers based on digital electronics is represented as bits (alternatives 0 and 1) on the lowest level. The smallest addressable unit of data is usually a group of bits called a byte (usually an octet, which is 8 bits). The unit processed by machine code instructions is called a word (as of 2011, typically 32 or 64 bits). Most instructions interpret the word as a binary number, such that a 32-bit word can represent unsigned integer values from 0 to 2^{32}-1 or signed integer values from -2^{31} to 2^{31}-1. Because of two's complement, the machine language and machine doesn't need to distinguish between these unsigned and signed data types for the most part.

There is a specific set of arithmetic instructions that use a different interpretation of the bits in word as a floating-point number. Machine data types need to be exposed or made available in systems or low-level programming languages, allowing fine-grained control over hardware. The C programming language, for instance, supplies integer types of various widths, such as short and long. If a corresponding native type does not exist on the target platform, the compiler will break them down into code using types that do exist. For instance, if a 32-bit integer is requested on a 16 bit platform, the compiler will tacitly treat it as an array of two 16 bit integers.

Processing



  • WP: Voltage_regulator_module - VRM), sometimes called processor power module (PPM), is a buck converter that provides a microprocessor the appropriate supply voltage, converting +5 V or +12 V to a much lower voltage required by the CPU, allowing processors with different supply voltage to be mounted on the same motherboard.


  • Libre Silicon - We develop a free (as in freedom, not as in free of charge) and open source semiconductor manufacturing process standard, including a full mixed signal PDK, and provide a quick, easy and inexpensive way for manufacturing. No NDAs will be required anywhere to get started, making it possible to build the designs in your basement if you wish so. We are aiming to revolutionize the market by breaking through the monopoly of proprietary closed source manufacturers! [20]


CPU







  • WP: Control_unit - a component of a computer's central processing unit (CPU) that directs operation of the processor. It controls communication and co-ordination between input/output devices. It reads and interprets instructions and determines the sequence for processing the data.


  • WP: Control_store - the part of a CPU's control unit that stores the CPU's microprogram. It is usually accessed by a microsequencer.








  • WP: Cache_coherence - the uniformity of shared resource data that ends up stored in multiple local caches. When clients in a system maintain caches of a common memory resource, problems may arise with incoherent data, which is particularly the case with CPUs in a multiprocessing system. In the illustration on the right, consider both the clients have a cached copy of a particular memory block from a previous read. Suppose the client on the bottom updates/changes that memory block, the client on the top could be left with an invalid cache of memory without any notification of the change. Cache coherence is intended to manage such conflicts by maintaining a coherent view of the data values in multiple caches.




  • WP: NX_bit - stands for No-eXecute, a technology used in CPUs to segregate areas of memory for use by either storage of processor instructions (code) or for storage of data, a feature normally only found in Harvard architecture processors. However, the NX bit is being increasingly used in conventional von Neumann architecture processors, for security reasons.



  • WP: Branch_predication - a strategy in computer architecture design for mitigating the costs usually associated with conditional branches, particularly branches to short sections of code. It does this by allowing each instruction to conditionally either perform an operation or do nothing.




  • WP: Vector_processor - a central processing unit (CPU) that implements an instruction set containing instructions that operate on one-dimensional arrays of data called vectors






  • WP: Processor_affinity - or CPU pinning or "cache affinity", enables the binding and unbinding of a process or a thread to a central processing unit (CPU) or a range of CPUs, so that the process or thread will execute only on the designated CPU or CPUs rather than any CPU. This can be viewed as a modification of the native central queue scheduling algorithm in a symmetric multiprocessing operating system. Each item in the queue has a tag indicating its kin processor. At the time of resource allocation, each task is allocated to its kin processor in preference to others.

Microprocessor

  • WP: Microprocessor - a computer processor that incorporates the functions of a computer's central processing unit (CPU) on a single integrated circuit

Coprocessor

  • WP: Coprocessor - a computer processor used to supplement the functions of the primary processor (the CPU). Operations performed by the coprocessor may be floating point arithmetic, graphics, signal processing, string processing, encryption or I/O Interfacing with peripheral devices. By offloading processor-intensive tasks from the main processor, coprocessors can accelerate system performance. Coprocessors allow a line of computers to be customized, so that customers who do not need the extra performance need not pay for it.


  • WP: Floating-point_unit - FPU, colloquially a math coprocessor) is a part of a computer system specially designed to carry out operations on floating point numbers. Typical operations are addition, subtraction, multiplication, division, square root, bitshifting. Some systems (particularly older, microcode-based architectures) can also perform various transcendental functions such as exponential or trigonometric calculations, though in most modern processors these are done with software library routines. In a general purpose computer architectures, one or more FPUs may be integrated with the central processing unit; however many embedded processors do not have hardware support for floating-point operations.
  • WP: Arithmetic_underflow - The term arithmetic underflow (also floating point underflow, or just underflow) is a condition in a computer program where the result of a calculation is a number of smaller absolute value than the computer can actually represent in memory on its central processing unit (CPU).
  • WP: Denormal_number - fill the underflow gap around zero in floating-point arithmetic. Any non-zero number with magnitude smaller than the smallest normal number is subnormal.


  • WP: Controller_(computing) - a chip, an expansion card, or a stand-alone device that interfaces with a peripheral device. This may be a link between two parts of a computer (for example a memory controller that manages access to memory for the computer) or a controller on an external device that manages the operation of (and connection with) that device.

The term is sometimes used in the opposite sense to refer to a device by which the user controls the operation of the computer, as in game controller. In desktop computers the controller may be a plug in board, a single integrated circuit on the motherboard, or an external device. In mainframes the controller is usually either a separate device attached to a channel or integrated into the peripheral.






  • WP: Compute_kernel - a routine compiled for high throughput accelerators (such as GPUs), DSPs or FPGAs, separate from (but used by) a main program. They are sometimes called compute shaders, sharing execution units with vertex shaders and pixel shaders on GPUs, but are not limited to execution on one class of device, or graphics APIs.

DSP


CISC

x86







  • WP: Intel_8088 - a variant of the Intel 8086. Introduced on June 1, 1979, the 8088 has an eight-bit external data bus instead of the 16-bit bus of the 8086. The 16-bit registers and the one megabyte address range are unchanged, however. In fact, according to the Intel documentation, the 8086 and 8088 have the same execution unit (EU)—only the bus interface unit (BIU) is different. The original IBM PC is based on the 8088, as are its clones.


  • homebrew8088.com - 8088 Motherboard project. The Motherboard is built to be generally PC XT compatible. The schematics and source code can be found on my GitHub page. Features: -8088, NEC V20, or NEC V40 Processor -640k RAM (This can be changed) -8 Bit ISA sockets -PC Speaker -USB "Hard Drive" -PS/2 Keyboard -ATX form factor





















  • https://github.com/xoreaxeaxeax/sandsifter - The sandsifter audits x86 processors for hidden instructions and hardware bugs, by systematically generating machine code to search through a processor's instruction set, and monitoring execution for anomalies. Sandsifter has uncovered secret processor instructions from every major vendor; ubiquitous software bugs in disassemblers, assemblers, and emulators; flaws in enterprise hypervisors; and both benign and security-critical hardware bugs in x86 chips. With the multitude of x86 processors in existence, the goal of the tool is to enable users to check their own systems for hidden instructions and bugs.

RISC

MIPS



SPARC
Power


Alpha
ARM
RISC-V


  • https://github.com/riscv/riscv-opcodes - enumerates standard RISC-V instruction opcodes and control and status registers. It also contains a script to convert them into several formats (C, Scala, LaTeX).



  • lowRISC - producing fully open hardware systems. From the processor core to the development board, our goal is to create a completely open computing eco-system. Our open-source SoC (System-on-a-Chip) designs will be based on the 64-bit RISC-V instruction set architecture. Volume silicon manufacture is planned as is a low-cost development board. There are more details on our plans in these slides from a recent talk [41] [42]



  • PULP Platform - What you will get is a competitive, state-of-the-art 32-bit processor based on the RISC-V architecture, with a rich set of peripherals, and full debug support. At ETH Zurich and Universita’ di Bologna we have put many of the ideas that we have developed through our research on ultra-low-power parallel processing (PULP project) into PULPino. It is the little hip brother to its more serious bigger brothers.








Other





GPU





TPU

  • WP: Tensor_processing_unit - are application-specific integrated circuits (ASIC) developed specifically for machine learning. Compared to graphics processing units (which as of 2016 are frequently used for the same tasks), they are designed explicitly for a higher volume of reduced precision computation with higher IOPS per watt (e.g. as little as 8-bit precision), and lack hardware for rasterisation/texture mapping. The chip has been specifically designed for Google's TensorFlow framework, however Google still uses CPUs and GPUs for other machine learning. Other AI accelerator designs are appearing from other vendors also and are aimed at embedded and robotics markets.


The Mill

Parallel computing


  • WP: Amdahl's_law - a formula which gives the theoretical speedup in latency of the execution of a task at fixed workload that can be expected of a system whose resources are improved. It is named after computer scientist Gene Amdahl, and was presented at the AFIPS Spring Joint Computer Conference in 1967.Amdahl's law is often used in parallel computing to predict the theoretical speedup when using multiple processors. For example, if a program needs 20 hours to complete using a single thread, but a one hour portion of the program cannot be parallelized, therefore only the remaining 19 hours (p = 0.95) of execution time can be parallelized, then regardless of how many threads are devoted to a parallelized execution of this program, the minimum execution time cannot be less than one hour.




  • WP: SIMD - Single instruction, multiple data (SIMD) is a class of parallel computers in Flynn's taxonomy. It describes computers with multiple processing elements that perform the same operation on multiple data points simultaneously. Such machines exploit data level parallelism, but not concurrency: there are simultaneous (parallel) computations, but only a single process (instruction) at a given moment. SIMD is particularly applicable to common tasks such as adjusting the contrast in a digital image or adjusting the volume of digital audio. Most modern CPU designs include SIMD instructions to improve the performance of multimedia use. Not to be confused with SIMT which utilizes threads.





  • https://github.com/taichi-dev/taichi - a parallel programming language for high-performance numerical computations. It is embedded in Python, and its just-in-time compiler offloads compute-intensive tasks to multi-core CPUs and massively parallel GPUs.


GPGPU





  • WP: Load-link/store-conditional - LL/SC, sometimes known as load-reserved/store-conditional (LR/SC), are a pair of instructions used in multithreading to achieve synchronization. Load-link returns the current value of a memory location, while a subsequent store-conditional to the same memory location will store a new value only if no updates have occurred to that location since the load-link. Together, this implements a lock-free atomic read-modify-write operation. "Load-linked" is also known as load-link, load-reserved, and load-locked.


CUDA

  • WP: CUDA - (Compute Unified Device Architecture) is a parallel computing platform and application programming interface (API) model created by Nvidia. It allows software developers and software engineers to use a CUDA-enabled graphics processing unit (GPU) for general purpose processing – an approach termed GPGPU (General-Purpose computing on Graphics Processing Units). The CUDA platform is a software layer that gives direct access to the GPU's virtual instruction set and parallel computational elements, for the execution of compute kernels. The CUDA platform is designed to work with programming languages such as C, C++, and Fortran. This accessibility makes it easier for specialists in parallel programming to use GPU resources, in contrast to prior APIs like Direct3D and OpenGL, which required advanced skills in graphics programming. CUDA-powered GPUs also support programming frameworks such as OpenACC and OpenCL; and HIP by compiling such code to CUDA. When CUDA was first introduced by Nvidia, the name was an acronym for Compute Unified Device Architecture, but Nvidia subsequently dropped the common use of the acronym.


  • https://github.com/NVIDIA/libcudacxx - libcu++, the NVIDIA C++ Standard Library, is the C++ Standard Library for your entire system. It provides a heterogeneous implementation of the C++ Standard Library that can be used in and between CPU and GPU code.





  • https://github.com/jgbit/vuda - a header-only library based on Vulkan that provides a CUDA Runtime API interface for writing GPU-accelerated applications.


OpenCL

  • WP: OpenCL - a framework for writing programs that execute across heterogeneous platforms consisting of central processing units (CPUs), graphics processing units (GPUs), digital signal processors (DSPs), field-programmable gate arrays (FPGAs) and other processors or hardware accelerators. OpenCL specifies programming languages (based on C99 and C++11) for programming these devices and application programming interfaces (APIs) to control the platform and execute programs on the compute devices. OpenCL provides a standard interface for parallel computing using task- and data-based parallelism.





  • WP: SYCL - a higher-level programming model for OpenCL as a single-source domain specific embedded language (DSEL) based on pure C++11 for SYCL 1.2.1 to improve programming productivity. This is a standard developed by Khronos Group, announced in March 2014.

ROCm

  • ROCm - the first open-source HPC/Hyperscale-class platform for GPU computing that’s also programming-language independent. We are bringing the UNIX philosophy of choice, minimalism and modular software development to GPU computing. The new ROCm foundation lets you choose or even develop tools and a language run time for your application.ROCm is built for scale; it supports multi-GPU computing in and out of server-node communication through RDMA. It also simplifies the stack when the driver directly incorporates RDMA peer-sync support.ROCm has a rich system run time with the critical features that large-scale application, compiler and language-run-time development requires.HSA Compliant Runtime and Driver for AMD RADEON GPU’s


Microcontroller

  • WP: Microcontroller - a small computer (SoC) on a single integrated circuit containing a processor core, memory, and programmable input/output peripherals. Program memory in the form of Ferroelectric RAM, NOR flash or OTP ROM is also often included on chip, as well as a typically small amount of RAM. Microcontrollers are designed for embedded applications, in contrast to the microprocessors used in personal computers or other general purpose applications consisting of various discrete chips.







ASIC



PAL

  • WP: Programmable_Array_Logic - a family of programmable logic device semiconductors used to implement logic functions in digital circuits introduced by Monolithic Memories, Inc. (MMI, in March 1978. MMI obtained a registered trademark on the term PAL for use in "Programmable Semiconductor Logic Circuits". The trademark is currently held by Lattice Semiconductor. PAL devices consisted of a small PROM (programmable read-only memory) core and additional output logic used to implement particular desired logic functions with few components.


CPLD

  • WP: Complex_programmable_logic_device - CPLD, is a programmable logic device with complexity between that of PALs and FPGAs, and architectural features of both. The main building block of the CPLD is a macrocell, which contains logic implementing disjunctive normal form expressions and more specialized logic operations.

FPGA



  • https://github.com/amaranth-lang/amaranth - The Amaranth project provides an open-source toolchain for developing hardware based on synchronous digital logic using the Python programming language, as well as evaluation board definitions, a System on Chip toolkit, and more. It aims to be easy to learn and use, reduce or eliminate common coding mistakes, and simplify the design of complex hardware with reusable components. The Amaranth toolchain consists of the Amaranth hardware definition language, the standard library, the simulator, and the build system, covering all steps of a typical FPGA development workflow. At the same time, it does not restrict the designer’s choice of tools: existing industry-standard (System)Verilog or VHDL code can be integrated into an Amaranth-based design flow, or, conversely, Amaranth code can be integrated into an existing Verilog-based design flow. [57]


Memory



There are four major storage levels:

  1. Internal – Processor registers and cache.
  2. Main – the system RAM and controller cards.
  3. On-line mass storage – Secondary storage.
  4. Off-line bulk storage – Tertiary and Off-line storage.




  • WP: NVDIMM NVDIMM - a type of random-access memory for computers. Non-volatile memory is memory that retains its contents even when electrical power is removed, for example from an unexpected power loss, system crash, or normal shutdown. "Dual in-line" identifies the memory as using the DIMM package. NVDIMMs improve application performance and system crash recovery time. They enhance solid-state drive (SSD) endurance and reliability. "Non-volatile" products may use volatile memory during normal operation and dump the contents into non-volatile memory if the power fails, using an on-board backup power source. Volatile memory is faster than non-volatile; it is byte-addressable; and it can be written to arbitrarily, without concerns about wear and device lifespan. However, including a second memory to achieve non-volatility (and the on-board backup power source) increases the product cost compared to volatile memory.



  • WP: ECC_memory - Error correction code memory (ECC memory, is a type of computer data storage that uses an error correction code[a] (ECC) to detect and correct n-bit data corruption which occurs in memory. ECC memory is used in most computers where data corruption cannot be tolerated, like industrial control applications, critical databases, and infrastructural memory caches. Typically, ECC memory maintains a memory system immune to single-bit errors: the data that is read from each word is always the same as the data that had been written to it, even if one of the bits actually stored has been flipped to the wrong state. Most non-ECC memory cannot detect errors, although some non-ECC memory with parity support allows detection but not correction.




  • 28C256 EEPROM Writer - a simple homemade EEPROM writer that any one can make. The code is written in python. I have included my Kicad Files where you can find the schematics and PCB layout. This was developed to be a cheap alternative for writing 32k EEPROMs for my 8088 projects. You can compile and upload code in the application or just upload a precompiled file. When using the application to compile the JMP code for an 8088 is automatically inserted at address 0x7FF0.





  • WP: Memory_rank - a set of DRAM chips connected to the same chip select, which are therefore accessed simultaneously. In practice all DRAM chips share all of the other command and control signals, and only the chip select pins for each rank are separate (the data pins are shared across ranks).



  • WP: Address_space - defines a range of discrete addresses, each of which may correspond to a network host, peripheral device, disk sector, a memory cell or other logical or physical entity.





  • WP: Bank_switching - a technique used in computer design to increase the amount of usable memory beyond the amount directly addressable by the processor. It can be used to configure a system differently at different times; for example, a ROM required to start a system from diskette could be switched out when no longer needed.


  • WP: Slab_allocation - a memory management mechanism intended for the efficient memory allocation of kernel objects. It eliminates fragmentation caused by allocations and deallocations. The technique is used to retain allocated memory that contains a data object of a certain type for reuse upon subsequent allocations of objects of the same type. It is analogous to an object pool, but only applies to memory, not other resources. Slab allocation was first introduced in the Solaris 5.4 kernel by Jeff Bonwick. It is now widely used by many Unix and Unix-like operating systems including FreeBSD and Linux.



  • WP: Executable_space_protection - the marking of memory regions as non-executable, such that an attempt to execute machine code in these regions will cause an exception. It makes use of hardware features such as the NX bit, or in some cases software emulation of those features.


  • WP: Virtual_memory - a memory management technique that is implemented using both hardware and software. It maps memory addresses used by a program, called virtual addresses, into physical addresses in computer memory.


  • WP: Paging - a memory management scheme by which a computer stores and retrieves data from secondary storage[a] for use in main memory.
  • WP: Page_(computer_memory) - memory page, or virtual page is a fixed-length contiguous block of virtual memory, described by a single entry in the page table. It is the smallest unit of data for memory management in a virtual memory operating system.
  • WP: Page_table - the data structure used by a virtual memory system in a computer operating system to store the mapping between virtual addresses and physical addresses. Virtual addresses are used by the accessing process, while physical addresses are used by the hardware, or more specifically, by the RAM subsystem.



  • WP: Page_fault - a type of interrupt, called trap, raised by computer hardware when a running program accesses a memory page that is mapped into the virtual address space, but not actually loaded into main memory. When handling a page fault, the operating system generally tries to make the required page accessible at the location in physical memory, or terminates the program in case of an illegal memory access. Contrary to what "fault" might suggest, valid page/hard faults are not errors, and are common and necessary to increase the amount of memory available to programs in any operating system that utilizes virtual memory,


  • WP: Thrashing_(computer_science) - occurs when a computer's virtual memory subsystem is in a constant state of paging, rapidly exchanging data in memory for data on disk, to the exclusion of most application-level processing



  • WP: Call_stack - a stack data structure that stores information about the active subroutines of a computer program. This kind of stack is also known as an execution stack, control stack, run-time stack, or machine stack, and is often shortened to just "the stack". Although maintenance of the call stack is important for the proper functioning of most software, the details are normally hidden and automatic in high-level programming languages. Many computer instruction sets provide special instructions for manipulating stacks.

A call stack is used for several related purposes, but the main reason for having one is to keep track of the point to which each active subroutine should return control when it finishes executing.

  • WP: Stack-based_memory_allocation - because data is added and removed to the stack in a last-in-first-out manner, stack-based memory allocation is very simple and typically faster than heap-based memory allocation (also known as dynamic memory allocation).


  • WP: Non-uniform_memory_access - a computer memory design used in multiprocessing, where the memory access time depends on the memory location relative to the processor. Under NUMA, a processor can access its own local memory faster than non-local memory (memory local to another processor or memory shared between processors). The benefits of NUMA are limited to particular workloads, notably on servers where the data are often associated strongly with certain tasks or users.


  • WP: Pointer_(computer_programming) - a programming language object, whose value refers to (or "points to") another value stored elsewhere in the computer memory using its address. A pointer references a location in memory, and obtaining the value stored at that location is known as dereferencing the pointer.


  • WP: Pointer_aliasing - refers to the situation where the same memory location can be accessed using different names.






  • https://github.com/Hexorg/Rampage - Linux memory scanner/editor written in python. Similar to scanmem, artmoney, or cheat engine in concept. Allows you to find values of programs in RAM and then change them. Made to be used inside of a python shell. You don't need to know python to use this, but it can help with some automation.


  • WP: Test_and_test-and-set - the test-and-set CPU instruction is used to implement mutual exclusion in multiprocessor environments. Although a correct lock can be implemented with test-and-set, it can lead to resource contention in busy lock (caused by bus locking and cache invalidation when test-and-set operation needs to access memory atomically).To lower the overhead a more elaborate locking protocol test and test-and-set is used. The main idea is to reduce writeback that can create resource contention when two separate threads want the same lock. If n threads are competing for the lock, they will attempt to acquire it as soon as it is released if only using test and set, causing each thread to invalidate the lock flag, meaning it must be propagated through the cache of the remaining processors n times, before any one thread may safely read it. By adding the check-yield step, only the first thread of execution to notice the lock is free will attempt to obtain it, eliminating the writeback.

Storage

See Storage


Interrupts

  • WP: Interrupt - a signal to the processor emitted by hardware or software indicating an event that needs immediate attention. An interrupt alerts the processor to a high-priority condition requiring the interruption of the current code the processor is executing. The processor responds by suspending its current activities, saving its state, and executing a function called an interrupt handler (or an interrupt service routine, ISR) to deal with the event. This interruption is temporary, and, after the interrupt handler finishes, the processor resumes normal activities.


  • WP: Interrupt_request_(PC_architecture) - or IRQ, is a hardware signal sent to the processor that temporarily stops a running program and allows a special program, an interrupt handler, to run instead. Hardware interrupts are used to handle events such as receiving data from a modem or network card, key presses, or mouse movements.

Interrupt lines are often identified by an index with the format of IRQ followed by a number. For example, on the Intel 8259 family of PICs there are eight interrupt inputs commonly referred to as IRQ0 through IRQ7. In x86 based computer systems that use two of these PICs, the combined set of lines are referred to as IRQ0 through IRQ15. Technically these lines are named IR0 through IR7, and the lines on the ISA bus to which they were historically attached are named IRQ0 through IRQ15. Newer x86 systems integrate an Advanced Programmable Interrupt Controller (APIC) that conforms to the Intel APIC Architecture. These APICs support a programming interface for up to 255 physical hardware IRQ lines per APIC, with a typical system implementing support for only around 24 total hardware lines.

  • WP: Interrupt_handler - also known as an interrupt service routine or ISR, a callback function in microcontroller firmware, an operating system or a device driver, whose execution is triggered by the reception of an interrupt. In general, interrupts and their handlers are used to handle high-priority conditions that require the interruption of the current code the processor is executing.

Interrupt handlers have a multitude of functions, which vary based on the reason the interrupt was generated and the speed at which the interrupt handler completes its task. For example, pressing a key on a computer keyboard, or moving the mouse, triggers interrupts that call interrupt handlers which read the key, or the mouse's position, and copy the associated information into the computer's memory. An interrupt handler is a low-level counterpart of event handlers. These handlers are initiated by either hardware interrupts or interrupt instructions in software, and are used for servicing hardware devices and transitions between protected modes of operation such as system calls.


  • WP: Exception_handling - the process of responding to the occurrence, during computation, of exceptions – anomalous or exceptional conditions requiring special processing – often changing the normal flow of program execution. It is provided by specialized programming language constructs or computer hardware mechanisms.


  • WP: Message_Signaled_Interrupts - an alternative in-band method of signaling an interrupt, using special in-band messages to replace traditional out-of-band assertion of dedicated interrupt lines. While more complex to implement in a device, message signaled interrupts have some significant advantages over pin-based out-of-band interrupt signaling. Message signaled interrupts are supported in PCI bus since its version 2.2, and in later available PCI Express bus. Some non-PCI architectures also use message signaled interrupts.


  • https://github.com/Irqbalance/irqbalance - a daemon to help balance the cpu load generated by interrupts across all of a systems cpus. Irqbalance identifies the highest volume interrupt sources, and isolates them to a single unique cpu, so that load is spread as much as possible over an entire processor set, while minimizing cache miss rates for irq handlers.


Other


Security



Runtime

  • WP: Computing_platform - or digital platform or software platform is an environment in which a piece of software is executed. It may be the hardware or the operating system (OS), even a web browser and associated application programming interfaces, or other underlying software, as long as the program code is executed with it. Computing platforms have different abstraction levels, including a computer architecture, an OS, or runtime libraries. A computing platform is the stage on which computer programs can run. A platform can be seen both as a constraint on the software development process, in that different platforms provide different functionality and restrictions; and as an assistant to the development process, in that they provide low-level functionality ready-made. For example, an OS may be a platform that abstracts the underlying differences in hardware and provides a generic command for saving files or accessing the network.


  • WP: Runtime_system - or runtime environment is a sub-system that exists both in the computer where a program is created, as well as in the computers where the program is intended to be run. The name comes from the compile time and runtime division from compiled languages, which similarly distinguishes the computer processes involved in the creation of a program (compilation) and its execution in the target machine (the run time). Most programming languages have some form of runtime system that provides an environment in which programs run. This environment may address a number of issues including the management of application memory, how the program accesses variables, mechanisms for passing parameters between procedures, interfacing with the operating system, and otherwise. The compiler makes assumptions depending on the specific runtime system to generate correct code. Typically the runtime system will have some responsibility for setting up and managing the stack and heap, and may include features such as garbage collection, threads or other dynamic features built into the language.






  • WP: Read-eval-print_loop - REPL, also termed an interactive toplevel or language shell, is a simple interactive computer programming environment that takes single user inputs, executes them, and returns the result to the user; a program written in a REPL environment is executed piecewise. The term usually refers to programming interfaces similar to the classic Lisp machine interactive environment. Common examples include command-line shells and similar environments for programming languages, and the technique is very characteristic of scripting languages.



  • WP: Green_threads - threads that are scheduled by a runtime library or virtual machine (VM) instead of natively by the underlying operating system. Green threads emulate multithreaded environments without relying on any native OS capabilities, and they are managed in user space instead of kernel space, enabling them to work in environments that do not have native thread support.

Programming

See also Languages, Development, Maths#Software 2


Assembly

Learning Assembly

Assembly Tools

Assembly Programming Challenges

= 6502 Assembly

Reverse Engineering & Disassembly

Programming Concepts & Theory

Software Development & Programming Practices

Programming Cheats & References

Programming Philosophy

Miscellaneous

Syntax


  • WP: Lexical_grammar - the process of converting a sequence of characters (such as in a computer program or web page) into a sequence of tokens (strings with an identified "meaning"). A program that performs lexical analysis may be called a lexer, tokenizer, or scanner (though "scanner" is also used to refer to the first stage of a lexer). Such a lexer is generally combined with a parser, which together analyze the syntax of programming languages, web pages, and so forth.

For instance, the lexical grammar for many programming languages specifies that a string literal starts with a " character and continues until a matching " is found (escaping makes this more complicated), that an identifier is an alphanumeric sequence (letters and digits, usually also allowing underscores, and disallowing initial digits), and that an integer literal is a sequence of digits. So in the following character sequence "abc" xyz1 23 the tokens are string, identifier and number (plus whitespace tokens) because the space character terminates the sequence of characters forming the identifier. Further, certain sequences are categorized as keywords – these generally have the same form as identifiers (usually alphabetical words), but are categorized separately; formally they have a different token type.

  • WP: Lexical_analysis - the process of converting a sequence of characters (such as in a computer program or web page) into a sequence of tokens (strings with an identified "meaning"). A program that performs lexical analysis may be called a lexer, tokenizer, or scanner (though "scanner" is also used to refer to the first stage of a lexer). Such a lexer is generally combined with a parser, which together analyze the syntax of programming languages, web pages, and so forth.


  • WP: Language_construct - a syntactically allowable part of a program that may be formed from one or more lexical tokens in accordance with the rules of a programming language. The term "language construct" is often used as a synonym for control structure, and should not be confused with a function.


  • WP: Syntactic_noise - syntax within a programming language that makes the programming language more difficult to read and understand for humans. It fills the language with excessive clutter that makes it a hassle to write code. Syntactic noise is considered to be the opposite of syntactic sugar, which is syntax that makes a programming language more readable and enjoyable for the programmer.


  • WP: Catalan_number - a sequence of natural numbers that occur in various counting problems, often involving recursively-defined objects. They are named after the Belgian mathematician Eugène Charles Catalan (1814–1894).

Using zero-based numbering, the nth Catalan number is given directly in terms of binomial coefficients. The first Catalan numbers for n = 0, 1, 2, 3, … are: 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, … (sequence A000108 in OEIS).


  • WP: Dyck_language - the language consisting of balanced strings of square brackets [ and ]. It is important in the parsing of expressions that must have a correctly nested sequence of brackets, such as arithmetic or algebraic expressions.



  • WP: Reserved_word - also known as a reserved identifier is a word that cannot be used as an identifier, such as the name of a variable, function, or label – it is "reserved from use". This is a syntactic definition, and a reserved word may have no meaning.

A closely related and often conflated notion is a keyword which is a word with special meaning in a particular context. This is a semantic definition. By contrast, names in a standard library but not built into the language are not considered reserved words or keywords. The terms "reserved word" and "keyword" are often used interchangeably – one may say that a reserved word is "reserved for use as a keyword" – and formal use varies from language to language; for this article we distinguish as above.

In general reserved words and keywords need not coincide, but in most modern languages keywords are a subset of reserved words, as this makes parsing easier, since keywords cannot be confused with identifiers. In some languages, like C or Python, reserved words and keywords coincide, while in other languages, like Java, all keywords are reserved words, but some reserved words are not keywords – these are "reserved for future use". In yet other languages, such as ALGOL and PL/I there are keywords but no reserved words, with keywords being distinguished from identifiers by other means.



  • WP: Identifier#In_computer_languages - are tokens (also called symbols) which name language entities. Some of the kinds of entities an identifier might denote include variables, types, labels, subroutines, and packages.


  • WP: Declaration_(computer_programming) - specifies properties of an identifier: it declares what a word (identifier) means. Declarations are most commonly used for functions, variables, constants, and classes, but can also be used for other entities such as enumerations and type definitions. Beyond the name (the identifier itself) and the kind of entity (function, variable, etc.), declarations typically specify the data type (for variables and constants), or the type signature (for functions); types may also include dimensions, such as for arrays. A declaration is used to announce the existence of the entity to the compiler; this is important in those strongly typed languages that require functions, variables, and constants, and their types to be specified with a declaration before use, and is used in forward declaration. The term "declaration" is frequently contrasted with the term "definition", but meaning and usage varies significantly between languages
  • WP: Initialization_(programming) - the assignment of an initial value for a data object or variable. The manner in which initialization is performed depends on programming language, as well as type, storage class, etc., of an object to be initialized. Programming constructs which perform initialization are typically called initializers and initializer lists. Initialization is distinct from (and preceded by) declaration, although the two can sometimes be conflated in practice. The complement of initialization is finalization, which is primarily used for objects, but not variables. Initialization is done either by statically embedding the value at compile time, or else by assignment at run time.
  • WP: Finalization - the process of preparing an object for deallocation; strictly speaking, finalization is all parts of object destruction until memory deallocation itself. Finalization is formally complementary to initialization, which is the part of object creation that follows allocation, but differs significantly in practice


  • WP: Directive_(programming) - a language construct that specifies how a compiler (or assembler or interpreter) should process its input. Directives are not part of the language proper – they are not part of the grammar, and may vary from compiler to compiler – but instead function either as an in-band form of a command-line option, specifying compiler behavior, or are processed by a preprocessor. In some cases directives specify global behavior, while in other cases they only affect a local section, such as a block of programming code. In some cases, such as some C pragmas, directives are optional compiler hints, and may be ignored, but normally they are prescriptive, and must be followed. However, a directive does not perform any action in the language itself, but rather only a change in the behavior of the compiler.

This term could be used to refer to proprietary third party tags and commands (or markup) embedded in code that result in additional executable processing that extend the existing compiler, assembler and language constructs present in the development environment. The term "directive" is also applied in a variety of ways that are similar to the term command.


  • WP: First-class_citizen - In programming language design, a first-class citizen (also type, object, entity, or value) in a given programming language is an entity which supports all the operations generally available to other entities. These operations typically include being passed as an argument, returned from a function, and assigned to a variable.



  • WP: Indentation_style - a convention governing the indentation of blocks of code to convey the program's structure. This article largely addresses the free-form languages, such as C programming language and its descendants, but can be (and frequently is) applied to most other programming languages (especially those in the curly bracket family), where whitespace is otherwise insignificant. Indent style is just one aspect of programming style.


  • WP: Syntactic_sugar - syntax within a programming language that is designed to make things easier to read or to express. It makes the language "sweeter" for human use: things can be expressed more clearly, more concisely, or in an alternative style that some may prefer.

For example, many programming languages provide special syntax for referencing and updating array elements. Abstractly, an array reference is a procedure of two arguments: an array and a subscript vector, which could be expressed as get_array(Array, vector(i,j)). Instead, many languages provide syntax like Array[i,j]. Similarly an array element update is a procedure of three arguments, something like set_array(Array, vector(i,j), value), but many languages provide syntax like Array[i,j] = value.

Specifically, a construct in a language is called syntactic sugar if it can be removed from the language without any effect on what the language can do: functionality and expressive power will remain the same. Language processors, including compilers, static analyzers, and the like, often expand sugared constructs into more fundamental constructs before processing, a process sometimes called "desugaring".




  • WP: Backus–Naur_Form - BNF (Backus Normal Form or Backus–Naur Form) is one of the two main notation techniques for context-free grammars, often used to describe the syntax of languages used in computing, such as computer programming languages, document formats, instruction sets and communication protocols; the other main technique for writing context-free grammars is the van Wijngaarden form. They are applied wherever exact descriptions of languages are needed: for instance, in official language specifications, in manuals, and in textbooks on programming language theory. Many extensions and variants of the original Backus–Naur notation are used; some are exactly defined, including Extended Backus–Naur Form (EBNF) and Augmented Backus–Naur Form (ABNF).



  • RFC 4234 - Augmented BNF for Syntax Specifications: ABNF - Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity, with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order- independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications.
  • WP: Augmented_Backus%E2%80%93Naur_form - a metalanguage based on Backus–Naur form (BNF, but consisting of its own syntax and derivation rules. The motive principle for ABNF is to describe a formal system of a language to be used as a bidirectional communications protocol. It is defined by Internet Standard 68 ("STD 68", type case sic), which as of December 2010 was RFC 5234, and it often serves as the definition language for IETF communication protocols.



  • WP: Parsing_expression_grammar - or PEG, is a type of analytic formal grammar, i.e. it describes a formal language in terms of a set of rules for recognizing strings in the language. The formalism was introduced by Bryan Ford in 2004 and is closely related to the family of top-down parsing languages introduced in the early 1970s. Syntactically, PEGs also look similar to context-free grammars (CFGs), but they have a different interpretation: the choice operator selects the first match in PEG, while it is ambiguous in CFG. This is closer to how string recognition tends to be done in practice, e.g. by a recursive descent parser. Unlike CFGs, PEGs cannot be ambiguous; if a string parses, it has exactly one valid parse tree. It is conjectured that there exist context-free languages that cannot be parsed by a PEG, but this is not yet proven. PEGs are well-suited to parsing computer languages, but not natural languages where their performance is comparable to general CFG algorithms such as the Earley algorithm

Compared to pure regular expressions (i.e. without back-references), PEGs are strictly more powerful, but require significantly more memory. For example, a regular expression inherently cannot find an arbitrary number of matched pairs of parentheses, because it is not recursive, but a PEG can. However, a PEG will require an amount of memory proportional to the length of the input, while a regular expression matcher will require only a constant amount of memory.


Data structures







Array




  • WP: Lookup_table - an array that replaces runtime computation with a simpler array indexing operation. The savings in terms of processing time can be significant, since retrieving a value from memory is often faster than undergoing an "expensive" computation or input/output operation. The tables may be precalculated and stored in static program storage, calculated (or "pre-fetched") as part of a program's initialization phase (memoization), or even stored in hardware in application-specific platforms. Lookup tables are also used extensively to validate input values by matching against a list of valid (or invalid) items in an array and, in some programming languages, may include pointer functions (or offsets to labels) to process the matching input. FPGAs also make extensive use of reconfigurable, hardware-implemented, lookup tables to provide programmable hardware functionality.



Tree




B-tree


Radix tree

  • WP: Radix_tree - (also radix trie or compact prefix tree) is a data structure that represents a space-optimized trie (prefix tree) in which each node that is the only child is merged with its parent. The result is that the number of children of every internal node is at most the radix r of the radix tree, where r is a positive integer and a power x of 2, having x ≥ 1. Unlike regular trees, edges can be labeled with sequences of elements as well as single elements. This makes radix trees much more efficient for small sets (especially if the strings are long) and for sets of strings that share long prefixes.

to sort






The difference between arrays and linked lists are:

- Arrays are linear data structures. Linked lists are linear and non-linear data structures. - Linked lists are linear for accessing, and non-linear for storing in memory - Array has homogenous values. And each element is independent of each other positions. Each node in the linked list is connected with its previous node which is a pointer to the node. - Array elements can be modified easily by identifying the index value. It is a complex process for modifying the node in a linked list. - Array elements can not be added, deleted once it is declared. The nodes in the linked list can be added and deleted from the list.

















Mutability

Evaluation

An expression evaluates to a value. A statement does something.

x = 1
y = x + 1     # an expression
print y       # a statement, prints 2



  • WP: Strict_function - in the denotational semantics of programming languages is a function f where f\left(\perp\right) = \perp. The entity \perp, called bottom, denotes an expression which does not return a normal value, either because it loops endlessly or because it aborts due to an error such as division by zero. A function which is not strict is called non-strict. A strict programming language is one in which user-defined functions are always strict.

Intuitively, non-strict functions correspond to control structures. Operationally, a strict function is one which always evaluates its argument; a non-strict function is one which may not evaluate some of its arguments. Functions having more than one parameter may be strict or non-strict in each parameter independently, as well as jointly strict in several parameters simultaneously.


  • WP: Non-strict_programming_language - A strict programming language is one in which only strict functions (functions whose parameters must be evaluated completely before they may be called) may be defined by the user. A non-strict programming language allows the user to define non-strict functions, and hence may allow lazy evaluation.




  • WP: Scope_resolution_operator - helps to identify and specify the context to which an identifier refers, particularly by specifying a namespace or class. The specific uses vary across different programming languages with the notions of scoping. In many languages, the scope resolution operator is written ::.


Operators

  • WP: Operator_(programming) - constructs which behave generally like functions, but which differ syntactically or semantically from usual functions. Common simple examples include arithmetic (addition with +, comparison with >) and logical operations (such as AND or &&). More involved examples include assignment (usually = or :=), field access in a record or object (usually .), and the scope resolution operator (often ::). Languages usually define a set of built-in operators, and in some cases allow user-defined operators.

Functions

See Maths

  • WP: Subroutine or function is a sequence of program instructions that perform a specific task, packaged as a unit. This unit can then be used in programs wherever that particular task should be performed. Subprograms may be defined within programs, or separately in libraries that can be used by multiple programs. In different programming languages a subroutine may be called a procedure, a function, a routine, a method, or a subprogram. The generic term callable unit is sometimes used.


  • WP: Closure_(computer_science) - also lexical closures or function closures are a technique for implementing lexically scoped name binding in languages with first-class functions. Operationally, a closure is a record storing a function[a] together with an environment: a mapping associating each free variable of the function (variables that are used locally, but defined in an enclosing scope) with the value or storage location to which the name was bound when the closure was created. A closure—unlike a plain function—allows the function to access those captured variables through the closure's reference to them, even when the function is invoked outside their scope.


  • WP: Call_site - a call site of a function or subroutine is the location (line of code) where the function is called (or may be called, through dynamic dispatch). A call site is where zero or more arguments are passed to the function, and zero or more return values are received.




  • WP: Language_binding - an application programming interface (API) that provides glue code specifically made to allow a programming language to use a foreign library or operating system service (one that is not native to that language).


  • WP: Wrapper_function - a subroutine in a software library or a computer program whose main purpose is to call a second subroutine or a system call with little or no additional computation. Wrapper functions are used to make writing computer programs easier by abstracting away the details of a subroutine's underlying implementation.
  • WP: Wrapper_library - or library wrappers) consist of a thin layer of code (a "shim") which translates a library's existing interface into a compatible interface.


  • WP: Anonymous_function - also function literal or lambda abstraction is a function definition that is not bound to an identifier. Anonymous functions are often: arguments being passed to higher-order functions, or used for constructing the result of a higher-order function that needs to return a function. If the function is only used once, or a limited number of times, an anonymous function may be syntactically lighter than using a named function. Anonymous functions are ubiquitous in functional programming languages and other languages with first-class functions, where they fulfill the same role for the function type as literals do for other data types.


  • WP: Function_type - the type of a variable or parameter to which a function has or can be assigned, or an argument or result type of a higher-order function taking or returning a function.



  • WP: Function_prototype - or function interface is a declaration of a function that specifies the function's name and type signature (arity, parameter types, and return type), but omits the function body. The term is particularly used in C and C++. While a function definition specifies how the function does what it does (the "implementation"), a function prototype merely specifies its interface, i.e. what data types go in and come out of it.

In a prototype, parameter names are optional (and in C/C++ have function prototype scope, meaning their scope ends at the end of the prototype), however, the type is necessary along with all modifiers (e.g. if it is a pointer or a const parameter). In object-oriented programming, interfaces and abstract methods serve much the same purpose.


  • WP: Function_objects - allows an object to be invoked or called as if it were an ordinary function, usually with the same syntax (a function parameter that can also be a function).



  • WP: Callback_(computer_science) - a piece of executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at some convenient time. The invocation may be immediate as in a synchronous callback, or it might happen at a later time as in an asynchronous callback. In all cases, the intention is to specify a function or subroutine as an entity that is, depending on the language, more or less similar to a variable. Programming languages support callbacks in different ways, often implementing them with subroutines, lambda expressions, blocks, or function pointers.


  • WP: Tail_call - a subroutine call performed as the final action of a procedure. If a tail call might lead to the same subroutine being called again later in the call chain, the subroutine is said to be tail-recursive, which is a special case of recursion. Tail recursion (or tail-end recursion) is particularly useful, and often easy to handle in implementations.


  • WP: Function_pointer - Instead of referring to data values, a function pointer points to executable code within memory. When dereferenced, a function pointer can be used to invoke the function it points to and pass it arguments just like a normal function call. Such an invocation is also known as an "indirect" call, because the function is being invoked indirectly through a variable instead of directly through a fixed name or address. Function pointers can be used to simplify code by providing a simple way to select a function to execute based on run-time values.


  • WP: Funarg_problem - refers to the difficulty in implementing first-class functions (functions as first-class objects) in programming language implementations so as to use stack-based memory allocation of the functions. The difficulty only arises if the body of a nested function refers directly (i.e., not via argument passing) to identifiers defined in the environment in which the function is defined, but not in the environment of the function call. To summarize the discussion below, two standard resolutions are to either forbid such references or to create closures.



  • WP: Inline_expansion - or inlining, is a manual or compiler optimization that replaces a function call site with the body of the called function. Inline expansion is similar to macro expansion, but occurs during compilation, without changing the source code (the text), while macro expansion occurs prior to compilation, and results in different text that is then processed by the compiler. Inlining is an important optimization, but has complicated effects on performance. As a rule of thumb, some inlining will improve speed at very minor cost of space, but excess inlining will hurt speed, due to inlined code consuming too much of the instruction cache, and also cost significant space.


  • WP: Defunctionalization - refers to a compile-time transformation which eliminates higher-order functions, replacing them by a single first-order apply function. The technique was first described by John C. Reynolds in his 1972 paper, "Definitional Interpreters for Higher-Order Programming Languages". Reynolds' observation was that a given program contains only finitely many function abstractions, so that each can be assigned (and replaced by) a unique identifier. Every function application within the program is then replaced by a call to the apply function with the function identifier as the first argument. The apply function's only job is to dispatch on this first argument, and then perform the instructions denoted by the function identifier on the remaining arguments.








Hash function


Algorithms

See also Computing#Computational complexity, Maths




  • WP: Algorithmic_information_theory - a subfield of information theory and computer science that concerns itself with the relationship between computation and information. According to Gregory Chaitin, it is "the result of putting Shannon's information theory and Turing's computability theory into a cocktail shaker and shaking vigorously."







  • WP: Assertion_(software_development) - a statement that a predicate (Boolean-valued function, a true–false expression) is expected to always be true at that point in the code. If an assertion evaluates to false at run time, an assertion failure results, which typically causes the program to crash, or to throw an assertion exception.
  • WP: Invariant_%28computer_science%29 - a condition that can be relied upon to be true during execution of a program, or during some portion of it. It is a logical assertion that is held to always be true during a certain phase of execution. For example, a loop invariant is a condition that is true at the beginning and end of every execution of a loop.



Sorting




Bloom filter



Polymorphism

  • WP: Polymorphism_(computer_science) - the provision of a single interface to entities of different types. A polymorphic type is one whose operations can also be applied to values of some other type, or types


  • WP: Ad_hoc_polymorphism - a kind of polymorphism in which polymorphic functions can be applied to arguments of different types, because a polymorphic function can denote a number of distinct and potentially heterogeneous implementations depending on the type of argument(s) to which it is applied. It is also known as function overloading or operator overloading. The term ad hoc in this context is not intended to be pejorative; it refers simply to the fact that this type of polymorphism is not a fundamental feature of the type system.


  • WP: Parametric_polymorphism - a way to make a language more expressive, while still maintaining full static type-safety. Using parametric polymorphism, a function or a data type can be written generically so that it can handle values identically without depending on their type. Such functions and data types are called generic functions and generic datatypes respectively and form the basis of generic programming.





Control structures







  • WP: Generator_(computer_science) - a special routine that can be used to control the iteration behaviour of a loop. In fact, all generators are iterators. A generator is very similar to a function that returns an array, in that a generator has parameters, can be called, and generates a sequence of values. However, instead of building an array containing all the values and returning them all at once, a generator yields the values one at a time, which requires less memory and allows the caller to get started processing the first few values immediately. In short, a generator looks like a function but behaves like an iterator.

Generators can be implemented in terms of more expressive control flow constructs, such as coroutines or first-class continuations. Generators, also known as semicoroutines, are a special case of (and weaker than) coroutines, in that they always yield control back to the caller (when passing a value back), rather than specifying a coroutine to jump to

Libraries


  • PDF: How To Write Shared Libraries - Ulrich Drepper, December 10, 2011. Abstract: Today, shared libraries are ubiquitous. Developers use them for multiple reasons and create them just as they would create application code. This is a problem, though, since on many platforms some additional techniques must be applied even to generate decent code. Even more knowledge is needed to generate optimized code. This paper introduces the required rules and techniques. In addition, it introduces the concept of ABI (Application Binary Interface) stability and shows how to manage it.




System calls

See *nix

Macros

Metaprogramming

  • WP: Metaprogramming - the writing of computer programs with the ability to treat programs as their data. It means that a program could be designed to read, generate, analyse or transform other programs, and even modify itself while running. In some cases, this allows programmers to minimize the number of lines of code to express a solution (hence reducing development time), or it gives programs greater flexibility to efficiently handle new situations without recompilation. The language in which the metaprogram is written is called the metalanguage. The language of the programs that are manipulated is called the object language. The ability of a programming language to be its own metalanguage is called reflection or reflexivity

Events


Messaging

See also Network#Messaging, Data#Serialization


  • WP: Messaging_pattern - In software architecture, a messaging pattern is a network-oriented architectural pattern which describes how two different parts of a message passing system connect and communicate with each other. In telecommunications, a message exchange pattern (MEP) describes the pattern of messages required by a communications protocol to establish or use a communication channel. There are two major message exchange patterns — a request–response pattern, and a one-way pattern. For example, HTTP is a request–response pattern protocol, and UDP is a one-way pattern.



  • WP: Message_queue - and mailboxes are software-engineering components used for interprocess communication, or for inter-thread communication within the same process.




  • WP: Interface_description_language - or interface definition language (IDL), is a generic term for a language that lets a program or object written in one language communicate with another program written in an unknown language. IDLs are usually used to describe data types and interfaces in a language-independent way, for example, between those written in C++ and those written in Java. IDLs are commonly used in remote procedure call software. In these cases the machines at either end of the link may be using different operating systems and computer languages. IDLs offer a bridge between the two different systems. Software systems based on IDLs include Sun's ONC RPC, The Open Group's Distributed Computing Environment, IBM's System Object Model, the Object Management Group's CORBA (which implements OMG IDL), an IDL based on DCE/RPC, and Data Distribution Service, Mozilla's XPCOM, Microsoft's Microsoft RPC (which evolved into COM and DCOM), Facebook's Thrift and WSDL for Web services.



  • WP: Remote_procedure_call - when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction. That is, the programmer writes essentially the same code whether the subroutine is local to the executing program, or remote. This is a form of client–server interaction (caller is client, executor is server), typically implemented via a request–response message-passing system. In the object-oriented programming paradigm, RPC calls are represented by remote method invocation (RMI). The RPC model implies a level of location transparency, namely that calling procedures are largely the same whether they are local or remote, but usually they are not identical, so local calls can be distinguished from remote calls. Remote calls are usually orders of magnitude slower and less reliable than local calls, so distinguishing them is important.RPCs are a form of inter-process communication (IPC), in that different processes have different address spaces: if on the same host machine, they have distinct virtual address spaces, even though the physical address space is the same; while if they are on different hosts, the physical address space is different. Many different (often incompatible) technologies have been used to implement the concept.



  • WP: Request–response - or request–reply, is one of the basic methods computers use to communicate with each other, in which the first computer sends a request for some data and the second responds to the request. Usually, there is a series of such interchanges until the complete message is sent; browsing a web page is an example of request–response communication. Request–response can be seen as a telephone call, in which someone is called and they answer the call.Request–response is a message exchange pattern in which a requestor sends a request message to a replier system which receives and processes the request, ultimately returning a message in response. This is a simple, but powerful messaging pattern which allows two applications to have a two-way conversation with one another over a channel. This pattern is especially common in client–server architectures. For simplicity, this pattern is typically implemented in a purely synchronous fashion, as in web service calls over HTTP, which holds a connection open and waits until the response is delivered or the timeout period expired. However, request–response may also be implemented asynchronously, with a response being returned at some unknown later time. When a synchronous system communicates with an asynchronous system, it is referred to as "sync over async" or "sync/async". This is common in enterprise application integration (EAI) implementations where slow aggregations, time-intensive functions, or human workflow must be performed before a response can be constructed and delivered.


Apache Thrift

  • Apache Thrift - framework for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages. Thrift allows you to define data types and service interfaces in a simple definition file. Taking that file as input, the compiler generates code to be used to easily build RPC clients and servers that communicate seamlessly across programming languages. Instead of writing a load of boilerplate code to serialize and transport your objects and invoke remote methods, you can get right down to business.


zeromq

  • zeromq - Distributed Messaging. Connect your code in any language, on any platform. Carries messages across inproc, IPC, TCP, TIPC, multicast. Smart patterns like pub-sub, push-pull, and router-dealer. High-speed asynchronous I/O engines, in a tiny library. Backed by a large and active open source community. Supports every modern language and platform. Build any architecture: centralized, distributed, small, or large. Free software with full commercial support.

hyperglyph

MessagePack

  • MessagePack - an efficient binary serialization format. It lets you exchange data among multiple languages like JSON but it's faster and smaller. For example, small integers (like flags or error code) are encoded into a single byte, and typical short strings only require an extra byte in addition to the strings themselves.

AMQP

  • AMQP - Advanced Message Queuing Protocol, an open standard for passing business messages between applications or organizations. It connects systems, feeds business processes with the information they need and reliably transmits onward the instructions that achieve their goals.

RabbitMQ

  • RabbitMQ - the most widely deployed open source message broker. RabbitMQ is lightweight and easy to deploy on premises and in the cloud. It supports multiple messaging protocols. RabbitMQ can be deployed in distributed and federated configurations to meet high-scale, high-availability requirements.

tosort

Concurrency

  • WP: Concurrent_computing - a form of computing in which several computations are executing during overlapping time periods—concurrently—instead of sequentially (one completing before the next starts). This is a property of a system—this may be an individual program, a computer, or a network—and there is a separate execution point or "thread of control" for each computation ("process"). A concurrent system is one where a computation can make progress without waiting for all other computations to complete—where more than one computation can make progress at "the same time".



  • Concurrency is not parallelism - The Go Blog - But when people hear the word concurrency they often think of parallelism, a related but quite distinct concept. In programming, concurrency is the composition of independently executing processes, while parallelism is the simultaneous execution of (possibly related) computations. Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once. With talk from Rob Pike on Go.

Hand wavey definition

  • Concurrency = dealing with a lot of thigns at one
  • Parallelism = doing a lot of things at once


  • WP: Communicating_sequential_processes - a formal language for describing patterns of interaction in concurrent systems. It is a member of the family of mathematical theories of concurrency known as process algebras, or process calculi, based on message passing via channels. CSP was highly influential in the design of the occam programming language, and also influenced the design of programming languages such as Limbo, RaftLib, Go, Crystal, and Clojure's core.async.CSP was first described in a 1978 paper by Tony Hoare, but has since evolved substantially. CSP has been practically applied in industry as a tool for specifying and verifying the concurrent aspects of a variety of different systems, such as the T9000 Transputer, as well as a secure ecommerce system. The theory of CSP itself is also still the subject of active research, including work to increase its range of practical applicability (e.g., increasing the scale of the systems that can be tractably analyzed)





  • WP: Mutual_exclusion - the requirement of ensuring that no two concurrent processes are in their critical section at the same time; it is a basic requirement in concurrency control, to prevent race conditions. Here, a critical section refers to a period when the process accesses a shared resource, such as shared memory. The requirement of mutual exclusion was first identified and solved by Edsger W. Dijkstra in his seminal 1965 paper titled Solution of a problem in concurrent programming control, and is credited as the first topic in the study of concurrent algorithms.


  • WP: Critical_section - a part of a multi-process program that may not be concurrently executed by more than one of the program's processes.[a] In other words, it is a piece of a program that requires mutual exclusion of access. Typically, the critical section accesses a shared resource, such as a data structure, a peripheral device, or a network connection, that does not allow multiple concurrent accesses.








  • WP: Deadlock - a situation in which two or more competing actions are each waiting for the other to finish, and thus neither ever does.


  • WP: Lock_(computer_science) - or mutex (from mutual exclusion) is a synchronization mechanism for enforcing limits on access to a resource in an environment where there are many threads of execution. A lock is designed to enforce a mutual exclusion concurrency control policy.




Futures and promises

  • WP: Futures_and_promises - future, promise, delay, and deferred refer to constructs used for synchronizing in some concurrent programming languages. They describe an object that acts as a proxy for a result that is initially unknown, usually because the computation of its value is yet incomplete.

Parallelism

  • WP: Parallel_computing - a type of computation in which many calculations or the execution of processes are carried out concurrently. Large problems can often be divided into smaller ones, which can then be solved at the same time. There are several different forms of parallel computing: bit-level, instruction-level, data, and task parallelism. Parallelism has long been employed in high-performance computing, but it's gaining broader interest due to the physical constraints preventing frequency scaling.[2] As power consumption (and consequently heat generation) by computers has become a concern in recent years, parallel computing has become the dominant paradigm in computer architecture, mainly in the form of multi-core processors.


  • WP: Analysis_of_parallel_algorithms - Like in the analysis of "ordinary", sequential, algorithms, one is typically interested in asymptotic bounds on the resource consumption (mainly time spent computing), but the analysis is performed in the presence of multiple processor units that cooperate to perform computations. Thus, one can determine not only how many "steps" a computation takes, but also how much faster it becomes as the number of processors goes up.



  • WP: Bit-level_parallelism - a form of parallel computing based on increasing processor word size. Increasing the word size reduces the number of instructions the processor must execute in order to perform an operation on variables whose sizes are greater than the length of the word. (For example, consider a case where an 8-bit processor must add two 16-bit integers. The processor must first add the 8 lower-order bits from each integer, then add the 8 higher-order bits, requiring two instructions to complete a single operation. A 16-bit processor would be able to complete the operation with single instruction.) Originally, all electronic computers were serial (single-bit) computers. The first electronic computer that was not a serial computer—the first bit-parallel computer—was the 16-bit Whirlwind from 1951. From the advent of very-large-scale integration (VLSI) computer chip fabrication technology in the 1970s until about 1986, advancements in computer architecture were done by increasing bit-level parallelism,[1] as 4-bit microprocessors were replaced by 8-bit, then 16-bit, then 32-bit microprocessors. This trend generally came to an end with the introduction of 32-bit processors, which have been a standard in general purpose computing for two decades. Only recently, with the advent of x86-64 architectures, have 64-bit processors become commonplace. On 32-bit processors, external data bus width continues to increase. For example, DDR1 SDRAM transfers 128 bits per clock cycle. DDR2 SDRAM transfers a minimum of 256 bits per burst.


  • WP: Instruction-level_parallelism - a measure of how many of the instructions in a computer program can be executed simultaneously. There are two approaches to instruction level parallelism: in hardware and in software. Hardware level works upon dynamic parallelism whereas, the software level works on static parallelism. Dynamic parallelism means the processor decides at run time which instructions to execute in parallel, whereas static parallelism means the compiler decides which instructions to execute in parallel. The Pentium processor works on the dynamic sequence of parallel execution but the Itanium processor works on the static level parallelism.


  • WP: Data_parallelism - a form of parallelization across multiple processors in parallel computing environments. It focuses on distributing the data across different nodes, which operate on the data in parallel. It can be applied on regular data structures like arrays and matrices by working on each element in parallel.


  • WP: Task_parallelism - also known as function parallelism and control parallelism, is a form of parallelization of computer code across multiple processors in parallel computing environments. Task parallelism focuses on distributing tasks—concurrently performed by processes or threads—across different processors. In contrast to data parallelism which involves running the same task on different components of data, task parallelism is distinguished by running many different tasks at the same time on the same data. A common type of task parallelism is pipelining which consists of moving a single set of data through a series of separate tasks where each task can execute independently of the others.

Garbage collection



Paradigms




  • The Rule of Least Power - When designing computer systems, one is often faced with a choice between using a more or less powerful language for publishing information, for expressing constraints, or for solving some problem. This finding explores tradeoffs relating the choice of language to reusability of information. The "Rule of Least Power" suggests choosing the least powerful language suitable for a given purpose.



Literate programming


Imperative

  • WP: Imperative_programming - a programming paradigm that uses statements that change a program's state. In much the same way that the imperative mood in natural languages expresses commands, an imperative program consists of commands for the computer to perform. Imperative programming focuses on describing how a program operates.
  • WP: Procedural_programming - a programming paradigm, derived from structured programming, based upon the concept of the procedure call. Procedures, also known as routines, subroutines, or functions (not to be confused with mathematical functions, but similar to those used in functional programming), simply contain a series of computational steps to be carried out. Any given procedure might be called at any point during a program's execution, including by other procedures or itself. Procedural programming languages include C, Go, Fortran, Pascal, and BASIC. Computer processors provide hardware support for procedural programming through a stack register and instructions for calling procedures and returning from them. Hardware support for other types of programming is possible, but no attempt was commercially successful (for example Lisp machines or Java processors).


  • WP: Structured_programming - a programming paradigm aimed at improving the clarity, quality, and development time of a computer program by making extensive use of subroutines, block structures, for and while loops—in contrast to using simple tests and jumps such as the goto statement which could lead to "spaghetti code" which is difficult both to follow and to maintain. It emerged in the late 1950s with the appearance of the ALGOL 58 and ALGOL 60 programming languages, with the latter including support for block structures.

Contributing factors to its popularity and widespread acceptance, at first in academia and later among practitioners, include the discovery of what is now known as the structured program theorem in 1966, and the publication of the influential "Go To Statement Considered Harmful" open letter in 1968 by Dutch computer scientist Edsger W. Dijkstra, who coined the term "structured programming". Structured programming is most frequently used with deviations that allow for clearer programs in some particular cases, such as when exception handling has to be performed.


Recursive


Object orientated





  • WP: Method_(computer_programming) - a procedure associated with an object. An object is made up of data and behavior, which form the interface that an object presents to the outside world. Data is represented as properties of the object and behavior as methods. For example, a Window object would have methods such as open and close, while its state (whether it is opened or closed) would be a property.








  • WP: Resource_acquisition_is_initialization - a programming idiom used in several object-oriented languages to describe a particular language behavior. In RAII, holding a resource is a class invariant, and is tied to object lifetime: resource allocation (or acquisition) is done during object creation (specifically initialization), by the constructor, while resource deallocation (release) is done during object destruction (specifically finalization), by the destructor. Thus the resource is guaranteed to be held between when initialization finishes and finalization starts (holding the resources is a class invariant), and to be held only when the object is alive. Thus if there are no object leaks, there are no resource leaks.




Data-orientated

  • WP: Data-oriented_design - a program optimization approach motivated by efficient usage of the CPU cache, used in video game development. The approach is to focus on the data layout, separating and sorting fields according to when they are needed, and to think about transformations of data. Proponents include Mike Acton and Scott Meyers.

The claim is that traditional object-oriented programming (OOP) design principles result in poor data locality, more so if runtime polymorphism (dynamic dispatch) is used (which is especially problematic on some processors). Although OOP does superficially seem to organise code around data, the practice is quite different. OOP is actually about organising source code around data types, rather than physically grouping individual fields and arrays in a format efficient for access by specific functions. It also often hides layout details under abstraction layers, while a data-oriented programmer wants to consider this first and foremost.




Declarative

  • WP: Declarative_programming - a programming paradigm—a style of building the structure and elements of computer programs—that expresses the logic of a computation without describing its control flow. Declarative programming often considers programs as theories of a formal logic, and computations as deductions in that logic space. Declarative programming may greatly simplify writing parallel programs. Common declarative languages include those of database query languages (e.g., SQL, XQuery), regular expressions, logic programming, functional programming, and configuration management systems.

We could do this in an imperative style like so:

var numbers = [1,2,3,4,5]
var doubled = []

for(var i = 0; i < numbers.length; i++) {
  var newNumber = numbers[i] * 2
  doubled.push(newNumber)
}
console.log(doubled) //=> [2,4,6,8,10]

We explicitly iterate over the length of the array, pull each element out of the array, double it, and add the doubled value to the new array, mutating the doubled array at each step until we are done. A more declarative approach might use the Array.map function and look like:

var numbers = [1,2,3,4,5]
 
var doubled = numbers.map(function(n) {
  return n * 2
})
console.log(doubled) //=> [2,4,6,8,10]

map creates a new array from an existing array, where each element in the new array is created by passing the elements of the original array into the function passed to map (function(n) { return n*2 } in this case). What the map function does is abstract away the process of explicitly iterating over the array, and lets us focus on what we want to happen. Note that the function we pass to map is pure; it doesn't have any side effects (change any external state), it just takes in a number and returns the number doubled.



Functional




  • λ Lessons - Pattern matching, first-class functions, and abstracting over recursion in Haskell. This is a short, interactive lesson that teaches core functional programming concepts. It was designed to transform the way you think about performing operations on lists of things, by showing you how functions are executed. [140]














Concatenative

  • WP: Concatenative_programming_language - a point-free computer programming language in which all expressions denote functions, and the juxtaposition of expressions denotes function composition. Concatenative programming replaces function application, which is common in other programming styles, with function composition as the default way to build subroutines.


  • The Theory of Concatenative Combinators - This article attempts to outline, in informal terms, a new theory of combinators, related to the theory of Combinatory Logic pioneered by Moses Schonfinkel, Haskell Curry, and others in the 1930s. Although not essential, an understanding of the classical theory of combinators may be helpful (see the links at the bottom of this article for some introductory material to combinators). This topic is one which no doubt ought to be subjected to the rigor of modern mathematics; there are many theorems from classical combinatory logic (e.g., Church-Rosser) which we conjecture have analogues here. However, what follows is only a rough, but hopefully, friendly, introduction to the subject. The inspiration for this theory comes from the programming language Joy, designed by Manfred von Thun. It would be very helpful if the reader is basically familiar with Joy. In Joy, data is manipulated through a stack (there are no variables); in this way, it is similar to the programming language FORTH. However, Joy goes one step further and permits (and actively encourages) pushing programs themselves onto the stack, which can then be manipulated just like ordinary data. In fact, the theory here is basically a subset of Joy in which programs are the only kind of data (i.e., numbers, string literals, and other kinds of data are not part of the theory here). To someone unfamiliar with combinatory logic, it might seem that no useful computations could be done without numbers, but it will soon be seen that numeric data can be simulated using concatenative combinators, just as they could using classical combinators. [150]


Dataflow

See Dataflow

  • WP: Dataflow_programming - a programming paradigm that models a program as a directed graph of the data flowing between operations, thus implementing dataflow principles and architecture. Dataflow programming languages share some features of functional languages, and were generally developed in order to bring some functional concepts to a language more suitable for numeric processing.
Reactive
  • WP: Reactive_programming - a programming paradigm oriented around data flows and the propagation of change. This means that it should be possible to express static or dynamic data flows with ease in the programming languages used, and that the underlying execution model will automatically propagate changes through the data flow.


Flow-based
  • WP: Flow-based_programming - FBP, a programming paradigm that defines applications as networks of "black box" processes, which exchange data across predefined connections by message passing, where the connections are specified externally to the processes. These black box processes can be reconnected endlessly to form different applications without having to be changed internally. FBP is thus naturally component-oriented. FBP is a particular form of dataflow programming based on bounded buffers, information packets with defined lifetimes, named ports, and separate definition of connections.



  • Apache NiFi is a dataflow system based on the concepts of flow-based programming. It supports powerful and scalable directed graphs of data routing, transformation, and system mediation logic. NiFi has a web-based user interface for design, control, feedback, and monitoring of dataflows. It is highly configurable along several dimensions of quality of service, such as loss-tolerant versus guaranteed delivery, low latency versus high throughput, and priority-based queuing. NiFi provides fine-grained data provenance for all data received, forked, joined cloned, modified, sent, and ultimately dropped upon reaching its configured end-state. [152]

Constraint


Logic

  • WP: Logic_programming - a programming paradigm based on formal logic. A program written in a logic programming language is a set of sentences in logical form, expressing facts and rules about some problem domain. Major logic programming language families include Prolog, Answer set programming (ASP) and Datalog. In all of these languages, rules are written in the form of clauses and are read declaratively as logical implications.


Differentiable

  • WP: Differentiable_programming - a programming paradigm in which a numeric computer program can be differentiated throughout via automatic differentiation. This allows for gradient-based optimization of parameters in the program, often via gradient descent, as well as other learning approaches that are based on higher order derivative information. Differentiable programming has found use in a wide variety of areas, particularly scientific computing and artificial intelligence. One of the early proposals to adopt such a framework in a systematic fashion to improve upon learning algorithms was made by the Advanced Concepts Team at the European Space Agency in early 2016.

Patterns

See also Organisation#Patterns, Development








"ExtremeProgramming -- all programming is maintenance."


  • Design Patterns Library - a source for information about all aspects of software patterns and pattern languages. If you are new to patterns, James Coplien and Richard Gabriel have created a succinct pattern definition.Patterns and Pattern Languages are ways to describe best practices, good designs, and capture experience in a way that it is possible for others to reuse this experience. The Hillside Group takes pleasure in sponsoring many different PLoP conferences that are provided for the betterment of the pattern community.


















  • WP: Flyweight_pattern - software design pattern refers to an object that minimizes memory usage by sharing some of its data with other similar objects. The flyweight pattern is one of twenty-three well-known GoF design patterns. These patterns promote flexible object-oriented software design, which is easier to implement, change, test, and reuse.In other contexts, the idea of sharing data structures is called hash consing. The term was first coined, and the idea extensively explored, by Paul Calder and Mark Linton in 1990 to efficiently handle glyph information in a WYSIWYG document editor. Similar techniques were already used in other systems, however, as early as 1988.


MV*

"create your views, express your models or develop a controller"


Component-based

  • WP: Component-based_software_engineering - CBSE), also called component-based development (CBD), is a style of software engineering that aims to build software out of loosely-coupled, modular components. It emphasizes the separation of concerns among different parts of a software system.


  • WP: Separation_of_concerns - a design principle for separating a computer program into distinct sections. Each section addresses a separate concern, a set of information that affects the code of a computer program. A concern can be as general as "the details of the hardware for an application", or as specific as "the name of which class to instantiate". A program that embodies SoC well is called a modular program. Modularity, and hence separation of concerns, is achieved by encapsulating information inside a section of code that has a well-defined interface. Encapsulation is a means of information hiding. Layered designs in information systems are another embodiment of separation of concerns (e.g., presentation layer, business logic layer, data access layer, persistence layer).


  • WP: Loose_coupling - In computing and systems design, a loosely coupled system is one; in which components are weakly associated (have breakable relationships, with each other, and thus changes in one component least affect existence or performance of another component, and/or; in which each of its components has, or makes use of, little or no knowledge of the definitions of other separate components. Subareas include the coupling of classes, interfaces, data, and services. Loose coupling is the opposite of tight coupling.


Service-orientated

See HTTP, Chat, Semantic, Feeds, etc.


  • WP: Service-orientation - a design paradigm for computer software in the form of services. The principles of service-oriented design stress the separation of concerns in the software. Applying service-orientation results in units of software partitioned into discrete, autonomous, and network-accessible units, each designed to solve an individual concern. These units qualify as services.


  • WP: Service_(systems_architecture) - In the contexts of software architecture, service-orientation and service-oriented architecture, the term service refers to a software functionality, or a set of software functionalities (such as the retrieval of specified information or the execution of a set of operations, with a purpose that different clients can reuse for different purposes, together with the policies that should control its usage (based on the identity of the client requesting the service, for example).

OASIS defines a service as "a mechanism to enable access to one or more capabilities, where the access is provided using a prescribed interface and is exercised consistent with constraints and policies as specified by the service description".


  • WP: Service_description - In computer science, a service description could be any of:
    • Interface description language – Computer language used to describe a software component's interface
    • Web Services Description Language – XML-based interface description language
    • RESTful Service Description Language – XML description of HTTP-based web APIs
    • SOAP Service Description Language – Messaging protocol for web services
    • Service Mapping Description – Proposed standard for describing web services available at a particular endpoint using JSON




  • WP: Service-oriented_architecture - an architectural style that focuses on discrete services instead of a monolithic design. By consequence, it is also applied in the field of software design where services are provided to the other components by application components, through a communication protocol over a network. A service is a discrete unit of functionality that can be accessed remotely and acted upon and updated independently, such as retrieving a credit card statement online. SOA is also intended to be independent of vendors, products and technologies.

Service orientation is a way of thinking in terms of services and service-based development and the outcomes of services. A service has four properties according to one of many definitions of SOA:

  • It logically represents a repeatable business activity with a specified outcome.
  • It is self-contained.
  • It is a black box for its consumers, meaning the consumer does not have to be aware of the service's inner workings.
  • It may be composed of other services.


  • WP: OASIS_SOA_Reference_Model - The OASIS Reference Model for Service Oriented Architecture, SOA-RM, is an abstract framework for understanding significant entities and relationships between them within a service-oriented environment, and for the development of consistent standards or specifications supporting that environment. It is based on unifying concepts of SOA and may be used by architects developing specific service oriented architectures or in training and explaining SOA.

In this context, a reference model is seen as a venue to provide a common semantics that can be used unambiguously across and between different SOA implementations. The relationship between the Reference Model and particular architectures, technologies and other aspects of SOA is illustrated below from the specification.


Push/pull

Graphics

See Graphics, UI, GUI, Wayland, 3D


  • WP: Layout_engine - a computer program that combines content and formatting information for electronic or printed display. It is not a stand-alone program but a core component of larger programs. There are different types of layout engines. One is the web browser engines used in web browsers and email clients. Another type is the layout managers used in widget toolkits.


to sort

SDL

  • Eco - a prototype editor for editing composed languages. It is not feature complete, it is not intended for production, and it does have bugs. Eco is distributed under a BSD/MIT license.



Noise


Optimisation

Areas

See also Games#Software, AI, Audio, etc.

Command-line

Compression

Network



Graphics


3D


Virtual / augmented reality


  • WP: X_Reality_(XR) - defined as: a form of “mixed reality environment that comes from the fusion (union) of ... ubiquitous sensor/actuator networks and shared online virtual worlds....”. It encompasses a wide spectrum of hardware and software, including sensory interfaces, applications, and infrastructures, that enable content creation for virtual reality (VR), mixed reality (MR), augmented reality (AR), cinematic reality (CR). With these tools, users generate new forms of reality by bringing digital objects into the physical world and bringing physical world objects into the digital world.Its meaning has more recently been broadened to include technologies of extended ("cyborg" or wearable) intelligence in regards to the IEEE Council on Extended Intelligence (CXI).

Distributed





Virus


Social



to sort

For kids

Scratch

Snap

to sort














Future







Performance



  • WP: Cyclomatic_complexity - a software metric (measurement), used to indicate the complexity of a program. It is a quantitative measure of the number of linearly independent paths through a program's source code. It was developed by Thomas J. McCabe, Sr. in 1976.


  • WP: LINPACK_benchmarks - a measure of a system's floating-point computing power. Introduced by Jack Dongarra, they measure how fast a computer solves a dense n by n system of linear equations Ax = b, which is a common task in engineering. The latest version of these benchmarks is used to build the TOP500 list, ranking the world's most powerful supercomputers. The aim is to approximate how fast a computer will perform when solving real problems. It is a simplification, since no single computational task can reflect the overall performance of a computer system. Nevertheless, the LINPACK benchmark performance can provide a good correction over the peak performance provided by the manufacturer. The peak performance is the maximal theoretical performance a computer can achieve, calculated as the machine's frequency, in cycles per second, times the number of operations per cycle it can perform. The actual performance will always be lower than the peak performance. The performance of a computer is a complex issue that depends on many interconnected variables. The performance measured by the LINPACK benchmark consists of the number of 64-bit floating-point operations, generally additions and multiplications, a computer can perform per second, also known as FLOPS. However, a computer's performance when running actual applications is likely to be far behind the maximal performance it achieves running the appropriate LINPACK benchmark.


  • TOP500 - The TOP500 project was launched in 1993 to improve and renew the Mannheim supercomputer statistics, which had been in use for seven years. Our simple TOP500 approach does not define “supercomputer” as such, but we use a benchmark to rank systems and to decide on whether or not they qualify for the TOP500 list. The benchmark we decided on was Linpack, which means that systems are ranked only by their ability to solve a set of linear equations, A x = b, using a dense random matrix A. Therefore, any supercomputer – no matter what its architecture is – can make it into the TOP500 list, as long as it is able to solve a set of linear equations using floating point arithmetic. We have been criticized for this choice from the very beginning, but now, after 20 years, we can say that it was exactly this choice that has made TOP500 so successful – Linpack therefore was a good choice. And there was, and still is, no alternative to Linpack. Any other benchmark would have been similarly specific, but would not have been so easily available for all systems – a very important factor, as compiling the TOP500 lists twice a year is a very complex process.

Quantum computing




Cool

Humour