분류는 단어가 의미하는 대로 데이터를 나누는 것을 의미합니다. 분류에 대한 이해를 하기 위해서 아이리스의 예제를 한번 살펴보겠습니다.

꽃잎의 너비와 높이 데이터를 이용해 주어진 아이리스가 Sentosa, Virginica, Versicolor 3 종류 중 어떤 품중에 속하는지를 판별해야 한다고 가정을 해봅시다. 이 문제는 저번 포스트에서 설명한 회귀와는 다르게 어떤 값을 예측하는 것이 아니고 어떤 종류에 속하는지를 파악하는 문제입니다. 회귀 문제와 마찬가지로 분류 역시 산점도를 그려 아이리스 품종별로 꽃잎의 너비와 높이가 어떤 관계가 있는지를 파악해야 합니다.

 

 

 

 

위의 그림을 살펴보면 Sentosa 품종은 화면에 네모로 왼쪽 아래에 위치하고, Virginica는 원으로 오른쪽 위에 위치하며, 그 중간에 삼각형으로 Versicolor 품종이 있음을 알 수 있습니다. 해결하려는 문제는 주어진 꽃잎의 너비와 데이터만으로 어떤 품종인지를 파악하는 것이므로 3가지 품종을 구분하는 방법이 필요합니다. 만약 어떤 모델이 있고 이 모델을 이용해 꽃잎의 너비와 높이에 따라 품종을 구분할 수 있게 된다면 새로운 데이터로 너비와 높이 데이터만을 입력해도 품종을 구분할 수 있습니다.

 

 

 

 

위의 그림과 같이 2개의 선을 이용해 Sentosa, Virginica, Versicolor로 영역을 나눈 다음 새롭게 주어진 데이터가 3개의 영역 중 어디에 위치하는지를 안다면 자연스럽게 아이리스 품종을 분류할 수 있습니다. 따라서 분류는 주어진 데이터들을 이용해 아이리스를 잘 구분 지을 수 있는 2개의 'Y = aX + b ' 를 찾는 것이라 할 수 있습니다.

분류는 이와 같은 과정을 거쳐 데이터를 구분할 수 있게 하는 것으로 머신러닝에서 매우 광범위하게 사용되고 있기도 합니다. 회귀는 연속적인 데이터(Continuous Data)에 적용할 수 있지만, 분류는 범주형 데이터 (Categorical Data)에 적용할 수 있습니다.

분류 문제의 예는 아래와 같습니다.

* 스팸메일 분류

* 이미지 인식

* 음성 인식

* 질병 발생 여부 판별

 


 

※ 오늘은 '분류(Classification)'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 인공지능, 머신러닝 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#인공지능 #컴퓨터공학 #AI #머신러닝 #분류 #범주형데이터 #Classification

 

 

 

※ 애자일 개발의 장점

모두 완성하지 않아도 완성된 업무 프로세스부터 순차적으로 현장에서 데모를 하고 실제로 조작하면서 사용의 편리성을 확인할 수 있습니다. 문자나 그림으로 그린 종이 사양서를 가지고 상상하는 것이 아니라 좋고 나쁨을 직관적으로 판단할 수 있으므로 개선을 위한 피드백을 정확하고 신속하게 처리할 수 있습니다.

비즈니스 상 중요한 업무 프로세스부터 완성시켜 1 ~ 2주 단위로 계속해서 사용자에게 릴리즈를 검증 받습니다. 릴리즈 때마다 이전 릴리즈의 수정과 테스트를 반복하므로 중요한 부분일수록 빠른 단계에서 반복 검증할 수 있어 버그를 철저히 수정할 수 있습니다. 개발 후반부가 되면 업무 프로세스의 중요도가 낮아지므로 문제가 발생해도 전체에 대한 영향을 최소한으로 줄일 수 있고 전체적으로 고품질의 시스템을 만들 수 있습니다.

애자일 개발에서의 업무 프로세스 단위화

 

업무 프로세스 단위로 만들기 때문에 사양 동결은 1 ~ 2 주가 걸리므로 도중에 사양이나 우선순위가 바뀌어도 아직 착수하지 않은 업무 프로세스라면 쉽게 바꿀 수 있고 변경 요구도 유연하게 대처할 수 있습니다.

 


 

결과적으로 단기간에 고품질의 변경이 용이한 개발을 실현할 수 있습니다. 애자일 개발의 목적을 정리하면 다음 3가지로 압축할 수 있습니다.

1) 예측할 수 없는 미래를 추측으로 정하지 않고 정말로 사용할 시스템만 만듦으로써 쓸데 없는 개발 투자를 막습니다.

2) 실제로 움직이는 '현물'을 확인하면서 현장이 납득하여 사용할 수 있는 시스템을 실현합니다.

3) 납득할 수 있는 예산과 기간 안에서 최선의 기능과 최고의 품질을 실현합니다.

