๐Ÿšจ Limited Offer: First 50 users get 500 credits for free โ€” only ... spots left!
Programming Languages & Compilers Flashcards

Free Programming Languages & Compilers flashcards, exportable to Notion

Learn faster with 49 Programming Languages & Compilers flashcards. One-click export to Notion.

Learn fast, memorize everything, master Programming Languages & Compilers. No credit card required.

Want to create flashcards from your own textbooks and notes?

Let AI create automatically flashcards from your own textbooks and notes. Upload your PDF, select the pages you want to memorize fast, and let AI do the rest. One-click export to Notion.

Create Flashcards from my PDFs

Programming Languages & Compilers

49 flashcards

A programming language is a formal language designed to communicate instructions to a computer or computing device to perform specific tasks.
Syntax refers to the rules that define the structure and composition of statements or instructions in a programming language.
Semantics refers to the meaning and interpretation of the statements or instructions in a programming language.
A compiler is a computer program that translates high-level programming language code into low-level machine code that can be executed by a computer's processor.
The main phases of a compiler are lexical analysis, syntax analysis, semantic analysis, intermediate code generation, code optimization, and code generation.
Lexical analysis, also known as scanning or tokenization, is the process of converting the source code into a sequence of tokens (meaningful character strings).
Syntax analysis, also known as parsing, is the process of analyzing the sequence of tokens to determine their grammatical structure according to the programming language's syntax rules.
Semantic analysis is the process of analyzing the source code to ensure that it adheres to the language's semantic rules, such as type checking and resolving variable references.
Intermediate code generation is the process of translating the source code into an intermediate representation, which is typically a lower-level and more machine-independent form.
Code optimization is the process of improving the intermediate code or machine code by applying various techniques to make the resulting program more efficient in terms of execution time, memory usage, or other factors.
Code generation is the final phase of the compiler, where the optimized intermediate code is translated into machine code or assembly language that can be executed directly by the computer's processor.
Python is a high-level, interpreted, and general-purpose programming language known for its simplicity, readability, and versatility.
Java is a high-level, class-based, object-oriented programming language designed to be platform-independent and suitable for developing various types of applications.
A context-free grammar is a formal grammar used to describe the syntax of programming languages. It consists of a set of production rules that define how sequences of symbols can be generated or parsed.
A parse tree is a graphical representation of the syntactic structure of a program based on the grammar rules of the programming language. It is generated during the syntax analysis phase of a compiler.
Type checking is the process of verifying that the types of values used in a program are consistent with the rules of the programming language. It is part of the semantic analysis phase of a compiler.
A symbol table is a data structure used by a compiler to store information about identifiers (variables, functions, etc.) used in the source code, such as their names, types, and scopes.
Register allocation is the process of assigning CPU registers to variables and temporary values used in a program during the code generation phase of a compiler, in order to optimize performance.
A virtual machine is a software implementation of a computer that executes instructions or programs like a physical machine. It is often used to run bytecode or intermediate code generated by compilers for programming languages like Java and Python.
Bytecode is a form of instruction set designed for efficient execution by a virtual machine or interpreter. It is a lower-level representation of the source code that is generated by compilers for languages like Java and Python.
An interpreter is a computer program that directly executes instructions written in a programming language, without previously converting them to an executable form like machine code. Languages like Python and JavaScript are commonly interpreted.
A just-in-time (JIT) compiler is a component of a virtual machine that compiles bytecode or intermediate code into machine code at runtime, just before execution, in order to improve performance.
A lexer or lexical analyzer is the first phase of a compiler or interpreter that converts the source code into a sequence of tokens, which are meaningful units of the programming language.
A parser or syntax analyzer is the second phase of a compiler or interpreter that takes the sequence of tokens generated by the lexer and builds a parse tree or abstract syntax tree according to the language's grammar rules.
An abstract syntax tree (AST) is a tree representation of the abstract syntactic structure of a program, generated by the parser during the syntax analysis phase of a compiler or interpreter.
A recursive descent parser is a type of top-down parser that uses a set of recursive procedures to construct the parse tree by matching the input against the grammar rules of the programming language.
A context-sensitive analysis is a type of semantic analysis that takes into account the context or flow of control in a program, such as variable scopes and data dependencies, to perform optimizations or detect errors.
Type inference is the process of automatically deducing the data types of expressions, variables, and function parameters in a programming language based on their usage and context, without explicit type annotations.
A language specification or grammar is a formal description of the syntax and semantics of a programming language, defining the rules that govern the structure and meaning of valid programs in that language.
A domain-specific language (DSL) is a programming language designed specifically for a particular application domain or problem domain, with syntax and semantics tailored to that domain.
A regular expression is a sequence of characters that defines a search pattern, used for matching and manipulating text in programming languages and text processing utilities.
A finite state machine (FSM) is an abstract computational model used in computer science to represent and analyze systems with a finite number of states and transitions between them, such as in lexical analysis and pattern recognition.
Lexical scope, also known as static scope, is a scope resolution mechanism in programming languages where the scope of a variable is determined by its position in the source code, and it is accessible within its enclosing block or function.
Dynamic scope, also known as run-time scope, is a scope resolution mechanism in programming languages where the scope of a variable is determined by the execution context or call stack, rather than its position in the source code.
A closure is a function that has access to variables in its outer (enclosing) function's scope, even after the outer function has returned. It captures and preserves the environment in which it was created.
A curried function is a technique in functional programming where a function with multiple arguments is transformed into a sequence of functions, each taking a single argument and returning a new function that accepts the next argument.
Tail call optimization is a compiler optimization technique that reuses the current stack frame for a function call instead of creating a new one when the last operation of a function is a call to another function. This can improve performance and prevent stack overflow issues.
A garbage collector is a component of a programming language runtime or virtual machine that automatically manages memory allocation and deallocation by identifying and reclaiming memory occupied by objects or data structures that are no longer reachable or in use.
A lambda function, or anonymous function, is a function in a programming language that can be defined and used inline without being bound to an identifier or name. It is commonly used in functional programming and event handling.
A higher-order function is a function that can take one or more functions as arguments, return a function as its result, or both. It is a key concept in functional programming, enabling code reuse and abstraction.
A pure function is a function in a programming language that has the following properties: it always returns the same output for the same input, and it has no side effects (it does not modify any external state or data outside its scope).
A functional programming language is a programming language that treats computation as the evaluation of mathematical functions and avoids changing state or data. It emphasizes immutable data, higher-order functions, and recursive patterns.
Monadic programming is a programming style in functional programming languages that provides a way to structure and sequence computations that involve side effects or state changes, using the concept of monads to encapsulate and control those effects.
Lazy evaluation, also known as non-strict evaluation, is an evaluation strategy in programming languages where expressions are not evaluated until their values are needed, and expressions that are never used are never evaluated. This can improve performance and enable infinite data structures.
Referential transparency is a property of expressions in a programming language where an expression can be replaced by its value without changing the behavior of the program. It is an important concept in functional programming and allows for easier reasoning about code.
A declarative programming paradigm is a style of programming where the programmer specifies what the program should accomplish, rather than describing how it should accomplish it. It focuses on describing the logic and relationships, rather than explicit control flow.
An imperative programming paradigm is a style of programming where the programmer provides a sequence of instructions or statements that describe how the program should achieve its desired behavior or output. It focuses on changing state and control flow.
Object-oriented programming (OOP) is a programming paradigm based on the concept of objects, which can contain data (properties or attributes) and code (methods or functions) that operate on that data. It emphasizes concepts like encapsulation, inheritance, and polymorphism.
A programming paradigm is a fundamental style or approach to programming that is based on different ways of conceiving and structuring computation. Some common paradigms include imperative, functional, object-oriented, logical, and declarative programming.