본문 바로가기
척척학사/프로그래밍 언어론

프로그래밍 언어의 발전과 동작원리

by 학사쟁이 2023. 8. 19.
반응형
역사를 모르는 민족에게 미래는 없다. 단재 신채호선생

프로그래밍 언어의 발전

컴퓨터 시스템과 운영체제의 발전

 

컴퓨터시스템은 계산을 빠르게 수행하기 위해 발전했다. 계산분야는 문제가 잘 정형화되어있기 때문이다. 오늘날의 컴퓨터와 흡사한 컴퓨터로는 튜링기계가 있다 1936 앨런 튜링이 튜링기계자체를 튜링기계의 입력으로 하는 범용 듀링기계를 만들었다. 그리고 최초 전자식 컴퓨터로 알려진 에니악은 1943~1946년에 제작한 진공관식 전자컴퓨터이고  이보다 약간 앞서 1943~1945년 영국에서 개발된 콜로서스는 암호해독으로 사용되었다.

위의 콜로서스와 에니악은 둘다 전자식이지만 프로그래밍이 되기 어려워서 전자식이라고 보기 어려운 면도 있다. 이러한 저장된 프로그램을 자동으로 수행하는 최초의 컴퓨터는 미국방부에서 1949년 폰노이만이 개발한 에드박이 있다. 프로그램과 처리기가 분리되어 있고 이진수를 도입했다. 

 

  1. 앨런튜닝
  2. 콜로서스
  3. 에니악
  4. 에드박

이러한 상황에서 지금에 운영체제 역활을 직접 사람이 했고 이를 오퍼레이터라고 했다. 초기 운영체제는 오퍼레이터가 하던 방식인 일괄처리 운영체제였고 이는 프로그램을 순서대로 하나씩 처리한다는 뜻이다. 그리고 이후 여러 프로그램을 한 번에 조금씩 수행하는 시분할운영체제가 등장했다 이로 인해 클라이언트 서버방식의 환경과 통신개념이 등장했다. 하나의 서버 컴퓨터에서 여러 터미널이 접속될 수 있는 형태로 사용되었다. 이후 개인용 컴퓨터가 등장해 서버에 비해 초라한 수준이지만 간단한 업무 그리고 그래픽 기능이 좋아져 비디오게임이 등장하게 된다. 초기 pc에 운영체제는 DOS였고 그다음은 GUO환경을 가진 매킨토시와 윈도가 탄생했다. 서버 운영체제 역시 GUI를 도입해 X윈도 시스템을 사용했고 터미널에서 GUI처리를 하고 서버는 계산한다는 혁신이 있었지만 비싼 이유로 PC에게 자리를 내주었다. 그리고 인터넷상에 웹과 스마트기기를 위한 모바일 운영체제가 새롭게 등장한다. 이로서 개발자들은 여러 플랫폼을 지원해야 하는 부담이 생기게 된다.

오퍼레이터 - 일괄처리시 운영체제 - 시분할 운영체제 - PC등장 - 비디오게임의 발전 - X윈도 서버운영체제와 PC와의 경쟁에서 PC승리 - 웹과 모바일 운영체제 등장

1950년대 초기언어 프로그래밍언어

일괄 프로그래밍 환경과 프로그래밍언어의 발전이 시작되었다. Fortran, LISP, Algol의 등장은 현대언어의 주요 특징은 이들에게서 유래됐다.

  1. Fortran : 수식변환의 약자로 과학 계산에서 사용되는 여러 수식을 어떻게 편리하게 계산할 것인가에 포인트를 둔 언어이다.
  2. Algol : 알고리즘 기술을 위해 ACM-GAMM을 통해 설계뙨언어로 문제 해법, 즉 알고리즘 기술을 위해 개발되었다. 복합문사용으로 제어문 구조화하여 발전시켰고, 알고는 함수와 프로시저로 서브프로그램을 구별하였고 이는 후에 이름 전이라는 특별한 형태의 인수 전달 방법이 생겨나는 발판이 된다.
  3. LISP : 리스트 처리를 위한 언어로 최초의 함수형 언어이다. 초기 인공지능, 기호처리 능력과 재귀로 매우 유명하다. 그리고 쓰레기 수집기를 사용하여 필요 없이 할당된 메모리를 수거하여 메모리를 자동으로 관리하고 안정성을 높인다.

1960년대 프로그래밍 언어의 발전

