<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java on 0AndWild_log</title><link>https://0andwild.com/en/series/java/</link><description>Recent content in Java on 0AndWild_log</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><lastBuildDate>Fri, 23 Sep 2022 22:27:28 +0900</lastBuildDate><atom:link href="https://0andwild.com/en/series/java/index.xml" rel="self" type="application/rss+xml"/><item><title>Deep Dive into JVM (Java Virtual Machine) (2)</title><link>https://0andwild.com/en/posts/220923_jvm_2/</link><pubDate>Fri, 23 Sep 2022 22:27:28 +0900</pubDate><guid>https://0andwild.com/en/posts/220923_jvm_2/</guid><description>&lt;img src="https://0andwild.com/" alt="Featured image of post Deep Dive into JVM (Java Virtual Machine) (2)" /&gt;&lt;h1 id="jvm-components"&gt;&lt;a href="#jvm-components" class="header-anchor"&gt;&lt;/a&gt;JVM Components
&lt;/h1&gt;&lt;p&gt;&lt;img alt="JVM_process" class="gallery-image" data-flex-basis="420px" data-flex-grow="175" height="325" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://0andwild.com/posts/220923_jvm_2/featured.png" width="569"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="1-class-loader"&gt;&lt;a href="#1-class-loader" class="header-anchor"&gt;&lt;/a&gt;1. Class Loader
&lt;/h2&gt;&lt;p&gt;JVM&amp;rsquo;s &lt;strong&gt;Class Loader&lt;/strong&gt; loads &lt;code&gt;*.class&lt;/code&gt; files (bytecode files converted by &lt;code&gt;javac&lt;/code&gt;) into &lt;strong&gt;Runtime Data Areas&lt;/strong&gt; to run the program.&lt;/p&gt;
&lt;div class="stack-alert stack-alert--tip"&gt;
 &lt;div class="stack-alert__icon"&gt;💡&lt;/div&gt;
 &lt;div class="stack-alert__content"&gt;&lt;p&gt;Class Loader loading occurs at &lt;strong&gt;runtime&lt;/strong&gt;, when a class is first accessed. This enables &lt;strong&gt;Lazy Loading Singleton&lt;/strong&gt; implementation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Class Loading is &lt;strong&gt;Thread-safe&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="2-execution-engine"&gt;&lt;a href="#2-execution-engine" class="header-anchor"&gt;&lt;/a&gt;2. Execution Engine
&lt;/h2&gt;&lt;p&gt;Executes the &lt;strong&gt;bytecode&lt;/strong&gt; loaded into Runtime Data Areas by the Class Loader. It converts bytecode to machine code and executes it instruction by instruction, composed of 1-byte OpCode and operands.&lt;/p&gt;
&lt;h3 id="key-components"&gt;&lt;a href="#key-components" class="header-anchor"&gt;&lt;/a&gt;Key Components
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Interpreter&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compiler (Just-in-Time)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="3-garbage-collector"&gt;&lt;a href="#3-garbage-collector" class="header-anchor"&gt;&lt;/a&gt;3. Garbage Collector
&lt;/h2&gt;&lt;p&gt;Responsible for &lt;strong&gt;removing unreferenced objects in the Heap area&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Before Java, programmers managed all program memory. In Java, the JVM manages program memory through a process called &lt;strong&gt;garbage collection&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="stack-alert stack-alert--note"&gt;
 &lt;div class="stack-alert__icon"&gt;ℹ️&lt;/div&gt;
 &lt;div class="stack-alert__content"&gt;Garbage collection continuously finds and removes unused memory in Java programs.&lt;/div&gt;
&lt;/div&gt;

