컴퓨터 프로그램

Computer program
HTML자바스크립트 언어로 작성된 컴퓨터 프로그램의 소스 코드

컴퓨터 프로그램(computer programm)은 컴퓨터실행하기 위한 프로그래밍 언어일련의 명령어입니다.컴퓨터 프로그램은 소프트웨어의 한 구성 요소로, 문서화와 다른 무형의 구성 요소도 포함합니다.[1]

사람이 읽을 수 있는 형태의 컴퓨터 프로그램을 소스 코드라고 합니다.컴퓨터는 기본 컴퓨터 명령만 실행할 수 있기 때문에 소스 코드는 실행할 다른 컴퓨터 프로그램이 필요합니다.따라서 언어의 컴파일러를 이용하여 소스코드를 기계어로 번역할 수 있습니다. (어셈블리 언어 프로그램은 어셈블러를 이용하여 번역됩니다.)결과 파일을 실행 파일이라고 합니다.또는 소스 코드가 언어의 인터프리터 내에서 실행될 수도 있습니다.[2]

실행 파일을 실행하도록 요청하면 운영 체제는 실행 파일을 메모리로드하고 프로세스를 시작합니다.[3]중앙 처리 장치는 곧 이 프로세스로 전환되어 각 기계 명령을 가져오고 해독한 다음 실행할 수 있습니다.[4]

소스 코드를 실행하도록 요청하면 운영 체제는 해당 인터프리터를 메모리에 로드하고 프로세스를 시작합니다.그런 다음 인터프리터는 소스 코드를 메모리에 로드하여 각 을 번역하고 실행합니다.[2]소스 코드를 실행하는 것은 실행 파일을 실행하는 것보다 느립니다.[a]또한 인터프리터가 컴퓨터에 설치되어 있어야 합니다.

컴퓨터 프로그램 예시

브라이언 커니건(1978)의 "Hello, World!" 프로그램

"Hello, World!" 프로그램은 언어의 기본 구문을 설명하는 데 사용됩니다.BASIC(1964) 언어의 구문은 언어를 배우기 쉽게 만들기 위해 의도적으로 제한되었습니다.[5]예를 들어 변수는 사용되기 전에 선언되지 않습니다.[6]또한 변수가 자동으로 0으로 초기화됩니다.[6]다음은 숫자 목록을 평균화하는 Basic의 컴퓨터 프로그램 예입니다.[7]

10 인풋 "평균적으로 몇 개의 숫자가 있습니까?", A 20 위해서 I = 1 로. A 30 인풋 "번호 입력:", B 40 허락하다 C = C + B 50 다음 분. I 60 허락하다 D = C/A 70 프린트 "평균은", D 80 끝. 

일단 기본적인 컴퓨터 프로그래밍의 메커니즘이 학습되면, 더 정교하고 강력한 언어들이 대형 컴퓨터 시스템을 구축할 수 있게 됩니다.[8]

역사

소프트웨어 개발의 개선은 컴퓨터 하드웨어의 개선의 결과입니다.하드웨어 역사의 각 단계에서 컴퓨터 프로그래밍 작업은 극적으로 변화했습니다.

해석 엔진

노트 G에서 러브레이스에 대한 설명

1837년, 찰스 배비지자카드의 분석 엔진 제작 시도에 영감을 받았습니다.[9]계산기의 부품명은 섬유산업에서 빌려온 것입니다.섬유 산업에서는, 원사를 가게에서 가져와 제분을 했습니다.이 장치에는 각각 50자리의 십진 숫자 1,000개를 담을 수 있는 메모리로 구성된 "스토어"가 있었습니다.[10]"매장"의 번호는 처리를 위해 "밀"로 옮겨졌습니다.두 세트의 천공 카드를 사용하여 프로그래밍했습니다.한 집합은 작업을 지시하고 다른 집합은 변수를 입력합니다.[9][11]하지만, 17,000 파운드 이상의 영국 정부의 돈 이후, 톱니바퀴와 기어 수천 개는 완전히 함께 작동하지 않았습니다.[12]

에이다 러브레이스는 찰스 배비지(Charles Babbage)[13]를 위해 해석 엔진에 대한 설명을 만들었습니다.설명에는 해석 엔진을 사용하여 Bernouli 번호를 계산하는 방법을 완전히 자세히 설명한 노트 G가 포함되어 있습니다.이 노트는 몇몇 역사학자들에게 세계 최초의 컴퓨터 프로그램으로 인정받고 있습니다.[12]다른 역사학자들은 배비지 자신이 해석 엔진을 위한 최초의 컴퓨터 프로그램을 작성했다고 생각합니다.두 개의 선형 방정식으로 이루어진 시스템에 대한 해를 계산하기 위한 일련의 연산을 나열했습니다.[14]

유니버설 튜링 머신

1936년 앨런 튜링은 모든 계산을 모델링 할 수 있는 이론적 장치인 유니버설 튜링 기계를 소개했습니다.[15]무한히 긴 읽기/쓰기 테이프를 가진 유한 상태 기계입니다.이 기계는 테이프를 앞뒤로 움직이며 알고리즘을 수행할 때 내용을 변경할 수 있습니다.기계는 초기 상태에서 시작하여 일련의 단계를 거치고 정지 상태가 되면 정지합니다.[16]오늘날의 컴퓨터는 모두 튜링이 완성된 것입니다.[17]

에니악

글렌 A.에니악에서 튜브를 갈아주는 벡

전자 수치 통합기와 컴퓨터(ENIAC)는 1943년 7월에서 1945년 가을 사이에 만들어졌습니다.이것은 회로를 만들기 위해 진공관 17,468개를 사용한 튜링의 완전한 범용 컴퓨터였습니다.그 중심에는 파스칼린 계열이 함께 연결되어 있었습니다.[18]40대의 무게는 30톤, 1,800평방피트(167m2)를 차지했으며, 유휴시 시간당 650달러(1940년대 화폐)의 전기를 소비했습니다.[18]20개의 베이스-10 축전지를 가지고 있었습니다.ENIAC을 프로그래밍하는 데는 두 달까지 걸렸습니다.[18]세 개의 기능 테이블이 바퀴 위에 있어서 고정 기능 패널에 굴려야 했습니다.무거운 검은색 케이블을 플러그보드에 꽂아 기능 패널에 기능 테이블을 연결했습니다.각 기능 테이블에는 728개의 회전 노브가 있었습니다.ENIAC을 프로그래밍하는 데에는 3,000개의 스위치 중 일부도 포함되었습니다.프로그램 디버깅에 일주일이 걸렸습니다.[19]1947년부터 1955년까지 애버딘 프루빙 그라운드에서 수소폭탄 매개변수를 계산하고, 날씨 패턴을 예측하고, 포를 조준하기 위한 발사대를 제작했습니다.[20]

저장 프로그램 컴퓨터

코드를 꽂고 스위치를 돌리는 대신, 저장된 프로그램 컴퓨터는 데이터를 메모리에 로드하는 것처럼 명령을 메모리에 로드합니다.[21]그 결과, 컴퓨터는 빠르게 프로그램 될 수 있었고 매우 빠른 속도로 계산을 수행할 수 있었습니다.[22]Presper EckertJohn Mochly는 ENIAC을 만들었습니다.두 엔지니어는 1944년 2월자 3페이지 분량의 메모에서 저장 프로그램 개념을 소개했습니다.[23]그 후 1944년 9월, 존 폰 노이만 박사는 ENIAC 프로젝트를 시작했습니다.1945년 6월 30일, 폰 노이만은 컴퓨터의 구조와 인간 뇌의 구조를 동일시한 EDVAC관한 보고서의 초안을 출판했습니다.[22] 디자인은 폰 노이만 건축으로 알려지게 되었습니다.이 아키텍처는 1949년 EDVACEDSAC 컴퓨터의 구축에 동시에 배치되었습니다.[24]

IBM System/360(1964)은 각각 동일한 명령어 세트 아키텍처를 가진 컴퓨터 제품군입니다.20번 모델이 가장 작고 가격도 저렴했습니다.고객은 동일한 애플리케이션 소프트웨어를 업그레이드하고 유지할 수 있습니다.[25]모델 195가 가장 프리미엄급이었습니다.각 시스템/360 모델은 멀티프로그래밍[25] 기능을 갖추고 있어 메모리에 여러 프로세스가 동시에 있습니다.한 프로세스가 입출력을 기다리고 있을 때, 다른 프로세스는 계산을 할 수 있었습니다.

IBM은 PL/1을 사용하여 각 모델을 프로그래밍할 계획을 세웠습니다.[26]코볼(COBOL), 포트란(Fortran) 및 알골(ALGOL) 프로그래머를 포함하는 위원회가 구성되었습니다.목적은 포괄적이고 사용하기 쉽고 확장 가능하며 코볼과 포트란을 대체할 언어를 개발하는 것이었습니다.[26]그 결과 컴파일하는 데 오랜 시간이 걸리는 크고 복잡한 언어가 탄생했습니다.[27]

1970년대 중반에 제조된 Data General Nova 3의 수동 입력을 위한 스위치

1970년대까지 생산된 컴퓨터에는 수동 프로그래밍을 위한 전면 패널 스위치가 있었습니다.[28]컴퓨터 프로그램은 참고용으로 종이에 쓰여졌습니다.명령은 On/Off 설정의 구성으로 표시되었습니다.구성 설정 후 실행 버튼을 눌렀습니다.그런 다음 이 과정을 반복했습니다.컴퓨터 프로그램은 또한 종이 테이프, 천공 카드 또는 마그네틱 테이프를 통해 자동으로 입력되었습니다.매체가 로딩된 후 스위치를 통해 시작 주소를 설정하고 실행 버튼을 누릅니다.[28]

대규모 통합

VLSI 집적회로 다이

소프트웨어 개발의 중요한 이정표는 VLSI(Very Large Scale Integration) 회로(1964)의 발명이었습니다.[29]제2차 세계 대전 이후, 튜브 기반 기술은 회로 기판에 장착된 점 접촉 트랜지스터(1947)와 양극 접합 트랜지스터(1950년대 후반)로 대체되었습니다.[29]1960년대항공우주 산업은 회로 기판을 집적회로 칩으로 대체했습니다.[29]

Fairchild Semiconductor(1957)와 Intel(1968)의 공동 설립자인 Robert Noice는 전계 효과 트랜지스터생산을 미세화하는 기술적 개선을 달성했습니다(1963).[30]반도체 접합부전기저항전도도를 변화시키는 것이 목적입니다.첫째, 자연적으로 발생하는 규산염 광물지멘스 공정을 이용하여 폴리실리콘 로드로 변환됩니다.[31]그리고 나서 초크랄스키 공정은 막대를 단결정 실리콘, 부울 결정으로 바꿉니다.[32] 후 결정을 얇게 잘라 웨이퍼 기판을 형성합니다.포토리소그래피평면 프로세스는 단극 트랜지스터, 커패시터, 다이오드저항기를 웨이퍼에 통합하여 MOS(Metal-Oxide-Semiconductor) 트랜지스터의 매트릭스를 구축합니다.[33][34]MOS 트랜지스터는 집적 회로 칩의 주요 구성 요소입니다.[30]

원래 집적회로 칩은 제조 시 기능이 설정되어 있었습니다.1960년대 동안 전기 흐름을 제어하는 것은 읽기 전용 메모리(ROM) 매트릭스를 프로그래밍하는 것으로 옮겨졌습니다.매트릭스는 퓨즈의 2차원 배열과 유사했습니다.[29]명령어를 매트릭스에 삽입하는 프로세스는 불필요한 연결을 소진하는 것이었습니다.[29]연결이 너무 많아서 펌웨어 프로그래머들이 다른 칩에 컴퓨터 프로그램을 작성해서 태우는 것을 감독했습니다.[29]이 기술은 프로그래머블 롬(Programmable ROM)으로 알려지게 되었습니다.1971년 인텔은 이 칩에 컴퓨터 프로그램을 설치하고 인텔 4004 마이크로프로세서라고 이름 지었습니다.[35]

IBM의 System/360 (1964) CPU는 마이크로프로세서가 아니었습니다.

마이크로프로세서중앙처리장치(CPU)라는 용어는 이제 혼용되고 있습니다.그러나 CPU는 마이크로프로세서보다 앞서 있습니다.예를 들어, IBM System/360(1964)은 세라믹 기판 위에 개별 부품을 포함하는 회로 기판으로 CPU를 만들었습니다.[36]

Sac 스테이트 8008

예술가의 새크라멘토 주립대학 인텔 8008 마이크로컴퓨터 묘사 (1972)

