C언어 - 프로그래밍 언어의 문법

이미지
1. 언어의 문법 인간이 사용하는 언어에는 매우 다양한 문법 이 존재하며, 이를 익히는 데에는 많은 시간이 필요하다. 명사, 동사, 시제, 어순 등 매우 많은 문법을 익혀야 한다. 프로그래밍 언어는 컴퓨터에게 무엇을 어떻게 할지 지시하기 위한 명확한 목적을 가진 언어이다. 비교적 적은 수의 문법 요소만으로도 의미의 표현과 실행이 가능하다. 사람이 쓰는 언어와 달리 프로그래밍 언어는 몇 가지 핵심 문법 만 이해하면 바로 사용이 가능하다. 2. C언어 문법 프로그래밍 언어는 다음과 같이 다섯 가지로 구성되어 있다. 변수 - 값을 저장한다. 연산 - 값을 계산한다. 문장 - 내용을 실행한다. 제어 - 실행 순서를 변경한다. 함수 - 여러 문장을 하나로 묶는다. 이 다섯 가지만의 문법만 이해해도 프로그램의 기본 구조를 이해할 수 있다. 2.1. 변수 (Variable) 변수는 값(value)을 저장하는 메모리 공간에 이름 을 부여한 것이다. 프로그램은 변수를 통해 데이터를 기억하고, 참조하고, 변경한다. 2.1.1. 변수 타입(Type) 변수 타입은 변수가 어떤 종류의 값을 저장 하며, 그 값을 어떻게 해석할지를 결정하는 규칙이다. 변수 타입에 의하여 저장 가능한 값의 형태, 메모리 사용 방식, 그리고 허용되는 연산의 종류가 결정된다. int count; count = count + 1 ; // int type stores integer values.   char grade = 'A' ; // char type stores a single character or small integer values.   float ratio = 0.75f ; ratio = ratio * 100.0f ; // float type stores floating-point (real) values. 2.1.2. 상수 상수는 값이 바뀌지 않는 변수 이다. C언어에...

C 언어 - "Hello World!"로 시작하기

이미지
1. C 컴파일러 설치 Linux 환경에서 C 언어 프로그램을 개발하기 위해 가장 널리 사용하는 컴파일러는 GCC(GNU Compiler Collection)이다. 이를 개별적으로 설치할 수도 있지만 개발에 필요한 필수 도구 모음인 build-essential 패키지를 통해 설치하는 것이 효율적이다. $ sudo apt update $ sudo apt install -y build-essential $ gcc --version gcc ... $ make --version GNU Make ... GCC (GNU Compiler Collection) : 리눅스 환경의 표준 C 컴파일러이다.  build-essential : GCC를 포함하여 g++(C++ 컴파일러), make(빌드 자동화 도구), libc6-dev(표준 라이브러리 및 헤더 파일) 등 개발에 필수적인 소프트웨어들을 한 번에 설치해 주는 패키지이다. 2. 첫 번째 프로그램 1978년에 발행된 교재의 첫 번째 예제로 “Hello, world!” 문장을 출력하는 예제가 소개된 이후 , 이 문장은 거의 모든 프로그래밍 언어 The C Programming Language [1] 를 설명하는 교재와 서적에서 가장 기본적인 첫 예제로 사용되고 있다. [출처]  The C Programming Language 2.1. hello.c 먼저 "hello.c" 라는 파일을 생성하고, “Hello, world!” 문장을 출력하는 예제를 작성한다. hello.c #include <stdio.h> main() { printf("Hello, world!\n"); } "hello.c" 파일을 컴파일한다. $ gcc hello.c hello.c:3:1: warning: return type defaults to ‘int’ [-Wimplicit-int] ...

Vibe Coding - 프롬프트를 구조화하는 4가지 방법

