Busan IT/제어언어2015. 2. 9. 17:16

프로그래밍 언어의 종류와 역사 그리고 제어문(if)

 

#1. 프로그래밍 언어의 종류와 역사

 

//늦게 들어온 학우들을 위해 그리고 교양을 위해 프로그래밍을 위한 기초에 대해 알아본다.

 

컴퓨터언어 종류와 역사

 

알골, Basic, 포트란, 코볼 등이 1970년 전에 만들어진 주요 프로그래밍 언어이다.

 

GW-Basic은 마이크로스프트사가 컴팩을 위해 개발한 베이직의 일종이다.

 

포트란은 과학 계산 용도로 코볼은 상업 계산을 주 대상으로 한 언어였다.

 

알골은 1950년대 미국에서 만들어진 포트란에 대항하여 유럽을 중심으로 개발된 프로그래밍 언어이다.

 

C형 언어의 주요 언어의 흐름을 보면 C(1972) -> C++(1980) -> Java(1995)로 볼 수 있다.

 

C는 구조적 프로그램이라하고 이것은 절차에 따라 프로그램을 짜는 것이다.

 

객체지향적 언어는 기능 위주로 프로그램을 짜는 것이다.

 

C프로그램에 객체지향을 도입한 것이 C++이고 이를 만든 사람이 Bjarne Stroustrup이다. C를 객체지향으로 만듦으로써 생기는 문제점을 해결하려고 만든 것이 Java이다.

 

RAD(Rapid Application Development) 짧은 시간에 프로그래밍을 만들 수 있게 만들어주는 도구이다. 대표적인 도구로 Visual Basic이 있다.

 

언어계층으로 보면 최하위층부터 기계어, Assembly, C, C++/Java, RAD가 있다.

 

프로그래밍은 단순히 해당 언어의 문법을 배우는 것이 아니라 문법을 활용한 실제 프로그래밍 콘텐츠에 달렸다.

#2. C 문법의 유래

 

컴퓨터 언어들은 다른 언어들로부터 많은 기능을 빌려 오는데 C 또한 파스칼에서 많은 기능을 차용해 왔다.

 

ex) 명령어 끝에 세미콜론이 붙는 것은 파스칼에서 온 것이다.

 

C 문법은 다른 프로그래밍 언어의 문법을 고루 차용해 왔기 때문에, C언어를 익히는 다른 프로그래밍을 언어 문법에 쉽게 적응할 수 있다.

 

변수에 숫자 0이 들어가 있는 것을 null이라고 한다.

#3. 제어문: if/if~else

 

메모리에 0이 들어가 있는 경우를 ASCII 코드로 ‘null'이라고 한다.

 

문자가 나열되다가 ‘0’이 나오는 경우는 문자열이라 하고 문자가 지속되는 경우를 문자배열이라고 한다.

 

문자열을 출력하고 싶은 경우에는 '%s'를 입력하여 문자열을 입력해 주면 된다. 이것은 사람의 편의를 위해 제공된다.

 

// 배열도 Java와 문법이 동일하다.

 

제어문: if/if~else

 

우리가 사용하는 프로그래밍 언어인 C는 순서를 가지고 순차적으로 코딩한 명령어가 시행된다. 이 때 이러한 순서의 흐름을 바꿔주는 역할을 제어문이 수행한다.

 

제어문 'if'을 배우기 전에 우선 논리연산에 대하여 알아보자.

 

논리연산은 참(1)과 거짓(0)을 가지는 연산이다.

 

비교 논리 연산자는 ‘==’이고 이것은 우측과 좌측이 같은지 비교한다.

 

!not이라는 뜻이다.

 

//0이 아니면 다 참으로 본다.

 

대소 연산자를 >, <, >=, <=로 참(1) 또는 거짓(0) 여부를 %d로 출력해 볼 수 있다.

 

선언된 변수에 값이 들어가는 경우는 참으로 인식되고, 값이 들어가지 않은 경우는 거짓으로 인식된다.

 

또한 변수 앞에 !를 붙이는 경우는 해당 변수에 값이 들어갔는지(1) 0이 들어 있는지(0)를 묻는 논리 연산이 되어 버린다.

 

대소 비교 시 ‘=’표시는 항상 오른쪽에 와야 한다.

 

// 대입 연산자를 여러개를 쓸 수 있다.

// ex) iNum3 = iNum2 = iNum1 = 50

 

 

#4. 제어문: if/if~else

 

//printf("%d\n", 2<1);도 논리연산으로 확인해 볼 수 있다.

 

IF

 

문법 :

if () //()안에 논리연산의 내용을 적는다.

{

내용

}//{}안에 참일 때 실행할 내용을 적는다.

 

 

If ~ else

 

if값이 참이 아닐 경우 else를 붙혀 거짓일 경우의 값을 실행한다.

 

문법 :

 

if ()

 

{

 

"내용

}

 

else

 

{

"내용

}

 

 

 

 

반응형

'Busan IT > 제어언어' 카테고리의 다른 글

제어문(if~else, for, while)  (0) 2015.02.11
제어문(if~else, for)  (0) 2015.02.10
실수의 저장방법과 scanf  (0) 2015.02.06
포인터의 개념과 컴퓨터의 데이터 저장 방식  (0) 2015.02.05
포인터 변수의 기초  (0) 2015.02.04
Posted by newind2000
Busan IT/제어언어2015. 2. 6. 17:35

실수의 저장방법과 scanf

 

#1. 컴퓨터의 실수 저장 방법

 

학습목표 - 실수를 32bit IEEE형식으로 바꿀 수 있다.

 

컴퓨터는 자료를 기억하려면 메모리의 설정이 필요하다. 컴퓨터의 메모리는 한정되어 있기 때문에 메모리를 쓰려면 기억 공간을 설정해 주어야 한다. 메모리를 확보하기 위해서 우선 1. 변수 선언을 해주어야 한다. ex) char/short/int/long/float/double

// 이 중에 실수를 저장하는 변수는 floatdouble이다.

이 때 변수는 하나 이상을 생성하게 하기 위해 이름을 넣어주어 같은 형의 변수를 구분해야 한다.

 

IEEE 형식에 따른 4byte 실수의 저장방법을 알아보자. 실수 7.25를 예를 들어 설명해 본다.

 