인텔 4004(1971)는 부시컴 계산기를 구동하도록 설계된 4비트 마이크로프로세서였습니다.출시 5개월 후 인텔은 8비트 마이크로프로세서인 인텔 8008을 출시했습니다.빌 펜츠(Bill Pentz)는 새크라멘토 주에서 팀을 이끌고 인텔 8008: Sac State 8008 (1972)을 사용한 최초의 마이크로컴퓨터를 만들었습니다.[37]그 목적은 환자 진료 기록을 보관하는 것이었습니다. 컴퓨터는 3메가바이트하드 디스크 드라이브실행하기 위해 디스크 운영체제를 지원했습니다.[29]컬러 디스플레이와 키보드가 하나의 콘솔에 포장되어 있었습니다.디스크 운영 체제는 IBM의 BAL(Basic Assembly Language)을 사용하여 프로그래밍되었습니다.의료 기록 애플리케이션은 BASIC 통역기를 사용하여 프로그래밍되었습니다.[29]하지만, 컴퓨터는 엄청나게 비쌌기 때문에 진화의 막다른 길에 있었습니다.또한, 그것은 특정한 목적을 위해 공립 대학 연구실에서 만들어졌습니다.[37]그러나 이 프로젝트는 인텔 8080 (1974) 명령어 세트의 개발에 기여했습니다.[29]

x86계

원래 IBM 개인용 컴퓨터(1981)는 인텔 8088 마이크로프로세서를 사용했습니다.

1978년 인텔이 인텔 8080인텔 8086으로 업그레이드하면서 현대적인 소프트웨어 개발 환경이 시작되었습니다.인텔은 인텔 8086을 단순화하여 더 저렴한 인텔 8088을 제조했습니다.[38]IBM은 인텔 8088을 개인용 컴퓨터 시장에 뛰어들었을 때(1981년) 수용했습니다.개인용 컴퓨터에 대한 소비자 수요가 증가함에 따라 인텔의 마이크로프로세서 개발도 증가했습니다.개발의 연속은 x86 시리즈로 알려져 있습니다.x86 어셈블리 언어는 하위 호환 기계 명령어 계열입니다.이전 마이크로프로세서에서 생성된 기계 명령은 마이크로프로세서 업그레이드 내내 유지되었습니다.이를 통해 소비자는 새로운 응용 소프트웨어를 구입할 필요 없이 새로운 컴퓨터를 구입할 수 있었습니다.지침의 주요 범주는 다음과 같습니다.[b]

프로그래밍 환경 변화

DEC VT100 (1978)은 널리 사용되는 컴퓨터 단말기였습니다.

VLSI 회로를 통해 프로그래밍 환경이 컴퓨터 터미널에서 그래픽 사용자 인터페이스(GUI) 컴퓨터로 발전할 수 있었습니다.컴퓨터 터미널은 프로그래머들을 명령 줄 환경에서 실행되는 단일 로 제한했습니다.1970년대에는 텍스트 기반 사용자 인터페이스를 통해 전체 화면 소스 코드 편집이 가능해졌습니다.사용 가능한 기술에 관계없이 프로그래밍 언어로 프로그래밍하는 것이 목표입니다.

프로그래밍 패러다임 및 언어

프로그래밍 언어 기능은 프로그래밍 이상을 표현하기 위해 결합될 빌딩 블록을 제공하기 위해 존재합니다.[39]이상적으로 프로그래밍 언어는 다음을 수행해야 합니다.[39]

  • 코드에 직접적으로 아이디어를 표현합니다.
  • 독자적인 생각을 개진하다
  • 아이디어 간의 관계를 코드에 직접 표현합니다.
  • 사상을 자유자재로 조합하다
  • 아이디어를 조합하는 것은 단지 조합이 이치에 맞는 경우에만 가능합니다.
  • 단순한 생각을 단순하게 표현합니다.

이러한 빌딩 블록을 제공하기 위한 프로그래밍 언어의 프로그래밍 스타일은 프로그래밍 패러다임으로 분류될 수 있습니다.[40]예를 들어, 서로 다른 패러다임이 다음을 구별할 수 있습니다.[40]

이러한 각각의 프로그래밍 스타일은 다양한 프로그래밍 언어를 합성하는 데 기여했습니다.[40]

프로그래밍 언어는 프로그래머가 컴퓨터에 명령을 전달할 수 있는 키워드, 기호, 식별자 및 규칙의 집합입니다.[41]그들은 구문이라고 불리는 일련의 규칙을 따릅니다.[41]

프로그래밍 언어공식 언어에서 기본을 얻습니다.[42]솔루션을 공식 언어로 정의하는 목적은 밑줄 친 문제를 해결하는 알고리즘을 생성하는 것입니다.[42]알고리즘은 문제를 해결하는 간단한 명령의 연속입니다.[43]

프로그래밍 언어 세대

프로그래밍 언어의 진화는 EDSAC(1949)가 폰 노이만 아키텍처에서 최초로 저장된 컴퓨터 프로그램을 사용했을 때 시작되었습니다.[44]EDSAC의 프로그래밍은 프로그래밍 언어의 첫 번째 세대였습니다.

  • 프로그래밍 언어의 2세대어셈블리어입니다.[45]어셈블리 언어를 사용하면 프로그래머가 명령 번호를 기억하는 대신 기억법 명령을 사용할 수 있습니다.어셈블러는 각 어셈블러 언어 니모닉을 기계어 번호로 변환합니다.예를 들어, PDP-11에서, 동작 24576은 소스 코드에서 ADD로 참조될 수 있습니다.[46]4개의 기본 연산은 ADD, SUB, MUL, DIV와 같은 어셈블리 명령을 가지고 있습니다.[46]컴퓨터에는 메모리 셀을 예약하는 DW(Define Word)와 같은 명령어도 있습니다.그러면 MOV 명령어는 레지스터와 메모리 사이의 정수를 복사할 수 있습니다.
  • 레이블을 사용하면 프로그래머가 변수 이름으로 작업할 수 있습니다.어셈블러는 나중에 라벨을 물리적 메모리 주소로 변환할 것입니다.
  • 연산을 통해 프로그래머는 기억법을 사용하여 작업할 수 있습니다.어셈블러는 나중에 니모닉을 명령어 번호로 변환할 것입니다.
  • 피연산자는 연산이 어떤 데이터를 처리할 것인지 어셈블러에게 알려줍니다.
  • 설명만으로는 설명이 모호하기 때문에 프로그래머는 설명을 명료하게 표현할 수 있습니다.
어셈블리 언어 프로그램의 주요 특징은 해당 기계 언어 대상과 일대일 매핑을 형성한다는 것입니다.[48]
  • 프로그래밍 언어의 4세대는 프로그래밍 문이 어떻게 구성되어야 하는지 보다는 어떤 출력 결과가 필요한지를 강조합니다.[45]선언 언어들은 부작용을 제한하고 프로그래머들이 비교적 적은 오류로 코드를 작성할 수 있도록 시도합니다.[45]인기 있는 4세대 언어 중 하나는 SQL(Structured Query Language)입니다.[45]데이터베이스 개발자는 더 이상 각 데이터베이스 레코드를 한 번에 하나씩 처리할 필요가 없습니다.또한 간단한 문장을 사용하면 출력 레코드를 검색하는 방법을 이해하지 않아도 출력 레코드를 생성할 수 있습니다.

명령어

명령어로 쓰여진 컴퓨터 프로그램.

명령형 언어선언, 표현식, 문장을 사용하여 순차적 알고리즘을 지정합니다.[52]

  • 선언은 변수 이름을 컴퓨터 프로그램에 도입하고 데이터 유형[53] 할당합니다.var x: integer;
  • 식을 사용하면 다음과 같은 값이 산출됩니다.2 + 2수확량 4
  • 문장은 변수에 식을 할당하거나 변수의 값을 사용하여 프로그램의 제어 흐름을 변경할 수 있습니다.x := 2 + 2; if x = 4 then do_something();

포트란

FORTRAN(1958)은 "IBM Mathematical FORMula TRANslating system"으로 발표되었습니다.을 다루는 시설 없이 과학적 계산을 위해 설계되었습니다.선언, 표현, 성명과 함께 다음을 지원했습니다.

성공한 이유는 다음과 같습니다.

  • 프로그래밍 및 디버깅 비용은 컴퓨터 운영 비용보다 낮았습니다.
  • IBM의 지원을 받았습니다.
  • 그 당시의 응용은 과학적이었습니다.[54]

그러나 IBM 이외의 벤더들도 포트란 컴파일러를 작성했지만 IBM의 컴파일러에 실패할 가능성이 있는 구문을 사용했습니다.[54]미국 표준 협회(ANSI)는 1966년에 최초의 포트란 표준을 개발했습니다.1978년 포트란 77은 1991년까지 표준이 되었습니다.포트란 90 지원:

코볼

코볼(COBOL, 1959)은 "Common Business Oriented Language"의 약자입니다.포트란 조작 기호.기호가 숫자일 필요가 없다는 것을 곧 깨달아서 문자열이 도입되었습니다.[55]미국 국방부Grace Hopper를 주요 기여자로 하여 COBOL의 발전에 영향을 미쳤습니다.그 진술들은 영어같고 장황했습니다.목표는 관리자들이 프로그램을 읽을 수 있도록 언어를 설계하는 것이었습니다.그러나 체계적인 진술의 부족이 이 목표를 방해했습니다.[56]

코볼의 개발은 엄격하게 통제되어 있었기 때문에 방언들은 ANSI 표준을 필요로 하지 않았습니다.그 결과, 1974년까지 15년 동안 그것은 바뀌지 않았습니다.1990년대 버전은 객체 지향 프로그래밍과 같은 결과적인 변화를 일으켰습니다.[56]

알골

ALGOL (1960)은 "ALGO Rithmic Language"의 약자입니다.프로그래밍 언어 디자인에 지대한 영향을 미쳤습니다.[57]유럽과 미국의 프로그래밍 언어 전문가들로 구성된 위원회에서 나온 그것은 표준 수학적 표기법을 사용했고 읽을 수 있고 구조화된 디자인을 가지고 있었습니다.Algol은 Backus-Naur 형식을 사용하여 구문을 처음 정의했습니다.[57]이것은 구문 지향 컴파일러로 이어졌습니다.다음과 같은 기능을 추가했습니다.

알골의 직계 후손으로는 파스칼, 모듈라-2, 에이다, 델포이, 오베론이 한 갈래에 있습니다.또 다른 분기에는 C, C++, 자바 등의 자손이 있습니다.[57]

기본의

BASIC(1964)은 "초보자의 다목적 기호 명령어 코드"를 의미합니다.그것은 그들의 모든 학생들이 배울 수 있도록 다트머스 대학교에서 개발되었습니다.[7]만약 한 학생이 더 강력한 언어로 나아가지 않았다면, 그 학생은 Basic을 여전히 기억할 것입니다.[7]1970년대 후반에 제조된 마이크로 컴퓨터에 기본 통역기가 설치되었습니다.마이크로컴퓨터 산업이 성장하면서 언어도 성장했습니다.[7]

Basic은 대화형 세션을 개척했습니다.[7]자사 환경 내에서 운영 체제 명령어를 제공했습니다.

  • 'new' 명령으로 빈 슬레이트가 생성되었습니다.
  • 진술은 즉시 평가됩니다.
  • 행 번호를 앞에 붙여 문을 프로그래밍할 수 있습니다.
  • 'list' 명령어가 프로그램을 표시했습니다.
  • run 명령어가 프로그램을 실행했습니다.

그러나 대규모 프로그램에는 기본 구문이 너무 간단했습니다.[7]최근의 방언은 구조와 객체 지향 확장을 추가했습니다.Microsoft의 Visual Basic은 여전히 널리 사용되며 그래픽 사용자 인터페이스를 생성합니다.[6]

C

C 프로그래밍 언어(1973)는 BCPL이라는 언어가 B로 대체되었기 때문에 이름이 지어졌고, AT&T연구소는 다음 버전을 "C"라고 불렀습니다. 그 목적은 UNIX 운영 체제를 만드는 것이었습니다.[50]C는 비교적 작은 언어로 컴파일러 작성이 용이합니다.이러한 성장은 1980년대의 하드웨어 성장을 반영한 것입니다.[50]그것의 성장은 또한 어셈블리어의 기능을 가지고 있지만 높은 수준의 구문을 사용하기 때문입니다.다음과 같은 고급 기능을 추가했습니다.

컴퓨터 메모리 맵