'IT와 하나 된 비즈니스'에 대한 비중이 높아지는 지금 IT 비즈니스 요구에 대한 즉각적인 대응력은 지금보다 중요해질 것입니다. 그런 의미에서도 애자일 개발이 주목받고 있습니다.

 


 

※ 오늘은 소프트웨어 공학의 기초인 '애자일 개발의 장점'에 대하여 알아보았습니다.

 

이 포스트는 학부에서 제공하는 기본적인 컴퓨터, 소프트웨어 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 컴퓨터, 소프트웨어 공학,프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

 

#컴퓨터공학#소프트웨어공학#애자일개발#애자일개발의장점#효율극대화

 

 

워터풀형 개발 방법론(폭포수 개발 방법론)

 

기존에는 만들어야 할 시스템의 요건을 모두 정한 후에 개발을 시작하는 '워터풀형 개발'이 주류였지만, 이 방법으로는 대응할 수 없는 사태가 늘고 있습니다. 그래서 주목을 받고 있는 것이 애자일 개발입니다.

워터풀형 개발에서는 '전부 만드는 것'을 전제로 하여, 사용자의 요건이 모두 정해지지 않으면 개발에 착수할 수 없습니다. '반드시 사용한다', '사용할 것 같다', '장래에 사용할지도 모른다' 등을 고려하여 사양을 굳혀 갑니다. 개발은 기능 단위로 진행하는데, 기능이란 입력 화면, 장표 인쇄, 집계 등 일련의 업무처리를 구현하는 부품입니다. 이러한 것을 나눠서 만든 후 나중에 모두 연결하여 처리의 흐름을 만듭니다.

따라서 모든 기능을 완성시키고 연결하기 전까지는 현장 사용자에게 사용해 보라고 할 수가 없습니다. 또한, 만들기 시작하면 도중에 변경하는 것이 어려우며, 일단 전부를 다 만드는 것이 우선시됩니다. 변경이나 품질 보증은 코드를 전부 다 쓴 마지막에 확인하고 대처해야 합니다.

애자일 개발 방법론

 

한편 애자일 개발은 '전부 만들지 않는다'는 것을 전제로 합니다. 이 점이 워터풀 개발과 본질적으로 다른 점으로, 애자일 개발은 '업무상 필요성이 높은 프로세스를 선별하여 우선순위를 정하고, 정말로 사용할 업무 프로세스만 만들자'라는 개념입니다.

여기서 말하는 업무 프로세스는 '출하 지시 버튼을 누르면 창고 출하 전표가 인쇄되어 출력된다', '경비 전산 장표에 데이터를 입력하면 경리 부서에 데이터가 전달된다'와 같이 하나로 연결된 업무의 흐름입니다. 이를 '업무 수행하는 데 있어서 중요도가 높은 순서'로 우선순위를 정해 순차적으로 개발해 갑니다. '필요한지 아닌지 모르겠다', '있으면 좋을지 모르겠다'라는 만들지 않는 것이 좋습니다.

반복형 개발 (Iterative development)

 

지속적 통합 과정 (Continuous integration)

 

하나의 업무 프로세스는 1~2주일 정도에 개발할 수 있는 규모로 하여 대략의 개발 기간과 필요한 인원을 계획하여 개발을 시작합니다. 그리고 '반복형 개발(Iterative Development)'나 '지속적인 통합(Continuous Integration)이라는 기법을 사용하여 비즈니스 요구에 즉시 대응하고 있습니다.


 

※ 오늘은 소프트웨어 공학의 기초인 '애자일 개발'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 컴퓨터, 소프트웨어 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 컴퓨터, 소프트웨어 공학,프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #소프트웨어공학 #애자일개발 #반복형개발 #지속적인통합 #효율극대화 #업무프로세스최적화

 

XP의 창시자 켄트 백의 TDD

 

TDD란 도대체 무엇일까?

어떤 의미를 가진 약자일까?

도대체 이게 개발하고 무슨 관련이 있는 것일까?

 

XP(eXtreme Programming) 창시자 중 한명이자, TDD를 주도한 켄트 백은 TDD를 소개한 자신의 책에서 "프로그램을 작성하기 전에 테스트를 먼저 작성하는 것"이라고 테스트 주도개발을 정의하였습니다. 프로그램을 작성하지도 않았는데, 테스트를 먼저 하라는 것은 무슨 의미인지 어리둥절했습니다.

 

 

"프로그램을 작성하기 전에 테스트를 먼저 하라! Test the program before you write it! " by 켄트 백

 

 


 

"업무 코드를 작성하기 전에 테스트 코드를 먼저 만드는 것"

 

 

 

코드를 검증하는 테스트 코드를 먼저 만든 다음에 실제 작성해야 하는 프로그램 코드작성에 들어가라는 뜻입니다. 최초에는 테스트 우선 개발 (Test First Development)이라고 불렸으나 지금은 테스트 주도 개발 (Test-Driven Development, TDD)이라 불립니다. 테스트 코드를 작성한다는 TDD의 정의가 다소 과격하게 들릴 수도 있지만, 메소드나 함수 같은 프로그램 모듈을 작성할 때 '작성 종료조건을 먼저 정해놓고 코딩을 시작한다'는 의미로 받아들이면 편합니다.

 