시분할 환경이 지원되어 여러 명이 피시를 사용했고 이를 공유할 수 있는 기반을 마련했다.

  1. Cobal : 미 해군 그레이스 호퍼가 이끄는 팀에 의해 개발된 사무용 언어이다. 당시 Fortran의 데이터 처리작업을 보완하기 위해 시작되었다. 복합데이터 타입을 나타내기 위한 레코드 개념을 처음 제안했다. PIC X(20)으로 배열 20개를 저장 이런 식으로 표현한다. 오늘날 소수선언을 부동소수점수로 표현하지만 Cobal은 고정소수점수라고 구별하여 부른다.
  2. PL/I : 사무용 과학용 등 여러 언어들에 특징을 묶으려 했으나 너무 복잡해졌다. MILTICS라는 시분할 운영체제를 개발에 사용했는데 역시 매우 복잡해 이때 참여했던  사람이 후에 Unix를 개발하게 된다.
  3. BASIC: 교육용 목적으로 만들어졌으며 마이크로컴퓨터의 등장과 더불어 인기를 얻게 된다. 후에 빌게이츠가 이 언어를 Visual Basic으로 재탄생시킨다.
  4. Simula : 처음으로 등장한 객체지향언어이며 객체, 클래스, 상속 개념을 모두 포함한다. 이것은 시뮬레이션언어여서 반복되는 절차를 코루틴을 통해 상태를 유지하는 프로시저를 개발했다. 후속 객체지향언어에 큰 영향을 끼쳤다.

1970년대 프로그래밍 언어의 단순화

  1. Pascal : 차세대 교육용 언어로 가장 큰 차이점은 구조화된 언어이다. 이로 인해 가독성이 높아 교육용으로 인기가 높았다. 거기에 값전달과 주소전달을 함께 지원했다. 하지만 전체 프로그램을 한파일에 작성해야 해서 모듈 시스템이 부족했다.
  2. C : 진정한 시스템 프로그래밍언어로 시스템 프로그램을 작성하기 위해 개발된 언어라 하드웨어 세부 사항까지 다룰 수 있록 설계되었다. 포인터제공 비트 필드와 연산을 제공하고 union타입과 결합하면 특정 타입의 비트 패턴까지 해석할 수 있다. 간성을 매우 중요해 i++; 와 같은 표현을 사용했다.
  3. Prolog :최초의 논리언어,  인공지능분야를 위해 개발된 언어이다. 연역적 데이터베이스 시스템과 함께 주목받는았다가 점차 시들었다.
  4. Smalltalk : 객체지향언어로 최초로 GUI, 마우스를 도입해서 이벤트 처리를 수행하는 언어이다. 개념과 환경은 급속도로 퍼저나 갔지만 언어자체는 다소 낯설게 느껴지는 부분이 있어 널리 보급되는데 방해가 되었다.
  5. Ada : 미 국방성이 국방용 사용할 언어로 만들었다. 여러 전문가들이 시험을 거쳐 교통제어 상업용 로켓 위성 등에도 사용되고 있다.
  6. ML : ML은 강력한 타입 시스템 덕분에 타입 추론기능을 제공한다. 그래서 타입을 명시하지 않아도 함수나 변수의 타입을 유추할 수 있다.
  7. Scheme : 간결한 LISP로 MIT AI연구실에서 만들어졌다. 그전에 LISP는 동적 영역 규칙은 프로그램의 가독성이 떨어지는 비판이 있었는데 정적영역 규칙을 채택하여 가독성을 높이고 꼬리 재귀호출 최적화를 통해 수행 성능을 향상했다.

1980년대 현대프로그래밍 언어등장

  1. C++ 객체지향으로 변신한 C, 클래스 개념을 C에 도입
  2. Perl : 문자열 처리에 특화된 언어. Unix시스템에서 인기누리던 셸 스크립트등을 도구로 지원하였다. 
  3. Common Lisp : 방대한  LISP통합 함수형 언어 패러다임과 객체지향 패러다임 동시지원
  4. Objective-C : C를 기초로한 객체지향언어의 신호탄 Apple의 애플리케이션 작성언어로 발전

1990년대 이후 프로그래밍 언어의 대중화

  1. Java : 프로그래밍 대중화에 시작, JVM을 바탕으로 어디든 실행가능하다는 장점, 현재 웹에서 주로 사용되는 편이고 이것이 보안된 것이 자바스크립트이다.
  2. JavaScript : 웹프로그래밍 언어 실행목적으로 만들어졌다.
  3. Python : 빠른 프로토타이핑 언어 명령형, 객체지향, 함수형을 아우르는 방식이다. 동적언어를 추구하며 쉽게 배울 수 있는 언어이다.
  4. Haskell : 초기 연구용으로 사용되었다. 순수 함수형 언어이다.