C는 프로그래머가 메모리 데이터를 저장할 영역을 제어할 수 있게 해줍니다.전역 변수정적 변수는 저장하는 데 가장 적은 클럭 주기가 필요합니다.스택은 표준 변수 선언에 자동으로 사용됩니다. 메모리는 함수에서 포인터 변수로 반환됩니다.

  • 전역정적 데이터 영역은 프로그램 영역 바로 위에 위치합니다.(전문적으로 프로그램 영역을 텍스트 영역이라고 합니다.기계 명령이 저장되어 있는 곳입니다.)
  • 글로벌 데이터 영역과 정적 데이터 영역은 엄밀히 말하면 두 영역입니다.[58]한 영역을 초기화된 데이터 세그먼트라고 하며, 기본값으로 선언된 변수가 저장됩니다.다른 영역을 세그먼트별 시작 블록이라고 하며, 기본값 없이 선언된 변수가 저장됩니다.
  • 전역정적 데이터 영역에 저장된 변수의 주소는 컴파일 타임에 설정됩니다.그들은 프로세스의 수명 동안 자신들의 가치를 유지합니다.
  • 전역 및 정적 영역은 (외부에) 선언된 전역 변수를 저장합니다.main()기능을 합니다.[59]전역 변수를 볼 수 있습니다.main()소스 코드의 다른 모든 기능을 포함합니다.
반면에 내부의 변수 선언은main(), 다른 기능들, 또는 그 안에서.{ } 블록 구분 기호는 로컬 변수입니다.지역 변수에는 공식 모수 변수도 포함됩니다.모수 변수는 함수 정의 괄호 안에 포함됩니다.[60]기능에 대한 인터페이스를 제공합니다.
  • 를 사용하여 선언된 로컬 변수static접두사는 전역 및 정적 데이터 영역에도 저장됩니다.[58]전역 변수와 달리 정적 변수는 함수 또는 블록 내에서만 볼 수 있습니다.정적 변수는 항상 값을 유지합니다.사용 예로는 함수를 들 수 있습니다.int increment_counter(){static int counter = 0; counter++; return counter;}[e]
  • 스택 영역은 최상위 메모리 주소 근처에 위치한 연속된 메모리 블록입니다.[61]스택에 배치된 변수는 위에서 아래로 채워집니다.[f][61]스택 포인터는 입력된 마지막 메모리 주소를 추적하는 특수 목적 레지스터입니다.[61]변수는 어셈블리 언어 PUSH 명령을 통해 스택에 배치됩니다.따라서 이러한 변수의 주소는 런타임 중에 설정됩니다.스택 변수가 범위를 잃는 방법은 POP 명령을 통해 수행됩니다.
  • 로컬 변수는 다음 값 없이 선언됩니다.static공식 매개변수 변수를 포함한 접두사는 [62]자동 변수라고[59] 불리며 스택에 저장됩니다.[58]함수 또는 블록 내부에서 볼 수 있으며 함수 또는 블록을 나가면 범위가 손실됩니다.
  • 영역은 스택 아래에 있습니다.[58]그것은 아래에서부터 위까지 인구가 밀집되어 있습니다.운영 체제는 힙 포인터와 할당된 메모리 블록 목록을 사용하여 힙을 관리합니다.[63]스택과 마찬가지로 힙 변수의 주소는 런타임 중에 설정됩니다.힙 포인터와 스택 포인터가 만나면 메모리 부족 오류가 발생합니다.
  • C가 제공합니다.malloc()힙 메모리를 할당하는 라이브러리 함수입니다.[64]힙을 데이터로 채우는 것은 추가 복사 기능입니다.힙에 저장된 변수는 포인터를 사용하여 함수에 경제적으로 전달됩니다.포인터가 없으면 데이터의 전체 블록이 스택을 통해 함수로 전달되어야 합니다.

C++

1970년대 소프트웨어 엔지니어들은 대규모 프로젝트를 모듈로 분해하기 위해 언어 지원이 필요했습니다.[65]한 가지 분명한 기능은 대규모 프로젝트를 물리적으로 개별 파일로 분해하는 것이었습니다.명확하지 않은 기능은 대규모 프로젝트를 논리적으로 추상적인 데이터 유형으로 분해하는 것이었습니다.[65]그 당시 언어들은 정수, 부동소수점 숫자, 문자의 문자열과 같은 구체적인 (스칼라) 데이터 유형을 지원했습니다.추상 데이터 유형은 새로운 이름이 지정된 구체적인 데이터 유형의 구조입니다.예를 들어, 정수 목록을 호출할 수 있습니다.integer_list.

객체 지향 전문용어에서는 추상적인 데이터 유형을 클래스라고 부릅니다.그러나 클래스는 정의일 뿐이며 메모리가 할당되지 않습니다.메모리가 클래스에 할당되고 식별자바인딩되면 개체라고 합니다.[66]

수업의 필요성과 안전한 기능 프로그래밍의 필요성을 결합하여 개발된 객체 지향 명령형 언어.[67]객체 지향 언어로 된 함수는 클래스에 할당됩니다.할당된 기능을 메소드, 멤버 함수 또는 연산이라고 합니다.객체 지향 프로그래밍객체에 대한 작업을 실행하는 것입니다.[68]

객체 지향 언어는 부분 집합/초 집합 관계를 모델링하기 위한 구문을 지원합니다.집합 이론에서 부분 집합의 요소는 부분 집합에 포함된 모든 속성을 상속합니다.예를 들어, 학생은 사람입니다.따라서 학생 집합은 사람 집합의 부분 집합입니다.결과적으로 학생들은 모든 사람들에게 공통된 모든 속성을 물려받게 됩니다.게다가 학생들은 다른 사람들에게는 없는 독특한 특성을 가지고 있습니다.개체 지향 언어상속을 사용하여 하위 집합/초 집합 관계를 모델링합니다.[69]객체 지향 프로그래밍은 1990년대 후반에 이르러 지배적인 언어 패러다임이 되었습니다.[65]

C++ (1985)는 원래 "C with Classes"라고 불렸습니다.[70]시물라 언어의 객체 지향적인 설비를 추가하여 C의 역량을 확장할 수 있도록 설계되었습니다.[71]

객체 지향 모듈은 두 개의 파일로 구성됩니다.정의 파일을 헤더 파일이라고 합니다.간단한 학교 애플리케이션에서 GRADE 수업을 위한 C++ 헤더 파일은 다음과 같습니다.

// 등급을 매기다 // -------  // 여러 원본 파일이 포함되도록 허용하는 데 사용됩니다. // 중복 오류가 없는 이 헤더 파일입니다. // ---------------------------------------------- #ifndef GRADE_H #정의 GRADE_H  학급 등급. { 일반의:     // 시공자 작업입니다.     // ----------------------------------     등급. ( 머리를 짜다 차를 편지 );      // 클래스 변수입니다.     // -------------------------     차를 편지;      // 이것은 멤버 작업입니다.     // ---------------------------     인트 등급_( 머리를 짜다 차를 편지 );      // 클래스 변수입니다.     // -------------------------     인트 숫자의; }; #엔디프 

생성자 연산은 클래스 이름과 동일한 이름을 가진 함수입니다.[72]호출 작업이 실행될 때 실행됩니다.new진술.

모듈의 다른 파일은 소스 파일입니다.간단한 학교 애플리케이션에서 GRADE 수업을 위한 C++ 소스 파일은 다음과 같습니다.

// grade.cpp // --------- # # "등급.h"  등급.::등급.( 머리를 짜다 차를 편지 ) {     // 키워드 'this'를 사용하여 개체를 참조합니다.     // ----------------------------------------------     이것.->편지 = 편지;      // 이것은 시간적 응집력입니다.     // -------------------------     이것.->숫자의 = 등급_( 편지 ); }  인트 등급.::등급_( 머리를 짜다 차를 편지 ) {     한다면 ( ( 편지 == 'A'    편지 == 'a' ) )         돌아가다 4;     또 다른     한다면 ( ( 편지 == 'B'    편지 == 'b' ) )         돌아가다 3;     또 다른     한다면 ( ( 편지 == '다'    편지 == 'ㄷ' ) )         돌아가다 2;     또 다른     한다면 ( ( 편지 ==     편지 == '드' ) )         돌아가다 1;     또 다른     한다면 ( ( 편지 == 'F'    편지 == 'f' ) )         돌아가다 0;     또 다른         돌아가다 -1; } 

다음은 간단한 학교 응용 프로그램에서 PERSONA 수업을 위한 C++ 헤더 파일입니다.

// 사람.h // -------- #ifndef PERSONA_H #정의Person_H  학급 사람인 { 일반의:     사람인 ( 머리를 짜다 차를 *이름. );     머리를 짜다 차를 *이름.; }; #엔디프 

다음은 간단한 학교 응용 프로그램에서 PERSONA 수업을 위한 C++ 소스 파일입니다.

// person.cpp // ---------- # # "person.h"  사람인::사람인 ( 머리를 짜다 차를 *이름. ) {     이것.->이름. = 이름.; } 

다음은 간단한 학교 응용 프로그램에서 학생 수업을 위한 C++ 헤더 파일입니다.

// 학생.h // --------- #ifndef 학생_H #정의학생_H  # # "person.h" # # "등급.h"  // 학생은 사람의 부분집합입니다. // -------------------------------- 학급 학생입니다 : 일반의 사람인{ 일반의:     학생입니다 ( 머리를 짜다 차를 *이름. );     등급. *등급.; }; #엔디프 

다음은 간단한 학교 응용 프로그램에서 학생 수업을 위한 C++ 소스 파일입니다.

// 학생.cpp // ----------- # # "학생.h" # # "person.h"  학생입니다::학생입니다 ( 머리를 짜다 차를 *이름. ):     // PERSONA 슈퍼클래스의 생성자를 실행합니다.     // -------------------------------------------------     사람인( 이름. ) {     // 더이상 할 일이 없습니다.     // ------------------- } 

시연용 드라이버 프로그램은 다음과 같습니다.

// 학생_ dvr.cpp // --------------- # # <아이오스트림> # # "학생.h"  인트 주된( 공허한 ) {     학생입니다 *학생입니다 = 신규 학생입니다( "학생" );     학생입니다->등급. = 신규 등급.( 'a' );      std::꾸트린          // 학생이 PERSONA의 이름을 상속함         << 학생입니다->이름.         << ": 숫자 등급 = "         << 학생입니다->등급.->숫자의         << "\n";  돌아가다 0; } 

여기 모든 것을 컴파일할 수 있는 make file이 있습니다.

#makefile # ----------- all : student_dvr clean : rm student_dvr *.o student_dvr : student_dvr.cpp grade.o student.o person.o c++ student_cpp grade.o student.o student.o : grade.cpp grade.o : grade.cpp grade.h c++ -cpp grade.o : student.cpp grade.o : student.cpp person.h c++ -cpp person.o : person.cpp person.

선언어

명령형 언어는 로컬 변수가 아닌 변수에 식을 할당하면 의도하지 않은 부작용이 발생할 수 있다는 한 가지 주요한 비판이 있습니다.[73]선언 언어는 일반적으로 할당 문과 제어 흐름을 생략합니다.그들은 어떤 계산을 수행해야 하는지 설명하고 어떻게 계산해야 하는지 설명하지 않습니다.선언적 언어의 두 가지 넓은 범주는 기능적 언어와 논리적 언어입니다.

함수 언어 뒤에 있는 원리는 람다 미적분학을 잘 정의된 의미를 위한 지침으로 사용하는 것입니다.[74]수학에서 함수는 의 요소를 의 범위에 매핑하는 규칙입니다.다음과 같은 기능을 고려합니다.

times_10(x) = 10 * x

표정이 10 * x함수에 의해 매핑됩니다.times_10()의 범위까지.은 20입니다.이것은 x가 2일 때 발생합니다.따라서 함수의 적용은 수학적으로 다음과 같이 적습니다.

times_10(2) = 20

함수 언어 컴파일러는 이 값을 변수에 저장하지 않습니다.대신 프로그램 카운터를 호출 기능으로 다시 설정하기 전에 값을 컴퓨터 스택에 푸시합니다.그러면 호출 함수가 스택에서 값을 팝니다.[75]

명령어는 기능을 지원합니다.따라서 프로그래머가 규율을 사용한다면 명령어로 기능적 프로그래밍을 할 수 있습니다.그러나 기능적 언어는 문법을 통해 이 규율을 프로그래머에게 강요할 것입니다.기능 언어에는 무엇을 강조하기 위해 맞춤화된 구문이 있습니다.[76]

기능 프로그램은 원시 기능 집합과 단일 드라이버 기능으로 개발됩니다.[73]토막글을 살펴봅니다.

function max(a,b){/* code omitted */}

function min(a,b){/* code omitted */}