예를 들어, 2개의 숫자 합을 구해서 반환하는 SUM이라는 메소드를 작성한다고 가정해봅시다.

 

 

 

 

위의 표는 만들고자 하는 메소드를 일종의 설계문서(Spec)처럼 간단히 적어본 모습입니다. 사실 이러한 형식은 굳이 TDD라는 용어를 꺼내지 않더라도, 우리가 프로그램을 작성할 때 머릿속으로 생각하는 내용과 별반 다르지 않습니다.

 

다만 '문서로 만들어 머리로 생각하고 눈으로 확인할 것인가?' 아니면 '예상결과를 코드로 표현해놓고 해당 코드가 자동으로 판단하게 할 것인가?' 의 차이가 있습니다. 예를 들면 위의 설계 문서에 따라 sum 메소드를 작성할 때, 코드를 정상적으로 구현됐는지를 판단하는 방법을 선택한다면 아래와 같은 코드로도 작업할 수 있습니다.

 

 

 

 

위의 예제는 main 메소드를 테스트 메소드 처럼 사용했습니다. sum 메소드는 컴파일 에러만 나지 않도록 해놓고, 내부는 비어 있는 상태입니다. sum 메소드를 먼저 구현한 다음에 테스트를 할 수도 있지만, 그렇게 하지 않고 검증코드를 먼저 만들어놓았습니다. 그 검증코드에 해당되는 테스트 케이스를 모두 만족하면, 즉 main 메소드의 실행 결과가 모두 true로 나오면 sum 메소드가 정상적으로 작성됐다고 판단하기로 한 것입니다.

 

명시적인 코드로 개발 종료조건을 정해놓은 것입니다. 이런 식의 개발 접근 방식이 바로 TDD입니다. 무언가 특별한 테크닉이나 테스트 프레임워크를 써야 TDD일 것 같지만 그렇지 않습니다. 테스트 케이스 작성으로 구현을 시작하는 것, 그게 바로 TDD방식입니다.

 


 

이 포스트는 학부에서 제공하는 기본적인 컴퓨터, 소프트웨어 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 컴퓨터, 소프트웨어 공학, 프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

 

#컴퓨터공학 #소프트웨어공학 #프로그래밍 #공대공부 #TDD #테스트주도개발 #개발방법론

 

네이버 금융

 

※ 시세

 

시세란 시가와 같은 말로 그 당시의 가격을 말합니다. 시세에 관련된 용어는 주식시장으로만 한정이 되는 것이 아니라 채권, 환율, 원자재, 유가, 금리 등 시장을 통해 시세가 형성되면 어느 분야라 할 것 없이 동일하게 사용할 수 있습니다.

 


 

 

출처: 네이버 금융 시세정보

 

 

 

1) 현재의 시점에서 시세를 설명할 때

상승: 전날(전장)에 비해 시세가 오르면 '상승' 했다고 표현합니다. 보통 2% 미만의 상승을 말합니다.

하락: 전날(전장)에 비해 시세가 내리면 '하락' 했다고 합니다. 보통 2% 미만의 하락을 말합니다. 하락을 나타내는 표현은 상승보다 더 다양합니다.

ex) "다우지수가 하락했다", "다우지수 내렸다", "다우지수가 밀렸다", 다우지수가 떨어졌다"

급등: 전날(전장)에 비해 시세가 보통 2~4%대까지 상승할 때 '급등'이라고 합니다.

급락: 전날(전장)에 비해 시세가 보통 2~4%까지 하락할 때 '급락'이라고 합니다.

폭등: 전날(전장)에 비해 시세가 보통 5% 이상 상승할 때 '폭등'이라고 합니다.

폭락: 전날(전장)에 비해 시세가 보통 5% 이상 하락할 때 '폭락'이라고 합니다.

급. 등락과 폭. 등락 사이의 기준이 5%인 것은 일반적으로 사용되는 기준이고, 정해진 것은 아닙니다. 따라서 신문, TV 등의 매체에서는 기자들의 의도에 따라 다르게 표현될 수 있습니다. 하지만 보통 급. 등락보다는 폭. 등락이 더 과도한 변동성을 표현하는 것은 거의 똑같다고 볼 수 있습니다.


 

반면 전날에 비해 시세가 거의 변화가 없을 때는 다음과 같이 표현할 수 있습니다.

보합: 전날(전장)에 비해 시세의 변동이 거의 없는 경우 '보합'이라고 합니다.

강보합: 전날(전장)에 비해 시세의 변화가 거의 없지만 약간 상승했을 때는 '강보합'이라고 합니다.

ex) "유가 배럴당 79달러 강보합, 2달러 올라"라는 식으로 표현할 수 있습니다.