/*부호는 음과 양을 나타낸다. 음일 때는 1, 양일 때는 0을 갖는다.

지수부는 나타나는 값이 1.*의 형태를 갖게 만드는 지수X가 되도록 X-127이 되게 만드는 X값을 넣는다. 가수부는 1.* 형식에서 *를 넣는다.*/

!! 정규화에 무슨 수를 곱하는지가 나오도록 만들어야 한다.

 

0(부호)/00000000(지수부)/00000000000000000000000(가수부)에서

 

7.25EEEE형식으로 변환하면

1. 부호는 양수 임으로 ‘0’

2. 72진수로 바꾸면 111(2)이고 소수점 이하 자리 0.252진수로 바꾸면

 

0.25 * 2 = 0.5 -> 0

0.5 * 2 = 1.0 -> 1

 

11101을 합치면 111.01이다. 1.* 형식에서 111.01으로 바꿔주려면 2칸 앞으로 이동해야 하기 때문 22승이 되어야 하고 X - 1272가 되게 하는 X129이므로 이것을 2진수로 고치면 10000001이다. 이것을 넣어주면,

 

0(부호)/00000000(지수부)/00000000000000000000000(가수부)

 

0(부호)/10000001(지수부)/11010000000000000000000(가수부)

 

nibble로 나누어 16진수로 표현하면

 

0100/0000/1110/1000/0000/0000/0000/0000

40 / E8 / 00 / 00

A / B / C / D 인데 Big endian 방식임으로

 

D / C / B / A 가 되기 때문에 값은 00 00 E8 40 이 된다.

 



 

 

#2. scanf의 개념과 사용

 

//Double형은 float형의 두 배의 용량을 가짐으로 지수부와 가수부가 영역이 늘어난다.

 

컴퓨터의 입력에 대하여 알아본다.

 

출력(output) - printf

입력(input) - scanf

 

우리는 대표적인 출력 명령어인 printf를 배웠고 이 시간에는 입력의 대표적인 명령어인 scanf에 대해 알아본다.

 

모든 값이 고정되어 버리면 수정 작업이 힘들다. 프로그램의 유연성을 위해서 scanf를 쓴다.

 

scanf의 입력방법

 

scanf("표현형식“, 입력할 곳의 주소); 를 입력하면 된다.

 

실습 - 양의 정수를 넣으면 해당 정수의 구구단이 표현되는 프로그램을 코딩해라)

 



/*간단하게 짤 수 있지만 지난 시간에 배운 것을 종합하여 iNum2를 추가하여 짜보았다.

처음에 구구단 코딩을 하면서 헤맸던 이유는 printf의 체계에 대한 정확한 구조를 이해하지 못해서이다. printf("변수를 표시할 형식 or/and 표시할 단순 정보“, 표시할 형식을 표현할 변수);

추가적으로 scanfscanf("변수를 입력할 형식“, 변수); scanf에서 변수를 입력할 형식은 변환 시켜서는 안된다.

*/

 

 

#3. array 배열

 

같은 이름을 쓰면서 여러 개의 자료를 확보하기 위해서 쓰는 것이 array이다.

 

int Smart[5];를 쓰면 20바이트가 확보된다. 뒤에 [정수]를 해당 형식에 곱을 한 만큼의 개수가 생성되기 때문이다.

 

int Smart[5]; 를 생성하여 주소를 확인해 보면 Smart[0] ~ Smart[4]가 생성되는 해당 주소는 연속으로 붙어있다는 것을 확인할 수 있다.

 

이 때 Smart[2]로 변수선언명령어에서 생성 변수 숫자를 바꾸면 run time error가 난다. 이것은 코드를 잘못 짰다는 표시이다. 때문에 배열을 선언할 때 주의를 해야 한다.

 

C는 직접적으로 CPU와 의사소통을 하기 때문에 잘못된 코딩을 하면 CPU에 영향을 줄 수 있다.

 

실습 - Array 배열)

intchar형식의 변수 여러 개를 선언한 후 값을 넣고 출력해 본다.



 

#4. 문자열 출력

 

문자열(string)을 사용하는 방법을 배운다. 끝에 0이 있으면 문자열이라고 부르고 끝에 0이 없으면 문자 배열(character array)이라고 한다.

 

실습 - 문자열)

character함수 5개를 만들어 문자열을 출력해 본다.

//문자열 출력 표시는 %s이다. ‘s'string의 약자이다.


 

출력 양식에 ‘%s'넣은 후 출력하면 0이 나올 때까지 옆에 있는 자료를 지속적으로 출력한다.

 

문자배열을 쉽게 넣을 수 있는 방법은 큰 따옴표를 써서 연속된 숫자를 적어 주는 것이다. 여기서 주의할 점은 변수의 개수 -1개의 값을 넣어주어야 한다는 것이다. 마지막의 입력값은 0이 되어야 하는데 4개만 넣어주면 컴파일러에서 자동으로 마지막 문자를 0으로 처리하기 때문이다.

 

실습 - 문자열 값 끝에 자동적으로 “0”이 추가되는지 확인해 보고 한글 이름도 출력해 본다.


 

 

반응형
Posted by newind2000
Busan IT/제어언어2015. 2. 5. 17:34

제어언어 - 포인터의 개념과 컴퓨터의 데이터 저장 방식

#1. 포인터의 개념

 

학습목표 - 포인터의 개념을 이해하고 포인터를 사용하여 값을 출력할 수 있다.

 

C에서 unsigned int uiNum; 이라는 코딩을 하게 되면, CPU에서 메모리에게 해당 형식의 변수를 만들고 메모리에 저장시키라고 명령한다. uiNum=88;의 명령어를 입력하면 uiNum88을 대입한다. 이 때 대입연산자 좌우에 형이 동등해야 대입연산자가 작동하게 된다.

 

//변수를 만들 경우 심볼 테이블을 작성하여 값을 쉽게 나타내 볼 수 있다.

//잘못된 코딩의 경우 error/warning의 메시지가 뜨는데 error시 작동이 되지 않고 //warning이 작동은 가능하되 언어에 맞지 않게 작성되었다는 코딩으로 인식한다.

//ex) int 3.9의 경우 소수점을 절삭하고 3만 표시된다.

 

unsigned int *uip;를 입력하면 unsigned int를 대상으로 하는 포인터가 된다.