이미지
1. Custom Instructions AI를 제대로 활용하기 위한 첫 단계는 ‘ 프롬프트를 잘 만드는 것 ’이다. AI 모델의 응답 품질은 프롬프트 설계에 크게 영향을 받는다. Custom Instructions 는 AI가 응답할 때 항상 참고해야 할 기본 지침을 미리 정의하는 기능이다. 즉, 사용자의 언어 종류, 작업 스타일 등의 반복되는 지침을 지속적으로 반영하게 하는 개인화 설정 이다. 이를 통해 매번 같은 프롬프트를 반복하지 않아도 일관된 스타일을 유지하게 할 수 있다. 1.1. GitHub Copilot GitHub Copilot에서는 프로젝트에서 자동으로 로드되는 지침을 아래 경로의 파일에 작성한다. .github/copilot-instructions.md 1.2. Gemini Code Assist Gemini Code Assist에서는 프로젝트 지침을 아래 파일명으로 사용하고 있다. GEMINI.md 1.3. 작성 예제 Custom Instructions의 목적은 프롬프트를 잘 만드는 것이 아니라, 매번 반복해서 쓰는 요청을 미리 설정 해 두는 것이다. ## 지침 * 질문에 대한 응답은 한국어로 작성한다. * 코드의 주석 및 출력 메시지, 설명은 영문으로 작성한다. 2. Three File System Three File System 은 창업가, 개발자로 활동해 온 라이언 카슨(Ryan Carson) 이 제안한, 프롬프트를 구조적으로 관리하고, 문서화하기 위한 단순하지만 매우 효과적인 방법이다. 2.1. 핵심 개념 프로젝트 관리의 복잡도를 줄이기 위해 모든 프로젝트를 3가지 기본 파일로 단순화 하는 것이다. 이 구조를 통해 프로젝트를 빠르게 시작하고, 유지보수와 AI 학습 부담을 최소화할 수 있다. 프롬프트를 잘 쓰는 방법이라기보다 프롬프트를 잘 관리하는 방법 이라고 할 수 있다. 2.2. 구성 요소 무엇을 배경으로, 어떤 방식으로, 이번에는 무엇을 할지 분리해서 적는...

Vibe Coding - 자연어로 코드를 만든다.