function difference_between_largest_and_smallest(a,b,c) {

return max(a,max(b,c)) - min(a, min(b,c));

}

원초적인 것은.max()그리고.min(). 드라이버 기능은difference_between_largest_and_smallest(). 실행 중:

put(difference_between_largest_and_smallest(10,4,7));6을 출력합니다.

기능성 언어컴퓨터 과학 연구에서 새로운 언어 특징을 탐구하는 데 사용됩니다.[77]게다가 부작용이 없어 병렬 프로그래밍동시 프로그래밍에서 인기를 끌고 있습니다.[78]그러나 응용 프로그램 개발자들은 명령형 언어의 객체 지향적 기능을 선호합니다.[78]

리스프

Lisp (1958)은 "List Processor"의 약자입니다.[79]프로세스 목록에 맞게 조정됩니다.데이터의 전체 구조는 목록 작성으로 구성됩니다.메모리에는 트리 데이터 구조가 구축됩니다.내부적으로 트리 구조는 재귀적인 기능에 적합합니다.[80]트리를 만드는 구문은 괄호 안에 공백으로 구분된 요소를 포함하는 것입니다.다음은 세 가지 요소의 목록입니다.처음 두 요소는 그 자체로 두 요소의 목록입니다.

((A B) (HELLO WORLD) 94)

Lisp에는 요소를 추출하고 재구성하는 기능이 있습니다.[81]함수를head()목록의 첫 번째 요소를 포함하는 목록을 반환합니다.함수를tail()첫 번째 요소를 제외한 모든 것을 포함하는 목록을 반환합니다.함수를cons()다른 목록의 연결인 목록을 반환합니다.따라서 다음 식은 목록을 반환합니다.x:

cons(head(x), tail(x))

리스프의 단점 중 하나는 많은 함수들이 중첩되어 있을 때 괄호가 혼동되어 보일 수 있다는 것입니다.[76]현대의 리스프 환경은 괄호가 일치하도록 보장합니다.그 외에도 리스프는 과제문의 명령어 연산을 지원하고 루프로 이동합니다.[82]또한 Lisp은 컴파일 시 요소의 데이터 타입과 상관이 없습니다.[83]대신 런타임에 데이터 유형을 할당하고 다시 할당할 수 있습니다.런타임에 데이터 유형을 할당하는 것을 동적 바인딩이라고 합니다.[84]동적 바인딩은 언어의 유연성을 높이는 반면 프로그래밍 오류는 소프트웨어 개발 과정에서 늦게까지 지속될 수 있습니다.[84]

크고, 신뢰할 수 있고, 읽을 수 있는 리스프 프로그램을 쓰는 것은 사전에 숙고해야 합니다.제대로 계획된 경우, 프로그램이 동등한 명령어 프로그램보다 훨씬 짧을 수 있습니다.[76]리스프인공지능에 널리 사용되고 있습니다.하지만 명령적인 언어 조작이 가능하다는 이유만으로 사용이 받아들여져 의도치 않은 부작용이 발생할 수 있습니다.[78]

ML

ML (1973)[85]은 "메타 언어"의 약자입니다.ML은 동일한 유형의 데이터만 서로 비교하는지 확인합니다.[86]예를 들어, 이 함수는 하나의 입력 파라미터(정수)를 가지며 정수를 반환합니다.

재밌어요 times_10(n : 인트) : 인트 = 10 * n; 

ML리스프처럼 괄호 중심이 아닙니다.다음은 의 적용입니다.times_10():

times_102

"20 : int"를 반환합니다. (결과 및 데이터 유형 모두 반환됩니다.)

Lisp와 마찬가지로 ML도 프로세스 목록에 맞게 조정됩니다.Lisp와 달리 각 요소는 동일한 데이터 유형입니다.[87]또한 ML은 컴파일 타임에 요소의 데이터 유형을 할당합니다.컴파일 시간에 데이터 유형을 할당하는 것을 정적 바인딩이라고 합니다.정적 바인딩은 컴파일러가 변수를 사용하기 전에 변수의 컨텍스트를 확인하기 때문에 신뢰성을 높입니다.[88]

프롤로그

Prolog (1972)는 "ROGRAMING in LOGIC"의 약자입니다.이것은 형식 논리기반한 논리 프로그래밍 언어입니다. 언어는 알랭 콜메라우어와 필리프 루셀이 프랑스 마르세유에서 개발했습니다.이것은 선택적 선형 확정 조항 해결을 구현한 것으로, Robert Kowalski 등이 에딘버러 대학에서 개척했습니다.[89]

프롤로그 프로그램의 기본 요소는 사실규칙입니다.간단한 예는 다음과 같습니다.

고양이(톰.).                        % 톰은 고양이 입니다. 쥐를(제리.).                    % 제리는 쥐입니다.  동물적인(X) :- 고양이(X).             % 각각의 고양이는 동물입니다. 동물적인(X) :- 쥐를(X).           % 각각의 쥐는 동물입니다.  큰.(X)   :- 고양이(X).              % 각각의 고양이는 큽니다. 작은.(X) :- 쥐를(X).            % 각각의 쥐는 작습니다.  먹는다(X,Y) :- 쥐를(X), 치즈(Y). % 각각의 쥐는 각각의 치즈를 먹습니다. 먹는다(X,Y) :- 큰.(X),   작은.(Y).  % 각각의 큰 동물들은 각각의 작은 동물들을 먹습니다. 

모든 사실과 규칙이 입력되면 다음과 같은 질문을 할 수 있습니다.

톰은 제리를 먹을까요?
?- 먹는다(톰.,제리.). 진실의 

다음 예제에서는 프롤로그가 문자 등급을 숫자 값으로 변환하는 방법을 보여 줍니다.

숫자_등급('A', 4). 숫자_등급('B', 3). 숫자_등급('다', 2). 숫자_등급(, 1). 숫자_등급('F', 0). 숫자_등급(X, -1) :- 것은 아니다. X = 'A', 것은 아니다. X = 'B', 것은 아니다. X = '다', 것은 아니다. X = , 것은 아니다. X = 'F'. 등급.('학생', 'A'). 
?- 등급.('학생', X), 숫자_등급(X, Y). X = 'A', Y = 4 

다음은 포괄적인 예입니다.[90]

1) 모든 용은 불을 뿜거나, 그와 동등하게, 만약 그 용이 용이라면 불을 뿜습니다.

들불(X) :-     is_a_dragon(X). 

2) 생물은 부모 중 한 사람이 불을 뿜으면, 불을 뿜습니다.

들불(X) :-     is_a_(X),     의 _a_부모_입니다.(Y,X),     들불(Y). 

3) X가 Y의 어머니이거나 X가 Y의 아버지인 경우 X는 Y의 부모입니다.

  의 _a_부모_입니다.(X, Y):- 의 _어머니_입니다.(X, Y). 의 _a_부모_입니다.(X, Y):- 의 아버지입니다.(X, Y). 

4) 물건이 용이라면 생물입니다.

is_a_(X) :-     is_a_dragon(X). 

5) 노르베르타는 용이고 퍼프는 생물입니다.노르베르타는 퍼프의 어머니입니다.

is_a_dragon(노버타).  is_a_(뻥튀기). 의 _어머니_입니다.(노버타, 뻥튀기). 

규칙 (2)는 재귀적 (유도적) 정의입니다.그것은 어떻게 실행되는지 이해할 필요 없이 순수하게 선언적으로 이해될 수 있습니다.

규칙 (3)은 함수가 관계를 사용하여 어떻게 표현되는지 보여줍니다.여기서 어머니와 아버지의 기능은 모든 개인이 어머니 한 명과 아버지 한 명만을 갖도록 보장합니다.

프롤로그는 입력되지 않은 언어입니다.그러나 상속은 술어를 사용하여 나타낼 수 있습니다.규칙 (4)는 용이 생물의 아류임을 주장합니다.

질문은 후진적인 추론을 사용하여 답합니다.다음과 같은 질문이 주어집니다.

 ?- 들불(X). 

프롤로그는 다음 두 가지 답변을 생성합니다.

X = 노버타 X = 뻥튀기 

프롤로그의 실용적인 응용은 인공지능에서의 지식 표현문제 해결입니다.

객체 지향 프로그래밍

객체 지향 프로그래밍은 객체에 대한 연산(함수)[91]을 실행하기 위한 프로그래밍 방법입니다.기본 아이디어는 현상의 특성을 물체 용기에 그룹화하고 용기에 이름을 붙이는 것입니다.현상에 대한 작업도 컨테이너로 그룹화됩니다.[91]컨테이너의 필요성과 안전한 기능적 프로그래밍의 필요성을 결합하여 개발된 객체 지향 프로그래밍.[92]이 프로그래밍 방법은 객체 지향 언어에만 국한될 필요가 없습니다.[93]객체 지향 언어에서는 객체 컨테이너를 클래스라고 합니다.비객체 지향 언어에서는 데이터 구조(레코드라고도 함)가 객체 컨테이너가 될 수 있습니다.데이터 구조를 개체 컨테이너로 전환하려면 구조에 맞게 연산을 구체적으로 작성해야 합니다.결과적인 구조를 추상 데이터 유형이라고 합니다.[94]그러나 상속이 누락됩니다.그럼에도 불구하고, 이 단점은 극복할 수 있습니다.

간단한 학교 응용 프로그램에서 GRADE 추상 데이터 유형을 위한 C 프로그래밍 언어 헤더 파일은 다음과 같습니다.

/* 등급.h */ /* ------- */  /* 여러 원본 파일에 */을(를) 포함하도록 허용하는 데 사용됩니다. /* 중복 오류가 없는 이 헤더 파일입니다. */ /* ---------------------------------------------- */ #ifndef GRADE_H #정의 GRADE_H  타이프 디프 짜임새 있는 {     차를 편지; } 등급.;  /* 생성자 */ /* ----------- */ 등급. *grade_new( 차를 편지 );  인트 등급_( 차를 편지 ); #엔디프 

grade_new()함수는 C++ 컨스트럭터 연산과 동일한 알고리즘을 수행합니다.

간단한 학교 응용 프로그램에서 GRADE 추상 데이터 유형을 위한 C 프로그래밍 언어 소스 파일은 다음과 같습니다.

/* 등급.c */ /* ------- */ # # "등급.h"  등급. *grade_new( 차를 편지 ) {     등급. *등급.;      /* 힙 메모리 할당 */     /* -------------------- */     한다면 ( ! ( 등급. = 캘록( 1, 의 크기 ( 등급. ) ) ) )     {         fprintf(쎄더르,                 "%s/%s/%d의 오류: calloc()가 비어 있습니다.\n",                 __FILE__,                 __FUCTION__,                 __LINE__ );         출입구( 1 );     }      등급.->편지 = 편지;     돌아가다 등급.; }  인트 등급_( 차를 편지 ) {     한다면 ( ( 편지 == 'A'    편지 == 'a' ) )         돌아가다 4;     또 다른     한다면 ( ( 편지 == 'B'    편지 == 'b' ) )         돌아가다 3;     또 다른     한다면 ( ( 편지 == '다'    편지 == 'ㄷ' ) )         돌아가다 2;     또 다른     한다면 ( ( 편지 ==     편지 == '드' ) )         돌아가다 1;     또 다른     한다면 ( ( 편지 == 'F'    편지 == 'f' ) )         돌아가다 0;     또 다른         돌아가다 -1; } 

생성자에서, 함수calloc()대신에 사용됩니다.malloc()각 메모리 셀은 0으로 설정되기 때문입니다.

간단한 학교 응용 프로그램에서 PERSONA 추상 데이터 유형을 위한 C 프로그래밍 언어 헤더 파일은 다음과 같습니다.

/* person.h */ /* -------- */ #ifndef PERSONA_H #정의Person_H  타이프 디프 짜임새 있는 {     차를 *이름.; } 사람인;  /* 생성자 */ /* ----------- */ 사람인 *person_new( 차를 *이름. ); #엔디프 

간단한 학교 응용 프로그램에서 PERSONA 추상 데이터 유형을 위한 C 프로그래밍 언어 소스 파일은 다음과 같습니다.

/* person.c */ /* -------- */ # # "person.h"  사람인 *person_new( 차를 *이름. ) {     사람인 *사람인;      한다면 ( ! ( 사람인 = 캘록( 1, 의 크기 ( 사람인 ) ) ) )     {         fprintf(쎄더르,                 "%s/%s/%d의 오류: calloc()가 비어 있습니다.\n",                 __FILE__,                 __FUCTION__,                 __LINE__ );         출입구( 1 );     }      사람인->이름. = 이름.;     돌아가다 사람인; } 

다음은 간단한 학교 응용 프로그램에서 학생 추상 데이터 유형을 위한 C 프로그래밍 언어 헤더 파일입니다.