uip=&uiPNum;을 입력하면 uip&uiNum 둘 다 주소를 나타내는 변수로 형이 같음으로 작동하게 된다.

// *를 적고 변수명을 적으면 주소를 저장하는 포인터 변수가 된다.

// ‘*’asterisk[as-tuh-risk]로 읽는다.



UiNumuiP의 값과 주소를 출력한다. 이 때 *uiP를 입력한다고 가정해보자. 이 때 *곱셈이 아니라 주소를 찾아가라는 뜻으로 인식된다. 이것은 통상적으로 uiPuiNum을 가르킨다고라고 말한다.

 

그러므로, *uiP를 출력하라는 말은

1. *uiP의 값(uiNum)이 나타내는 주소(uiNum의 주소)를 찾아가

2. 이 주소(uiNum의 주소)가 가지는 변수의 값(88)을 출력하라는 뜻이다.

#2. 포인터의 기본개념 복습과 캐스팅

 

학습목표 - 포인터에 대한 완전한 이해와 변수에 값 대입시 표시 방법을 원하는 대로 바꿀 수 있다.

 

실습 - 포인터의 이해)

unsigned int5개의 값을 선언한 후(90, 80, 70, 60, 50) 포인터 변수를 하나 선언하여 *uip값이 모두 선언한 unsigned int의 변수 값을 출력하도록 코딩하여라.




실습 - 캐스트 연산자를 활용한 경고 표시의 제거

1. character함수를 선언하여 255가 넘는 수를 넣고 캐스팅 연산자를 활용하여 warning을 없애본다.

2. unsigned int함수를 선언하여 16진수(12C) 넣고

 

 

//warning이 뜰 경우 사용자가 이것을 인식하고 있음을 표시하기 위해 캐스트 연산자를 사용한다.

 

캐스트 연산자는 1. 묵시적 2. 명시적 캐스팅이 있다.

1. 컴파일러에서 경고는 띄우지만 오류를 내지 않고 실행하는 경우.

2. 사용자가 캐스트 연산자를 활용하여 적어주는 것.

 

실습 - 진수 표시의 변환)

unsigned 변수를 선언하고 16진수 12C를 넣은 후 16진수로 표현해 본다.

 

 

// 16진수 uiNum = 0x12C;

// 8진수 uiNum = 012C;

#3. 컴퓨터의 데이터 저장 방법

 

학습목표 - 컴퓨터의 데이터 저장 방법을 이해한다.

 

컴퓨터는 메모리에 데이터를 어떻게 저장 하는가에 대한 학습

 

실습 - 컴퓨터의 데이터 저장 방법 이해)

16진수로 1부터 8까지의 수를 입력한 후에 2자리씩 출력하는데 매 출력마다 주소에서 1을 더하여 총 4번 출력해 본다.

 




 

컴퓨터는 빠른 산술계산을 위해서 정수는 뒤집어서 저장한다. 대신 대소비교(논리)는 느려진다. PC의 경우에는 숫자를 뒤집어서 넣고 슈퍼컴퓨터는 숫자를 그대로 집어넣는다. 산술과 논리는 양립한다.

 

컴퓨터 용어로써 숫자를 뒤집어 넣는 방식을 little endian이라고 부른다. 숫자를 그대로 넣는 방식은 big endian이라고 부른다.

 

ucP1씩 더할 때 주소에서 1byte(8bit)씩 커짐으로 16진수(4bit)를 나타내는 자리수에서는 2칸씩 이동하게 된다. 왜냐하면 변수 값에 1을 더하기 때문에

#4. IEEE 형식

 

학습목표 - IEEE를 형식에 맞게 실수를 표현할 수 있다.

 

현재 수업의 초점은 C를 바탕으로 컴퓨터에 대한 이해를 위한 수업이다.

 

float4byte의 실수를 저장하는 명령어이다. 실수를 저장하는 독특한 방법이 있다.

 



 

부호비트(1)/지수부(8)/가수부(23)

 

위와 같은 형태로 바꾸기 위해서는 정규화 과정을 거쳐야 한다.

 

부호비트는 양수일 때 0, 음수일 때 1이고

지수부는 “X-127”형태에서 지수가 1.*인 상태를 맞추기 위한 X의 값을 넣어줘야 한다.

 

 

 

 

 

 

 

 

 

반응형
Posted by newind2000
Busan IT/제어언어2015. 2. 4. 17:35


20150204 - 포인터 변수의 기초.hwp

포인터 변수의 기초

 

학습목표 - 포인터의 개념을 이해하고 심볼 테이블을 만들 수 있다.

 

#1. Pointer - Randomized Base Address

 

보안이 강화되어 DOS에서 주소 값 출력을 요구하면 해당 주소의 값은 지속적으로 바뀌는 현상을 보였다.

 

지난 시간에 Visual Studio에서 Randomized Base Address의 설정을 해지하면 Memory에서 address가 고정되어 나타남을 확인할 수 있다.

 

실습) Visual Studio에서 Randomized Base Address의 설정을 해지한 후 주소 값을 확인해 본다.

 






 


#2. Address값의 직접입력 실습

 

#include <stdio.h>

 

int main()

 

{

int iNum = 100;

 

printf("iNum의값:%d\n", iNum);

printf("iNum의주소:%08X\n", &iNum);

printf("iNum의주소:%p\n", &iNum);

 

return 0;

}

 

위에 과정에 대한 CPUMemory의 처리과정을 설명하면,

1. CPU에서 변수형 int 변수명 iNum 100 선언

2. 메모리에서 해당 변수형, 변수명, 변수값을 메모리에 등록

//단 변수명은 문자임으로 해당 변수가 저장된 메모리의 위치를 숫자로 표현

3. CPU에서 해당 변수의 값과 주소를 불러달라고 요청하면 컴파일러가 이를 해석하여 저장되어 있던 iNum의 주소와 값을 불러온다.

 

인간이 기계가 쓰는 2진수 체계의 언어를 이해하고 구사하기 힘들기 때문에 그 중간역할을 하는 중간언어를 만들어 인간이 기계에게 특수한 과제를 실행하도록 프로그램을 짤 수 있게 만들어 놓았다

//중간언어를 기계어로 번역하기 위해 중간프로그램이 필요하다.

 

