프로그래밍 언어의 요소
- 구문(Syntax)
언어의 문법(Formal grammer)와 언어의 어휘(Voca)로 나뉜다.
- 의미 분석(Semantics)
각 문장이 어떤 뜻인지, 객체는 어떻게 메모리에 할당되는지 분석
- 이름(Name)
영역(Scope), 타입(Type), 생명주기(Lifespan), 가시성(Visibility)등에 묶인 것
- 타입(Type)
수, 문자, 불, 리스트, 트리 등 허용하는 연산 결정이고, 타입오류 감지에 사용된다.
프로그래밍 패러다임
- 명령형
- 객체지향 : 상속, 다형성, 메시지전달 등의 특징을 가짐. ( C#, JAVA 등 )
- 함수형 : 함수 합성, 재귀 등의 특징을 가짐 ( Haskell, Lisp 등 )
- 논리형 : 프로그램을 문제에 대한 제한식으로 표현한 집합. 비결정적임 ( Prolog )
설계 제약사항
- 폰-노이만 구조를 지켜야함.
- 기술적 환경이 자유롭고, 표준을 만들어야 함.
- Legacy System ( 이전 버전에 대한 지원? )
성공적인 언어의 특징
- 단순성과 가독성 : 명령문 개수의 소규모화, 구문구조의 단순함, 배우기 쉽고 작성하기도 쉬움.
- 묶기의 명확성 : 어떤 개체와 성질을 결합하는 것 (변수와 변수의 타입, 변수와 변수의 값 등..)
-> 조기 묶기는 컴파일 시간에 실행되고, 만기 묶기는 실행 시간에 실행된다.
- 신뢰성 : 다른 플랫폼에서 실행해도 같은 결과를 보여주며, 타입 오류를 잘 감지하고 메모리 누수를 방지한다.
- 지원성 : 쉽게 구해서 사용할 수 있는 컴파일러와 IDE가 있고, 양질의 교재, 지침서, 사용자 커뮤니티 등이 있다.
- 추상화
- 직교성 : 상호 독립된 소규모 기본 연산만으로 프로그램을 구축할 수 있음.
-> 함수의 인수타입을 제한하는 등인데, 이로 인해 직교성과 효율성은 반비례하게 된다.
- 구현의 효율성
컴파일러 와 인터프리터
컴파일러(Compiler)
- 컴파일 실행 과정 : 어휘분석 > 구분분석 > 타입검사 > 코드향상 > 코드 생성
- 컴파일러는 기계코드를 만들어서 실행한다.
인터프리터(Interpreter)
- 인터프리터 실행 과정 : 어휘분석 > 구분분석 > 타입검사 > 인터프리터 > 컴퓨터
- 인터프리터는 가상 기계의 명령을 실행한다.
Q. C언어에서의 while(*p++ = *q++) 는 무엇을 의미하는가?
-> String copy(strcpy)