========
CS 235 - Week 1 Lecture - 2021-08-23
========
TODAY we will:
*   intros/see who's here
*   intro CS 235's "big idea"
*   point out the course syllabus, review a few HIGHLIGHTS
*   intro to public course web site and course Canvas site
*   basic course structure
*   discussion and example of clickers, clicker questions
*   start talking about Java, I hope!
*   prep for next class

*   when I call on you:
    *   unmute your microphone if you can (otherwise put this into Chat)
    *   give your preferred name
    *   your hometown
    *   your major
    *   do you have an assumption or a question about Java you'd
        like to share?

*   which Java?
    anything at or after OpenJDK Java 11 *should* be fine,
    probably Java 15 or 16 in in-class examples

========
START our intro to Java!!!

*   See course text, Chapter 1, Section 1.2

*   when Java was designed in the 1990s,
    *   they wanted to make it easy to learn, so they deliberately
        designed it to be close to C++ in a lot ways, but not ALL ways

    *   BUT! also deliberately OMITTING those features of C++
        that Java's developers felt were:
	*   rarely used
	*   poorly understood
	*   confusing
	...and bring (in their opinions) brought more grief than benefit

*   Java does not have (or does not need)
    *   header files
    *   pointer arithmetic (or even a pointer syntax) [!!!]
    *   structures (structs)
    *   unions
    *   operator overloading
    *   virtual base classes
    *   multiple inheritance - Java uses interfaces instead

===== [little aside]
*   SO -- as just a few examples that should look familiar to
    a C++ programmer -- using jshell, a Java interactive
    REPL (Read-Evaluate-Print-Loop) tool introduced in Java 9
    that gives you a means to type JUST Java expressions
    and see their values!:

    (pasted from jshell demo during class):

macbook-pro:235lect01 smtuttle$ jshell
|  Welcome to JShell -- Version 16.0.1
|  For an introduction type: /help intro

jshell> int count;
count ==> 0

jshell> count = 27;
count ==> 27

jshell> count
count ==> 27

// well, not ALL of the example expressions demo'd
//     are like you'd see in C++:

jshell> String name;
name ==> null

jshell> name = "Sharon";
name ==> "Sharon"

jshell> name + name
$6 ==> "SharonSharon"

// FORGOT to mention during class: you can END the jshell session
//     by typing the control key and d key at the same time
//     (often written as "type ^D")

===== [end of little aside]

*   Java is a highly-portable, object-oriented language
    that is suitable for general-purpose computing

    *   developed at Sun Microsystems
    *   development started in 1990
    *   originally known as Oak
    *   needed to be very reliable

    *   converted to being an "Internet programming language"
        in 1993, with the explosion of the World Wide Web

    *   famous white paper in which Sun claims Java to be...
        (and it included 11 famous buzzwords)
	*   simple
	*   object-oriented
	*   distributed
	*   interpreted
	*   robust
	*   secure
	*   architecture-neutral
	*   portable
	*   high-performance
	*   multi-threaded
	*   dynamic

*   you can translate Java in different ways,
    but the classic way is to "compile" it into Java bytecode,
    a special low-level virtual machine language, BUT not for any
        particular hardware

    when you give Java bytecode to a Java Runtime Environment (JRE),
    THAT's an interpreter! And Java bytecode is made to be efficiently
    interpreted by the JRE
    *   JRE: is JUST for interpreting and executing Java bytecode!
    *   You need the JDK - Java Development Kit - to get the compiler,
        javac, that compiles high-level Java files into Java bytecode

    *   if your hardware is running a JRE,
        it can run the Java bytecode

*   robust?
    *   they made language design decisions to avoid certain common errors;
    *   e.g., strongly typed (the type of a variable has to be apparent)
    *   there's no pointer syntax
    *   you are not allowed to overflow an array's bounds
    *   and more...