변수 iNum는 인간의 인식을 위한 문자이고 실제로 변수는 숫자형태의 주소로 메모리에 저장된다.

 

주소 0012FF28(16진수)10진수 1,244,968이다. 이것을 표현하면 0012FF28=1,244,968인데 이것은 오류를 일으킨다. ‘=’의 명령어는 오른쪽에 있는 것을 왼쪽에 넣는 명령어인데 왼쪽에 위치한 값은 항상 변수이어야 한다.

//오른쪽에는 변수든 상수든 올 수 있다.

 

실습) 변수명 대신에 주소, 1244968을 넣고 변수 값 50을 넣어보자.

 

//연산을 위해 몇 개의 항이 필요한지에 따라 단항 연산자, 다항 연산자로 구분된다.

//사칙연산은 다항 연산자이고, 단순 부호(+/-)는 단항 연산자이다.

//C에서 숫자 앞이나 변수 앞에 ‘*’를 붙이면 주소로 취급된다.

//형식은 (‘변수형’ *)(‘주소’) = ‘변수 값으로 된다.

 

#include <stdio.h>

 

int main()

 

{

int iNum = 100;

 

 

printf("iNum의값:%d\n", iNum);

printf("iNum의주소:%08X\n", &iNum);

printf("iNum의주소:%p\n", &iNum);

 

(int *)(1244968) = 50;

printf("iNum의값:%d\n", iNum);

//(int *)

return 0;

}

 

 

 

#3.

 

포인터의 사용 방법을 지난 시간에 배웠다.

 

실습) 포인터를 사용하여 iNum의 값을 불러와 보자.

 

#include <stdio.h>

 

int main()

 

{

int iNum=100;

 

 

printf("iNum의값:%d\n", iNum);

printf("iNum의주소:%08X\n", &iNum);

printf("iNum의주소:%p\n", &iNum);

 

 

//iNum = 50;

*((int *)(1244968)) = 50;

printf("iNum의값:%d\n", iNum);

 

return 0;

}

 

* 는 주소의 값을 선언하는 변수



실습) int iNum의 값을 99로 설정하고 값과 주소를 출력해 본다.




 

 

 

포인터 변수(Pointer type)

 

메모리의 공간주소를 가리키는 변수를 말한다. 포인터 변수는 주소를 담는 변수이다.

 

자료형마다 포인트 타입이 다 따로 있다.

//왜 자료형마다 포인터의 타입이 따로 있을까? 변수형이 부여하는 byte수의 차이 때문일까?

 

int *int형의 포인터 변수이다.

#4.

 

실습) 인트 변수 iNum=99와 포인터 변수 iP를 설정하고 이것의 주소와 크기를 출력한다.

iP변수를 iNum의 주소로 설정한 후 iNum을 출력해본다.

 



 


<Symbol Table + value>

Style

Name

Address

Value

int

iNum

12FF28

99

int *

iP

12FF1C

12FF28

 

+@

iP주소(=iNum의 주소)77을 넣으면 실제로 77이 표시된다.

*iP = 77;

printf("iNum의값은[%d] 입니다.\n", iNum);

 

결과 값, iNum = 77

반응형
Posted by newind2000
Busan IT/제어언어2015. 2. 3. 17:30


20150203-제어문, 수의 표현 그리고 포인터.hwp

제어문과 수의 표현 그리고 포인터

 

#1. ASCII Code 제어문

 

학습목표 - ASCII Code에서 사용되는 제어문 개념에 대해 이해한다.

 

C프로그램이 어떻게 실행파일을 만들어 내는가에 대해 지난 시간에 학습하였다.

 

C프로그램은 *.exe의 실행파일이 만들어지고, 리눅스에서는 확장자가 없이 표시된다.

 

오늘은 제어문에 대해서 배워본다.

 

* 다음 주 월요일 책 배포 예정

 

printf("%d,c,u,x,o,f)

 

c = 아스키코드를 표현한다.

 

명령어 끝에 엔터(\n)를 넣어줘야 한다. 리눅스 환경에서는 자동으로 엔터를 넣어주지 않기 때문에 리눅스 작성환경을 대비하여 엔터를 넣어주는 습관을 들인다.

 

줄 바꿈과 엔터는 다르다. 줄 바꿈은 다음 줄로 내려오는 것이고, 엔터는 줄을 바꾸고 커서도 제일 앞으로 옮겨주는 역할을 한다.

 

ASCII code(128)

 

0 - 31 (32) : 제어문자

역슬레쉬는 cl에서 해석하지 않는다. \n의 경우 단순히 n으로 해석하지 않고 엔터로 해석한다.

 

도스에서만 10번이 엔터 역할을 한다.(줄 내림, 커서 제일 앞으로 이동)

 

10번은 CR + LF

 

파일명을 bin으로 변경한 후 Visual Studio에서 실행해보면 Magic Number가 나타나고 이것은 파일의 형식을 나타내준다. ex) MZ는 윈도우 파일, BM 비트맵



 

#2. 숫자의 정렬과 표시(실습)

 

 

실습) 1. 3 * 3 = 9%d 3개와 printf 1개를 써서 출력하여라.

2. 구구단을 3단을 전부 적고 1의 자리는 결과 값을 나머지 값들과 같은 자리 수에 표 현 되게 정렬하여라.

3. 실수 3.2의 소수점 2자리까지만 표시되게 출력하여라.




 

%d사이에 숫자를 넣으면 그만큼 공간이 확보된다.

기본은 %와 문자 사이에 숫자를 넣으면 오른쪽으로 밀리게 된다.(왼쪽에 빈공간이 생긴다)

사이에 ‘-’를 붙이면 왼쪽정렬(오른쪽에 빈공간이 생긴다)

표현하는 자리수보다 적은 숫자를 사이에 넣어도 내용은 다 표시된다.

숫자 다음에 점을 찍고 숫자를 넣으면 소수점 이하에 출력하고자하는 자리수를 나타낸다.

 

변수를 대괄호로([]) 넣고 표현하면 감춰진 내용도 볼 수 있다.

#3. 포인터의 주소 표시

 

실습) 1. int iNum=100을 설정하고 printfiNum의 값과 주소(16진수로)를 표시 한다.

 

주소 출력 시 %08X 출력 한다 -> %p로 대체된다.

 

%d, c, f, u, x 는 기본 암기가 필요하다.

 

 