&lt;hr&gt;
&lt;h2 id="4-runtime-data-areas"&gt;&lt;a href="#4-runtime-data-areas" class="header-anchor"&gt;&lt;/a&gt;4. Runtime Data Areas
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;JVM&amp;rsquo;s memory area allocated from the OS&lt;/strong&gt;. It holds data needed to run Java applications.&lt;/p&gt;
&lt;p&gt;Runtime Data Areas are divided into &lt;strong&gt;5 areas&lt;/strong&gt; as follows.&lt;/p&gt;
&lt;div class="stack-alert stack-alert--note"&gt;
 &lt;div class="stack-alert__icon"&gt;ℹ️&lt;/div&gt;
 &lt;div class="stack-alert__content"&gt;&lt;p&gt;&lt;strong&gt;Shared Areas&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Method and Heap areas are shared by all Threads&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Thread-specific Areas&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stack, PC Register, Native Method areas exist per Thread&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;img alt="JVM_process" class="gallery-image" data-flex-basis="414px" data-flex-grow="172" height="475" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://0andwild.com/posts/220923_jvm_2/runtime_data_area.png" srcset="https://0andwild.com/posts/220923_jvm_2/runtime_data_area_hu_6eeea157fdec0966.png 800w, https://0andwild.com/posts/220923_jvm_2/runtime_data_area.png 820w" width="820"&gt;&lt;/p&gt;
&lt;h3 id="1-method-area"&gt;&lt;a href="#1-method-area" class="header-anchor"&gt;&lt;/a&gt;(1) Method Area
&lt;/h3&gt;&lt;p&gt;Created when the JVM starts, it stores runtime constant pools, field and method code, static variables, method bytecode, etc. for each class and interface read by the JVM.&lt;/p&gt;
&lt;div class="stack-alert stack-alert--tip"&gt;
 &lt;div class="stack-alert__icon"&gt;💡&lt;/div&gt;
 &lt;div class="stack-alert__content"&gt;It&amp;rsquo;s a Non-Heap area stored in the Permanent area. This is a factor to consider when specifying the &lt;code&gt;PermSize&lt;/code&gt; (Permanent Generation size) JVM option.&lt;/div&gt;
&lt;/div&gt;

&lt;h4 id="1-1-type-information"&gt;&lt;a href="#1-1-type-information" class="header-anchor"&gt;&lt;/a&gt;1-1 Type Information
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Whether it&amp;rsquo;s an Interface&lt;/li&gt;
&lt;li&gt;Type name including package name&lt;/li&gt;
&lt;li&gt;Type access modifiers&lt;/li&gt;
&lt;li&gt;Associated Interface list&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="1-2-runtime-constant-pool"&gt;&lt;a href="#1-2-runtime-constant-pool" class="header-anchor"&gt;&lt;/a&gt;1-2 Runtime Constant Pool
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Stores all references to Type, Field, and Method&lt;/li&gt;
&lt;li&gt;JVM finds and references memory addresses through the Runtime Constant Pool&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="1-3-field-information"&gt;&lt;a href="#1-3-field-information" class="header-anchor"&gt;&lt;/a&gt;1-3 Field Information
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Field type&lt;/li&gt;
&lt;li&gt;Field access modifiers&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="1-4-method-information"&gt;&lt;a href="#1-4-method-information" class="header-anchor"&gt;&lt;/a&gt;1-4 Method Information
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Stores metadata for all Methods including Constructors&lt;/li&gt;
&lt;li&gt;Stores Method name, parameter count and type, return type, access modifiers, bytecode, local variable section size, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="1-5-class-variable"&gt;&lt;a href="#1-5-class-variable" class="header-anchor"&gt;&lt;/a&gt;1-5 Class Variable
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Stores variables declared with the &lt;code&gt;static&lt;/code&gt; keyword&lt;/li&gt;
&lt;li&gt;Actual instances of non-primitive static variables are stored in Heap memory&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-heap-area"&gt;&lt;a href="#2-heap-area" class="header-anchor"&gt;&lt;/a&gt;(2) Heap Area
&lt;/h3&gt;&lt;p&gt;Space for storing objects created with the &lt;code&gt;new&lt;/code&gt; operator.&lt;/p&gt;
&lt;div class="stack-alert stack-alert--note"&gt;
 &lt;div class="stack-alert__icon"&gt;ℹ️&lt;/div&gt;
 &lt;div class="stack-alert__content"&gt;Objects become targets for &lt;strong&gt;GC (Garbage Collector)&lt;/strong&gt; when no referencing variables or fields exist.&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="3-stack-area"&gt;&lt;a href="#3-stack-area" class="header-anchor"&gt;&lt;/a&gt;(3) Stack Area
