<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>lee_homin11.log</title>
        <link>https://velog.io/</link>
        <description>!developer</description>
        <lastBuildDate>Thu, 08 May 2025 11:03:52 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>lee_homin11.log</title>
            <url>https://velog.velcdn.com/images/lee_homin11/profile/95d11f0d-4e1e-41fa-82db-db3f8309f32a/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. lee_homin11.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/lee_homin11" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[RUST STUDY - ALGORITHM]]></title>
            <link>https://velog.io/@lee_homin11/RUST-STUDY-ALGORITHM</link>
            <guid>https://velog.io/@lee_homin11/RUST-STUDY-ALGORITHM</guid>
            <pubDate>Thu, 08 May 2025 11:03:52 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>오늘은 RUST를 이용하여 무언가를 만드는게 아닌 algorithm을 풀것이다.</p>
</blockquote>
<h1 id="hello-world---2557">Hello World! - 2557</h1>
<p>첫번째로 풀 문제는 
<img src="https://velog.velcdn.com/images/lee_homin11/post/7408fc21-f00d-4a3b-b142-24a0f9c8ca5e/image.png" alt="">
기초라고 할 수 있는 &quot;Hello World!&quot;를 출력하는 문제이다.
우선 algorithm을 풀기위해 vscode에 파일을 만들자.
<img src="https://velog.velcdn.com/images/lee_homin11/post/a64cc384-fd19-4b65-89d1-90953d285fd3/image.png" alt="">
파일을 만들자 말자 2557번 문제의 정답과 비슷한 코드가 적혀있다.</p>
<h3 id="분석">분석</h3>
<pre><code class="language-rust">fn main() {
    println!(&quot;Hello World!&quot;);
}</code></pre>
<p>C언어를 통해서 예시를 들자면 fn main(){}부분 같은 경우 int main(){}과 같다.
그리고 println!을 통해서 출력하는 것을 알 수 있다.</p>
<h3 id="제출">제출</h3>
<p><img src="https://velog.velcdn.com/images/lee_homin11/post/329d203f-6aad-430d-b9c9-35f13f067df7/image.png" alt="">
아주 쉽게 해결할 수 있다.</p>
<details>
<summary>‼️주의할 점</summary>

<blockquote>
<p>파일에 나오는 예시 코드 같은경우 출력 결과와 다른것을 알수 있다. 
출력 결과: Hello World!
예시 코드: Hello, world!
예시 코드를 제출하면 틀린다고 나오기 때문에 주의하자.</p>
</blockquote>
</details>


<h1 id="a--b---1000">A + B - 1000</h1>
<p>다음 문제는 수학 문제중 가장 기초 문제인 1000번 A+B이다.
이 문제 같은 경우에는 Hello World!문제와 다르게 출력만 하는 것이 아닌 직접 입력하고 그 입력한 수를 더하여 출력하기 때문에 코드가 조금 길어진다.</p>
<h3 id="풀이">풀이</h3>
<p>우선 입력을 받아야 하는 문제이므로</p>
<pre><code class="language-rust">use std::io;</code></pre>
<p>라이브러리 모듈을 가져오자.
다음으로 해야할것은 입력받을 변수를 만드는 것이다.</p>
<pre><code class="language-rust">let mut s = String::new();</code></pre>
<p>s로 받아올 것이다.
다음으로는 입력을 받는 부분이다.</p>
<pre><code class="language-rust">io::stdin().read_line(&amp;mut s).unwrap();</code></pre>
<p>io::stdin()이 입력 받는 부분
.read_line(&amp;mut s)입력받는 부분을 읽어주는 부분
.unwrap();안전하게 추출하는 부분이다.</p>
<p>입력받은 부분을 나눈후 정수로 저장하는 코드이다.</p>
<pre><code class="language-rust">let values:Vec&lt;i32&gt; = s
        .split_whitespace()
        .map(|s| s.parse().unwrap())
        .collect();</code></pre>
<p>코드가 엄청 긴 것을 알수 있다.</p>
<p>코드를 해석하면 우선 <code>values</code>라는 변수를 만든다.
그리고 <code>Vec</code>를 통해 입력받은 값을 나누어 저장한다. 
<code>&lt;i32&gt;</code>같은 경우 정수형으로 표현할 수 있는 가장 작은 값이다. 
<code>.split_whitespace()</code>는 문자열을 공백 기준으로 나누는 부분이다.
<code>map(|s| s.parse().unwrap())</code>각 부분 문자열을 숫자로 변환 하는 코드이다. 
<code>.collect();</code>같은 경우 Iterator를 컬렉션으로 수집하는 부분이다.</p>
<p>마지막으로 </p>
<pre><code class="language-rust">println!(&quot;{}&quot;, values[0] + values[1]);</code></pre>
<p>출력을 하면 된다. values를 둘로 나누어 저장하였기 때문에
values[0], values[1]을 더하면 된다.</p>
<details>
<summary>예시</summary>
입력값: 3, 4

<p>values &lt;- 3, 4
values[2]
values[0] = 3, values[1] = 4
values[0] + values[1] = 7</p>
</details>

<p>전체코드는 이렇다.</p>
<pre><code class="language-rust">use std::io;

