TIL 1/12

김주민·2024년 1월 12일

csapp

목록 보기
1/8

컴퓨터 시스템 ~ 1.3

컴퓨팅 시스템 생각보다 재밌을 듯
용어가 어려워서 자주 찾아보면서 하게 된다.
총체적으로 이해하게 되면 앞으로 코딩할 때 도움이 많이 될듯


hello 프로그램

  • 소스파일 ---> hello.c 텍스트 파일로 저장 ( ASCII 표준을 사용하여 표시)

hello.c 의 표시방법

  • 모든 시스템 내부의 정보(디스크 파일, 메모리 상의 프로그램과 데이터, 네트워크로 전송되는 데이터)가 비트로 표시
  • 서로 다른 객체들을 구분하는 유일한 방법 : 컨텍스트
  • 컨텍스트 : 네트워크로 인해 방대한 정보 네트워크에서 유용한 서비스 및 정보 검색을 위해 필요한 ‘상황 정보’ 또는 ‘정보의 정보’

hello.c --> hello

hello.c : Source Program(text) -> 전처리 Pre-Processor(cpp)
-> hello.i : Modified Source Program(text) -> 컴파일 Compiler(ccl)
-> hello.s : Assembly Program (text) -> 어셈블러 Assembler(as)
-> hello.o : Relocatable object programs(binary) -> 링커 Linker(ld)
-> hello : Executable object program(binary)

전처리 cpp : #으로 시작하는 디렉티브에 따라 수정, #include <studio.h> 헤더 파일인 studio.h를 프로그램 문장에 삽입하라고 지시. -> .i로 끝나는 새로운 C프로그램 생성

컴파일(ccl) : .i 를 .s 로 번역 후 어셈블리어 프로그램 저장.

  • 어셈블리어 : 프로그래밍 언어의 하나, 기계어와 인간어의 중간다리

어셈블리(as) : hello.s를 기계어 인스트럭션으로 번역 후 재배치 가능 목적 프로그램의 형태로 묶어서 hello.o 목적 파일에 결과 저장.

  • hello.o : main 함수의 인스터럭션들을 인코딩하기 위한 17바이트를 포함하는 바이너리 파일
  • 인스트럭션 : 컴퓨터에게 일을 시키는 단위, 기계어로 이뤄진 지시 or 명령

링크(ld) : C 컴파일러에서 제공하는 표준 C 라이브러리에 들어있는 printf 함수 호출. printf 함수는 이미 컴파일된 목적 파일 printf.o에 존재 hello.o와 결합하기 위해서 링커 프로그램이 통합작업 수행. - > 그 결과 hello 파일은 실행가능 목적파일 (실행파이례)로 메모리에 적재되어 시스템에 의해 실행

전처리를 통해 헤더studio.h를 프로그램에 삽입 -> 컴파일을 통해 어셈블리어로 저장 -> 어셈블리를 통해 기계어 인스트럭션으로 번역 -> 링크를 통해 내부의 함수들을 호출하여 통합

컴파일러 시스템 동작의 이해를 통해

  • 프로그램 성능 최적화
  • 링크 에러 이해
  • 보안 약점

추가 용어

  • 컴포넌트 : 특정 기능 수행을 위해 여러 개의 함수를 모아 구성한 작은 기능적 단위
  • 버퍼 오버플로우 : 버퍼에 데이터를 쓰는 소프트웨어가 버퍼의 용량을 초과하여 인접한 메모리 위치를 덮어쓸 때 발생
  • 버퍼 : 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역

알고리즘 ~ N-QUEEN(10%)

2달 정도 쉬고 보니까 기억이 흐릿하다.

공채 끝나고 마음이 너무 꺾여서 알고리즘 공부를 이어하지 않은게 아쉽지만
지나간 일은 어쩔 수 없고

앞으로가 중요할 것 같다.


재귀함수 하노이 까지 풀어봤었어서 그렇게까지 어렵다곤 생각하지 않았었는데

오늘 생각이 바뀌었다.

N-Queen 은 내일 다시 해보는걸로.


골드바흐의 추측

아쉬움이 남는 문제다

# 골드바흐의 추측

import sys

input = sys.stdin.readline

n = int(input())

for i in range(n):
  a = int(input())
  arr = []
  
  for p in range(2, a):
    for q in range(2, p+1):
      if p % q == 0:
        if p == q:
          arr.append(p)
        break
  
  for i in arr:
    for j in arr:
      if i + j == a:
        if i > j:
          break
        print(i, j)

이 코드로 시도했는데 실패했고

코어 학습 시간에 다른 팀원의 풀이를 보고

2로 나눈 두 값을 +-1을 하며 값을 찾아가는 과정을 선택했다.

알고리즘 공부할 때 빠르게 풀려고 하지말고

좀 더 알고리즘을 찾는데 집중해보는게 먼저인듯


자꾸 까먹는데 소수 찾는 거 좀 그만 까먹자


print( end, sep )

end = '' : 출력 후 뒤에 이어서 출력할 내용, 기본적으로 \n 이 있으므로 end='' 로 설정시 줄바꿈 차단
sep = '' : separation, 분리하여 출력 '' 안에 구분자를 넣어서 문자들 사이를 구분 가능, sep='' 로 설정시 띄어쓰기 차단

0개의 댓글