/* 학생.h */ /* --------- */ #ifndef 학생_H #정의학생_H  # # "person.h" # # "등급.h"  타이프 디프 짜임새 있는 {     /* 학생은 사람의 부분집합입니다. */     /* -------------------------------- */     사람인 *사람인;      등급. *등급.; } 학생입니다;  /* 생성자 */ /* ----------- */ 학생입니다 *학생_신입( 차를 *이름. ); #엔디프 

다음은 간단한 학교 응용 프로그램에서 학생 추상 데이터 유형을 위한 C 프로그래밍 언어 소스 파일입니다.

/* 학생.c */ /* --------- */ # # "학생.h" # # "person.h"  학생입니다 *학생_신입( 차를 *이름. ) {     학생입니다 *학생입니다;      한다면 ( ! ( 학생입니다 = 캘록( 1, 의 크기 ( 학생입니다 ) ) ) )     {         fprintf(쎄더르,                 "%s/%s/%d의 오류: calloc()가 비어 있습니다.\n",                 __FILE__,                 __FUCTION__,                 __LINE__ );         출입구( 1 );     }      /* PERSONA 슈퍼클래스의 컨스트럭터를 실행합니다.*/     /* ------------------------------------------------- */     학생입니다->사람인 = person_new( 이름. );     돌아가다 학생입니다; } 

시연용 드라이버 프로그램은 다음과 같습니다.

/* 학생_ dvr.c */ /* ------------- */ # # <stdio.h> # # "학생.h"  인트 주된( 공허한 ) {     학생입니다 *학생입니다 = 학생_신입( "학생" );     학생입니다->등급. = grade_new( 'a' );      활자로 찍어내다( "%s: 숫자 등급 = %d\n",             /* 부분 집합이 존재하는 반면 상속은 존재하지 않습니다.*/             학생입니다->사람인->이름.,             /* 기능 프로그래밍이 JIT(Just-in-time) 기능을 실행하고 있습니다 */             등급_( 학생입니다->등급.->편지 ) );   돌아가다 0; } 

여기 모든 것을 컴파일할 수 있는 make file이 있습니다.

#makefile # ----------- all : student_dvr clean : rm student_dvr *.o student_dvr : student_dvr cgrade.o student_o person.o gcc student_o person.o gcc student_o student.o -o student_o student.o : grade.c grade.c grade.o : student.c student.h gcc -c student.o : person.c person.c person.c person.c

객체 지향 객체를 구축하는 공식 전략은 다음과 같습니다.[95]

  • 개체를 식별합니다.아마도 이것들은 명사일 것입니다.
  • 각 개체의 속성을 식별합니다.물체를 설명하는 데 도움이 되는 것은 무엇입니까?
  • 각 개체의 동작을 식별합니다.아마도 이들은 동사가 될 것입니다.
  • 개체 간의 관계를 파악합니다.아마도 이들은 동사가 될 것입니다.

예를 들어,

  • 사람이란 이름으로 식별되는 인간을 말합니다.
  • 성적은 글자로 확인되는 성취입니다.
  • 학생은 학점을 따는 사람입니다.

구문론과 의미론

프로그래밍 언어의 구문형식을 지배하는 제작 규칙목록입니다.[96]프로그래밍 언어의 형태선언, 표현진술의 올바른 배치입니다.[97]언어의 구문을 보완하는 것이 의미론입니다.의미론은 다양한 구문에 붙어있는 의미를 설명합니다.[96]양식에 잘못된 해석이 있을 수 있으므로 구문 구문에 의미론적 설명이 필요할 수 있습니다.[98]또한, 다른 언어들은 동일한 구문을 가질 수 있지만, 그들의 행동은 다를 수 있습니다.

언어의 구문은 생산 규칙을 나열함으로써 공식적으로 설명됩니다.자연어의 구문은 매우 복잡하지만, 영어의 부분집합은 다음과 같은 생산 규칙 목록을 가질 수 있습니다.[99]

  1. 문장명사구동사구로 구성됩니다.
  2. 명사구관사 뒤에 형용사 뒤에 명사 뒤에 오는 것으로 구성됩니다.
  3. 동사구동사구 다음에 명사구로 구성됩니다.
  4. 기사는 'the'입니다.
  5. 형용사는 'big' 또는 'big'입니다.
  6. 형용사는 'small'입니다.
  7. 명사는 'cat' 또는
  8. 명사는 'mouse'입니다.
  9. 동사는 'eats'입니다;

굵은 글씨로 된 단어는 "비단자"로 알려져 있습니다.'단일 인용문'의 단어는 '말단'이라고 합니다.[100]

이 생산 규칙 목록에서 일련의 교체를 사용하여 완전한 문장을 구성할 수 있습니다.[101]이 프로세스는 비단자를 유효한 비단자 또는 유효한 단자로 교체하는 것입니다.터미널만 남을 때까지 교체 과정이 반복됩니다.유효한 문장은 다음과 같습니다.

  • 문장.
  • 명사구 동사구
  • 기사 형용사 명사 동사구
  • 형용사 명사 동사구
  • 큰. 명사 동사구
  • 큰. 고양이 동사구
  • 큰. 고양이 동사. 명사구
  • 큰. 고양이 먹다 명사구
  • 큰. 고양이 먹다 기사 형용사 명사
  • 큰. 고양이 먹다 형용사 명사
  • 큰. 고양이 먹다 작은. 명사
  • 큰. 고양이 먹다 작은. 쥐를

그러나 다른 조합은 유효하지 않은 문장을 만듭니다.

  • 작은. 쥐를 먹다 큰. 고양이

따라서, 먹는 활동의 의미를 정확하게 설명하기 위해서는 의미론이 필요합니다.

BNF(Backus-Naur form)라고 하는 생산 규칙 목록 방법이 있습니다.[102]BNF는 언어의 구문을 설명하고 그 자체도 구문을 가지고 있습니다.이 재귀적 정의는 메타 언어의 한 예입니다.[96]BNF의 구문은 다음과 같습니다.

  • ::=로 번역되는 것은 비단자가 오른쪽에 있을 때 a[n]로 구성됩니다.터미널이 오른쪽에 있을 때로 번역됩니다.
  • 또는 로 번역됩니다.
  • <그리고.>terminals이 아닌 사람들을 둘러싸고 있습니다.

BNF를 사용하면 영어의 하위 집합은 다음과 같은 프로덕션 규칙 목록을 가질 수 있습니다.

<sentence> ::= <noun 프레이즈> <verb 프레이즈> <noun 프레이즈> ::= <기사> <adjective> <noun> <verb> <noun 프레이즈> ::= <verb> <기사> ::= the <adjective> ::= the <noun> ::= big small <verb> ::= cat mouse <verb> ::= eats.

BNF를 사용하면 서명된 정수는 다음과 같은 생산 규칙 목록을 가집니다.[103]

<signed-integer> ::= <sign> <integer> <sign> ::= + - <integer> ::= <digit> <digit> <digit> ::= 0 1 2 3 4 5 6 7 8 9

재귀적 생산 규칙에 주목하십시오.

<정수의> ::= <숫자를>   <숫자를><정수의> 

이것은 무한한 수의 가능성을 허용합니다.따라서 숫자의 제한을 설명하기 위해서는 의미론이 필요합니다.

생산 규칙에서 가장 중요한 0 가능성에 주목하십시오.

<integer> ::= <digit> <digit> <integer> <digit> ::= 0 1 2 3 4 5 6 7 8 9

따라서 선행 0이 무시되어야 한다는 것을 설명하기 위해서는 의미론이 필요합니다.

의미론을 설명하는 데는 두 가지 형식적인 방법이 있습니다.그것들은 지시적 의미론공리적 의미론입니다.[104]

소프트웨어 공학 및 컴퓨터 프로그래밍

프로그래밍 언어 이전에 Betty JenningsFran Bilas는 케이블을 이동하고 스위치를 설정하여 ENIAC를 프로그래밍했습니다.

소프트웨어 공학은 양질의 소프트웨어를 생산하기 위한 다양한 기술입니다.[105]컴퓨터 프로그래밍소스 코드를 쓰거나 편집하는 과정입니다.정형화된 환경에서 시스템 분석가는 자동화할 조직의 모든 프로세스에 대한 정보를 관리자로부터 수집하게 됩니다.그런 다음 이 전문가는 새 시스템이나 수정된 시스템에 대한 세부 계획을 준비합니다.[106]이 계획은 건축가의 설계도와 유사합니다.[106]

성과목표

시스템 분석가는 적절한 정보를 적절한 시기에 적절한 사람에게 전달하는 것을 목표로 합니다.[107]이 목표를 달성하기 위한 핵심 요소는 다음과 같습니다.[107]

  1. 출력의 질입니다.결과물이 의사결정에 유용합니까?
  2. 출력의 정확도입니다.그것이 실제 상황을 반영하는 것입니까?
  3. 출력의 형식입니다.출력을 쉽게 이해할 수 있습니까?
  4. 출력 속도입니다.고객과 실시간으로 소통할 때는 시간에 민감한 정보가 중요합니다.

원가목표

성능 목표를 달성하려면 다음을 포함한 모든 비용과 균형을 맞춰야 합니다.[108]

  1. 개발비.
  2. 고유성 비용.재사용 가능한 시스템은 비용이 많이 들 수 있습니다.그러나 제한된 용도의 시스템보다는 선호될 수 있습니다.
  3. 하드웨어 비용.
  4. 운영비.

시스템 개발 프로세스를 적용하면 오류가 나중에 발견될수록 수정하는 비용이 더 많이 든다는 공리가 완화됩니다.[109]

폭포 모형

폭포 모델시스템 개발 프로세스를 구현한 것입니다.[110]폭포 라벨에서 알 수 있듯이 기본 단계는 서로 겹칩니다.[111]

  1. 조사 단계는 근본적인 문제를 파악하는 것입니다.
  2. 분석 단계는 가능한 해결책을 이해하는 것입니다.
  3. 설계 단계는 최상의 솔루션을 계획하는 것입니다.
  4. 구현 단계는 최상의 솔루션을 프로그래밍하는 것입니다.
  5. 유지보수 단계는 시스템 수명 전반에 걸쳐 지속됩니다.시스템을 배포한 후 변경해야 할 수도 있습니다.[112]규격 결함, 설계 결함 또는 코딩 결함을 포함한 결함이 존재할 수 있습니다.개선이 필요할 수도 있습니다.변화하는 환경에 대응하기 위해서는 적응이 필요할 수 있습니다.

컴퓨터 프로그래머

컴퓨터 프로그래머는 세부 계획을 실행하기 위해 소스 코드를 작성하거나 수정하는 전문가입니다.[106]대부분의 시스템은 한 명의 프로그래머가 완성하기에는 너무 크기 때문에 프로그래밍 팀이 필요할 것으로 보입니다.[113]그러나 프로젝트에 프로그래머를 추가해도 완료 시간이 단축되지 않을 수 있습니다.대신 시스템의 품질을 저하시킬 수 있습니다.[113]효과적이기 위해서는 프로그램 모듈을 정의하고 팀원들에게 배포해야 합니다.[113]또한, 팀원들은 의미 있고 효과적인 방법으로 서로 교류해야 합니다.[113]

컴퓨터 프로그래머들은 작은 부분에서 프로그래밍을 하고 있을 수도 있습니다: 하나의 모듈 안에서 프로그래밍하는 것입니다.[114]모듈이 다른 소스 코드 파일에 위치한 모듈을 실행할 가능성이 있습니다.따라서 컴퓨터 프로그래머들은 대체로 프로그래밍 모듈을 사용하여 서로 효과적으로 결합할 수 있습니다.[114]일반적인 프로그래밍에는 API(Application Programming Interface)에 기여하는 것이 포함됩니다.

프로그램 모듈

모듈형 프로그래밍명령형 언어 프로그램을 다듬는 기술입니다.정제된 프로그램은 소프트웨어 크기를 줄이고 별도의 책임을 지므로 소프트웨어 노후화를 완화할 수 있습니다.프로그램 모듈블록 내에서 경계를 이루고 이름으로 함께 식별되는 일련의 문장입니다.[115]모듈에는 다음과 같은 기능, 컨텍스트로직이 있습니다.[116]

  • 모듈의 기능은 모듈이 하는 일입니다.
  • 모듈의 컨텍스트는 수행 중인 요소입니다.
  • 모듈의 논리는 모듈이 기능을 수행하는 방식입니다.