이미지
1. Vibe Coding ‘Vibe Coding’이라는 말은 안드레이 카파시(Andrej Karpathy) 가 2025년 2월 X(트위터)에 올린 글에서 처음 등장한 용어다. OpenAI 공동 창립자이며 테슬라 AI 책임자로 활동한 이력을 가지고 있다. "There's a new kind of coding I call vibe coding, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists." "나는 이것을 ‘바이브 코딩’이라고 부릅니다. 코드를 신경 쓰는 대신, 그저 흐름과 감각에 몸을 맡기고, vibe 자체를 그대로 받아들이는 방식입니다." [출처] X - Andrej Karpathy ‘Vibe Coding’의 주요 개념은 코드를 사람이 직접 타이핑하기보다, AI에게 자연어로 요구하고 AI가 코드를 생성하도록 하는 개발 방식 이다. 마치 리듬을 타며 음악을 만들듯이, 코딩도 ‘vibe’를 타고 리듬과 분위기에 따라 진행하는 방식 을 말하고 있다. 정리하면, Vibe Coding은 ‘AI에게 요청해 개발을 진행하는 방식’ 으로, 인간은 코드 자체보다 결과와 흐름에 집중하는 AI 기반 개발 패러다임이다. 2. Code Assistant Code Assistant 는 사람이 자연어로 지시하면, 그 내용을 바탕으로 코드를 생성하거나 수정해주는 AI 도구를 말한다. 대표적으로 GitHub Copilot, Claude Code, OpenAI Codex, Gemini Code Assist 등이 있다. 이러한 도구들은 개발자가 ‘ 어떻게 ’보다 ‘ 무엇을 ’에 집중하도록 돕는 Vibe Coding 을 지원한다. Code Assist 제공업체 기반 모델 GitHub Copilot - GitHub - Microsoft GPT(GPT-...

실행 파일은 파일은 어떻게 동작하는가

이미지
1. Assembly CPU가 이해하는 기계어는 2진(Binary) 코드 이다. Assembly 는 기계어를 사람이 읽을 수 있도록 문자 형태의 명령어(mnemonic) 로 표현한 것이다.  따라서, 기계어(machine code)와 가장 유사한 프로그래밍 언어는 Assembly 이라고 할 수 있다.  기계어가 어떤 과정으로 실행되는지 확인하기 위하여 간단한 Assembly 프로그램을 살펴보고자 한다.  다음 Assembly 코드는 "2 + 3"의 결과를 출력하는 동작을 한다. ; Ubuntu 24.04 x86-64 (NASM, ELF64) section .data msg db "result: " msg_len equ $ - msg newline db 0x0a section .bss buf resb 1 section .text global _start _start: mov al, 2 add al, 3 mov bl, al mov rax, 1 mov rdi, 1 mov rsi, msg mov rdx, msg_len syscall mov al, bl add al, '0' mov [buf], al mov rax, 1 mov rdi, 1 mov rsi, buf mov rdx, 1 syscall mov rax, 1 mov rdi, 1 mov rsi, newline mov rdx, 1 syscall mov rax, 60 xor rdi, rdi syscall add.asm ...

게이트 회로로 이해하는 컴퓨터 연산

이미지
1. Computer 영화 "히든 피겨스(Hidden Figures, 2016)"는 NASA의 우주 개발 프로젝트를 성공으로 이끈 숨겨진 흑인 여성 계산원의 실화를 다룬 영화이다. 이 영화 속에서 계산원들의 직함은 " computer "이다. 컴퓨터(computer)는 계산을 하는 기계이다. 그런데 어떻게 계산을 수행하는 것일까? 컴퓨터는 수 많은 트랜지스터로 구성된 " Gate Circuit "을 이용하여 논리 연산과 산술 연산을 수행한다. 2. 연산 (Operation) 2.1. Basic 전류가 흐르면( ON ) 전구가 켜지고, 흐르지 않으면( OFF ) 꺼진다. 👉  circuitjs-basic ※ 전류를 흐르게 만드는 전자는 실제 물리적으로는  (–) 에서  (+) 로 이동한다. 그러나 전자의 존재를 알지 못했던 당시, 프랭클린이 ‘전하가 (+)에서 (–)로 움직인다’고 정의한 규칙이 오랫동안 사용되면서, 오늘날에도 전류의 방향은 관례적으로 (+)에서 (–)로 흐르는 것으로 표현한다. 2.2. Transistor 그런데, 반도체(Semiconductor) 라는 것은 전기를 흐르게도 할 수 있고, 흐르지 않게도 할 수 있다. 대표적으로 트랜지스터(Transistor) 는 이러한 반도체의 특성을 이용하여 전류의 흐름을 제어 할수 있다. 👉  circuitjs-transistor 2.3. Gate 트랜지스터(Transistor)를 이용하여 기본 AND, OR, NOT, NOR, XOR 연산을 구현할 수 있다. 이것을 Gate Circuit 라고 하며, 이러한 여러 게이트를 조합하여 복잡한 디지털 논리 회로(Circuit) 를 구성한다. 👉  circuitjs-gate 👉  circuitjs-gate_xor 2.3.1. AND Gate X, Y가 모두 ON 일때 ...

0과 1로 이해하는 컴퓨터 동작

이미지
1. ON/OFF 전구에 전기가 흐르면 전구가 켜지고( ON ), 전기가 흐르지 않으면 전구가 꺼진다( OFF ). 이렇게 컴퓨터는 ON 을 1로, OFF를 0으로 표현하는 이진법( Binary) 을 사용한다.  1.1. Bit 와 Byte 0과 1로 값을 표현하는 최소 단위를 ‘ bit ’라고 한다. (0 또는 1) 8bit는 1byte를 구성하며, 1byte는 문자를 표현하는 기본 단위로 사용된다. 1.2. Char 8bit, 즉 1byte로 영문(ASCII) 문자( char )를 표현한다. 코드를 표현할 때 "00010001" 과 같은 2진수는 길고 읽기 어렵기 때문에, 8bit(1byte)를 두 자리로 나타낼 수 있는 16진수( "0x11" ) 표기를 사용한다.       [출처] Computer Architecture - The ASCII character representations 1.3. Code 문자를 2진 코드로 정의하듯, 실행 코드도 동일한 방식으로 2진 형태로 정의된다. CPU는 이러한 기계어( Assembly )를 기반으로 동작하며, CPU를 설계할 때 정의되는 동작 코드( Instruction Code )는 x86, x64, ARM 등 CPU 아키텍처마다 서로 다르게 구성된다. Instruction Code는 피아노 연주를 위해 사용되는 음표들의 모음과 같다고 할 수 있다.     [출처] Stack Overflow - Intel x86(8086/8088) 16bit Opcode Instruction 1.4. Process CPU에는 Instruction Code를 처리하기 위한 레지스터(Register) 라는 초고속 저장 공간이 있으며, 기계어 코드들은 일련의 과정을 거쳐 레지스터로 전달되어 명령을 실행하게 된다.