약보합: 전날(전장)에 비해 시세 변화가 거의 없지만 약간 하락했을 때는 '약보합'이라고 합니다.

ex) "유가 배럴당 75달러 약보합, 2달러 내려"라는 식으로 표현할 수 있습니다.

 


 

2) 일관된 흐름을 설명할 때

일정하게 지속된 흐름을 표현할 때는 앞의 표현들에 보통 '~세'를 붙입니다. 이를 '추세'라고 하며, 경제기사에는 '모멘텀(momentum)'이라는 말도 자주 쓰입니다. 예를 들면 상승세, 하락세, 강세, 약세, 급등세, 급락세, 폭등세, 폭락세, 보합세 등으로 표현합니다.

추세의 경우는 일정의 흐름을 표현하는 것이므로 앞서 설명한 현재 시점에서의 시세 표현처럼 % 등락폭에 대한 정확한 기준이 있는 것은 아닙니다. 대체적으로 일정 기간 동안 시세의 흐름이 완만히 상승하면 '상승세' 혹은 '강세'라고 표현하고, 과도하게 오르면 '급등세' 혹은 '폭등세'라고 표현합니다.

반대로 완만히 하락하면 '하락세' 혹은 '약세'락 표현하고, 크게 하락하면 '급락세' 혹은 '폭락세'라고 표현합니다. 또 큰 변화가 없는 시세의 흐름을 보인다면 '보합세'라고 말합니다.


 

※ 오늘도 쉽고 재밌게 주식용어 공부를 통해 '시세에 관련된 용어'에 대해서 설명하였고, 다음 포스트에서는 시세에 변화가 생기고, 방향성이 제한되는 경우에 관한 용어들을 더욱 세부적으로 다룰 예정입니다.

#주식공부 #주식용어공부 #주식초보 #주식투자 #경제공부 #금융공부 #쉽고재밌게공부 #공부정리 #네이버증권 #해외지수 #코스닥 #코스피

 

 


 

'흐름도'는 작업의 흐름을 의미합니다. 즉, 알고리즘을 표현하기 위한 다이어그램의 일종으로, 여러 가지 종류의 기호들을 화살표로 연결하여 나타냅니다. 흐름도는 알고리즘이 그러하듯이 프로그램을 위해 만들어진 것은 아닙니다.

 


 

프랭크 길브레스(Frank Gilbreth)

 

프로세스(Process) 또는 작업의 흐름을 구조적으로 표현하기 위한 방법인 흐름도는 1921년 프랭크 

길브레스(Frank Gilbreth)에 의해 소개되었습니다. 소개될 당시에는 '프로세스 흐름도(Process Flow Chart)라는 이름로 불렸습니다. 이후 흐름도는 1940년대에 이루어 허먼 골드스틴(Herman Goldstine)과 존 폰 노이만(John Von Neumann)에 의해 컴퓨터 프로그램 개발을 위한 도구로 사용되기 시작하였습니다.

프로그램을 위한 흐름도가 처음 사용되기 시작할 때는 어셈블리 언어로 프로그램을 작성하기 위한 전단계로 알고리즘을 기술하기 위해 사용되었습니다. 하지만 흐름도는 C언어와 같은 구조적 프로그래밍 언어가 등장하기 이전에 만들어졌기 때문에 문장의 실행 순서가 뒤얽혀있는 스파게티 코드(Spaghetti code)를 만들어 내는 문제점이 있었습니다.

 



 

flowchart symbol / 흐름도 기호

 



흐름도에서는 다양한 기호를 사용합니다. 마이크로소프트 사의 파워포인트를 비롯하여 흐름도 작성을 지원하는 프로그램에서는 흐름도의 표준 기호들을 제공하고 있습니다. 



단말 기호(가장 자리가 둥글다)

단말 기호


1. 단말 (Terminal)

알고리즘의 시작과 끝을 나타내기 위해 사용하는 기호입니다. 흐름도에서 시작과 끝은 반드시 존재하는 것이 좋으며, 가능한 시작과 끝은 하나만 사용하는 것이 알고리즘의 흐름을 파악하는데 용이합니다.

또한, "시작과 끝이 없는 프로그램도 존재할까?" 생각이 들 수도 있습니다. 

 

프로그램의 시작은 반드시 존재합니다. 하지만 끝이 존재하지 않는 프로그램, 동일한 동작을 무한히 되풀이하는 프로그램은 어렵지 않게 찾아볼 수 있습니다. 예를 들면 백화점의 자동문 시스템에는 전원을 내리기 전까지 사람의 접근을 검사하고 문을 여는 동작을 반복하는, 끝나지 않는 프로그램이 설치되어있습니다.

 

 

처리 기호


※ 처리 기호

2. 처리 (Process)