** 해킹 방지를 위해 심볼 테이블의 address는 계속 바뀌지만 CPU에서는 해당 주소를 보고 위치를 알아낼 수 있다.

 

** 원하는 사이트의 IP 주소를 알아내기 위해서는 DOS창에서

ping_‘도메인 주소를 입력하면 된다.

#4. Visual Studio에서 고정 포인터

 

기계어를 이해할수록 짜여진 프로그램에 대해 조작이 가능하다.

 

Java는 사용자가 주소를 건들지 못하게 보호되어 있다.

 

C언어 쪽이 컴퓨터에 대한 이해도가 높아야하며 컴퓨터의 최적화에 알맞다.

 

* JVM(Java Virtual Machine)

 

숫자를 주소 값을 넣는 것을 배운다.

 

조작하는 DOS창을 Console이라고 부르기도 한다. Win32 = window 32bit

 

MFC C++ 윈도우 작성하는 경우

 

Makefile Project는 윈도우 창 작성

 

엠티 프로젝트를 선택하여 창을 연다.

반응형
Posted by newind2000
Busan IT/제어언어2015. 2. 2. 17:13


20150202-컴파일의 단계와 처리.hwp

컴파일의 단계와 처리

 

#1. 지난 주 정리 요약

 

<지난 주 정리>

 

우리는 C언어를 하고 있다.

 

CPU와 메모리의 의사소통 과정을 배우고 있다.

 

변수의 표현방식에 관하여 정수(char, int - short, long)가 있고 이것들은 ‘sizeof'변수로 바이트가 얼마인지 확인해 볼 수 있다.

 

사칙연산(+ - * / %) 형수정자(long, short, unsigned) 명령어(형선언, printf, cast(), 앰퍼센트)

 

메모장으로 c언어를 기입한 후 cl(컴파일러)을 통하여 exe파일을 만들어 실행할 수 있다.

컴파일러는 언어를 번역하는 번역기 역할을 한다.

 

* 번역기는 크게 두 개로 나눌 수 있다. 1. 컴파일러(compiler) 2. 인터프리터(interpretor)

 

exe0,1을 사용하는 이진수로 되어 있다.

 

c언어 기본형을 배웠다.

 

파일은 파일이름.확장자형식으로 표시되고 확장자에 따라 파일형식이 바뀐다.

 

다만 exe는 연결프로그램이 없고 바로 실행되는 파일 형식이다.

 

금일 3교시부터는, 컴파일러가 exe로 바꾸는 단계에 대하여 알아볼 예정이다.

 

exe파일을 2진법으로 보는 방법은 exe파일의 확장명을 bin으로 바꾼 후 Visual Studio에서 드래그에 드롭으로 실행시킨다.

 

Visual Studio 제일 우측에 각 16진수에 해당되는 ASCII코드를 보여준다.

 

해당하는 ASCII코드가 없는 경우 ‘.’으로 찍힐 수 있다.

 

#2 컴파일러와 인터프리터

 

학습목표: 컴파일러와 인터프리터의 기능과 종류를 설명할 수 있다.

 

X.c ->(cl; 컴파일러) X.exe 2진수인 기계어로 번역되고 이것을 binary파일이라고 한다.

구체적으로 C언어를 바꾸어줬기 때문에 C컴파일러라고 부른다.

 

** 인터프리터는 프로그램 언어를 순간순간 해석하여 가동시키는 역할을 한다.

 

X.java ->(컴파일) X.class -> JVM로 실행을 시킨다. 자바는 컴파일러로 거쳐 바로 실행 시킬수 없다. class파일은 가상 CPU파일로 존재한다.

 

Java프로그램의 목적

 

인텔사에서 보급형 컴퓨터용으로 제조한 CPU8088(고급형), 8086(일반형)으로 보급되고 80286, 80386, 80486에서 80586(펜티엄; AMD사와의 모델명 상표권 싸움 이후 문자형으로 고침) 86으로 끝나는 것을 86계열이라고 부른다.

 

AMDIntel의 기계언어를 도입하였다.

 

Intel은 저전력 시장에 진출하지 못하고 ARM이 저전력 CPU를 사용하는 mobile시장을 점유하고 있다.

 

CPU최적화를 원하는 경우는 특정 CPU에 대한 언어에 최적화된 언어로 개발해야 하지만(Firmware)

 

성능이 아닌 프로그램에 집중할 경우에는(게임, java, contents 시장) 해당 소프트웨어를 만드는데 집중하면 된다.

 

Javaapplication용이다. * Java는 커피 원산지의 이름이다.

 

Java는 프로그램을 한번에 해석하는 것이 아니라 순간순간 해석하여 옮기기 때문에 이것을 interpretor라고 한다.

 

C언어로 Window에 바로 돌릴 수도 있지만 FrameworkMiddleware를 활용하여 다른 운영체제에서도 가동 시킬 수 있다. ex) .net

 

* AndroidLinux기반의 프로그램이다.

 

<학습요약>

 

- 컴파일러는 저급 언어를 CPU에서 실행할 수 있도록 binary 형식 실행파일로 바꿔주는 기능을 한다.

 

- CPU기능을 최적화 시키는 목적의 프로그램 작성을 위해서 compiler를 활용하는 저급언어를 활용하고 주로 firmware를 만들 때 쓰인다.

 

- Contents와 상이한 환경에서 구동시키기 위해 interpretor(frameworkmiddleware)를 활용한 프로그램을 개발하기도 하며 게임이 이에 해당된다.

 

#3. CL라인 컴파일의 5단계

 

학습목표 : CL컴파일 과정에 생기는 파일을 생성할 수 있고 그 내용을 설명할 수 있다.

 

Review> Interpretor는 조금씩 해석하여 가동시키는 형태이고 compiler는 완전히 번역 후 가동시키는 형태이다.

 

주석

 

//: 현재 위치로부터 한줄

/* */: 사이에 있는 모든 내용이 주석

 

컴파일의 과정

 

CL라인

 

1. main.c ->(전처리 preprocess) 2. main.i ->(컴파일 compile) 3. main.asm ->(어셈블리 assembly) 4. main.obj ->(링크 link) 5. main.exe

 

1 ~ 3 text file

 

4 ~5는 기계어

 

gcc라인

 