프로그램 동작 원리

컴퓨터 구조, 프로그램 동작 원리

컴퓨터는 하드웨어와 소프트 웨어 두 가지로 구성되며 소프트웨어 실행을 지원하는 것이 하드웨어로 여러 장치의 집합체이다. 연결구조는 버스라는 전송로를 통해 서로 연결되어 있다.

컴퓨터 전원을 켜면 운영체제라는 프로그램을 메모리에 적재한 후 인출-해설-실행주기를 반복한다. 이는 메모리에 적재된 명령어를 CPU로 읽어 들이고 이를 해석하고 실행하는 주기를 뜻한다.

프로그래밍 언어 구현이 필요한 이유

컴퓨터가 수행하는 것은 기계어이다. 사람이 이해하기 어렵고  또한 기기마다 기계어가 다르기 때문에 이식성이 없어 사람이 고급프로그래밍 언어로 만들고 컴파일러를 통해 기계어로 번역하는 방법이 컴파일러이고 각 프로그램의 단위 문장을 기계어로 해석해서 수행하는 것이 인터프리터이다. 

  • 소스 프로그램 : 프로그래머가 작성한 프로그램
  • 목적 프로그램 :  컴퓨터가 하드웨어가 수행할 수 있는 프로그램
  • 실제 작성한 소스 프로그램을 목적 프로그램으로 변환해줘야한다.

쉽게 컴파일은 프로그램은 번역해서 하드웨어에 전달해 주고 인터프리터는 번역하여 자기가 직접 수행을 하는 것을 말한다.  결국엔 인출-해설-실행주기를 위해 도입된 것이 인터프리터이며 고급언어 프로그램을 문장 하나씩 읽어서 수행하고 이때 해석 부담을 줄이기 위해 기계어로 미리 번역하는 프로그램이 컴파일러인 것으로 이 두 가지를 조합한 것이 하이브리드 구현으로 고급언어 프로그램 중간 코드형태로 컴파일하고 이 중간 코드를 가상기계(인터프리터+하드웨어)에서 해석한다.

프로그래밍 언어의 평가기준

프로그래밍 언어의 요구사항인 표현 풍부성 유지보수성 실행 가능성을 효과적으로 지원하기 위해 따라야 하는 프로그래밍 언어 설계 원칙으로는 규칙성, 추상화지원, 복잡도 제어

  • 규칙성 - 언어의 기능을 얼마나 잘 조합될 수 있냐는 문제로 일반성(연관된 기능이 더일반적인 형태로 확장될 수 있는 특성), 직교성(언어의 기능을 자유롭게 조합할 수 있는 특성), 일관성?(비슷한 것을 같은 방식으로 지원하는 특성)에 의해 지원된다.
  • 추상화 지원 - 실세계를 모형화하여 관련된 문제를 풀어야 하기에 간략하게 추상화하여 나타낼 수 있는 기능을 제공해야 하고 또 수행해야 한다.
  • 복잡도 제어 - 복잡한 대상 및 처리방법을 제어하기 위해 모듈, 패키지, 이름 공간등을 통하여 캡슐화 및 모듈화 기능을 제공한다.

평가하는 기준

  • 작성력 : 수식이나 문장, 기능을 쉽게 표현할 수 있는 특성
  • 가독성 : 보고 쉽게 이해할 수 있는 특성
  • 신뢰성 : 오류에 빠질 가능성을 줄이는 특성
  • 직교성 : 언어의 기능이 서로 간섭하지 않고 자유롭게 조합되는 특성
  • 일관성 : 유사한 기능을 같은 형태로 나타낼 수 있는 특성
  • 확장성 : 사용자가 원하는 새로운 기능을 추가할 수 있는 특성
  • 효율성 : 작성된 프로그램이 효율적으로 수행될 수 있도록 하는 특성
  • 유연성 : 프로 그래머가 표현하고 싶은 내용을 유연하게 수용하는 특성
  • 이식성 : 다른 실행환경으로 이전할 수 있는 특성

이러한 평가기준은 상출 될 수 있는데 효율성과 신뢰성 가독성과 작성력 신뢰성과 유연성은 상충되는 측면이 있다 이 둘 사이의 적절한 지점에서 절충해야 한다. 그래서 프로그래밍언어를 선택할 때는 언어 사용 커뮤니티가 활발하고 호의적인지, 언어의 특정 응용분야가 있는지, 새로운 프로그래밍 패러다임을 지원하는지 등을 고려해야 한다.

반응형