알고리즘의 특정 처리 단계를 나타내기 위해 사용하는 기호입니다. 기호의 내부에는 처리 과정을 기술합니다. 기술되는 내용은 흐름도의 상세 정도에 따라 '100보다 큰 첫 번째 홀수를 구한다.'와 같이 작은 단위의 작업을 표시할 수도 있습니다. 전화로 약속시간을 정하는 경우, 전화번호를 누르는 동작이나 약속시간을 정하기 위해 통화하는 과정 역시 처리 기호로 나타낼 수 있습니다.

데이터 기호



※ 데이터 기호

3. 데이터 (input / output)

입출력이라고도 불리며, 데이터 입출력을 나타내기 위해 사용하는 기호입니다. 현금 인출을 위한 알고리즘에서 비밀번호를 입력하는 과정이나 명세표가 출력되는 과정이 이에 해당합니다.



※ 오늘은 C언어 프로그래밍에서 '흐름도=알고리즘을 표현하는 도구'에 대하여 알아보았습니다.


이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 C 언어 프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.


#컴퓨터공학 #C언어 #C언어프로그래밍 #프로그램 #알고리즘 #컴퓨터의문제해결 #프로그래밍언어 #공대공부 #알고리즘이해 #흐름도 #flowchart #흐름도기호

인공지능의 발전 흐름도

 

CPU 발전 그래프

 

2. 1980 ~ 2000년 : 2차 인공지능 붐과 신경망의 암흑기

1980년대에는 반도체 개발 비용이 낮아지면서 CPU, RAM, 캐시 메모리 용량이 늘어난 대규모 직접회로를 만들 수 있게 되었습니다. 이를 통해 메인 연산 영역에서 다룰 수 있는 데이터의 단위가 달라지고 연산 속도가 빨라졌습니다. CPU 역사에서 자주 언급하는 무어의 법칙이 이때 유명해졌습니다.

이러한 성능 향상을 그냥 두고 볼 연구자들이 아닙니다. 이번에는 국가 차원에서 "컴퓨터의 성능 향상을 고려하는 새로운 인공지능 연구" 라는 관점으로 연구가 이뤄졌습니다. 이는 2차 인공지능 붐으로 연결 되었습니다.

 

 

2차 인공지능 붐은 신경망 연구가 발전했던 시기입니다. 2차 인공지능 붐 전의 신경망 연구에서는 단순 퍼셉트론을 이용한 패턴 인식 알고리즘을 만들었습니다.

 


 

그러나 다음 2가지의 문제로 인기가 시들해진 상태였습니다.

1. 명제 중 1개만 참일 경우를 판단하는 배타적 논리합을 다룰 수 없음

2. 앞에서 설명한 사고범위 문제를 계산할 정도로 컴퓨터 연산 수준이 높지 않음

그런데 2차 인공지는 붐 때는 퍼셉트론의 다중화 (다층 퍼셉트론)와 오차역전파법으로 2가지 문제점을

해결할 수 있게 되었습니다.

하지만 실제 연구한 결과 1980년대의 컴퓨터 연산 성능으로는 사고범위 문제를 해결하기 어렵다는 한계에 도달했습니다.이렇게 1990년대의 인공지능 연구는 암흑기를 맞이합니다.

 

 

인공지능 발전 흐름도

 

 

1) 1960 ~ 1980년 : 전문가 시스템과 1차 인공지능 붐

1950년대 이후 다수의 조건 분기를 사용하는 규칙 기반 자동 판정 프로그램이 발전하기 시작했습니다.

(자동 판정 프로그램은 오늘날까지도 규칙 기반을 기본으로 발전해오고 있었습니다.)

Dendral (전문가 시스템)

 

 

그리고 이 프로그램은 규칙을 이용해 새로운 사실을 탐색하는 추론 엔진과 이를 기반으로 일반인도 기계가 판단한 지식 탐구의 결과를 참고할 수 있도록 하는 전문가 시스템 (expert system)이 등장했습니다. 전문가 시스템은 전문가가 실행하는 조건 판단을 프로그램화해 문제를 처리하는 시스템으로 유명한 전문가 시스템으로는 Dendral이 있습니다. 또한 전문가 시스템은 상용 시스템에 통합되어 1970년대에는 의료현장에서 사용하는 MYCIN 같은 전문가 시스템이 시범적으로 운영되기도 했습니다.

 

에드워드 파이겐바움 (Edward Feigenbaum)

 

 

Dendral은 1965년 Stanford 대학의 에드워드 파이겐바움 (Edward Feigenbaum)등이 개발하기 시작한 인공지능 프로젝트입니다. 아직 알려지지 않은 유기화합물에 질량 분석법을 적용해 화합물의 구조를 파악해서 분석합니다. 원래 화학자가 해야할 일을 자동화한 세계 최초의 전문가 시스템으로 알려져 있습니다.

 

 

이 시기부터 1차 인공지능 붐이 시작되었습니다.