main.c -> main.i -> main.s -> main.e

 

 

명령어에 따라 생성되는 파일이 달라진다.

 

cl /P *.c -> .i

 

cl /c *.c -> .obj

 

cl /Fa *.c -> .asm

 

* tap키를 누르면 해당 폴더에 있는 파일의 이름명을 순차적으로 하나씩 띄워준다

 

전처리과정(preprocess) 컴파일 이전에 명령어를 불러오는 기능을 한다. 전처리 언어는 C언어에 포함되지만 C언어는 아니다. 전처리의 구분은 ‘#’의 포함여부로 달린다.

 

#include <stdio.h> -> ‘#’ 전처리 언어, include <stdio.h>는 명령어를 불러 오는 것이다.

<> 대신에 “”도 쓸 수 있다.

<>는 환경변수에서 경로에서 찾는 것이다.

“”는 현재 위치에 있는 폴더 경로에서 찾는 것이다.

 

stdio.h - stdio 표준입출력(Standard Input Output)

h is for header

<학습 요약>

- 컴파일은 총 4단계를 거친다.

1. 전처리과정(Preprocess; cl /P *.c): 전처리 언어를 불러온다.

2. 컴파일(Compile; cl /c *.c): 전처리가 끝난 파일을 컴파일러한다.

3. 어셈블리(Assembly; cl /Fa): 컴파일된 파일을 어셈블리어로 만든다.

4. 링크(Link): 어셈블리어로 된 obj파일을 link작업을 통해 실행 파일로 만든다.

 

#4. Object파일에서 실행파일(*.exe)

 

학습목표: Obj의 속성과 exe파일로 변환될 때는 차이점을 설명할 수 있다.

 

전처리 과정을 거치면 전처리언어는 해석되고 C언어만 남는다.

전처리 언어를 제외하고 보고 싶다면 전처리과정을 거친 후의 파일을(*.i)을 보면 된다.

 

C언어를 assembly언어로 바꾼 후에 binary로 변경한다.

 

기계어로 만들어진 파일을 object라고 부른다.

 

obj파일을 실행시키려면 window에서 구동시키기 위한 추가 작업이 필요하다. 이를 link(연결)라고 부른다. ex) printf

 

obj도 기계어지만 실행이 불가능하다. obj을 실행파일의 모양을 만드는 것도 link에 속한다.

 

<학습요약>

- Object파일은 기계언어지만 실행은 불가능한 언어이다.

 

- Obj파일이 실행 파일(exe)이 되기 위해서는 ‘link'라는 과정이 필요하고 이는 Visual Studio lib폴더에서 명령어를 끌어와 작성된 언어와 대조후 이를 실행시키는 작업과 실행파일로 옮기는 작업을 거친다.

 

<실습>

 

- 컴파일 5단계에 해당되는 각 각의 파일을 생성하고 안의 내용을 살펴보자.

반응형
Posted by newind2000
Busan IT/제어언어2015. 1. 30. 17:42

수의 출력, 연산 그리고 address

 

학습목표 : 변수형과 형수정자를 조작하여 자유롭게 정수와 실수를 표현할 수 있다.

연산자를 활용하여 정수와 실수를 표현할 수 있다.

심볼테이블과 address를 표현할 수 있다.

 

#1. 정수와 변수형

 

지난 시간 CPU와 메모리 사이의 처리과정을 배웠다.

 

변수를 만들 때 값을 넣음으로써 초기화할 수 있다.

 

어떠한 값을 넣었을 때 특정 값을 나오는 이유를 이해할 수 있어야 한다.

 

실습)257를 입력했을 때와 999를 넣었을 때를 연습해본다. 값이 나오는 논리를 이해한다.

 

숫자 25732bit CPU에서는 0000 0001 0000 0001(16)으로 인식한다.

그러므로 메모리는 01을 가져 오는데 이것은 1임으로 결과창에 1로 표시된다.

 

 

999CPU에서 3E7으로 인식되고 이것은 8bit에서 1110 0111값을 가짐으로 음수임을 알 수 있다.

 

그러므로 여기에 1의 보수를 취하면 0001 1000이고 여기에 1을 더하면 0001 1001임으로 결과값은 -25가 된다.

 

 

Bell사가 전화기로 미국에서 크게 성공하고 벨 연구소를 만든다.

 

벨 연구소에서 슈퍼컴퓨터에 있는 운영체제를 개인적으로 쓸 수 있는 방법을 고안하여 나오는 것이 Unix이다. 통신사에서 쓰는 운영체제는 Unix이다. Unix 연구를 통해 많은 수의 해커들이 양성되고 핀란드인 또 다른 운영체제를 만든 것이 Linux이다. 리눅스 안에 Java엔진이 있고 AndroidJava를 기반으로 돌아가는 프로그램이다. Unix를 개발할 때 쓰인 언어가 C언어이다.

 

C언어의 표준화를 위해 ANSI C를 정립하였다.

 

변수형에서 Int가 기준이 되고 Int를 줄일 때 short (int) 늘릴 때 long (int)를 쓴다.

 

정수는 4가지 타입이 있다.

 

char(1) < short(2) < int(4) < long(4)

#2. ASCII코드와 컴퓨터의 사칙연산

 

형수정자란 기본형의 자료의 형태를 바꿔주는 역할을 하는 명령어이고 여기에는

short long signed unsigned가 있다.

 

표시 형식에 %d가 되어 있으면 signed decimal을 표시하기 때문에 최대수를 넣어봤자 -1이 나온다.

 

이것을 %u로 바꾸면 unsigned의 약자임으로 양수로 표현이 된다.

 

프로그램 작동을 최적화 시키려면 레지스터와 메모리가 일치시켜야 한다. 메모리를 쓰지 않는 경우에도 CPU에서 쓰지 않는 메모리에 대한 제어를 해야 하기 때문에 메모리를 적게 쓴다고 속도가 높아지는 것은 아니다. 하여 변수를 크기를 꼭 줄여야 하는 것은 아니다.

 

C에서 기본적으로 변수의 모양을 정해놓은 것을 기본형이라고 한다.

 

char은 알파벳에 대한 숫자를 저장한다.

 

알파벳에 대한 표시는 그림으로 출력하지만 저장하고 출력하는 것은 숫자이다.

 

charASCII를 사용하기 위해 쓰인다.

 

 