모듈의 이름은 먼저 해당 기능에 의해 도출된 다음, 해당 컨텍스트에 의해 도출되어야 합니다.논리는 이름의 일부가 되어서는 안 됩니다.[116]예를들면,function compute_square_root( x )아니면function compute_square_root_integer( i : integer )적절한 모듈 이름입니다.하지만,function compute_square_root_by_division( x )아닙니다.

모듈 내 상호 작용의 정도는 모듈의 응집력 수준입니다.[116]응집력은 모듈의 이름과 기능 사이의 관계를 판단하는 것입니다.모듈 간 상호 작용의 정도는 커플링 수준입니다.[117]커플링은 모듈의 상황과 수행 중인 요소 사이의 관계를 판단하는 것입니다.

응집력

최악에서 최상의 응집력 수준은 다음과 같습니다.[118]

  • 우연의 일치 응집력:모듈은 여러 기능을 수행하는 경우 우연한 일치로 응집력을 가지며 기능은 전혀 관련이 없습니다.예를들면,function read_sales_record_print_next_line_convert_to_float(). 경영진이 어리석은 규칙을 시행하면 우연한 응집력이 실제로 발생합니다.예를 들어, "모든 모듈에는 35개에서 50개 사이의 실행 가능한 문이 있습니다."[118]
  • 논리적 응집력:모듈은 일련의 기능을 사용할 수 있는 경우 논리적 응집력을 갖지만 그 중 하나만 실행됩니다.예를들면,function perform_arithmetic( perform_addition, a, b ).
  • 시간적 응집력:모듈은 시간과 관련된 기능을 수행할 경우 시간적 응집력을 갖습니다.한가지 예를 들자면,function initialize_variables_and_open_files(). 또 다른 예로,stage_one(),stage_two(), ...
  • 절차적 응집력:모듈은 느슨하게 관련된 여러 기능을 수행하는 경우 절차적 응집력을 갖습니다.예를들면,function read_part_number_update_employee_record().
  • 커뮤니케이션 응집력:모듈은 밀접하게 관련된 여러 기능을 수행하는 경우 의사소통적 응집력을 갖습니다.예를들면,function read_part_number_update_sales_record().
  • 정보의 응집력:모듈은 여러 기능을 수행할 경우 정보적 응집력을 갖지만 각 기능에는 고유한 진입 및 퇴출 지점이 있습니다.또한 기능은 동일한 데이터 구조를 공유합니다.객체 지향 클래스는 이 수준에서 작동합니다.
  • 기능적 응집력(Functional Cohesion): 모듈은 지역 변수에만 작용하는 단일 목표를 달성할 경우 기능적 응집력을 갖습니다.또한 다른 맥락에서 재사용이 가능할 수도 있습니다.

커플링

최악에서 최상의 커플링 수준은 다음과 같습니다.[117]

  • 내용 커플링: 모듈이 다른 함수의 로컬 변수를 수정할 경우 내용 커플링이 있습니다.코볼(COBOL)은 작업을 대체 동사로 수행하곤 했습니다.
  • 공통 커플링: 모듈이 전역 변수를 수정하는 경우 공통 커플링이 있습니다.
  • Control Coupling(제어 커플링): 모듈은 다른 모듈이 제어 흐름을 수정할 수 있는 경우 제어 커플링이 있습니다.예를들면,perform_arithmetic( perform_addition, a, b ). 대신, 반환된 개체의 구성에 제어가 있어야 합니다.
  • Stamp Coupling: 파라미터로 전달된 데이터 구조의 요소를 수정하면 모듈에 Stamp Coupling이 있습니다.객체 지향 클래스는 이 수준에서 작동합니다.
  • 데이터 커플링: 모듈은 입력 파라미터가 모두 필요하고 어느 것도 수정되지 않은 경우 데이터 커플링이 있습니다.또한 함수의 결과는 하나의 개체로 반환됩니다.

데이터흐름분석

샘플 함수 수준 데이터 흐름 다이어그램

데이터 흐름 분석기능적 응집력데이터 결합의 모듈을 달성하기 위해 사용되는 설계 방법입니다.[119]메소드에 대한 입력은 데이터 플로우 다이어그램입니다.데이터 흐름도는 모듈을 나타내는 타원형 집합입니다.각 모듈의 이름은 타원형 안에 표시됩니다.모듈은 실행 가능 레벨 또는 기능 레벨에 있을 수 있습니다.

이 다이어그램에는 모듈을 서로 연결하는 화살표도 있습니다.모듈을 가리키는 화살표는 입력 집합을 나타냅니다.각 모듈은 단일 출력 개체를 나타내기 위해 각 모듈에서 가리키는 화살표가 하나만 있어야 합니다. (선택적으로, 추가 예외 화살표는 가리킵니다.)데이지로 이루어진 타원형 사슬은 전체 알고리즘을 전달할 것입니다.입력 모듈이 다이어그램을 시작해야 합니다.입력 모듈을 변환 모듈에 연결해야 합니다.변환 모듈은 출력 모듈에 연결되어야 합니다.[120]

기능 카테고리

사용자애플리케이션 소프트웨어와 상호작용하는 모습을 보여주는 도면입니다.애플리케이션 소프트웨어는 하드웨어와 상호 작용하는 운영 체제와 상호 작용합니다.

컴퓨터 프로그램은 기능에 따라 분류될 수 있습니다.주요 기능 범주는 응용 소프트웨어시스템 소프트웨어입니다.시스템 소프트웨어에는 컴퓨터 하드웨어와 응용 프로그램 소프트웨어를 결합하는 운영 체제가 포함되어 있습니다.[121]운영체제의 목적은 응용 소프트웨어가 편리하고 효율적으로 실행되는 환경을 제공하는 것입니다.[121]응용 소프트웨어와 시스템 소프트웨어 모두 유틸리티 프로그램을 실행합니다.하드웨어 수준에서 마이크로코드 프로그램은 중앙 처리 장치 전체의 회로를 제어합니다.

응용 소프트웨어

응용 소프트웨어는 컴퓨터 시스템의 가능성을 여는 열쇠입니다.[122]엔터프라이즈 응용프로그램 소프트웨어는 회계, 인력, 고객 및 공급업체 응용프로그램을 번들로 제공합니다.예를 들어 엔터프라이즈 리소스 계획, 고객 관계 관리 및 공급망 관리 소프트웨어 등이 있습니다.

엔터프라이즈 애플리케이션은 자체적으로 독자적인 소프트웨어로 개발될 수 있습니다.[123]또는 기성 소프트웨어로 구입할 수도 있습니다.구입한 소프트웨어는 맞춤형 소프트웨어를 제공하도록 수정될 수 있습니다.응용프로그램이 사용자 정의된 경우 회사의 리소스가 사용되거나 리소스가 아웃소싱됩니다.외주 소프트웨어 개발은 원래 소프트웨어 공급업체 또는 타사 개발업체에서 개발한 것일 수 있습니다.[124]

사내 소프트웨어의 잠재적인 장점은 기능이며 보고서는 사양에 맞게 개발될 수 있습니다.[125]또한 관리자는 개발 프로세스에 참여하여 수준 높은 통제력을 제공할 수도 있습니다.[126]경영진은 경쟁사의 새로운 이니셔티브에 대응하거나 고객 또는 공급업체의 요구사항을 이행하기로 결정할 수 있습니다.[127]합병이나 인수를 위해서는 엔터프라이즈 소프트웨어의 변경이 필요할 수 있습니다.사내 소프트웨어의 잠재적인 단점은 시간과 자원 비용입니다.[123]또한 기능 및 성능과 관련된 위험이 다가오고 있을 수 있습니다.

기성품 소프트웨어의 잠재적인 장점은 초기 비용을 식별할 수 있고, 기본적인 요구사항을 충족해야 하며, 성능과 신뢰성은 실적이 있다는 것입니다.[123]기성 소프트웨어의 잠재적인 단점은 최종 사용자를 혼란스럽게 하는 불필요한 기능이 있을 수 있고, 기업이 필요로 하는 기능이 부족할 수 있으며, 데이터 흐름이 기업의 업무 프로세스와 일치하지 않을 수 있다는 것입니다.[123]

맞춤형 엔터프라이즈 애플리케이션을 경제적으로 얻을 수 있는 한 가지 방법은 애플리케이션 서비스 프로바이더를 통한 것입니다.[128]전문 업체는 하드웨어, 맞춤형 소프트웨어 및 최종 사용자 지원을 제공합니다.그들은 숙련된 정보 시스템 직원을 보유하고 있기 때문에 새로운 응용 프로그램의 개발을 가속화할 수 있습니다.가장 큰 장점은 복잡한 컴퓨터 프로젝트의 인력 배치 및 관리로부터 사내 자원을 자유롭게 해준다는 점입니다.[128]많은 애플리케이션 서비스 프로바이더들이 제한된 정보 시스템 리소스를 가진 빠르게 성장하는 소규모 기업들을 대상으로 합니다.[128]반면, 주요 시스템을 보유한 대기업은 기술적 인프라를 구축할 가능성이 높습니다.한 가지 위험은 민감한 정보를 가진 외부 조직을 신뢰해야 한다는 것입니다.또 다른 위험은 공급업체의 인프라 신뢰성을 신뢰해야 한다는 것입니다.[128]

운영체제

프로그램 vs.프로세스 대.
스케줄링, 선점, 컨텍스트 전환

운영체제컴퓨터의 기본 기능인 스케줄링 과정, 주변기기 제어 을 지원하는 하위 소프트웨어입니다.[121]

1950년대에는, 운영자이기도 한 프로그래머가 프로그램을 작성해서 운영하기도 했습니다.프로그램 실행이 완료된 후 출력물이 인쇄되었거나 나중에 처리하기 위해 종이 테이프 또는 카드에 천공되었을 수 있습니다.[28]프로그램이 작동하지 않는 경우가 많았습니다.그리고 나서 프로그래머는 콘솔 조명을 보고 콘솔 스위치를 만지작거렸습니다.운이 좋지 않을 경우, 추후 연구를 위해 메모리 출력물이 제작되었습니다.1960년대에 프로그래머들은 연산자의 작업을 자동화함으로써 낭비되는 시간을 줄였습니다.운영체제라는 프로그램은 컴퓨터에 항상 저장되어 있었습니다.[129]

운영 체제라는 용어는 두 가지 레벨의 소프트웨어를 의미할 수 있습니다.[130]운영체제는 프로세스, 메모리장치를 관리하는 커널 프로그램을 의미할 수 있습니다.좀 더 넓게 보면, 운영 체제는 중앙 소프트웨어의 전체 패키지를 지칭할 수 있습니다.패키지에는 커널 프로그램, 명령줄 인터프리터, 그래픽 사용자 인터페이스, 유틸리티 프로그램편집기가 포함됩니다.[130]

커널 프로그램

커널은 응용 소프트웨어를 컴퓨터의 하드웨어에 연결합니다.

커널의 주된 목적은 컴퓨터의 제한된 리소스를 관리하는 것입니다.