fn main(){
    let mut s = String::new();
    io::stdin().read_line(&amp;mut s).unwrap();
    let values:Vec&lt;i32&gt; = s
        .split_whitespace()
        .map(|s| s.parse().unwrap())
        .collect();

    println!(&quot;{}&quot;, values[0] + values[1]);
}
</code></pre>
<h3 id="제출-1">제출</h3>
<p><img src="https://velog.velcdn.com/images/lee_homin11/post/9dad15ff-6dd4-4349-b812-21e331cb4b8e/image.png" alt="">
완벽하다.</p>
<p>마지막으로 for문을 사용하는 문제를 풀고 마무리 하자.</p>
<h1 id="별-찍기1---2438">별 찍기(1) - 2438</h1>
<p>이 문제는 N을 입력받아서 N줄만큼 N별을 찍어내는 문제이다.
예시로 N이 6일 경우
*
**
***
****
*****
******
이 출력된다.</p>
<h3 id="풀이-1">풀이</h3>
<pre><code class="language-rust">use std::io;
fn main(){
    let mut input = String::new();

    io::stdin()
        .read_line(&amp;mut input)
        .expect(&quot;Cannot read line.&quot;);
    let input: usize = input.trim().parse().unwrap();

    for i in 1..=input {
        println!(&quot;{}&quot;, &quot;*&quot;.repeat(i));
    }
}</code></pre>
<p> 코드는 이러하다.</p>
<p>우선 입력을 받아야 하므로</p>
<pre><code class="language-rust">use std::io;</code></pre>
<p>라이브러리를 불러오고</p>
<pre><code class="language-rust">let mut input = String::new();</code></pre>
<p>input을 만든다.
그리고 해야할 것은 반복문을 사용해 별을 찍어내는 것이다.</p>
<pre><code class="language-rust">for i in 1..=input {
  println!(&quot;{}&quot;, &quot;*&quot;.repeat(i));
  }
}  </code></pre>
<p>i를 사용하여 1.. 1부터 ~ input값 만큼 반복을 하는 것이다.
출력을 할때에는 i만큼 repeat을 해서 출력을 하기 때문에 
예제 출력과 같은 출력을 할 수 있다.</p>
<h3 id="마무리">마무리</h3>
<p>오늘은 Rust를 이용해 알고리즘 문제 3개를 풀어봤다. 난이도는 매우 낮은 문제였지만, 새로운 언어로 풀다 보니 생각보다 고전했던 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[RUST STUDY(2)]]></title>
            <link>https://velog.io/@lee_homin11/RUST-STUDY2</link>
            <guid>https://velog.io/@lee_homin11/RUST-STUDY2</guid>
            <pubDate>Tue, 08 Apr 2025 01:46:09 GMT</pubDate>
            <description><![CDATA[<h1 id="📝plan">📝PLAN</h1>
<p>RUST의 설치, 사용방법을 <a href="https://velog.io/@lee_homin11/RUST-STUDY">저번</a>에 알아보았다.
요번시간에는 더욱 깊이 공부를 해볼 예정이다.
RUST라는 언어에 대해서 아는것이 없는 나는 우선 chatGPT에게 물어봤다.</p>
<h4 id="🙋question">🙋question</h4>
<p><img src="https://velog.velcdn.com/images/lee_homin11/post/7096dca0-7d6b-47a0-87a8-259d00a6d444/image.png" alt="">
chatgpt가 추천해준 것을 읽던중
<img src="https://velog.velcdn.com/images/lee_homin11/post/9bb17309-ad93-4a5b-9b81-3e58d8f65469/image.png" alt="">
괜찮은 실습 프로젝트를 발견하였다.
그래서 요번 시간에는 RUST를 이용하여 CLI TOOL을 만들어볼 것이다.</p>
<h1 id="📖study">📖STUDY</h1>
<p>우선 간단하게 입력한 단어가 뜨게 하는 코드를 작성해볼 것이다.
<img src="https://velog.velcdn.com/images/lee_homin11/post/cff44cd8-c0e7-46f3-8bc8-d0a97436b09a/image.png" alt=""></p>
<p>프로젝트를 만들고
vim을 통해 main.rs을 수정하자.</p>
<pre><code class="language-rust">use clap::Parser;

#[derive(Parser)]
struct Args{
    #[arg(short, long)]
    message: String,
}
fn main(){
    let args = Args::parse;
    println!(&quot;메시지: {}&quot;, args().message);
}

</code></pre>
<p>코드를 완성하였다. 이제 저장하고 실행을 해보자
우선 실행하기 전에 </p>
<pre><code class="language-rust">use clap::Parser;</code></pre>
<p>같은 경우 라이브러리이므로 다운을 받아야한다.</p>
<pre><code class="language-cmd">cargo add clap --features derive</code></pre>
<p>명령어를 입력하고 다운을 받자.
그리고 이제 코드가 정상작동 하는지 실행을 한번 해보자.</p>
<pre><code class="language-cmd">cargo run -- --message &quot;&lt;내가 입력하고 싶은 단어&gt;&quot;</code></pre>
<p>위 코드를 cmd에 입력하면
<img src="https://velog.velcdn.com/images/lee_homin11/post/ac4fc96f-a49a-4d4b-bef0-cc3665897b59/image.png" alt="">
메시지: helloworld 
정상 작동하는 것을 볼 수 있다.</p>
<p>이제 제대로 된 CLI TOOL을 개발해 보자</p>
<h1 id="😎cli-tooooool">😎CLI TOOOOOOL</h1>
<p>요번에 만들 것은 타이머 기능이다.</p>
<h3 id="⚙️기능">⚙️기능</h3>
<p>공부할때 쓸 수 있도록 집중시간과 그 집중시간이 끝나면 쉬는 시간을 주며 반복을 하는 기능이다.</p>
<h3 id="🖥️개발-시작">🖥️개발 시작</h3>
<p>우선 TOOl을 만들기 위해 폴더를 하나 생성한다.
나는 studytime이라는 폴더를 만들었다.</p>
<p>우선 clap은 필수이므로 clap을 추가한다.</p>
<blockquote>
</blockquote>
<p>cargo.toml에 가면 clap이 추가가 되어있는지 확인이 가능하다.
<img src="https://velog.velcdn.com/images/lee_homin11/post/8ee5eddc-621b-4fb4-b954-ef3b98790276/image.png" alt=""></p>
<p>다음으로 main.rs를 작성하자</p>
<pre><code class="language-rust">use clap::Parser;
use std::thread::sleep;
use std::time::{Duration, Instant};

#[derive(Parser, Debug)]</code></pre>
<p>헤더 부분이다. 
다음으로 공부시간과, 휴식시간을 정하는 코드이다. 우선 공부시간은 25분, 휴식시간은 5분으로 지정하였다.</p>
<pre><code class="language-rust">struct Args {
    #[arg(short, long, default_value_t = 25)]
    focus: u64,

    #[arg(short, long, default_value_t = 5)]
    rest: u64,
}</code></pre>
<p>그리고 이제 그 코드를 실행했을때 타이머가 출력되게 해주는 코드를 작성했다.</p>
<pre><code class="language-rust">fn main() {
    let args = Args::parse();

    println!(&quot;🔥 공부 시작: {}분&quot;, args.focus);
    run_timer(args.focus * 60, &quot;🕖 집중 중...&quot;);

    println!(&quot;💤 쉬는 시간: {}분&quot;, args.rest);
    run_timer(args.rest * 60, &quot;😴 쉬는 중...&quot;);

    println!(&quot;✅ 1라운드 완료!&quot;);
}</code></pre>
<p>남은 시간을 보여주는 코드도 작성하였다.</p>
<pre><code class="language-rust">fn run_timer(seconds: u64, label: &amp;str) {
    let _start = Instant::now();

    for remaining in (0..seconds).rev() {
        print!(&quot;\r{} 남은 시간: {:02}:{:02}&quot;, label, remaining / 60, remaining % 60);
        std::io::Write::flush(&amp;mut std::io::stdout()).unwrap();
        sleep(Duration::from_secs(1));
    }
    println!(&quot;\r🔔 시간 종료!&quot;);
}</code></pre>
<p>전체 코드이다.</p>
<pre><code class="language-rust">use clap::Parser;
use std::thread::sleep;
use std::time::{Duration, Instant};

#[derive(Parser, Debug)]

struct Args {
    #[arg(short, long, default_value_t = 25)]
    focus: u64,

    #[arg(short, long, default_value_t = 5)]
    rest: u64,
}
fn main() {
    let args = Args::parse();

    println!(&quot;🔥 공부 시작: {}분&quot;, args.focus);
    run_timer(args.focus * 60, &quot;🕖 집중 중...&quot;);

    println!(&quot;💤 쉬는 시간: {}분&quot;, args.rest);
    run_timer(args.rest * 60, &quot;😴 쉬는 중...&quot;);

    println!(&quot;✅ 1라운드 완료!&quot;);
}
fn run_timer(seconds: u64, label: &amp;str) {
    let _start = Instant::now();

    for remaining in (0..seconds).rev() {
        print!(&quot;\r{} 남은 시간: {:02}:{:02}&quot;, label, remaining / 60, remaining % 60);
        std::io::Write::flush(&amp;mut std::io::stdout()).unwrap();
        sleep(Duration::from_secs(1));
    }
    println!(&quot;\r🔔 시간 종료!&quot;);
}</code></pre>
<p>이제 작동시켜 보자</p>
<h3 id="🏃run">🏃RUN</h3>
<p>cmd창에</p>
<pre><code class="language-cmd">cargo run -- --focus &lt;원하는 시간&gt; --rest &lt;원하는 시간&gt;</code></pre>
<p>을 입력하면?
<del>테스트를 위해 시간을 1분으로 설정하였다.</del>
<img src="https://velog.velcdn.com/images/lee_homin11/post/c36a22c4-0ab0-457f-a63e-7bd232e5fedb/image.png" alt="">
초단위로 시간이 흘러가는 것을 볼 수 있다.
<img src="https://velog.velcdn.com/images/lee_homin11/post/dade1dfe-61ab-46e6-8fe7-34ded80b7d54/image.png" alt="">
공부시간이 끝나면 쉬는 시간이 출력된다.
그리고 쉬는 시간 타이머가 끝나면
<img src="https://velog.velcdn.com/images/lee_homin11/post/5cfa4f9a-3a5f-4206-a57a-465c6ca11441/image.png" alt="">
완료 되었다는 말과 함께 끝난다.</p>
<p>코드가 정상작동 하는 것을 확인하였다.
다음으로 추가기능을 넣어보자</p>
<h3 id="➕plus">➕PLUS</h3>
<p>코드를 추가하고 수정하자.
우선 struct Args에 rounds를 추가하고</p>
<pre><code class="language-rust">struct Args{
    #[arg(short, long, default_value_t = 1)]
    rounds: u64,
}</code></pre>
<p>그런데 여기서 문제가 있다.
바로 rest와 rounds의 단축옵션이 중복이 된다는 것이다.
그러므로 코드를 이렇게 수정하였다.</p>
<pre><code class="language-rust">struct Args {
    #[arg(short, long, default_value_t = 25)]
    focus: u64,

    #[arg(short, long, default_value_t = 5)]
    breaktime: u64, // rest --&gt; breaktime

    #[arg(short, long, default_value_t = 1)]
    rounds: u64,
}</code></pre>
<p>그리고 메인 코드도 수정과 추가를 하였다.</p>
<pre><code class="language-rust">fn main() {
    let args = Args::parse();

    for round in 1..=args.rounds { // --&gt; 라운드 반복문
        println!(&quot;✔️ 라운드 {}/{}&quot;, round, args.rounds); // 몇라운드인지 확인하는 출력하는 코드

        println!(&quot;🔥 집중 시작: {}분&quot;, args.focus);
        run_timer(args.focus * 60, &quot;⏰ 집중 중...&quot;);

        if round != args.rounds {
            println!(&quot;💤 쉬는 시간: {}분&quot;, args.breaktime); // rest -&gt; breaktime
            run_timer(args.breaktime * 60, &quot;😴 쉬는 중...&quot;); // rest -&gt; breaktime
        }

        println!(&quot;✅ 라운드 {}/{} 완료!\n&quot;, round, args.rounds);
    }

    println!(&quot;🎉 모든 라운드를 완료했습니다! 수고하셨어요 👏&quot;);
}</code></pre>
<p>이것으로 수정을 끝냈다.
이제 정상작동 하는지 보고 마무리하자</p>
<p>실행 코드는</p>
<pre><code class="language-cmd">cargo run -- --focus &lt;시간&gt; --breaktime &lt;시간&gt; --rounds &lt;시간&gt;</code></pre>
<p>이다
<img src="https://velog.velcdn.com/images/lee_homin11/post/94ae661a-9fcb-4dbb-b4cd-8acc52fc911e/image.png" alt="">
라운드를 2로 지정하였고 위와 같이 2라운드후 종료되는 것을 알 수 있다.</p>
<h1 id="🎬end">🎬END</h1>
<p>이것으로 CLI TOOL개발이 완료 되었다.
다음에는 RUST로 새로운 무언가를 만들어보자.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[LLVM을 공부하며 CPP compiler만들기(1)]]></title>
            <link>https://velog.io/@lee_homin11/LLVM%EC%9D%84-%EA%B3%B5%EB%B6%80%ED%95%98%EB%A9%B0-CPP-compiler%EB%A7%8C%EB%93%A4%EA%B8%B01</link>
            <guid>https://velog.io/@lee_homin11/LLVM%EC%9D%84-%EA%B3%B5%EB%B6%80%ED%95%98%EB%A9%B0-CPP-compiler%EB%A7%8C%EB%93%A4%EA%B8%B01</guid>
            <pubDate>Tue, 25 Mar 2025 15:44:17 GMT</pubDate>
            <description><![CDATA[<h1 id="llvm에-공부를-시작하기-전에">LLVM에 공부를 시작하기 전에..</h1>
<blockquote>
<p>작년에 LLVM에 대하여 맛보기를 한적이 있었다. 요번에는 LLVM을 이용하여 프로젝트를 하나 진행해 볼까 한다. </p>
</blockquote>
<h1 id="개발-시작">개발 시작</h1>
<h2 id="🌎hello-world">🌎hello World!</h2>
<p>우선 처음으로 cpp코드를 LLVM IR로 변환을 해볼것이다.
<img src="https://velog.velcdn.com/images/lee_homin11/post/99350962-13c1-4111-8da8-98e44c3d6a6b/image.png" alt="">
여기 Hello, World!를 출력하는 cpp코드가 있다.</p>
<pre><code>% clang++ -S -emit-llvm cpp.cpp -o cpp.ll  </code></pre><p>터미널에서 현재 파일 위치로 이동한 후 위 명령어를 실행하면
cpp.cpp 파일이 변환되어 cpp.ll이라는 파일이 생긴다.
<img src="https://velog.velcdn.com/images/lee_homin11/post/3b338619-27b9-4a54-8f08-92b9c0180583/image.png" alt="">
굿
다음으로 cpp.ll파일을 열어볼까?</p>
<h2 id="🧐cppll">🧐cpp.ll</h2>
<p><img src="https://velog.velcdn.com/images/lee_homin11/post/2cfac76e-ac92-472d-9938-8901a87a72fd/image.png" alt="">
엄청 코드가 긴 것을 확인할 수 있다.
🧐왜 코드가 길어졌을까?
사실 이것에 대한 정답은 cpp.cpp파일에 있다.
바로 </p>
<pre><code>using namespace std;</code></pre><p>가 문제였던 것이다.
복잡한 C++ 표준 라이브러리가 포함이 되어있어서 길었던 것이였다...</p>
<h3 id="✍️cppcpp수정">✍️cpp.cpp수정</h3>
<p><img src="https://velog.velcdn.com/images/lee_homin11/post/caf22c45-8da2-47e2-93b5-ab4fae5b7b68/image.png" alt="">
c 스타일로 코드를 작성하였다.
<img src="https://velog.velcdn.com/images/lee_homin11/post/ab313cad-8011-4661-8bb1-8ca29b092050/image.png" alt="">
무려 28줄까지 줄어들었다..
<del>500줄이 넘던 파일이...</del>
수정을 완료하였으니 다음단계로 넘어가자</p>
<h3 id="😎최적화">😎최적화</h3>
<p>이제 cpp.ll 파일을 최적화 할 것이다.</p>
<pre><code>% opt -O2 cpp.ll -o  cpp-clean.ll</code></pre><p>이 코드를 입력하면 cpp-clean.ll이라는 파일이 생성된다.</p>
<p>🤔그런데 opt가 뭐지?</p>
<blockquote>
<p>😲opt는 LLVM 자체 최적화 툴이다</p>
</blockquote>
<p>이제 최적화를 완료 하였으니 실행을 시켜볼까?</p>
<h3 id="👨💻코드-실행">👨‍💻코드 실행</h3>
<p>실행을 하려면 JIT컴파일러를 이용해야한다.</p>
<p>우선 파일을 실행 가능한 바이너리 파일로 만들자.</p>
<pre><code>% clang++ -o cpp-clean cpp-clean.ll</code></pre><p><img src="https://velog.velcdn.com/images/lee_homin11/post/524d233d-f082-424f-a33c-6a7d473d6254/image.png" alt="">
cpp-clean.ll위에 cpp-clean이 나왔다!
이제 저 파일을 실행하면 된다.</p>
<pre><code>% ./cpp-clean</code></pre><p><img src="https://velog.velcdn.com/images/lee_homin11/post/9b44cddd-0e63-4b6b-bdeb-2ed3735a260c/image.png" alt="">
실행이 되는 것을 확인하였다.</p>
<p>이제 직접 IR을 만들고 실행해보자.</p>
<h1 id="💻llvm-cpp-api">💻LLVM CPP API</h1>
<p>LLVM은 CPP API가 존재하기 때문에 직접 IR을 만들고 실행이 가능하다.
IR생성 코드를 작성해보자.</p>
<h4 id="include">include</h4>
<p><img src="https://velog.velcdn.com/images/lee_homin11/post/3b2fbcd3-fee8-41c5-98ad-5146ff1a2dfd/image.png" alt="">
include를 통해 llvm/IR을 불러온다.</p>
<blockquote>
<p>⚠️만약 이부분에서 
<img src="https://velog.velcdn.com/images/lee_homin11/post/b654ea56-9706-4d35-8d33-54ef562eb96c/image.png" alt="">
에러가 난다면
c_cpp_properties.json파일에 들어간다</p>
</blockquote>
<pre><code>&quot;includePath&quot;: [
                &quot;${workspaceFolder}/**&quot;
            ],</code></pre><p>부분에 </p>
<pre><code>&quot;includePath&quot;: [
                &quot;${workspaceFolder}/**&quot;,
                &quot;/opt/homebrew/opt/llvm/include&quot;
            ],</code></pre><p>&quot;/opt/homebrew/opt/llvm/include&quot;를 추가하시면
<img src="https://velog.velcdn.com/images/lee_homin11/post/7e29a91b-128b-4bf4-af8a-799bc15c70be/image.png" alt="">
수정이 되는걸 확인하실수 있습니다.</p>
<h4 id="main">main</h4>
<p><img src="https://velog.velcdn.com/images/lee_homin11/post/0225cc99-0495-4151-8a3b-d6622bcac4ca/image.png" alt="">
밑에는 코드에 대하여 주석입니다.</p>
<pre><code>LLVMContext Context; // LLVM Context 생성
Module *ModuleOb = new Module(&quot;MyModule&quot;, Context); // LLVM 모듈 생성
IRBuilder&lt;&gt; Builder(Context); // IR생성을 위한 빌더 객체 생성

// Main함수 부분타입 정의 - 타입 int32, 매개변수 false
FunctionType *funcType = FunctionType::get(Type::getInt32Ty(context), false);
Function *mainFunc = Function::Create(funcType, Function::ExternalLinkage, &quot;main&quot;, ModuleOb); // main 함수 생성 (외부 호출 가능)

BasicBlock *entry = BasicBlock::Create(Context, &quot;entry&quot;, mainFunc); // main함수 entry 생성 - 코드가 실행될 시작부분
Builder.SetInsertPoint(entry); // 빌더 insert위치 entry로 설정

Value *returnValue = ConstantInt::get(Type::getInt32Ty(Context), 0); // 정수 0 생성 - int32
Builder.CreateRet(returnValue); // return 생성

ModuleOb-&gt;print(outs(), nullptr); // 만들어진 IR을 출력
delete ModuleOb; // 메모리 누수 방지!
return 0 // 종료</code></pre><p>✅이제 코드를 완성하였으니 실행을 해봅시다.</p>
<h3 id="컴파일--실행">컴파일 &amp;&amp; 실행</h3>
<p>이제 실행을 위해 LLVM라이브러리 링크를하자
cmd창에 </p>
<pre><code>clang++ generate_ir.cpp -o generate_ir `llvm-config --cxxflags --ldflags --libs core` -std=c++17</code></pre><p>를 입력하면
<img src="https://velog.velcdn.com/images/lee_homin11/post/62133933-bcb0-47e8-b94d-3f8aaea07cb6/image.png" alt="">
정상작동 하는 경우
<img src="https://velog.velcdn.com/images/lee_homin11/post/948e2b23-8f7f-422c-a0ca-26ed85e6dc17/image.png" alt="">
generate_ir파일이 생성된 것을 확인할 수 있다.</p>
<p>👍생성되었다면 컴파일은 완료된 것이다!</p>
<p>이제 실행을 해보자</p>
<pre><code>./generate_ir</code></pre><p>커맨드에 입력하면 된다.</p>
<p><img src="https://velog.velcdn.com/images/lee_homin11/post/bc5bd0c1-573d-4d48-8bd6-8b823cf0e8ea/image.png" alt="">
🎉LLVM IR을 생성하는 프로그램을 완성하였다!🎉</p>
<p>다음시간에는 IR을 파일로 생성하여 저장하고, 실행하는 부분을 공부해볼 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[RUST STUDY ]]></title>
            <link>https://velog.io/@lee_homin11/RUST-STUDY</link>
            <guid>https://velog.io/@lee_homin11/RUST-STUDY</guid>
            <pubDate>Fri, 21 Mar 2025 14:10:37 GMT</pubDate>
            <description><![CDATA[<h1 id="rust">RUST?</h1>
<blockquote>
<p>RUST는 메모리 안전성, 성능 및 편의점에 중점을 두었고,
시스템 프로그래밍, 웹 개발, 임베디드 시스템 등 여러가지 분야에서 널리 사용되고 있는 언어이다.</p>
</blockquote>
<p>여러 분야에서 사용한다는점, 그리고 위에 설명에는 없지만 저수준 언어(C/C++)의 성능을 유지 하면서 <strong>메모리 안전성, 스레드 안전성</strong>을 보장하는 언어이다🫢</p>
<h1 id="install💻">INSTALL💻</h1>
<p>RUST를 다운 받으려면 <a href="https://www.rust-lang.org/tools/install">여기</a>를 누르면 된다.</p>
<p><em>위 사이트에 접속하면 아래와 같은 커맨드가 보인다.</em>
<img src="https://velog.velcdn.com/images/lee_homin11/post/9b614d84-bcea-4af3-b70d-a28c51b04b12/image.png" alt="">
이제 저 명령어를 복사하여 커맨드에 붙여넣으면 된다.
<img src="https://velog.velcdn.com/images/lee_homin11/post/fdf6a6c6-0cf0-4ff4-832f-79444476d772/image.png" alt=""></p>
<h3 id="✅다운이-완료되었다">✅다운이 완료되었다!</h3>
<p><del>만약 다운이 제대로 되었는지 확인하고 싶으면?</del></p>
<pre><code>rustc -- version</code></pre><p><del>을 터미널에 입력하자</del></p>
<p>이제 RUST를 사용하는 방법에 대해 알아보자</p>
<h1 id="term">TERM</h1>
<h3 id="📄프로젝트를-만들자">📄프로젝트를 만들자!</h3>
<pre><code>cargo new {프로젝트-이름}</code></pre><p>위 명령어를 터미널에 입력하면 프로젝트가 생성 된다.
<img src="https://velog.velcdn.com/images/lee_homin11/post/3a6b4bdd-3f70-470e-94d7-522955789054/image.png" alt=""></p>
<pre><code>생성 되었는지 확인하는 코드
[프로젝트를 생성할 폴더에 cd 한 다음] 예) % cd rust
% find . -type f | grep -v /.git</code></pre><p><img src="https://velog.velcdn.com/images/lee_homin11/post/b81e752a-0962-4b5b-a763-72ed185871ba/image.png" alt="생성 되었는지 확인">
아까 정한 프로젝트 폴더 안에 Cargo.toml와 main.rs가 생성된 것이 보인다.
생성을 했으니 이제 실행을 해서 작동이 되는지 확인해 보자</p>
<h1 id="run-rust">RUN RUST</h1>
<h3 id="🏃실행을-해보자">🏃실행을 해보자</h3>
<p>우선 실행을 하기 위해서는 아까 생성했던 폴더로 들어가야 한다.</p>
<pre><code>cd {프로젝트-이름}
예) % cd hello-world</code></pre><p>생성한 폴더로 들어갔다면 아래 코드를 통해서 실행할 수 있다.</p>
<pre><code>// RUST 실행
% cargo run</code></pre><p>실행할 경우 아래와 같이 </p>
<blockquote>
<p>Compiling hello-world v0.1.0 (/Users/1eehomin/rust/hello-world)
    Finished <code>dev</code> profile [unoptimized + debuginfo] target(s) in 4.38s
     Running <code>target/debug/hello-world</code>
Hello, world!</p>
</blockquote>
<p>이런 메시지가 출력이 되면 정상으로 작동하는 것이다!
<img src="https://velog.velcdn.com/images/lee_homin11/post/940afefe-ec06-4413-ad49-c7e3489280b9/image.png" alt="">
정상작동 하는것을 확인하였으면 이제 수정하는 방법을 알아보자</p>
<h1 id="edit">EDIT</h1>
<h3 id="📝코드를-수정해보자">📝코드를 수정해보자!</h3>
<p>코드가 적혀있는 파일은</p>
<pre><code>{프로젝트-이름}/src/main.rs</code></pre><p>에 적혀있기 때문에 main.rs를 수정하면 된다!
작성을 하기 위해 터미널로 간다음</p>
<pre><code>% vi src/main.rs
또는
% vim src/main.rs</code></pre><p>위에 있는 명령어중 골라서 사용하면 된다.
위 명령어 입력시
<img src="https://velog.velcdn.com/images/lee_homin11/post/5c74cb46-c356-47fd-ad5b-680895c6d98c/image.png" alt="">
💡아까 출력되었던 Hello, world!가 보이는 것을 확인할 수 있다.</p>
<blockquote>
<p>C는 int main()을 사용하고 Java는 public static void main() 과 같은 main 메서드를 정의하는 문구를 사용하는데 RUST는 fn main()인 것을 확인할 수 있다!</p>
</blockquote>
<p>이제 저 코드를 수정해볼 차례
<img src="https://velog.velcdn.com/images/lee_homin11/post/95fc28c2-adb0-43c1-82f2-9dcfff7414b0/image.png" alt="">
간단하게 Hello, world!부분을 지우고 RUST IS BEST!를 입력하였다. 
코드를 수정하였으면 :q 또는 :wq를 사용해 코드를 저장해준다.</p>
<p>이제 코드가 제대로 저장되었는지 확인을 위해</p>
<pre><code>% cat src/main.rs</code></pre><p>를 입력하자
<img src="https://velog.velcdn.com/images/lee_homin11/post/2d79295d-2bf2-4fcc-a691-5cb4cf2d673d/image.png" alt=""></p>
<h3 id="😎저장이-된-것을-확인할-수-있다">😎저장이 된 것을 확인할 수 있다.</h3>
<p>이제 다음 차례로 넘어가자!</p>
<h1 id="build">BUILD!</h1>
<h3 id="🧱빌드를-하자">🧱빌드를 하자!</h3>
<pre><code>% cargo build</code></pre><p>위 명령어를 입력하면 아래 사진과 같이 나올 것이다.
<img src="https://velog.velcdn.com/images/lee_homin11/post/f8cfc61e-d90d-47ed-88a3-7d5c6017ec54/image.png" alt=""></p>
<h4 id="💻그러면-빌드가-완료된-것이다">💻그러면 빌드가 완료된 것이다!</h4>
<p>이제 마지막으로 정상작동하는지 실행을 해보자🥳</p>
<h1 id="run-again">RUN AGAIN!</h1>
<h3 id="💯오늘의-마지막-단계이다">💯오늘의 마지막 단계이다</h3>
<pre><code>% cargo run</code></pre><p>을 입력하여 내가 수정한 RUST 코드를 실행시키자
<img src="https://velog.velcdn.com/images/lee_homin11/post/ef46a0ea-33c2-49e5-8e51-682276eb6e96/image.png" alt="">
RUST IS BEST!가 출력이 되는 것을 알 수 있다.</p>
<p>이것으로 RUST기초 부분을 공부해 보았다.👍</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[FiSH SHELL]]></title>
            <link>https://velog.io/@lee_homin11/FiSH-SHELL</link>
            <guid>https://velog.io/@lee_homin11/FiSH-SHELL</guid>
            <pubDate>Thu, 18 Apr 2024 11:28:21 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/lee_homin11/post/0b86493b-0a78-421a-9c8e-01f520a99b45/image.jpg" alt=""></p>
<h1 id="iterm를-쓰면서-테마를-원한다">iterm를 쓰면서 테마를 원한다?</h1>
<p>[Fish shell] 이라는 것을 소개합니다.</p>
<p><img src="https://velog.velcdn.com/images/lee_homin11/post/6431fba2-02fb-48b3-bbd0-d533ef2817f3/image.png" alt="">
iterm을 쓰고 있는사람들 중에 zsh로 자신만의 iterm을 커스텀할수가 있다.</p>
<p>나도 사용은 하고 있지만 커스텀 할수 있는것중에서 다른거 없나? 하고 찾아보다가 fish shell을 찾았다.</p>
<p><a href="https://fishshell.com/">공식사이트</a></p>
<p><img src="https://velog.velcdn.com/images/lee_homin11/post/b064fbd8-32e3-4e14-b70a-041bd9a892cb/image.png" alt="">
테마가 완전 내 취향이라서 바로 다운을 하였다.</p>
<p>다운하는 방법은 여러가지가 존재하지만 homebrew를 사용하여 다운하는 것이 가장 쉽다.</p>
<pre><code>$ homebrew install fish</code></pre><p>또는</p>
<pre><code>$ homebrew i fish</code></pre><p>를 사용하여 다운할수 있다.
하지만 바로 적용되는것이 아니다.
터미널창에서 fish를 입력시 적용이 된다.</p>
<p><img src="https://velog.velcdn.com/images/lee_homin11/post/f2d3d07b-7655-4c17-a9fc-1e0263ecd789/image.png" alt="">
&quot;아주 좋구만.&quot;</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[개발 공부]Firebase google login]]></title>
            <link>https://velog.io/@lee_homin11/%EA%B0%9C%EB%B0%9C-%EA%B3%B5%EB%B6%80Firebase-google-login</link>
            <guid>https://velog.io/@lee_homin11/%EA%B0%9C%EB%B0%9C-%EA%B3%B5%EB%B6%80Firebase-google-login</guid>
            <pubDate>Tue, 05 Mar 2024 11:17:08 GMT</pubDate>
            <description><![CDATA[<p><img src="blob:https://velog.io/bf6eed60-a1b7-405e-b480-8edfaa8f9808" alt=""></p>
<h2 id="firebase-sdk-추가">Firebase SDK 추가</h2>
<pre><code>% npm install firebase</code></pre><p>터미널 창에서 입력하면 된다.
<img src="https://velog.velcdn.com/images/lee_homin11/post/add1cc0f-24f5-4e79-8b1b-428176418cd7/image.png" alt="package.json"></p>
<p>firebase가 다운된것을 확인할수 있다. - <em>package.json</em></p>
<details>package.json이 안보이는데요?


<p>  package.json이 안보이면</p>
<pre><code>$ npm init</code></pre><p>터미널 창에 입력하면 된다.</p>
</details>

<h2 id="firebase-authentication">firebase Authentication</h2>
<p>firebase에서 Authentication을 이용하여 로그인기능을 사용할수 있다.
<img src="https://velog.velcdn.com/images/lee_homin11/post/6990d705-530e-4e62-ab55-bf8c3cf20afc/image.png" alt="login_method">
위 사진 말고도 SMS 다중 인증 기능도 있다.</p>
<h2 id="google">Google</h2>
<p><img src="https://velog.velcdn.com/images/lee_homin11/post/b299ee82-3bd5-4cf6-840c-45598c6f056a/image.png" alt="Google_login">
구글을 사용해 볼것이다.
우선 구글 제공업체 객체의 인스턴스 생성 코드를 js에다가 입력한다.
[웹 모듈식이다!]</p>
<pre><code>import { GoogleAuthProvider } from &quot;firebase/auth&quot;;

const provider = new GoogleAuthProvider();</code></pre><details>
<summary>추가 세팅(안해도 됨)------------</summary>

<h4 id="oauth로그인할때-사용되는-보안-프로토콜의-범위를-지정-addscope호출">OAuth(로그인할때 사용되는 보안 프로토콜)의 범위를 지정, addScope호출</h4>
<pre><code>provider.addScope(&#39;https://www.googleapis.com/auth/contacts.readonly&#39;);</code></pre><h4 id="oauth과정에서-사용자가-선호하는-언어로-현지화">OAuth과정에서 사용자가 선호하는 언어로 현지화</h4>
<pre><code>import { getAuth } from &quot;firebase/auth&quot;;
const auth = getAuth();
auth.languageCode = &#39;it&#39;;</code></pre><h4 id="제공업체-매개변수-추가-저장-setcustomparameters-호출">제공업체 매개변수 추가 저장, setCustomParameters 호출</h4>
<pre><code>provider.setCustomParameters({
  &#39;login_hint&#39;: &#39;user@example.com&#39;
});</code></pre><p>추가 세팅(안해도됨)-----------</p>
</details>

<h2 id="google-객체-사용하여-firebase-인증">Google 객체 사용하여 Firebase 인증</h2>
<p>팝업 창을 띄우고, 로그인 할수도 있는 기능</p>
<ul>
<li>signInWithPopup 호출<pre><code>import { getAuth, signInWithPopup, GoogleAuthProvider } from &quot;firebase/auth&quot;;
</code></pre></li>
</ul>
<p>const auth = getAuth();
signInWithPopup(auth, provider)
  .then((result) =&gt; {
    const credential = GoogleAuthProvider.credentialFromResult(result);
    const token = credential.accessToken;
    const user = result.user;
    getAdditionalUserInfo(result)
  }).catch((error) =&gt; {
    const errorCode = error.code;
    const errorMessage = error.message;
    const email = error.customData.email;
    const credential = GoogleAuthProvider.credentialFromError(error);
  });</p>
<pre><code>


</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[🐉 LLVM 맛보기 🐉]]></title>
            <link>https://velog.io/@lee_homin11/LLVM-%EB%A7%9B%EB%B3%B4%EA%B8%B0</link>
            <guid>https://velog.io/@lee_homin11/LLVM-%EB%A7%9B%EB%B3%B4%EA%B8%B0</guid>
            <pubDate>Tue, 09 Jan 2024 10:58:21 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/lee_homin11/post/a4a7b4ed-787a-4c19-8e1f-31595d264220/image.png" alt="">
LLVM - 오픈 소스 컴파일러 프로젝트의 이름.
(Low-Level Virtual Machine의 약자)
여러군데 찾아보면서 도움이 되는 자료를 가져와 봤다.</p>
<p><a href="https://llvm.org/">LLVM 공식 사이트</a>, <a href="https://github.com/llvm/llvm-project">LLVM 깃허브</a></p>
<blockquote>
</blockquote>
<p><strong>우선 첫번째로 LLVM 환경을 만들어보자.</strong></p>
<pre><code>$ mkdir eva =-llvm
$ cd eva-llvm
$ clang++ --version</code></pre><p>그리고 LLVM를 설치한다.</p>
<pre><code>$ sudo port install llvm-16 
// 16은 version</code></pre><p><a href="https://releases.llvm.org/">버전</a>은 16으로 다운하였다.</p>
<p>LLVM 버전 선택코드</p>
<pre><code>$ port select —list llvm</code></pre><h4 id="버전선택-시스템에-사용되도록-적용">버전선택, 시스템에 사용되도록 적용</h4>
<pre><code>$ sudo port select --set llvm mp-llvm-16
$ llc --version  // llc 확인</code></pre><blockquote>
<p>test.cpp 파일 생성</p>
</blockquote>
<p>test.cpp파일을 만들어보자 (c++)</p>
<pre><code>$ touch test.cpp  //파일 생성
$ clang++ -S -emit-llvm test.cpp //test.cpp을 IR로 변환
$ clang++ -o test test.ll //test.ll파일 IR로 변환된거 컴파일, 실행한 파일 test 생성
$ lli --version //lli 확인</code></pre><p>LLVM 인터프리터 실행</p>
<pre><code>$ lli test.ll</code></pre><pre><code>=LLVM IR=

target datalayout = ...
</code></pre><p>(상)데이터 레이아웃 문자열 = 메모리 레이아웃 표현 =&gt; 정렬, 데이터 구조 크기 endian(엔디언) 크기, 더 자세히 알아보고 싶으면 [여기] (<a href="https://llvm.org/docs/LangRef.html)%EB%A1%9C">https://llvm.org/docs/LangRef.html)로</a></p>
<p>(하) 최소한의 LLVM IR 프로그램</p>
<pre><code>=LLVM IR=

define i32 @main(){
  ret i32 42
}</code></pre><p>컴파일, 출력 그리고 ./test 종료 코드 </p>
<pre><code>$ clang++ -o test test.ll; ./test; echo $?

[echo $? =&gt; 이전명령어 종료 코드]</code></pre><p>그러면 이제는 LLVM어셈블리 코드를 바이너리형식의 LLVM 비트코드로 변환해보자</p>
<pre><code>$ llvm-as test.ll

test.bc 파일 생성</code></pre><p>LLVM 비트코드를 읽고 해당 코드 텍스트 형식의 LLVM 어셈블리로 변환, 저장</p>
<pre><code>$ llvm-dis test.bc -o test-2.ll</code></pre><p>c++ 컴파일러 사용, test.ll파일에 있는 LLVM IR코드를 어셈블리코드로 변환</p>
<pre><code>$ llvm-dis test.bc -o test-2.ll</code></pre>]]></description>
        </item>
    </channel>
</rss>