1차 인공지능 붐과 함께 인공지능이 풀어야 할 과제도 논의되기 시작했습니다. 이중 주목할만 한 것으로 1969년 존 매카시(John McCarthy)와 패트릭 헤이즈(Patrick John Hayes)가 제기한 사고범위 문제(frame problem)가 있습니다. 인공지능은 제한된 범위에서만 정보를 처리하므로 실제 발생하는 문제를 모두 처리할 수 없다는 것이 핵심입니다.

 

 

 

 

 

TCP/IP 소켓 프로그래밍에서는 주로 네트워크 프로그램의 개발에 대한 내용을 설명합니다.정보 전달은 정보의 종류와 처리하는 방식에 상관없이 수신자, 송신자, 전령 3 가지 구성요소를 가지고 있습니다. 이중에 전령은 매체의 역할을 하며 송신자와 수신자는 정보를 만들고 해석하는 역할을 하게 됩니다. 예를 들자면 방송은 방송죽 (송신자), 전파 (전령), TV (수신자)가 있어야 합니다.

 

일반적으로 매체는 전령의 역할을 할 뿐 그 자체가 정보를 생산하거나 정보를 해석하지는 않습니다. 그러므로 매체를 통해서 전달된 정보를 저장하고, 분석하고, 분류하기 위한 프로그램이 필요합니다. 인터넷이 생기기 이전의 매체에서는 사람이 중심이 되어 프로그램의 역할을 맡아서 진행하였습니다.

 

 

 

그러나 인터넷 시대인 현재는 사람 대신에 컴퓨터가 그 역할을 맡아서 하고 있습니다. (인간의 역할 100%를 대신 한다는 것은 아닙니다.) 즉 인터넷에서는 네트워크 프로그램이 사람을 대신해서 네트워크로 전달된 정보를 저장, 분석, 처리하고 있습니다.

 

 


 

 

네트워크는 주로 '여러 객체가 얽혀서 정보를 교환하는 시스템' 이라고 말할 수 있습니다. 우리는 주로 사회 혹은 기술적인 분야에서 네트워크란 단어를 많이 듣습니다. 때문에 네트워크는 사람이 만든 인공적인 것이라고 생각할 수 있겠지만, 네트워크는 원래 자연에서 찾아볼 수 있습니다. 네트워크의 예는 생명체의 최소 단위라고 할 수 있는 세포 수준에서도 찾아볼 수 있습니다.

 

 

 

위의 그림을 자세히 보면 각 점은 하나의 정보를 저장할 수 있습니다. 네트워크를 이루지 않을 경우 저장할 수 있는 정보는 매우 한정적이지만, 여섯 점이 모두 서로 연결되어 이를 조합하면 매우 많은 정보를 저장할 수 있습니다. 한 점에서 다른 점으로 갈 수 있는 경로가 매우 다양하기 때문입니다. 또한 경로 하나가 차단되더라도 다른 경로를 이용해서 정보에 접근할 수 있으므로 안정성을 높일 수도 있습니다. 사람의 뇌를 구성하는 뉴런도 이러한 네트워크의 형태로 구성되어 있습니다. 덕분에 그렇게 크지 않은 뇌 (약 1300g)로 엄청난 양의 정보를 안정적으로 저장하고 분석까지 할 수 있습니다.

 

이처럼 네트워크를 구성하면 한정된 공간에서 정보를 더 많이 그리고 더 안정적으로 운용할 수 있습니다. 인류의 문명의 발전에 있어서도 네트워크의 활용이 지대한 영향을 미쳤습니다. 인류의 발전은 네트워크와 함께 하고 있다고 해도 과언이 아닙니다. 인간은 다른 동물에게서 볼 수 없는 사회라는 고도의 정보 네트워크를 구축해서,문화를 일구었습니다. 또한 상하수도망과 도로망도 만들었습니다. 모든 길은 로마로 통한다는 말은 네트워크의 중심이 즉 로마에 있었고, 때문에 로마가 문명의 중심에 있었기 때문입니다.

 

네트워크는 보통 정보를 전달하는 매체에 의해서 한계가 주어집니다. 이러한 한계는 대체로 물리적인 요소들 이었습니다. 도로망, 우편망은 도로 및 차량이 가지는 물리적인 한계가 있습니다. 더 좋은 도로와 더 크고 빠른 교통수단들 덕에 상당히 완화되긴 하였지만 여전히 공간과 시간의 정보전달을 방해하고 있습니다.

 

이런 공간과 시간의 한계는 전기/전자 정보통신 기술의 발전과 함께 허물어지기 시작했습니다. 전화, 라디오, TV로 이어지는 매체의 발전은 대량의 정보를 거의 실시간으로 전송할 수 있게 해줬습니다. 방송망 즉 대중매체가 탄생했기 때문입니다. 그러다가 드디어 컴퓨터를 사용하는 컴퓨터의 네트워크인 '인터넷'이 발명되었고, 20세기 후반에 나타난 인터넷은 '제 3의 물결', '정보통신 혁명'이 일어나며 새로운 산업으로 급성장했습니다.

 


 