ALT를 누른 상태에서 숫자를 누르면 ASCII(American Standard Code for Information interchange)코드를 테스트할 수 있다.

 

컴퓨터의 사칙연산 + - * /로 표시

 

CPU에서 소수점의 계산은 상당히 복잡하기 때문에 정수로만 표현해준다.

 

연산기호에서 %를 쓰면 나누기 후에 나머지를 표시해준다.

 

실습>> unsigned 방식에서 음수가 나오게 표현시켜보자.

 

컴퓨터는 2진수를 사용하고 인간은 10진수를 사용하기 때문에 소수점의 진수 변환에 대한 문제가 생긴다.

 

10진수에 있는 소수점을 2진수로 바꾸는 방법은 소수점 이상의 수에 대하여 우선 2진수로 변환하고 소수점 이하의 값에 대해서는 *2를 한 다음에 앞에 1이 나오면 1 소수점 뒤에 표시해 준다.

#3. 실수의 표현과 sizeof

 

10진수를 2진수로 고치는 방법

 

첫째자리 0.5 둘째자리 0.25 셋째짜리 0.125...

 

소수점 자리에 곱하기 2를 하여 1로 넘어가는 경우는 소수점 자리에 1을 표시하고 이 숫자가 다 소거될 때까지 계속 2를 곱해준다.

 

실습) 3.5, 0.625, 0.2

 

0.2는 순환소수이기 때문에 저장되지 않는다. 이 같은 경우에는 오차가 생겨난다.

 

실수형을 저장하는 변수형을 float이라고 한다. 크기는 4byte이다. 8byte의 경우에는 double이라는 변수형을 쓴다.

 

실수가 개입되는 경우 컴퓨터의 연산이 느려진다. 때문에 소수점이 없는 경우에는 정수형을 써야 한다.

 

실습) float으로 3.2표시

 

5/3

 

5/3

 

둘 중에 하나면 소수점을 넣어주면 소수점으로 결과 값을 보여준다.(OR logic)

 

Cast연산자(형변환 연산자)

 

둥근 가로로 기본형을 기입하는 방법을 Cast연산자라고 한다.

 

* 현재까지 배운 연산자

 

=, +, -, *, /, %, ()

 

sizeof연산자

 

뒤에 적은 대상의 크기를 알려준다(int 형으로)

 

학습) CPU와 메모리의 의사소통에 대해서 다시 찾아본다.

#4. 여러 종류의 출력 방법과 address

 

문자 출력법 = %c

 

ASCII를 찾는 방법 찾고 싶은 문자를 넣고 %d로 출력한다.

 

여러 가지 문자를 연속으로 출력하는 방법

 

printf("%c%c%d%c\n", 'T','E','S','T');

 

%기호를 넣고 삽입하고 싶은 형태를 넣은 후 입력하면 ‘’,마다 순차적으로 입력한 형태를 표현한다.

 

주소연산자(&, 앰퍼샌드, ampersand)

 

//주석처리하는 명령어

 

심볼테이블

 

Type

Name

Address

int

iNum

1BF7DC

char

cNum

1BF7E3

float

fNum

1BF7D8

 

 

* 위의 처리과정이 CPUMemory에서 어떻게 일어나는 그림으로 그려서 올려야 한다.

 

address.c


char.c


main.c


pmmd.c


sizeof.c


var.c

20150130-수의 출력, 연산 그리고 address.hwp


반응형
Posted by newind2000
Busan IT/제어언어2015. 1. 29. 13:55


20150129-CPU와 BUS.hwp

CPU와 메모리의 의사소통

 

학습목표 : CPU와 메모리간의 의사소통 방식을 이해한다.

 

#1. CPU와 버스

 

CPU와 메모리를 잇는 선들을 버스(BUS)라고 한다.

 

CPU에 용량에 의해 활용할 수 있는 버스선 자체가 결정된다.

버스 선은 CPU가 제어할 수 있는 방의 개수를 한정시킨다.

 

그러므로 CPU용량이 버스 선보다 개수보다 크거나 같은 경우에 CPU의 능력이 발휘될 수 있고 CPU의 용량보다 버스 선의 개수가 많을 경우에는 과부화가 일어난다.

 

그 선의 개수에 따라 8bit, 16bit, 32bit 64bit인데 한 선에 1bit를 보낼 수 있다.

8bit28(0~255, 256개의 데이터를 보낼 수 있다.)

ex) 8bit = 8

 

선당 5V의 전압을 보낼 수 있고, 5V의 전압이 들어간 경우

ex) 5V -> 1, 0V -> 0

 

#2. 심볼테이블과 unsigned

 

CPU가 할당용량의 자리를 찾아가는데 Address를 사용한다. 사용자는 이름으로 지정하고 있지만 컴퓨터는 Address를 사용하여 이를 찾아낸다. CPU는 이것을 표로 만들어 놓는다.

 

CL이 실행을 작성할 시 TypeName을 지정하면 주소를 지정해준다.

ex)

Type

Name(사람)

Address(컴퓨터)

char

Test0

100번지

위의 표를 심볼테이블 이라고 하고 이것은 CL이 만든다.

 

실습>>

 

기본형을 입력 후에 char이라는 변수형을 넣고 이름은 Cnum 값은 3을 입력한다.

 

char cNum;

cNum=3;

과 같다.

 

처음에 값을 넣는 것을 초기화라고 한다.(char cNum=3;)

실수가 많은 부분이라서 처음에 변수형을 만들 때 값을 넣어주는 게 좋다.

 

수를 양수로 적을때는 이것을 양수로 표시하고 싶다는 명령어를 넣어줘야 한다.

-> unsigned

 

 

unsigned 앞에 un을 제거하고 signed를 넣으면 -1이 표시된다.

 

 

#3. 정수의 입력과 CPU의 인식(magnitude방식과 보수방식)

 

정수의 입력에서

변수형

용량

char

1byte

short (int)

2byte

int

4byte

 

 

printf, %d\n에서 ddecimal(10진수), xdecimal hexa(16진수), oocta(8진수)이다.

 

 

흥미롭게도 magnitude방식과 보수방식은 가장 큰 자리에 1이 붙으면 음수로 구분되는 것은 같다.

 

