프로그래밍

프로그래밍 언어론 1장

CodeHS 2024. 11. 8. 23:54

1. 교과목 소개와 특성

  • 프로그래밍 언어들의 개념적 기초
  • 각 언어가 가진 특징과 장점
  • 운영체제, 하드웨어 시스템과의 연계성
  • 문제 해결을 위한 최적의 언어 선택 방법

2. 컴퓨터 시스템의 기초

2.1 컴퓨터의 5대 장치

  1. 연산장치
  2. 제어장치
  3. 기억장치
  4. 입력장치
  5. 출력장치

2.2 최초의 컴퓨터 시스템

  • ABC 컴퓨터 (1943년)
    • Atanasoff와 Berry가 설계
    • 최초의 전자식 컴퓨터
    • ABC = Atanasoff-Berry Computer
  • ENIAC (1946년)
    • 대포 탄도 계산용으로 개발
    • 2차 세계대전 중 개발 시작
  • 폰 노이만 구조 (1948년)
    • 현대 컴퓨터의 기본 구조 확립
    • 프로그램 내장 방식 도입
    • 현재까지 사용되는 기본 구조

3. 프로그래밍 언어의 정의

3.1 기본 정의

  • 컴퓨터와의 의사소통을 위한 표현법
  • 계산을 기술하는 형식적 표현 체계
  • 기계가 읽을 수 있고 사람도 이해할 수 있는 형식

3.2 자연어와 인공어의 차이

  1. 자연어
    • 자연 발생적으로 생성
    • 시간과 지역에 따라 변화
    • 한국어, 영어 등의 일반 언어
  2. 인공어(프로그래밍 언어)
    • 인위적으로 설계
    • 명확한 문법 규칙
    • 모호성이 없는 의미 전달

4. 프로그래밍 언어 학습의 중요성

4.1 학습의 필요성

  1. 기존 언어에 대한 깊은 이해
  2. 효율적인 프로그래밍 능력 향상
  3. 적절한 언어 선택 능력 개발
  4. 새로운 언어 학습의 용이성
  5. 언어 설계 능력 기초 습득

4.2 언어와 사고의 관계

  • 프로그래밍 언어는 사고방식과 밀접한 관련
  • 컴퓨터에 대한 이해와 프로그래밍 능력은 상호 연관
  • 언어 이해를 통한 컴퓨터 활용 능력 향상

5. 프로그래밍 언어의 역사적 발전

5.1 초기 발전

  • 1957-58년: 최초의 고급 프로그래밍 언어
  • 하드와이어드 시스템에서 프로그램 내장 방식으로 발전
  • 어셈블리어의 등장과 발전

5.2 현대적 발전

  • 현재까지 약 260여 개의 프로그래밍 언어 개발
  • 객체지향 프로그래밍의 등장과 발전
  • 하드웨어 발전에 따른 언어의 진화

프로그래밍 언어의 학습과 진화

1. 프로그래밍 언어의 발전 배경

1.1 시대적/환경적 변화

  • 하드웨어 환경 변화에 따른 요구사항 진화
  • 프로그래밍 언어 설계 개념의 지속적 변화
  • 전산학의 기본 법칙과 개념의 정형화 진행 중
  • 일부 근본적 문제들은 여전히 논쟁 중

2. 프로그래밍 언어의 형식적 정의

2.1 역사적 발전 과정

  1. 1940년대 이전
    • 하드와이어드 방식 (전선 연결 방식)
    • 초기 프로그래밍 개념의 태동
  2. 1940년대 후반
    • 폰 노이만 방식의 프로그래밍 개념 등장
    • 프로그램 내장 방식(Stored Program) 도입
    • CPU 실행 가능한 기계어 명령 코드 체계 확립
  3. 어셈블리 언어의 등장
    • 기계어 코딩의 어려움 해소
    • 심볼 기반 프로그래밍 도입
    • 기계 종속적, 저급 수준 추상화
    • 읽고 쓰기의 어려움 존재
  4. 고급 언어의 출현
    • 높은 수준의 추상화 도입
    • 일상적 표현 방식 채택
    • 주요 특징:
      • 간단하고 이해하기 쉬운 표현
      • 하드웨어 독립성(포터빌리티)
      • 배정문, 반복문, 선택문 기본 구조

2.2 문맥 자유 언어(Context-Free Language)

  • 현대 프로그래밍 언어의 기반
  • 4가지 문법 클래스 중 3번째 단계
  • 스택 자료구조 활용
  • 정규 문법(Regular Grammar)과 함께 현대 프로그래밍 언어 정의