※ 오늘은 TCP/IP 소켓 프로그래밍에서 '네트워크 프로그램'에 대하여 알아보았습니다.

 

이 포스트는 학부에서 제공하는 기본적인 컴퓨터 공학 강의와 네트워크 프로그래밍 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 TCP/IP 네트워크프로그래밍 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #TCPIP #소켓프로그래밍 #네트워크프로그래밍 #네트워크 #인터넷

 

 

저번 포스트에서는 어셈블러에 대하여 알아보았습니다. 이번 포스트에서는 프리 프로세서를설명하고 후에 세세한 설명과 예를 통해 풀어나갈 예정입니다.

 

전처리기라고도 불리는 프리 프로세서는 소스 프로그램과 목적 프로그램이 모두 고급 언어인 번역기로, 프로그래밍 언어에 유용한 기능을 추가하여 언어를 확장하는 역할을 합니다.프리 프로세서는 일반적으로 코볼 언어로 작성된 프로그램을 가지고 있지만 코볼 컴파일러가 없는 경우에는 실행할 수 없습니다. 하지만 코볼 컴파일러는 없어도 C 컴파일러가 있다면 실행해볼 수 있습니다.

코볼 언어로 작성된 프로그램을 C 언어로 작성된 프로그램으로 변환하고, C 언어로 변환된 프로그램을C 컴파일러에서 컴파일 및 실행하면 됩니다. 이때 코볼 언어로 작성된 프로그램을 C 언어로 작성된프로그램으로 변환하는 프로그램을 코볼-TO-C 프리프로세서라고 합니다.

 

 

즉 코볼-TO-C 프리프로세서나 C 컴파일러​가 있다면 코볼 컴파일러가 없어도 코볼 언어로 작성된 프로그램을 컴파일하여 실행할 수 있습니다.

 


 

◎ 프리 프로세서의 헤더 파일(header file)이 포함된 파일 포함(file inclusion) 기능

- C 언어에서 사용자가 #include<stdio.h>라는 문장을 작성했다면 프리 프로세서가 컴파일하기 전에 #include<stdio.h>를 삭제하고, 그 자리를 입출력과 관련된 표준 함수 stdio.h의 내용으로 대체합니다.

 

◎ 매크로(Macro) 기능

- 프리 프로세서는 매크로로 정의된 부분에 대해 컴파일하기 전에 매크로의 내용으로 확장시킵니다.

예를 들어#definemax 45는 이 프로그램에서 max가 나타날 때마다 그것을 45로 바꿔줍니다.

 

◎ 조건부 컴파일(Conditional compile) 기능

- 조건부 컴파일은 조건에 따라 소스 프로그램의 일부분을 선택적으로 삽입하거나 삭제하는 기능을 말합니다. 예를 들면아래의 그림과 같습니다.

 

 

 


 

※ 오늘은 '프리 프로세서'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 컴파일러 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학#컴파일러#컴파일러의필요성#프리프로세서

'컴퓨터공학 > 컴파일러' 카테고리의 다른 글

[컴파일러] 어셈블러  (0) 2019.09.29
[컴파일러] 번역기의 종류  (0) 2019.09.29
[컴파일러] 컴파일러는 왜 필요할까?  (0) 2019.09.27

 

 

저번 포스트에서는 번역기의 종류에 대하여 알아보았습니다. 이번 포스트에서는 어셈블러를 설명하고 후에 세세한 설명과 예를 통해 풀어나갈 예정입니다.

어셈블러는 어셈블리어로 작성된 소스 프로그램을 그에 대응하는 기계어로 번역된 목적 프로그램으로 변환해주는 번역기이고, 어셈블리어는 기계어를 사람이 좀 더 이해하기 쉽도록 기호화한 것입니다. 어셈블리 명령어(instruction)는 목적 기계에 따라 다르게 표현되는데 [아래의 그림]에서 예제를 다루어 보았습니다.

 

 


 

※ 어셈블리 명령어의 예

 

 

LOAD R1, a 코드는 변수 a에 있는 값을 레지스터 R1에 적재하라는 것이고, ADD R1, #2 코드는 레지스터 R1에 있는 값과 상수 2를 더하여 레지스터 R1에 저장하라는 것이며, 마지막으로는 STORE b, R1 코드는 레지스터 R1에 저장되어 있는 값을 변수 b에 저장하라는 것이다. 이렇게 하면 치환문 b = a + 2를 계산하는 코드입니다.

어셈블러를 구현하는 방법은 여러 가지가 있는데, 그중에서 가장 많이 사용되면서 가장 간단한 형태는 2-패스(two pass) 어셈블러입니다. 여기서 하나의 패스란 하나의 입력 파일을 단 한 번만 읽는 것으로 구성되는 단위를 말한다. 즉 2-패스 어셈블러는 2개의 패스로 구성됩니다.

