Programming Languages
The languages used to write code
Classification by Execution Model
- Compiled Languages: Converted into machine language before being executed, making them faster to run (but slower to edit)
- Examples: C, C++, Rust, Go, Fortran
- Characteristics: Better performance, platform-specific executables, compile-time error checking
- Interpreted Languages: Interpreted line-by-line and executed directly without having to be converted into machine language
- Examples: Python, JavaScript, Ruby, PHP
- Characteristics: Cross-platform portability, runtime flexibility, slower execution
- Hybrid/JIT Languages: Combine compilation and interpretation
- Examples: Java, C#, Kotlin
- Characteristics: Bytecode compilation, virtual machine execution
Classification by Level of Abstraction
- Low-Level Languages: Close to machine code
- Assembly language, machine code
- Direct hardware control, memory management
- High-Level Languages: Abstract away hardware details
- Python, Java, C#, JavaScript
- Built-in data structures, automatic memory management
Classification by Domain
- System Programming: C, C++, Rust
- Web Development: JavaScript, TypeScript, PHP, Python
- Data Science: Python, R, Julia, MATLAB
- Mobile Development: Swift, Kotlin, Dart
- Game Development: C++, C#, UnityScript
Programming Paradigms
Different approaches to programming
Major Paradigms
- Imperative Programming: Programming with explicit sequences of commands
- Focus on “how” to solve problems
- Step-by-step instructions
- Examples: C, Pascal, BASIC
- Declarative Programming: Programming by specifying what you want, not how
- Focus on “what” the result should be
- Examples: SQL, HTML, Prolog
- Object-Oriented Programming (OOP): Programming paradigm based on the object – a software entity that encapsulates data and function(s)
- Key principles: Encapsulation, Inheritance, Polymorphism, Abstraction
- Enhances modularity, reusability, and maintainability, making it particularly suitable for large-scale software development
- Examples: Java, C++, Python, C#
- Functional Programming: Programming with functions as first-class citizens
- Immutable data, pure functions, higher-order functions
- Examples: Haskell, Lisp, F#, functional aspects of JavaScript/Python
- Procedural Programming: Programming with procedures and functions
- Structured approach with subroutines
- Examples: C, Pascal, COBOL
Multi-Paradigm Languages
Many modern languages, including Python, support multiple paradigms, allowing developers to choose the best approach for specific problems.
Programming Patterns
Reusable solutions to common problems
Design Patterns Categories
Design Patterns are typical solutions to commonly occurring problems in software design. They are blueprints that you can customize to solve a particular design problem in your code
Creational Patterns
- Singleton: Ensures only one instance of a class exists
- Factory Method: Creates objects without specifying exact classes
- Builder: Constructs complex objects step by step
- Abstract Factory: Creates families of related objects
- Prototype: Creates objects by cloning existing instances
Structural Patterns
- Adapter: Allows incompatible interfaces to work together
- Decorator: Adds behavior to objects dynamically
- Facade: Provides simplified interface to complex subsystems
- Composite: Treats individual objects and compositions uniformly
- Bridge: Separates abstraction from implementation
Behavioral Patterns
Concerned with algorithms and the assignment of responsibilities between objects. These patterns characterize complex control flow
- Observer: Notifies multiple objects about state changes
- Strategy: Encapsulates algorithms and makes them interchangeable
- Command: Encapsulates requests as objects
- Template Method: Defines algorithm skeleton in base class
- Iterator: Provides way to access elements sequentially
Architectural Patterns
- Model-View-Controller (MVC): Separates application logic from presentation
- Model-View-ViewModel (MVVM): Data binding between view and model
- Microservices: Distributed architecture with small, independent services
- Layered Architecture: Organizes code into horizontal layers
- Event-Driven Architecture: Components communicate through events
Programming Principles
Fundamental rules and guidelines
SOLID Principles
- Single Responsibility: Class should have only one reason to change
- Open/Closed: Open for extension, closed for modification
- Liskov Substitution: Objects should be replaceable with instances of subtypes
- Interface Segregation: Many specific interfaces better than one general
- Dependency Inversion: Depend on abstractions, not concretions
Other Key Principles
- DRY (Don’t Repeat Yourself): Avoid code duplication
- KISS (Keep It Simple, Stupid): Prefer simple solutions
- YAGNI (You Aren’t Gonna Need It): Don’t add functionality until needed
- Separation of Concerns: Divide program into distinct sections
- Principle of Least Astonishment: Code should behave as expected
- Fail Fast: Detect and report errors as early as possible
- Composition over Inheritance: Favor object composition over class inheritance
Programming Concepts
Basic ideas and theories
Abstraction Levels
- Data Abstraction: Hiding implementation details of data structures
- Procedural Abstraction: Hiding implementation of operations
- Object Abstraction: Combining data and operations into objects
- Interface Abstraction: Defining contracts without implementation
Memory Management
- Stack Memory: Automatic allocation for local variables
- Heap Memory: Dynamic allocation for objects
- Garbage Collection: Automatic memory deallocation
- Memory Leaks: Unreleased memory causing resource exhaustion
Concurrency Concepts
- Threads: Lightweight execution units within processes
- Processes: Independent program instances
- Synchronization: Coordinating concurrent operations
- Race Conditions: Unpredictable results from timing dependencies
- Deadlocks: Circular dependencies preventing progress
Error Handling
- Exceptions: Structured error handling mechanism
- Error Codes: Return values indicating success/failure
- Assertions: Runtime checks for program correctness
- Defensive Programming: Anticipating and handling errors
Programming Fundamentals
Essential knowledge for programming
Basic Building Blocks
- Variables: Named storage locations for data
- Constants: Immutable named values
- Operators: Symbols performing operations on operands
- Expressions: Combinations of variables, constants, and operators
- Statements: Instructions that perform actions
Control Flow
- Sequential Execution: Linear execution of statements
- Conditional Execution: Branching based on conditions
- Iterative Execution: Repeating statements (loops)
- Subroutines: Named blocks of reusable code
Data Types
- Primitive Types: Built-in basic types (int, float, char, boolean)
- Composite Types: User-defined types (arrays, structures, classes)
- Abstract Data Types: Mathematical models for data types
- Type Systems: Rules governing type usage and conversion
Input/Output
- Standard Input/Output: Console-based interaction
- File I/O: Reading from and writing to files
- Network I/O: Communication over networks
- User Interfaces: Graphical and command-line interfaces
Programming Logic
Reasoning and problem-solving in code
Logical Structures
- Boolean Logic: True/false reasoning
- Propositional Logic: Statements that can be true or false
- Predicate Logic: Logic with variables and quantifiers
- Conditional Logic: If-then reasoning patterns
Problem-Solving Approaches
- Divide and Conquer: Breaking problems into smaller subproblems
- Top-Down Design: Starting with high-level design, adding details
- Bottom-Up Design: Building from basic components
- Incremental Development: Adding features gradually
- Iterative Refinement: Repeatedly improving solutions
Logical Operators
- AND (&&): Both conditions must be true
- OR (||): At least one condition must be true
- NOT (!): Negates a boolean value
- XOR: Exactly one condition must be true
- Implication: If-then logical relationship
Decision Making
- Conditional Statements: if-else constructs
- Switch Statements: Multi-way branching
- Ternary Operators: Inline conditional expressions
- Guard Clauses: Early returns for edge cases
Programming Syntax
Rules for writing valid code
Lexical Elements
- Keywords: Reserved words with special meanings
- Identifiers: Names for variables, functions, classes
- Literals: Fixed values in source code
- Operators: Symbols for operations
- Delimiters: Characters separating code elements
- Comments: Non-executable explanatory text
Grammar Rules
- Context-Free Grammar: Formal rules defining valid syntax
- Production Rules: Grammar rules for language constructs
- Parse Trees: Hierarchical representation of syntax
- Ambiguity: Multiple interpretations of same syntax
Language-Specific Syntax
- C-Style Languages: Braces, semicolons, C-like syntax
- Python-Style: Indentation-based, minimal punctuation
- Lisp-Style: Parentheses-heavy, prefix notation
- ML-Style: Pattern matching, type inference
Syntax Checking
- Lexical Analysis: Breaking code into tokens
- Parsing: Checking grammatical correctness
- Syntax Errors: Violations of grammar rules
- IDE Support: Real-time syntax highlighting and checking
Programming Semantics
Meaning of programming constructs
Types of Semantics
- Operational Semantics: Defines meaning through execution steps
- Denotational Semantics: Defines meaning through mathematical functions
- Axiomatic Semantics: Defines meaning through logical assertions
Semantic Analysis
- Type Checking: Ensuring type consistency
- Scope Resolution: Determining variable/function visibility
- Name Binding: Associating names with entities
- Semantic Errors: Meaningful but incorrect code
Runtime Semantics
- Evaluation Order: Order of expression evaluation
- Side Effects: Changes to program state during execution
- Reference Semantics: Variables as references to values
- Value Semantics: Variables as containers for values
Language Semantics
- Static Semantics: Properties checked at compile time
- Dynamic Semantics: Properties determined at runtime
- Type Safety: Prevention of type-related errors
- Memory Safety: Prevention of memory-related errors
Programming Structures
Ways to organize code and data
Code Organization
- Modules: Logical groupings of related functionality
- Packages: Hierarchical organization of modules
- Namespaces: Named scopes preventing name conflicts
- Libraries: Collections of reusable code
- Frameworks: Structured environments for development
Architectural Structures
- Monolithic Architecture: Single deployable unit
- Modular Architecture: Separate, interchangeable modules
- Layered Architecture: Horizontal organization by abstraction
- Component-Based Architecture: Reusable, composable components
Data Organization
- Arrays: Sequential collections of elements
- Records/Structures: Collections of named fields
- Classes: Blueprints for objects
- Interfaces: Contracts defining behavior
- Enumerations: Named sets of constants
Control Structures
- Sequence: Linear execution flow
- Selection: Conditional branching
- Iteration: Repetitive execution
- Subroutines: Callable code blocks
- Exception Handling: Structured error processing
Programming Algorithms
Step-by-step problem-solving procedures
Algorithm Categories
- Searching Algorithms: Finding elements in collections
- Linear Search, Binary Search, Hash Table Lookup
- Sorting Algorithms: Arranging elements in order
- Bubble Sort, Quick Sort, Merge Sort, Heap Sort
- Graph Algorithms: Processing connected data
- Depth-First Search, Breadth-First Search, Dijkstra’s Algorithm
- Dynamic Programming: Optimizing recursive problems
- Fibonacci, Longest Common Subsequence, Knapsack Problem
Algorithm Analysis
- Time Complexity: Execution time as function of input size
- Space Complexity: Memory usage as function of input size
- Big O Notation: Asymptotic behavior description
- Best/Average/Worst Case: Different performance scenarios
Algorithm Design Techniques
- Brute Force: Exhaustive search of solution space
- Divide and Conquer: Recursive problem decomposition
- Greedy Algorithms: Locally optimal choices
- Backtracking: Systematic solution space exploration
- Branch and Bound: Pruning of solution space
Optimization
- Algorithm Selection: Choosing appropriate algorithms
- Data Structure Choice: Impact on algorithm efficiency
- Caching: Storing computed results for reuse
- Memoization: Caching function results
- Parallel Algorithms: Leveraging multiple processors
Programming Data Structures
Ways to organize and store data
Linear Data Structures
- Arrays: Fixed-size sequential collections
- Static arrays, dynamic arrays, multi-dimensional arrays
- Linked Lists: Node-based sequential structures
- Singly linked, doubly linked, circular linked lists
- Stacks: Last-In-First-Out (LIFO) collections
- Push, pop, peek operations
- Queues: First-In-First-Out (FIFO) collections
- Enqueue, dequeue operations, priority queues
Hierarchical Data Structures
- Trees: Hierarchical structures with root and child nodes
- Binary trees, binary search trees, AVL trees, B-trees
- Heaps: Complete binary trees with heap property
- Min-heap, max-heap, priority queue implementation
- Tries: Tree structures for string storage and retrieval
Non-Linear Data Structures
- Graphs: Collections of vertices and edges
- Directed graphs, undirected graphs, weighted graphs
- Hash Tables: Key-value pair storage with hash functions
- Collision resolution, load factor, hash functions
- Sets: Collections of unique elements
- Maps/Dictionaries: Key-value associations
Advanced Data Structures
- Segment Trees: Range query optimization
- Fenwick Trees: Efficient prefix sum calculations
- Disjoint Set Union: Union-find data structure
- Bloom Filters: Probabilistic membership testing
- Skip Lists: Probabilistic alternative to balanced trees
Data Structure Selection
Each data structure provides costs and benefits, which implies that tradeoffs are possible. Selection depends on:
- Access Patterns: How data will be accessed
- Performance Requirements: Time and space constraints
- Operation Frequency: Which operations are most common
- Memory Constraints: Available memory resources
- Concurrency Needs: Thread-safety requirements