물리적 메모리는 RAM과 하드 디스크 주위에 흩어져 있습니다.가상 메모리는 하나의 연속적인 블록입니다.
  • 커널은 실행 파일을 메모리에 처음 로드할 때 주소 공간을 논리적으로 영역으로 나눕니다.[132]커널은 실행 중인 프로세스마다 하나씩 마스터 영역 테이블과 프로세스별 영역(영역) 테이블을 유지합니다.[132]이 테이블들은 가상 주소 공간을 구성합니다.마스터 영역 테이블은 해당 컨텐츠가 실제 메모리에서 어디에 있는지 확인하는 데 사용됩니다.각 공정마다 고유한 프로그램(텍스트) 영역, 데이터 영역 및 스택 영역을 가질 수 있습니다.
  • 프로그램 영역에는 기계 명령이 저장됩니다.기계 명령은 변하지 않기 때문에, 프로그램 영역은 동일한 실행 파일의 많은 프로세스에 의해 공유될 수 있습니다.[132]
  • 커널은 시간과 메모리를 절약하기 위해 전체 실행 파일이 아닌 실행 명령 블록만을 디스크 드라이브에서 로드할 수 있습니다.[131]
  • 커널은 가상 주소를 물리적 주소로 변환하는 역할을 합니다.커널은 메모리 컨트롤러에 데이터를 요청하고 대신 페이지 오류를 수신할 수 있습니다.[133]그렇다면 커널은 메모리 관리 유닛에 액세스하여 물리적 데이터 영역을 채우고 주소를 변환합니다.[134]
  • 커널은 프로세스의 요청에 따라 에서 메모리를 할당합니다.[64]프로세스가 메모리와 함께 완료되면 프로세스는 메모리 해제를 요청할 수 있습니다.할당된 모든 메모리의 해제를 요청하지 않고 프로세스가 종료되면 커널은 가비지 컬렉션(garbage collection)을 수행하여 메모리를 해제합니다.
  • 또한 커널은 프로세스가 커널이나 다른 프로세스의 메모리가 아닌 자신의 메모리에만 액세스하도록 보장합니다.[131]
  • 커널 프로그램은 파일 시스템 관리를 수행해야 합니다.[131]커널에는 파일을 생성, 검색, 업데이트 및 삭제하는 명령어가 있습니다.
  • 커널 프로그램은 장치 관리를 수행해야 합니다.[131]커널은 마우스, 키보드, 디스크 드라이브, 프린터 및 기타 장치에 대한 인터페이스를 표준화하고 단순화하는 프로그램을 제공합니다.또한, 두 프로세스가 동시에 디바이스를 요청할 경우 커널은 디바이스에 대한 액세스를 중재해야 합니다.
  • 커널 프로그램은 네트워크 관리를 수행해야 합니다.[135]커널은 프로세스를 대신하여 패킷을 송수신합니다.한 가지 핵심 서비스는 목표 시스템으로 가는 효율적인 경로를 찾는 것입니다.
  • 커널 프로그램은 프로그래머들이 사용할 수 있는 시스템 수준의 기능을 제공해야 합니다.[136]
    • 프로그래머들은 비교적 간단한 인터페이스를 통해 파일에 접근하며, 이 인터페이스는 비교적 복잡한 낮은 수준의 I/O 인터페이스를 실행합니다.하위 인터페이스에는 파일 작성, 파일 설명자, 파일 검색, 물리적 읽기 및 물리적 쓰기가 포함됩니다.
    • 프로그래머들은 비교적 간단한 인터페이스를 통해 프로세스를 만들고, 이 인터페이스는 상대적으로 복잡한 낮은 레벨의 인터페이스를 실행합니다.
    • 프로그래머들은 상대적으로 복잡한 낮은 수준의 시간 인터페이스를 실행하는 비교적 간단한 인터페이스를 통해 날짜/시간 산술을 수행합니다.[137]
  • 커널 프로그램은 실행하는 프로세스 사이에 통신 채널을 제공해야 합니다.[138]대규모 소프트웨어 시스템의 경우, 시스템을 작은 프로세스로 엔지니어링하는 것이 바람직할 수 있습니다.프로세스들은 신호를 주고받음으로써 서로 의사소통을 할 수 있습니다.

원래 운영 체제는 어셈블리로 프로그래밍되었지만 현대의 운영 체제는 일반적으로 C, Objective-C, Swift와 같은 상위 수준의 언어로 작성됩니다.[g]

유틸리티 프로그램

유틸리티 프로그램은 시스템 관리와 소프트웨어 실행을 돕기 위해 고안되었습니다.운영체제는 하드웨어 유틸리티 프로그램을 실행하여 디스크 드라이브, 메모리, 스피커, 프린터의 상태를 확인합니다.[139]유틸리티 프로그램은 붐비는 디스크에 파일 배치를 최적화할 수 있습니다.시스템 유틸리티 프로그램은 하드웨어 및 네트워크 성능을 모니터링합니다.메트릭이 허용 범위를 벗어나면 트리거 경고가 생성됩니다.[140]

유틸리티 프로그램에는 압축 프로그램이 포함되어 있어 데이터 파일을 더 적은 디스크 공간에 저장할 수 있습니다.[139]압축 프로그램은 데이터 파일이 네트워크를 통해 전송될 때 시간도 절약합니다.[139]유틸리티 프로그램은 데이터 세트를 정렬하고 병합할 수 있습니다.[140]유틸리티 프로그램은 컴퓨터 바이러스를 탐지합니다.[140]

마이크로코드 프로그램

NOT 게이트
낸드게이트
NOR 게이트
AND게이트
수술실 게이트

마이크로코드 프로그램은 소프트웨어 구동 컴퓨터의 데이터 경로를 제어하는 하위 레벨의 인터프리터입니다.[141] (하드웨어의 발전은 이러한 연산을 하드웨어 실행 회로로 이동시켰습니다.)[141]마이크로코드 명령어를 사용하면 프로그래머가 컴퓨터의 실제 하드웨어인 디지털[142] 논리 수준을 보다 쉽게 구현할 수 있습니다.디지털 논리 수준은 컴퓨터 과학컴퓨터 공학의 경계입니다.[143]

논리 게이트는 켜짐 또는 꺼짐의 두 신호 중 하나를 반환할 수 있는 작은 트랜지스터입니다.[144]

  • 트랜지스터가 하나 있으면 NOT 게이트가 형성됩니다.
  • 두 개의 트랜지스터를 직렬로 연결하면 NAND 게이트가 형성됩니다.
  • 두 개의 트랜지스터를 병렬로 연결하면 NOR 게이트가 형성됩니다.
  • NOT 게이트를 NAND 게이트에 연결하면 AND 게이트가 됩니다.
  • NOT 게이트를 NOR 게이트에 연결하면 OR 게이트가 형성됩니다.

이 다섯 개의 게이트는 컴퓨터의 디지털 논리 함수인 이진 대수의 구성 요소를 형성합니다.

마이크로코드 명령어는 프로그래머들이 이진 대수로 구성하는 대신 디지털 논리 함수를 실행하기 위해 사용할 수 있는 기억법입니다.중앙 처리 장치(CPU) 제어 저장소에 저장됩니다.[145]이러한 하드웨어 수준의 명령어는 데이터 경로를 통해 데이터를 이동합니다.

마이크로 명령 주기는 마이크로 순서기가 마이크로 프로그램 카운터를 사용하여 랜덤 액세스 메모리에서 다음 컴퓨터 명령가져올 때 시작됩니다.[146]다음 단계는 하드웨어 모듈에 적합한 출력 라인을 선택하여 기계 명령을 디코딩하는 것입니다.[147]마지막 단계는 하드웨어 모듈의 게이트 세트를 사용하여 명령을 실행하는 것입니다.

ALU의 상징적인 표현.

산술을 수행하는 명령은 ALU(Ametric Logic Unit)를 통해 전달됩니다.[148]ALU에는 정수를 추가, 이동 및 비교하기 위한 기본 연산을 수행하는 회로가 있습니다.CPU는 ALU를 통해 기본 연산을 조합하고 루프함으로써 복잡한 연산을 수행합니다.

마이크로코드 명령어는 CPU와 메모리 컨트롤러 사이에서 데이터를 이동시킵니다.메모리 컨트롤러 마이크로코드 명령어는 두 의 레지스터를 조작합니다.메모리 주소 레지스터는 각 메모리 셀의 주소에 액세스하기 위해 사용됩니다.메모리 데이터 레지스터는 각 셀의 내용을 설정하고 읽는 데 사용됩니다.[149]

마이크로코드 명령어는 CPU와 다수의 컴퓨터 버스 사이에서 데이터를 이동시킵니다.디스크 컨트롤러 버스하드 디스크 드라이브에 쓰기와 읽기를 합니다.또한 주변 부품 인터커넥트 고속 버스를 통해 CPU와 다른 기능 장치 간에 데이터가 이동됩니다.[150]

메모들

  1. ^ 컴파일된 프로그램은 CPU에 대한 각 기계 명령을 준비합니다.
  2. ^ 자세한 내용은 X86 어셈블리어#을 참조하십시오.명령어 종류.
  3. ^ 1999년에 도입된
  4. ^ 오퍼레이터는 다음과 같습니다.x++일반적으로 하나의 명령어로 컴파일됩니다.
  5. ^ 이 함수는 다음과 같이 더 간결하게 작성될 수 있습니다.int increment_counter(){ static int counter; return ++counter;}. 1) 정적 변수는 자동으로 0으로 초기화됩니다. 2)++counter는 접두사 증분 연산자입니다.
  6. ^ 이것은 보통 아래에서 위로 올라가는 스택의 은유에도 불구하고 그렇다는 것에 유의하십시오.
  7. ^ 유닉스 운영 체제는 C로 작성되었고 macOS는 Objective-C로 작성되었으며 스위프트는 Objective-C를 대체했습니다.