3. 프로그래밍 언어의 특성

3.1 기계 가독성(Machine Readable)

  • 효과적인 기계어 번역 가능
  • 제한된 시간 내 번역 실행
  • CPU 실행 가능한 코드 생성

3.2 인간 가독성(Human Readable)

  • 기계 독립적 추상성 제공
  • 자연어에 가까운 표현 방식
  • 번역 과정 필요성

3.3 지역성(Locality)

  • 대형 프로그램의 판독성 문제 해결
  • 부분적 이해 가능성 제공
  • 함수 단위 프로그래밍 지원
  • 운영체제 지역성 개념과 연관

3.4 개발 환경 통합

  • 소프트웨어 개발 환경 포함 추세
  • 통합 개발 환경(IDE) 중심
  • 다중 언어 지원 (예: Visual Studio)

4. 프로그래밍 언어 학습의 중요성

4.1 언어 이해 증진

  • 현재 사용 중인 언어의 깊은 이해
  • 효율적 알고리즘 작성 능력 향상
  • 다양한 언어 특징 비교 분석

4.2 프로그래밍 능력 향상

  • 유용한 프로그래밍 구사 능력 배양
  • 풍부한 프로그래밍 어휘력 확보
  • 다양한 구현 기술 습득

4.3 언어 선택 능력

  • 문제에 적합한 언어 선택
  • 효율적 문제 해결 방법 결정
  • 새로운 언어 학습 용이성

프로그래밍 언어의 추상화 개념

1. 추상화의 기본 개념

1.1 추상화의 정의

  • 주어진 작업이나 객체를 필요한 속성들의 일부분만으로 묘사하는 방법
  • 현대 프로그래밍 언어의 핵심 개념
  • 불필요한 세부사항을 감추고 필수적인 특징만 표현

1.2 추상화의 예시: “사람” 개념

  • 기본적 특징: 외형(눈, 코, 귀, 손발 등)
  • 기능적 특징: 먹기, 말하기, 걷기 등
  • 상세 특성 생략: 분자 구조, 정확한 체내 수분 비율 등
  • 필수적 속성만으로 개념 표현

2. 추상화의 주요 분류

2.1 자료 추상화 (Data Abstraction)

  1. 기본적 추상화
    • 컴퓨터 내부 자료 표현
    • 메모리 관리(변수 사용)
    • 이진수의 10진수 표현
  2. 구조적 추상화
    • 배열(Array)
    • 구조체(Struct)
    • 레코드(Record)
  3. 단위 추상화
    • 클래스 정의
    • 모듈화
    • 패키지 구성

2.2 제어 추상화 (Control Abstraction)

  1. 기본적 추상화
    • 기본 명령어 그룹화
    • 고수준 명령어 표현
    • 예: x = x + 1, goto 문
  2. 구조적 추상화
    • 제어 구조: if문, switch-case문
    • 반복 구조: for, while, do-while
    • 함수 호출 체계
  3. 단위 추상화
    • 프로시저(함수 포함)
    • 라이브러리 함수
    • 수학 함수(sin, cos 등)

3. 추상화의 현대적 발전

3.1 병행 프로그래밍

  • 동기화(Synchronization) 개념
  • 통신 메커니즘
  • 코루틴, 태스크, 프로세스

3.2 컴포넌트 프로그래밍

  • 재사용 가능한 컴포넌트
  • 모듈화된 설계
  • 인터페이스 기반 통신

4. 추상화의 실제 적용

4.1 객체 지향 프로그래밍

  • 클래스를 통한 추상화 구현
  • 인스턴스(객체)를 통한 실체화
  • 예: 사람 클래스와 실제 개인(객체)

4.2 식별자 시스템

  • 이름을 통한 객체 구분
  • 고유 식별자 필요성(예: 주민등록번호)
  • 중복 방지 메커니즘

5. 추상화의 이점

  1. 가독성(Readability) 향상
    • 코드의 이해도 증가
    • 유지보수 용이성
    • 신뢰도 향상
  2. 모듈화 용이
    • 기능별 분리 가능
    • 재사용성 증가
    • 확장성 향상
  3. 복잡성 관리
    • 필수 정보만 노출
    • 불필요한 세부사항 은닉
    • 전체 시스템의 단순화

'프로그래밍' 카테고리의 다른 글

프로그래밍 언어론 3장  (4) 2024.11.11
프로그래밍 언어론 2장  (2) 2024.11.10