&lt;/h3&gt;&lt;p&gt;Stored as &lt;strong&gt;separate Frames per Thread&lt;/strong&gt;, with the following elements stored.&lt;/p&gt;
&lt;h4 id="3-1-local-variable-area"&gt;&lt;a href="#3-1-local-variable-area" class="header-anchor"&gt;&lt;/a&gt;3-1 Local Variable Area
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Stores temporary data occurring during Method execution, such as local variables, parameters, and method call addresses&lt;/li&gt;
&lt;li&gt;Stored in 4-byte units: 4-byte primitives like &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;float&lt;/code&gt; occupy 1 cell; 8-byte primitives like &lt;code&gt;double&lt;/code&gt; occupy 2 cells&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bool&lt;/code&gt; generally occupies 1 cell&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-2-operand-stack"&gt;&lt;a href="#3-2-operand-stack" class="header-anchor"&gt;&lt;/a&gt;3-2 Operand Stack
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;The Method&amp;rsquo;s &lt;strong&gt;workspace&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Indicates which commands to execute with which operands&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="3-3-frame-data"&gt;&lt;a href="#3-3-frame-data" class="header-anchor"&gt;&lt;/a&gt;3-3 Frame Data
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Includes Constant Pool Resolution, Method Return, Exception Dispatch, etc.&lt;/li&gt;
&lt;li&gt;Also holds referenced Exception tables&lt;/li&gt;
&lt;li&gt;When an Exception occurs, JVM references this table to determine how to handle the Exception&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-pc-register"&gt;&lt;a href="#4-pc-register" class="header-anchor"&gt;&lt;/a&gt;(4) PC Register
&lt;/h3&gt;&lt;p&gt;Created when a Thread starts, &lt;strong&gt;one exists per thread&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Holds the &lt;strong&gt;address of the currently executing portion&lt;/strong&gt; of the Thread, recording which part should be executed with which instruction.&lt;/p&gt;
&lt;div class="stack-alert stack-alert--tip"&gt;
 &lt;div class="stack-alert__icon"&gt;💡&lt;/div&gt;
 &lt;div class="stack-alert__content"&gt;The OS references the &lt;strong&gt;PC (Program Counter) Register&lt;/strong&gt; to know which instruction the Thread should execute next during CPU scheduling.&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="5-native-method-stack"&gt;&lt;a href="#5-native-method-stack" class="header-anchor"&gt;&lt;/a&gt;(5) Native Method Stack
