--- author: Adam T. Carpenter, Carpenter Tutoring --- # Computational problem solving with _Rust_ ## The study of computer science ``` ~~~fsays Not just for computer scientists ~~~ ``` [practice of computing using python](https://www.pearson.com/en-us/subject-catalog/p/practice-of-computing-using-python-the/p200000003329/9780137524839) [rust book](https://doc.rust-lang.org/book/) --- # Why computer science? Computers are "more universally applicable than any other commodity in history." (Punch & Enbody) There is no other machine with as many diverse uses as the computer. A reprogrammable machine is a machine that works for _you_. ## Not just computer programming - theory of computation - efficiency - algorithms and data structures - parallelism - software engineering _Computer programming is a great way to begin exploring these fields_ --- # Difficulty in first-time programming It's like learning how to write poetry in a foreign language. You need: - fluency: the vocabulary and grammar to read and write the language - ability: the skill to rhyme, write in verse, _make poetry_ Learning to program has similar roadblocks. You need: - syntax and semantics: the structure of Rust as a language - problem solving: the skill to transform your problem into a solution --- # Good programs are essays Programming is writing how _you_ think a problem should be solved. A program is your thoughts! ## 1. Think before you program Writing a program should describe your thoughts well. Not just for computers, but for other human beings! You're going to read your program over and over again. Eventually you'll inevitably write programs in a group. Then others will need to read it too. ## 2. A program is a human-readable essay on problem solving (that also runs on a computer) --- # The promise A program, or an essay on problem-solving, has impact because it can be executed on a computer. Your problem-solving thoughts - are executable - are repeatable - are independent of you Programming is a leap forward in the way the printing press was hundreds of years ago. --- # Choosing a language The variety of languages is enormous, each one with a specific intended purpose. ## Why Rust? "performance, reliability, productivity" - useful types and memory guarantees - makes it easy to write concurrent programs - has a friendly compiler and helpful borrow checker - provides good documentation - offers great standard library and third-party libraries Thanks to middle school math, most folks have the prerequisite knowledge to understand variables, functions, and types. ## Why not C, Java, Python, etc.? Some of these languages force you to think about computer organization. Others may direct you into an object-oriented programming mindset. Still others promote dynamic type conversion or make it easy to dereference null values. The most important reason for using Rust is it helps prevent you from making mistakes, regardless of your skill level. --- # Is Rust the best language? If you don't already know you'll soon learn there is no "best language." All languages compromise on something; Each has its strengths and weaknesses. Rust is a good, _general-purpose_ programming language with _broad_ _applications_. Once you've gotten started, you'll be better equipped to explore other languages that may be better suited to solving your specific problems. --- # Computation and computers _Computation_ is the manipulation of data by humans or machines ...be that data numbers, letters, or other symbols. A _computer_ is something that does computation Note this does not specify _how_ the computation is accomplished. However, there are some things that every computer needs in order to do its job. - accept data as input - manipulate data (do computation on the input) - output data --- # Mechanical and electronic computers _Computer_ used to be a job description for human beings! General-purpose, reprogrammable, electronic digital computers first appeared in the 20th century. The basis of every digital computer is an on-off switch. The technology behind these "switches" has evolved from mechanical relays to vacuum tubes to transistors. _Transistors_, the tiny electronic switches powering modern computers, are either on or off. Just like a light switch, when turned on, they allow electricity to flow. Using switches to power other switches, you can create circuits that represent logic. --- # Example: a three-pole light switch ``` ~~~graph-easy --as boxart [hall switch] .. off ..> [ceiling lamp] [den switch] - on -> [ceiling lamp] [hall switch] <-> [den switch] ~~~ ``` ``` ~~~graph-easy --as boxart [hall switch] - on -> [*ceiling lamp*] { border: bold; } [den switch] - on -> [*ceiling lamp*] { border: bold; } [hall switch] <-> [den switch] ~~~ ``` Note: this is actually an XNOR gate, but we'll talk more about logical operators later. --- # Replace light with truth Off: false, 0 On: true, 1 Both switches off: light off, false, 0