CPURegister의 크기는 버스 크기와 맞물린다. 한 번에 처리할 수 있는 양과 Register의 양과 맞춰야지 회로를 최적화 시킬 수 있다. 그래서 데이터를 주고 받을 때 Register의 크기로 주고 받는다.

 

컴퓨터는 뺄셈을 인식하지 못하기에 뺄셈이 있을 시 보수를 더해줘서 뺄셈 값을 만족시킨다.

 

음수가 필요 없을 시는 unsigned를 써서 사용 하는 것이 CPU처리에 도움이 된다.

 

상황에 맞게 unsignedsigned를 생각하여 설정을 해야 한다.

 

 

 

#4 CPUMemory의 의사소통

 

CPU는 마이너스를 인식하지 못함으로 보수를 사용함으로써 연산을 한다.

예를 들어 32bit 컴퓨터에서 char a=-116진수로 표시하려고 한다.

이 때 메모리에서는 1byte(8=bit)만 선언이 되었기 때문에 ff로 표시가 된다. 이것을 32bit CPU에서 들고 오는 과정에서 32bit CPU는 이것을 ffffffff로 표시한다. 때문에 이것이 printf로 출력되는 경우 ffffffff로 출력되는 것이다.

 

중요한 점은 printf는 메모리에 있는 자료가 아니라 CPU에 있는 자료를 출력하기 때문에 ffffffff를 출력한다. 다시 말해 CPU에 있는 register 값을 출력한다.

<<Summary>>

 

- 사용자는 CPU에 있는 register를 통하여 CPU를 제어할 수 있다. 메모리와 CPU간의 의사소통을 최적화하기 위해서는 registerbit와 버스의 bit를 일치시켜 주어야 한다. bit하나당 하나의 선을 이용하고 5V의 전압을 보내어 보냈을 시 1, 안 보냈을 시 0으로 표시한다.

 

- 컴퓨터는 심볼테이블을 활용하여 각 변수의 형과 위치(address)를 기억한다.

 

- 변수형의 선언과 이름 그리고 값을 넣어주는 것을 초기화라고 부른다.

 

- 정수의 표현방식에 따라 양수만을 표시하고 싶을 때는 unsigned를 변수형 앞에 붙여주고, 양수와 음수 모두를 표현하고 싶을 때는 signed를 붙혀 주지만 기본적으로 signed가 제공되기 때문에 이 같은 경우는 변수형만 선언해주고 초기화시켜주면 된다.

 

- printf시 표현 방식에 따라 8진법 %o, 10진법 %d, 16진법 %x 이다.

 

- 메모리에 있는 값을 출력하는 경우 CPU에 표시되는 값으로 화면에 출력된다.

 

 

반응형
Posted by newind2000
Busan IT/제어언어2015. 1. 28. 22:10

CPU 구성과 컴퓨터의 정수기억방법


학습목표         - CPU 구성 요소와  기능에 대하여 안다.

        - 변수를 코딩하여 출력할  있다.

        - 컴퓨터의 정수 기억방법에 이해하고 양수와 음수를 표현할  있다.



 


 

1. CPU 구성 요소와 기능

 

 CPU(Central Process Unit) 중앙처리장치로써 연산, 제어, 기억, 출력의 기능을 한다. CPU 내부를 물리적으로 두부 자르 잘라서 설명하기는 힘들지만 주요 기능은 크게 3가지로 나뉜다.

 

1) ALU (Arithmetic Logic Unit)

2) CU (Control Unit)

3) Register

 

1) ALU 사칙 연산과 AND/OR 구분하여 연산을 처리하는 기능을 한다.

 

2) CU 명령어를 해독하고 실행하는 기능을 한다.

 

3) Register 기본적으로 기억의 역할을 하고 추가적으로 제어의 기능을 한다. 사용자는 Register 통해 CPU 제어할 있다.

 

2. 변수선언과 코딩

 

메모리에 특정공간을 남겨두는 것을 변수선언이라고 하며 이것의 최소단위는 1byte(=8bit)이다.

저장된 변수를 찾기 위해 특정 변수명을 지정해 주며 사용자는 저장공간의 용량의 따라 아래와 같은 변수선언 명령어를 사용할 있다.

 

Char = 1byte

Short = 2byte

Int = 4byte

 

코딩 , 변수선언은(char, short, int) 명령어 가장 상위에 몰아서 입력해야 한다.

변수 선언은 자료형” “변수명”; 형식을 취한다.

변수명 첫글자는 문자 혹은 언더바(_) 있으며 변수명은 Visual Studio에서 최대 255자까지 가능하다.

 

3. 컴퓨터의 정수기억법

 

컴퓨터의 정수 기억법으로 magnitude방식이 있다. 수를 표현할 때 최상위비트는 부호를 표시하기 위해 사용된다. 이러한 방식을 채택하면 수의 연산이 어려워지는데 이것을 해결하기 위해 아래와 같은 방법을 사용한다.

 

8bit 숫자 표현 방식에서, 0 ~ 127  까지는 원래대로 양의 정수를 표현하고

128~255 음의 정수 -128~-1 표현한다.

 

음의 정수를 이진법으로 바꿔주기 위해서

(1) 1 보수를 취한다.

(2) 2 보수를 취한다.

 

 

<요약 정리>

- CPU ALU, CU, Register 3개의 물리적 공간으로 나뉜다.

- 프로그래머는 register 통해 CPU 제어한다.

- CPU에서 변수는 변수선언에 의해 메모리가 할당되고 byte 다라 char(1), short(2), int(4) 나뉜다.

- 변수는 가장 위에 몰아서 입력해 준다.

- 컴퓨터는 오직 이진법(0, 1) 활용하여 숫자를 기억하고 2진법이 자리를 많이 차지하기에 16진법으로 고쳐쓰는 경우도 있다.

- 정수에서 (-) 표현하기 위해 숫자로 표현가능한 영역을 반으로 나누어 음과 양의 정수로 표현한다.

반응형

'Busan IT > 제어언어' 카테고리의 다른 글

포인터 변수의 기초  (0) 2015.02.04
제어문, 수의 표현 그리고 포인터  (0) 2015.02.03
컴파일의 단계와 처리  (0) 2015.02.02
수의 출력, 연산 그리고 address  (0) 2015.01.30
CPU와 메모리의 의사소통  (0) 2015.01.29
Posted by newind2000