&lt;/h3&gt;&lt;p&gt;Area for executing programs &lt;strong&gt;written in actual executable machine code&lt;/strong&gt; rather than bytecode generated from Java program compilation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Space for &lt;strong&gt;code written in languages other than Java&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Converted to bytecode and stored through the &lt;strong&gt;Java Native Interface&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Area where the kernel grabs the stack and independently executes the program, like a general program&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="jvm-execution-order"&gt;&lt;a href="#jvm-execution-order" class="header-anchor"&gt;&lt;/a&gt;JVM Execution Order
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Memory Allocation&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When a program runs, JVM receives memory needed to execute the program from the OS&lt;/li&gt;
&lt;li&gt;JVM divides this memory into multiple areas for use&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compilation&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java Compiler (&lt;code&gt;javac&lt;/code&gt;) compiles &lt;code&gt;*.java&lt;/code&gt; files and converts them to &lt;code&gt;*.class&lt;/code&gt; Java bytecode&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Class Loading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compiled &lt;code&gt;*.class&lt;/code&gt; files are loaded into JVM memory through the &lt;strong&gt;Class Loader&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bytecode Interpretation&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Loaded &lt;code&gt;*.class&lt;/code&gt; files are interpreted into machine code through the &lt;strong&gt;Execution Engine&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Execution and Management&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Interpreted bytecode is placed in memory areas and actually executed&lt;/li&gt;
&lt;li&gt;During execution, JVM performs memory management tasks such as &lt;strong&gt;thread synchronization&lt;/strong&gt; and &lt;strong&gt;garbage collector&lt;/strong&gt; as needed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Deep Dive into JVM (Java Virtual Machine) (1)</title><link>https://0andwild.com/en/posts/220922_jvm_1/</link><pubDate>Thu, 22 Sep 2022 22:06:50 +0900</pubDate><guid>https://0andwild.com/en/posts/220922_jvm_1/</guid><description>&lt;img src="https://0andwild.com/" alt="Featured image of post Deep Dive into JVM (Java Virtual Machine) (1)" /&gt;&lt;p&gt;While studying the Java language, I became curious about the &lt;strong&gt;JVM&lt;/strong&gt;.
I only knew it as a virtual computer that executes the code I write,
so I wanted to dig deeper into how it works and what role it plays.&lt;/p&gt;
&lt;h2 id="what-is-jvm"&gt;&lt;a href="#what-is-jvm" class="header-anchor"&gt;&lt;/a&gt;What is JVM?
&lt;/h2&gt;&lt;p&gt;An abbreviation for &lt;strong&gt;Java Virtual Machine&lt;/strong&gt;, it refers to a virtual computer environment for running Java.&lt;/p&gt;
&lt;h3 id="so-what-role-does-jvm-play"&gt;&lt;a href="#so-what-role-does-jvm-play" class="header-anchor"&gt;&lt;/a&gt;So what role does JVM play?
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;Java is not OS-dependent.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;To meet this condition and execute the code we write, something is needed between Java and the OS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;That&amp;rsquo;s the JVM.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="code-execution-process"&gt;&lt;a href="#code-execution-process" class="header-anchor"&gt;&lt;/a&gt;Code Execution Process
&lt;/h2&gt;&lt;p&gt;Source code (raw code) &lt;code&gt;*.java&lt;/code&gt; must be converted to &lt;strong&gt;machine code&lt;/strong&gt; (010101000101&amp;hellip;) for the CPU to recognize it.&lt;/p&gt;
&lt;h3 id="so-does-java-get-directly-converted-to-machine-code-and-executed"&gt;&lt;a href="#so-does-java-get-directly-converted-to-machine-code-and-executed" class="header-anchor"&gt;&lt;/a&gt;So does *.java get directly converted to machine code and executed&amp;hellip;?
&lt;/h3&gt;&lt;p&gt;No. The &lt;code&gt;*.java&lt;/code&gt; file is first converted to &lt;strong&gt;java bytecode&lt;/strong&gt; (&lt;code&gt;*.class&lt;/code&gt;) so that the JVM can recognize it.&lt;/p&gt;
&lt;p&gt;This conversion process is performed by the &lt;strong&gt;java compiler&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="stack-alert stack-alert--note"&gt;
 &lt;div class="stack-alert__icon"&gt;ℹ️&lt;/div&gt;
 &lt;div class="stack-alert__content"&gt;&lt;p&gt;The java compiler is &lt;code&gt;javac.exe&lt;/code&gt; located in the bin folder when you install JDK.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can generate &lt;code&gt;.class&lt;/code&gt; files using the &lt;code&gt;javac&lt;/code&gt; command&lt;/li&gt;
&lt;li&gt;You can execute these &lt;code&gt;.class&lt;/code&gt; files using the &lt;code&gt;java&lt;/code&gt; command&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="so-now-it-runs-on-the-os"&gt;&lt;a href="#so-now-it-runs-on-the-os" class="header-anchor"&gt;&lt;/a&gt;So now it runs on the OS..?
&lt;/h3&gt;&lt;div class="stack-alert stack-alert--warning"&gt;
 &lt;div class="stack-alert__icon"&gt;⚠️&lt;/div&gt;
 &lt;div class="stack-alert__content"&gt;No&amp;hellip;. bytecode is not machine code, so it doesn&amp;rsquo;t run directly on the OS&amp;hellip;!&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;At this point, &lt;strong&gt;the JVM plays the role of interpreting this bytecode so the OS can understand it&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Thanks to this role of the JVM, Java code written once can be executed regardless of the OS.&lt;/p&gt;