참고문헌

  1. ^ "ISO/IEC 2382:2015". ISO. 2020-09-03. Archived from the original on 2016-06-17. Retrieved 2022-05-26. [Software includes] all or part of the programs, procedures, rules, and associated documentation of an information processing system.
  2. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 7. ISBN 0-201-71012-9.
  3. ^ Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 98. ISBN 978-0-201-50480-4.
  4. ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 32. ISBN 978-0-13-854662-5.
  5. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 30. ISBN 0-201-71012-9. Their intention was to produce a language that was very simple for students to learn[.]
  6. ^ a b c Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 31. ISBN 0-201-71012-9.
  7. ^ a b c d e f Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 30. ISBN 0-201-71012-9.
  8. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 30. ISBN 0-201-71012-9. The idea was that students could be merely casual users or go on from Basic to more sophisticated and powerful languages[.]
  9. ^ a b McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 16. ISBN 978-0-8027-1348-3.
  10. ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 14. ISBN 978-0-13-854662-5.
  11. ^ Bromley, Allan G. (1998). "Charles Babbage's Analytical Engine, 1838" (PDF). IEEE Annals of the History of Computing. 20 (4): 29–45. doi:10.1109/85.728228. S2CID 2285332. Archived (PDF) from the original on 2016-03-04. Retrieved 2015-10-30.
  12. ^ a b Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 15. ISBN 978-0-13-854662-5.
  13. ^ J. Fuegi; J. Francis (October–December 2003), "Lovelace & Babbage and the creation of the 1843 'notes'", Annals of the History of Computing, 25 (4): 16, 19, 25, doi:10.1109/MAHC.2003.1253887
  14. ^ Rojas, Raúl (2023-03-24). "The First Computer Program". arXiv:2303.13740v1 [cs.GL].
  15. ^ Rosen, Kenneth H. (1991). Discrete Mathematics and Its Applications. McGraw-Hill, Inc. p. 654. ISBN 978-0-07-053744-6. Turing machines can model all the computations that can be performed on a computing machine.
  16. ^ Linz, Peter (1990). An Introduction to Formal Languages and Automata. D. C. Heath and Company. p. 234. ISBN 978-0-669-17342-0.
  17. ^ Linz, Peter (1990). An Introduction to Formal Languages and Automata. D. C. Heath and Company. p. 243. ISBN 978-0-669-17342-0. [A]ll the common mathematical functions, no matter how complicated, are Turing-computable.
  18. ^ a b c McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 102. ISBN 978-0-8027-1348-3.
  19. ^ McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 94. ISBN 978-0-8027-1348-3.
  20. ^ McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 107. ISBN 978-0-8027-1348-3.
  21. ^ McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 120. ISBN 978-0-8027-1348-3.
  22. ^ a b McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 118. ISBN 978-0-8027-1348-3.
  23. ^ McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 119. ISBN 978-0-8027-1348-3.
  24. ^ McCartney, Scott (1999). ENIAC – The Triumphs and Tragedies of the World's First Computer. Walker and Company. p. 123. ISBN 978-0-8027-1348-3.
  25. ^ a b Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 21. ISBN 978-0-13-854662-5.
  26. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 27. ISBN 0-201-71012-9.
  27. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 29. ISBN 0-201-71012-9.
  28. ^ a b c Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 6. ISBN 978-0-201-50480-4.
  29. ^ a b c d e f g h i "Bill Pentz — A bit of Background: the Post-War March to VLSI". Digibarn Computer Museum. August 2008. Archived from the original on March 21, 2022. Retrieved January 31, 2022.
  30. ^ a b To the Digital Age: Research Labs, Start-up Companies, and the Rise of MOS. Johns Hopkins University Press. 2002. ISBN 9780801886393. Archived from the original on February 2, 2023. Retrieved February 3, 2022.
  31. ^ Chalamala, Babu (2017). "Manufacturing of Silicon Materials for Microelectronics and Solar PV". Sandia National Laboratories. Archived from the original on March 23, 2023. Retrieved February 8, 2022.
  32. ^ "Fabricating ICs Making a base wafer". Britannica. Archived from the original on February 8, 2022. Retrieved February 8, 2022.
  33. ^ "Introduction to NMOS and PMOS Transistors". Anysilicon. 4 November 2021. Archived from the original on 6 February 2022. Retrieved February 5, 2022.
  34. ^ "microprocessor definition". Britannica. Archived from the original on April 1, 2022. Retrieved April 1, 2022.
  35. ^ "Chip Hall of Fame: Intel 4004 Microprocessor". Institute of Electrical and Electronics Engineers. July 2, 2018. Archived from the original on February 7, 2022. Retrieved January 31, 2022.
  36. ^ "360 Revolution" (PDF). Father, Son & Co. 1990. Archived (PDF) from the original on 2022-10-10. Retrieved February 5, 2022.
  37. ^ a b "Inside the world's long-lost first microcomputer". c/net. January 8, 2010. Archived from the original on February 1, 2022. Retrieved January 31, 2022.
  38. ^ "Bill Gates, Microsoft and the IBM Personal Computer". InfoWorld. August 23, 1982. Archived from the original on 18 February 2023. Retrieved 1 February 2022.
  39. ^ a b Stroustrup, Bjarne (2013). The C++ Programming Language, Fourth Edition. Addison-Wesley. p. 10. ISBN 978-0-321-56384-2.
  40. ^ a b c Stroustrup, Bjarne (2013). The C++ Programming Language, Fourth Edition. Addison-Wesley. p. 11. ISBN 978-0-321-56384-2.
  41. ^ a b Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 159. ISBN 0-619-06489-7.
  42. ^ a b Linz, Peter (1990). An Introduction to Formal Languages and Automata. D. C. Heath and Company. p. 2. ISBN 978-0-669-17342-0.
  43. ^ Weiss, Mark Allen (1994). Data Structures and Algorithm Analysis in C++. Benjamin/Cummings Publishing Company, Inc. p. 29. ISBN 0-8053-5443-3.
  44. ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 17. ISBN 978-0-13-854662-5.
  45. ^ a b c d e f Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 160. ISBN 0-619-06489-7.
  46. ^ a b c Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 399. ISBN 978-0-13-854662-5.
  47. ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 400. ISBN 978-0-13-854662-5.
  48. ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 398. ISBN 978-0-13-854662-5.
  49. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 26. ISBN 0-201-71012-9.
  50. ^ a b c d Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 37. ISBN 0-201-71012-9.
  51. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 160. ISBN 0-619-06489-7. With third-generation and higher-level programming languages, each statement in the language translates into several instructions in machine language.
  52. ^ Wilson, Leslie B. (1993). Comparative Programming Languages, Second Edition. Addison-Wesley. p. 75. ISBN 978-0-201-56885-1.
  53. ^ Stroustrup, Bjarne (2013). The C++ Programming Language, Fourth Edition. Addison-Wesley. p. 40. ISBN 978-0-321-56384-2.
  54. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 16. ISBN 0-201-71012-9.
  55. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 24. ISBN 0-201-71012-9.
  56. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 25. ISBN 0-201-71012-9.
  57. ^ a b c d Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 19. ISBN 0-201-71012-9.
  58. ^ a b c d "Memory Layout of C Programs". 12 September 2011. Archived from the original on 6 November 2021. Retrieved 6 November 2021.
  59. ^ a b Kernighan, Brian W.; Ritchie, Dennis M. (1988). The C Programming Language Second Edition. Prentice Hall. p. 31. ISBN 0-13-110362-8.
  60. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 128. ISBN 0-201-71012-9.
  61. ^ a b c Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 121. ISBN 978-1-59327-220-3.
  62. ^ Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 122. ISBN 978-1-59327-220-3.
  63. ^ Kernighan, Brian W.; Ritchie, Dennis M. (1988). The C Programming Language Second Edition. Prentice Hall. p. 185. ISBN 0-13-110362-8.
  64. ^ a b Kernighan, Brian W.; Ritchie, Dennis M. (1988). The C Programming Language Second Edition. Prentice Hall. p. 187. ISBN 0-13-110362-8.
  65. ^ a b c Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 38. ISBN 0-201-71012-9.
  66. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 193. ISBN 0-201-71012-9.
  67. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 39. ISBN 0-201-71012-9.
  68. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 35. ISBN 0-201-71012-9.
  69. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 192. ISBN 0-201-71012-9.
  70. ^ Stroustrup, Bjarne (2013). The C++ Programming Language, Fourth Edition. Addison-Wesley. p. 22. ISBN 978-0-321-56384-2.
  71. ^ Stroustrup, Bjarne (2013). The C++ Programming Language, Fourth Edition. Addison-Wesley. p. 21. ISBN 978-0-321-56384-2.
  72. ^ Stroustrup, Bjarne (2013). The C++ Programming Language, Fourth Edition. Addison-Wesley. p. 49. ISBN 978-0-321-56384-2.
  73. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 218. ISBN 0-201-71012-9.
  74. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 217. ISBN 0-201-71012-9.
  75. ^ Weiss, Mark Allen (1994). Data Structures and Algorithm Analysis in C++. Benjamin/Cummings Publishing Company, Inc. p. 103. ISBN 0-8053-5443-3. When there is a function call, all the important information needs to be saved, such as register values (corresponding to variable names) and the return address (which can be obtained from the program counter)[.] ... When the function wants to return, it ... restores all the registers. It then makes the return jump. Clearly, all of this work can be done using a stack, and that is exactly what happens in virtually every programming language that implements recursion.
  76. ^ a b c Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 230. ISBN 0-201-71012-9.
  77. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 240. ISBN 0-201-71012-9.
  78. ^ a b c Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 241. ISBN 0-201-71012-9.
  79. ^ Jones, Robin; Maynard, Clive; Stewart, Ian (December 6, 2012). The Art of Lisp Programming. Springer Science & Business Media. p. 2. ISBN 9781447117193.
  80. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 220. ISBN 0-201-71012-9.
  81. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 221. ISBN 0-201-71012-9.
  82. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 229. ISBN 0-201-71012-9.
  83. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 227. ISBN 0-201-71012-9.
  84. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 222. ISBN 0-201-71012-9.
  85. ^ Gordon, Michael J. C. (1996). "From LCF to HOL: a short history". Archived from the original on 2016-09-05. Retrieved 2021-10-30.
  86. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 233. ISBN 0-201-71012-9.
  87. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 235. ISBN 0-201-71012-9.
  88. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 55. ISBN 0-201-71012-9.
  89. ^ Colmerauer, A.; Roussel, P. (1992). "The birth of Prolog" (PDF). ACM Sigplan Notices. Association for Computing Machinery. 28 (3): 5. doi:10.1145/155360.155362.
  90. ^ Kowalski, R., Davila, J., Sartor, G. 그리고 Calebo, M., 2023.법학과 교육을 위한 논리 영어.프롤로그에서:다음 50년 (287-299쪽).참: 스프링거 네이처 스위스.
  91. ^ a b Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 35. ISBN 0-201-71012-9. Simula was based on Algol 60 with one very important addition — the class concept. ... The basic idea was that the data (or data structure) and the operations performed on it belong together[.]
  92. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 39. ISBN 0-201-71012-9. Originally, a large number of experimental languages were designed, many of which combined object-oriented and functional programming.
  93. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 284. ISBN 0-256-08515-3. While it is true that OOD [(object oriented design)] as such is not supported by the majority of popular languages, a large subset of OOD can be used.
  94. ^ Weiss, Mark Allen (1994). Data Structures and Algorithm Analysis in C++. Benjamin/Cummings Publishing Company, Inc. p. 57. ISBN 0-8053-5443-3.
  95. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 285. ISBN 0-256-08515-3.
  96. ^ a b c Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 290. ISBN 0-201-71012-9.
  97. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 78. ISBN 0-201-71012-9. The main components of an imperative language are declarations, expressions, and statements.
  98. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 294. ISBN 0-201-71012-9.
  99. ^ Rosen, Kenneth H. (1991). Discrete Mathematics and Its Applications. McGraw-Hill, Inc. p. 615. ISBN 978-0-07-053744-6.
  100. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 291. ISBN 0-201-71012-9.
  101. ^ Rosen, Kenneth H. (1991). Discrete Mathematics and Its Applications. McGraw-Hill, Inc. p. 616. ISBN 978-0-07-053744-6.
  102. ^ Rosen, Kenneth H. (1991). Discrete Mathematics and Its Applications. McGraw-Hill, Inc. p. 623. ISBN 978-0-07-053744-6.
  103. ^ Rosen, Kenneth H. (1991). Discrete Mathematics and Its Applications. McGraw-Hill, Inc. p. 624. ISBN 978-0-07-053744-6.
  104. ^ Wilson, Leslie B. (2001). Comparative Programming Languages, Third Edition. Addison-Wesley. p. 297. ISBN 0-201-71012-9.
  105. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. Preface. ISBN 0-256-08515-3.
  106. ^ a b c Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 507. ISBN 0-619-06489-7.
  107. ^ a b Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 513. ISBN 0-619-06489-7.
  108. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 514. ISBN 0-619-06489-7.
  109. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 516. ISBN 0-619-06489-7.
  110. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 8. ISBN 0-256-08515-3.
  111. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 517. ISBN 0-619-06489-7.
  112. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 345. ISBN 0-256-08515-3.
  113. ^ a b c d Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 319. ISBN 0-256-08515-3.
  114. ^ a b Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 331. ISBN 0-256-08515-3.
  115. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 216. ISBN 0-256-08515-3.
  116. ^ a b c Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 219. ISBN 0-256-08515-3.
  117. ^ a b Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 226. ISBN 0-256-08515-3.
  118. ^ a b Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 220. ISBN 0-256-08515-3.
  119. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 258. ISBN 0-256-08515-3.
  120. ^ Schach, Stephen R. (1990). Software Engineering. Aksen Associates Incorporated Publishers. p. 259. ISBN 0-256-08515-3.
  121. ^ a b c Silberschatz, Abraham (1994). Operating System Concepts, Fourth Edition. Addison-Wesley. p. 1. ISBN 978-0-201-50480-4.
  122. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 147. ISBN 0-619-06489-7. The key to unlocking the potential of any computer system is application software.
  123. ^ a b c d Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 147. ISBN 0-619-06489-7.
  124. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 147. ISBN 0-619-06489-7. [A] third-party software firm, often called a value-added software vendor, may develop or modify a software program to meet the needs of a particular industry or company.
  125. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 148. ISBN 0-619-06489-7. Heading: Proprietary Software; Subheading: Advantages; Quote: You can get exactly what you need in terms of features, reports, and so on.
  126. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 148. ISBN 0-619-06489-7. Heading: Proprietary Software; Subheading: Advantages; Quote: Being involved in the development offers a further level of control over the results.
  127. ^ Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 147. ISBN 0-619-06489-7. Heading: Proprietary Software; Subheading: Advantages; Quote: There is more flexibility in making modifications that may be required to counteract a new initiative by one of your competitors or to meet new supplier and/or customer requirements.
  128. ^ a b c d Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 149. ISBN 0-619-06489-7.
  129. ^ Tanenbaum, Andrew S. (1990). Structured Computer Organization, Third Edition. Prentice Hall. p. 11. ISBN 978-0-13-854662-5.
  130. ^ a b Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 21. ISBN 978-1-59327-220-3.
  131. ^ a b c d e Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 22. ISBN 978-1-59327-220-3.
  132. ^ a b c Bach, Maurice J. (1986). The Design of the UNIX Operating System. Prentice-Hall, Inc. p. 152. ISBN 0-13-201799-7.
  133. ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 443. ISBN 978-0-13-291652-3.
  134. ^ Lacamera, Daniele (2018). Embedded Systems Architecture. Packt. p. 8. ISBN 978-1-78883-250-2.
  135. ^ Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 23. ISBN 978-1-59327-220-3.
  136. ^ Kernighan, Brian W. (1984). The Unix Programming Environment. Prentice Hall. p. 201. ISBN 0-13-937699-2.
  137. ^ Kerrisk, Michael (2010). The Linux Programming Interface. No Starch Press. p. 187. ISBN 978-1-59327-220-3.
  138. ^ Haviland, Keith (1987). Unix System Programming. Addison-Wesley Publishing Company. p. 121. ISBN 0-201-12919-1.
  139. ^ a b c Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 145. ISBN 0-619-06489-7.
  140. ^ a b c Stair, Ralph M. (2003). Principles of Information Systems, Sixth Edition. Thomson. p. 146. ISBN 0-619-06489-7.
  141. ^ a b Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 6. ISBN 978-0-13-291652-3.
  142. ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 243. ISBN 978-0-13-291652-3.
  143. ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 147. ISBN 978-0-13-291652-3.
  144. ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 148. ISBN 978-0-13-291652-3.
  145. ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 253. ISBN 978-0-13-291652-3.
  146. ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 255. ISBN 978-0-13-291652-3.
  147. ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 161. ISBN 978-0-13-291652-3.
  148. ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 166. ISBN 978-0-13-291652-3.
  149. ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 249. ISBN 978-0-13-291652-3.
  150. ^ Tanenbaum, Andrew S. (2013). Structured Computer Organization, Sixth Edition. Pearson. p. 111. ISBN 978-0-13-291652-3.