첫 번째 패스에서는 메모리를 표시하는 모든 식별자를 찾아내고 그 식별자들을 기호표(symbol table)에 저장합니다. 예를 들어 [어셈블리 명령어의 예]의 코드를 읽으면 [아래의 그림, 예제 2]와 같은 항목을 포함하는 기호표가 만들어집니다. [예제 2]에서는 하나의 단어(word)가 4바이트로 구성되고 각 식별자의 주소가 0바이트부터 시작한다고 가정했습니다.

 

예제 2, [어셈블리어 명령어에 대한 식별자의 어셈블러 기호표]

 

 

두 번째 예제에서는 각 연산 코드를 기계어에서 수행될 수 있는 비트의 표현으로 나타냅니다. 예제 2의 어셈블리 명령어에 대한 가상적인 기계어는 아래의 그림과 같습니다.

 

 

예제 3 [어셈블리어 명령어에 대한 식별자의 어셈블러 기호표]에 대한 기계어

 

 

 

 

예제 3에서 첫 번째 4비트는 명령어로 0001은 LOAD, 0011은 ADD, 0010은 STORE을 나타냅니다. LOAD는 메모리에서 레지스터로 자료를 옮기고, STORE는 레지스터에서 메모리로 자료를 옮깁니다. 그다음 2비트는 레지스터를 표시하는 것으로 여기서 01은 레지스터 1을 의미합니다.

이어서 그다음 2비트는 태그를 나타내는데, 00은 다음의 8비트가 메모리 주소를 가리키는 일반적인 주소 방식(Ordinary Address Mode= 명령의 주소부가 피연산자가 저장되어 있는 기억장치의 주소를 지시) 일 때, 10은 다음의 8비트가 피연산자인 직접 번지 지정 방식(Immediate address mode= 주소의 값 자체가 피연산자)일 때 사용됩니다. *는 각각의 피연산자가 재배치(relocatable) 가능 기계어에서 재배치 비트임을 나타내는 것입니다.

 


 

※ 오늘은 '어셈블러'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 컴파일러 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #컴파일러 #컴파일러의필요성 #어셈블러 #기계어

 

 

지난 포스트에서는 컴파일러의 필요성에 대하여 알아보았습니다. 이번 포스트에서는 번역기의 종류의 큰 틀을 설명하고 후에 세세한 설명과 예를 통해 풀어나갈 예정입니다.

 

번역기는 하나의 프로그래밍 언어로 작성된 프로그램을 그와 동등한 의미를 가진 다른 프로그래밍 언어로 된 프로그램으로 변환하는 프로그램입니다. 이때 입력되는 프로그램을 소스 프로그램(Source Program)이라 하고 소스 프로그램을 기술하는 언어를 소스 언어(Source Language)라고 부릅니다.

또한 출력되는 프로그램을 목적 프로그램(Object Program)이라 하고, 목적 프로그램이라 하고, 목적 프로그램을 기술하는 언어를 목적 언어(Object Language, Target Language)라 합니다.

 


 

번역기의 종류는 아래의 그림과 같이 어셈블러, 컴파일러, 프리프로세서(Preprocessor), 인터프리터(Interpretor)등이 있는데, 이 가운데 가장 대표적인 번역기는 바로 컴파일러입니다.

 

 

 

그림에서 보듯이 어셈블러는 어셈블리어로 작성된 소스 프로그램을 그에 대응하는 기계어로 번역된 목적 프로그램으로 변환해주는 번역기입니다. 그리고 컴파일러는 고급 언어인 C나 코볼로 작성된 소스 프로그램을 그에 대응하는 어셈블리어나 기계어로 번역된 목적 프로그램으로 변환해주는 번역기입니다.

이때 소스 언어가 C이면 C 컴파일러라 하고,소스 언어가 코볼이면 코볼 컴파일러라고 합니다. 마찬가지로 프리프로세서는 프로그래밍 언어에 유용한 기능을 추가하여 언어를 확장하는 역할을 하는 것으로, 소스 프로그램과 목적 프로그램이 모두 고급 언어인 번역기를 말합니다. 한편 인터프리터는 다른 번역기와 달리 문장 단위로 번역과 동시에 실행한 후 그 결과를 출력하는 번역기입니다.

 


 

※ 오늘은 '번역기의 종류'에 대하여 알아보았습니다.

이 포스트는 학부에서 제공하는 기본적인 강의와 책들을 토대로 알기 쉽게 내용을 작성하였습니다. 하지만 계속 더 유익하고 논문 및 전문 서적을 읽어가며 더 추가돼야 할 내용이 있으면 컴파일러 포스트와 콘텐츠들을 계속 고도화하는 방식으로 진행하려고 합니다.

#컴퓨터공학 #컴파일러 #컴파일러의필요성 #번역기의종류

'컴퓨터공학 > 컴파일러' 카테고리의 다른 글

[컴파일러] 프리 프로세서  (0) 2019.09.29
[컴파일러] 어셈블러  (0) 2019.09.29
[컴파일러] 컴파일러는 왜 필요할까?  (0) 2019.09.27

+ Recent posts