&lt;h3 id="overall-process"&gt;&lt;a href="#overall-process" class="header-anchor"&gt;&lt;/a&gt;Overall Process
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;*.java&lt;/code&gt; → converted to bytecode form &lt;code&gt;*.class&lt;/code&gt; → converted to machine code (binary code) through &lt;strong&gt;JIT (Just In Time) compiler&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="JVM_process" class="gallery-image" data-flex-basis="846px" data-flex-grow="352" height="152" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://0andwild.com/posts/220922_jvm_1/jvm_process.png" width="536"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="what-is-jit-just-in-time-compiler"&gt;&lt;a href="#what-is-jit-just-in-time-compiler" class="header-anchor"&gt;&lt;/a&gt;What is JIT (Just In Time) Compiler?
&lt;/h2&gt;&lt;p&gt;Also called &lt;strong&gt;JIT compilation&lt;/strong&gt; or &lt;strong&gt;dynamic translation&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;JIT was introduced to &lt;strong&gt;complement the shortcomings of the interpreter approach&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It translates to machine code at the actual execution time of the program.&lt;/p&gt;
&lt;h3 id="performance-characteristics"&gt;&lt;a href="#performance-characteristics" class="header-anchor"&gt;&lt;/a&gt;Performance Characteristics
&lt;/h3&gt;&lt;div class="stack-alert stack-alert--tip"&gt;
 &lt;div class="stack-alert__icon"&gt;💡&lt;/div&gt;
 &lt;div class="stack-alert__content"&gt;Since machine code is stored in cache, &lt;strong&gt;code that has been compiled once executes quickly&lt;/strong&gt;.&lt;/div&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;The process of JIT compiler compiling to machine code is much &lt;strong&gt;slower&lt;/strong&gt; than interpreting bytecode, but once executed, it&amp;rsquo;s &lt;strong&gt;fast&lt;/strong&gt; afterwards&lt;/li&gt;
&lt;li&gt;However, for code that runs only once, it&amp;rsquo;s advantageous to interpret directly without compiling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;JVM using JIT compiler checks how often a method is executed and only compiles when it exceeds a certain threshold.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="what-is-the-interpreter-approach"&gt;&lt;a href="#what-is-the-interpreter-approach" class="header-anchor"&gt;&lt;/a&gt;What is the Interpreter Approach?
&lt;/h2&gt;&lt;p&gt;An &lt;strong&gt;interpreter&lt;/strong&gt; translates source code line by line to machine code at each execution, so execution speed is slower than statically compiled languages.&lt;/p&gt;
&lt;h3 id="representative-interpreter-languages"&gt;&lt;a href="#representative-interpreter-languages" class="header-anchor"&gt;&lt;/a&gt;Representative Interpreter Languages
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Database language SQL&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="advantages-and-disadvantages"&gt;&lt;a href="#advantages-and-disadvantages" class="header-anchor"&gt;&lt;/a&gt;Advantages and Disadvantages
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Category&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Advantages&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Simple program modification&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Disadvantages&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Execution speed is slower than compiled languages&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="stack-alert stack-alert--tip"&gt;
 &lt;div class="stack-alert__icon"&gt;💡&lt;/div&gt;
 &lt;div class="stack-alert__content"&gt;&lt;p&gt;&lt;strong&gt;Compilers&lt;/strong&gt; translate source code to create executable files, so when program modifications occur, the source code must be recompiled.&lt;/p&gt;
&lt;p&gt;If the program is small and simple, there&amp;rsquo;s no problem, but as the program grows larger, compilation often takes hours.&lt;/p&gt;
&lt;p&gt;However, with an &lt;strong&gt;interpreter&lt;/strong&gt;, you just modify the source code and run it, so it&amp;rsquo;s widely used in programming where modifications occur frequently.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</description></item></channel></rss>