"알골"의 두 판 사이의 차이
yueun920520 (토론 | 기여) |
잔글 |
||
(사용자 6명의 중간 판 91개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
+ | [[파일:알골 로고.png|썸네일|200픽셀|'''알골'''(ALGOL)]] | ||
+ | [[파일:알골 글자.png|썸네일|300픽셀|'''알골'''(ALGOL)]] | ||
+ | |||
'''알골'''<!--앨골-->(ALGOL)은 Algorithmic Language의 약자로서, 1950년대 후반 [[유럽]]을 중심으로 개발된 [[프로그래밍 언어]]이다. 당시 미국 [[IBM]]에서 개발한 [[포트란]](Fortran)에 대항하기 위해 1958년 [[스위스]] [[취리히]]의 국제회의에서 제안되었다. [[알고리즘]]의 연구 개발에 이용되었으나, 널리 보급되지는 못하였다. | '''알골'''<!--앨골-->(ALGOL)은 Algorithmic Language의 약자로서, 1950년대 후반 [[유럽]]을 중심으로 개발된 [[프로그래밍 언어]]이다. 당시 미국 [[IBM]]에서 개발한 [[포트란]](Fortran)에 대항하기 위해 1958년 [[스위스]] [[취리히]]의 국제회의에서 제안되었다. [[알고리즘]]의 연구 개발에 이용되었으나, 널리 보급되지는 못하였다. | ||
== 개요 == | == 개요 == | ||
+ | 알골(ALGOL)은 알고리즘언어(ALGOrithmic Language)의 약자로 이 언어는 계산과정묘사 지향적인 언어이자 알고리즘 묘사 지향적인 언어이다. 대표적인 블록구조 언어이기도하다. 대수 계산이나 논리적인 연산 처리를 하는 경우에 적합한 프로그램 언어이다. 1960년에 ALGOL 60으로서 문법서가 제정되었다. 그 후 ALGOL 68도 발표되었다. <ref> 전기용어사전,〈[https://terms.naver.com/entry.nhn?docId=2053754&cid=50372&categoryId=50372 알골 - 용어 해설]〉 , 《네이버 지식백과》</ref> 알골은 세계 최초의 구조화언어로서 엄격한 기초이론과 형식화된 어법 규칙을 가진다. | ||
+ | |||
+ | == 역사 == | ||
+ | *알골은 1958년 IBM의 연구 개발팀이 개발한 것으로 같은 해 취히리에서 개최한 국제 상업 학술 컴퓨터 위원회에서 ACM(Association of Computing Machinery) 팀과 당시 연방 독일의 응용수학과 역학협회(GAMM)가 건의한 알고리즘 표시법을 종합해 ALGOL 58을 만들었다. 1959년에 IBM은 ALGOL 코드를 실행시켰다. | ||
+ | *1960년 국제정보처리학회연합(IFIP)에서 유럽의 학자들을 중심으로 만들어졌다. 1월 튜링상 수상자 앨런 펄리스는 파리에서 열린 전 세계 일류 소프트웨어 전문가들이 참석한 토론회에서 <알고리즘 언어 ALGOL 60 보고>를 발표해, 알고리즘 언어 ALGOL 60을 확립했다. <ref name = "소프트웨어 문화개론"> 담 정,〈제3세대언어-고급언어〉 , 《소프트웨어 문화개론》, 2016-08-31 </ref> 유럽의 학자들 중심으로 만들어졌기 때문에 유럽쪽에서 많이 사용되었고 미국쪽에서는 포트란을 많이 사용하였다고 한다. | ||
+ | *알골 58 : 1958년 취리히에서 열린 국제회의에서 제안된 것이 그 기원으로 여겨진다.(이 언어는 후에 ALGOL 58로 불리게 되지만, 당초의 이름은 IAL이었다.) 알골 58은 코드 블록 및 이들을 제거할 begin과 end 쌍을 도입하였다. | ||
+ | *알골 60 : 1960의 준말로 문법이 BNF 표기법으로 기술,구조화된 프로그래밍의 형태를 갖춘다. BCPL, B, 파스칼, 시뮬라, C 등의 다른 수많은 프로그래밍 언어에 영향을 주었다.또한 알골 60은 어휘 범위의 네스티드 함수 정의를 처음 추가한 언어이다. 알골 60'이라는 새로운 언어는 신대륙의 포트란에 대항하기 위해 만들어졌다.<ref>이성규 기자, 〈[http://www.bloter.net/archives/196547 IT 거인들은 왜 프로그래밍 언어에 집착할까]〉, 《블로터》, 2014-06-18</ref> 알골은 [[포트란]](FORTRAN) 언어와 비교했을 때 두 가지 장점이 있다. | ||
+ | #프로그래밍 언어 중에서 처음으로 지역 변수를 사용 : FORTRAN 언어는 전역변수(하나의 변수는 모든 코드에서 하나의 의미로만 사용)만 사용 가능했지만, ALGOL은 지역변수를 사용하면서 하나의 코드 안에서 다른 함수라면 다른 의미를 가질 수 있었다. | ||
+ | #재귀라는 프로그래밍 설계 사상 : 재귀는 하나의 문제를 여러 개의 작은 문제로 나누고, 각각의 작은 문제 안에서 해결하고 전체적인 답을 얻는 것을 말한다. [[포트란]] 언어의 설계자인 배커스는 ALGOL 문법을 설계하던 중 전후 문맥이 무관한 문법형식이라는 그의 최신 연구 결과를 사용해 ALGOL 언어 회의에서 논문을 교류했다. 마감일을 넘겨 논문집에 실리지는 못했지만 덴마크의 수학자 페테르 나우르가 큰 영감을 받았고 배커스의 문법에 대한 감수와 수정을 해서 더욱 완벽하게 만들었다. 여기서 컴퓨터계의 유명한 베커스-나우르 표기법(BNF)이 탄생했다. 이 표기법은 <알고리즘 언어 ALGOL 60 보고>안에 쓰였다. <ref name = "소프트웨어 문화개론"></ref> | ||
+ | |||
+ | * 알골 68 :1968년에는 ALGOL 68이 개발되었다. ALGOL-10과 매우 유사하며, IFIP(국제 정보 처리 학회)에서 발표된 언어의 이름으로 알골 60을 발전시켜 다목적용의 강력한 언어로 만들 계획으로 설계했다. 2단계 문법 Wijngaarden 표기법으로 문법이 기술했고, 다양한 데이터형을 다루는 융통성이 주어져 과학 계산용의 범주를 벗어나 사무 처리용까지 적용범위를 확대했다.<ref> 시사상식사전,〈[https://terms.naver.com/entry.nhn?docId=932263&cid=43667&categoryId=43667 용어-시사상식사전]〉 , 《네이버 지식백과》</ref> 기능이 너무 복잡해 실제로는 많이 사용되지 않고 있다. 일괄처리 체제에 적합한 입출력 방식으로 되어있어 주로 일괄처리시스템에 사용된다.<ref> 컴퓨터인터넷IT용어대사전,〈[https://terms.naver.com/entry.nhn?docId=814912&cid=50376&categoryId=50376 알골 68]〉 , 《네이버 지식백과》</ref> | ||
+ | |||
+ | * 표준으로 IFIP TC/WG2.1에서 ALGOL 60이 제정되었다. 이후에는 이어지는 표준화 작업은 진행되지 않고 1984년에야 ALGOL 60에 상당하는 것이 ISO 표준으로 지정되었다. z 1968년에는 ALGOL 68이 개발되었다. ALGOL 68에서는 2단계 문법 Wijngaarden 표기법으로 문법이 기술되었다. ALGOL 60의 후계 언어가 제정되기까지 파스칼을 설계한 Wirth의 ALGOL W를 비롯한 여러 후보자가 있었지만, 결국은 ALGOL 68이 후계로 지정되었다. 그러나 너무 복잡하고 방대한 사양을 요구했기 때문에 ALGOL 68 컴파일러는 실제 구현이 어려웠고, Wijngaarden 표기법 또한 난해하여 실용적으로 보급되지 못했다. | ||
+ | |||
+ | 알골은 후에 알골(ALGOL) -> BCPL -> B 언어의 개발 과정으로 C언어를 개발하는데 큰 영향을 끼쳤다. 1963년 ALGOL60 보다 더 다양한 용도로 확장하기 위해 CPL 언어를 케임브리지 대학교의 수학 연구소와 런던 대학교의 컴퓨터 공학부에서 공동 개발하였다. 이후 1967년 마틴 리차드는 CPL을 더욱 단순화 시킨 BCPL(Basic CPL)을 개발하였고, 1969년 경 BCPL이 미국으로 넘어와서 켄 톰슨에 의해 B언어를 개발하였다. <ref> luckey, 〈[https://blog.makebyhand.co.kr/43 C언어의 유래와 역사]〉, 《티스토리》, 2009-03-19</ref> | ||
+ | 켄 톰슨(Ken Thompseon)이 벨 연구소에서 MULTICS 운영체제를 개조하여 유닉스를 만들던 중 기계마다 운영체계를 제작 하다시피 하여 만드는 애로사항을 해결하고자 이식성이 좋고, 호환성이 좋은 언어로 제작하여야겠다는 필요성을 가졌다. | ||
+ | 이때 데니스 리치(Dennis Ritchie)가 B 언어를 개조하여 1972년 C 언어를 제작하게 된것이다. | ||
+ | |||
+ | ==특징== | ||
+ | 알고리즘 언어의 목적은 계산 프로세스를 설명하는 것이다. 계산 규칙의 설명에 사용되는 기본 개념은 숫자, 변수 및 함수를 구성 요소로 포함하는 잘 알려진 산술 표현식이다. | ||
+ | 수치 계산 절차를 표준화된 형태로 정확하게 컴퓨터에 나타내는 데 쓰이는 산술 언어로 이 언어는 컴파일러가 있는 상황에서 컴퓨터에 수치 계산 과정을 인식시키는 것 외에 개인 간에 수치 계산 과정을 전달하기 위한 수단으로도 사용된다. 국제 협약에 의해 표준화된 국제 대수 언어(International Algebraic Lan-guage)는 알골의 전신이다. <ref> 컴퓨터인터넷IT용어대사전〈[https://terms.naver.com/entry.nhn?docId=814912&cid=50376&categoryId=50376 알골 60]〉 , 《네이버 지식백과》</ref> | ||
+ | |||
+ | 프로그램을 여러 단계의 블록으로 나누어 작성할 수 있도록 해 주는 언어의 구조. 즉 프로그램 작성 시 일련의 문장을 | ||
+ | 하나의 프로시저나 함수로 묶고 이러한 프로시저나 함수들을 계층적으로 조직하여 하나의 프로그램을 만들어 내는 블록구조를 사용하여 | ||
+ | 하향식 설계를 자연스럽게 구현하여 프로그램을 이해하기 쉽다. | ||
+ | 또한 지역 변수와 다른 블록을 포함하며 변수의 유효 범위가 블록 내로 제한되므로, 기억 장소가 절약되고 오류의 가능성이 적다.<ref> IT용어사전〈[https://terms.naver.com/entry.nhn?docId=850770&cid=42346&categoryId=42346 블록 구조]〉 , 《네이버 지식백과》</ref> | ||
+ | |||
+ | ALGOL에서의 서브프로그램은 procedure라고 부르며 넘겨주는 변수가 없다는 것이 특징이다. BASIC언어에서 사용하는 GOSUB와 동일하다고 보면 된다. 즉 서브프로그램에서 사용하는 변수의 이름을 메인프로그램의 변수 이름과 동일하게 해야한다. | ||
+ | procedure NAME begin ... | ||
+ | end | ||
+ | 하지만 ALGOL에서는 다른 언어에서 사용하는 함수기능을 가지고 있다. 함수는 서버 프로그램과 마찬가지로 procedure를 사용한다. 아래는 두개의 정수 n,m을 변수로 받아 큰 수를 찾아주는 larger라는 함수의 예이다. | ||
+ | integer procedure larger(n,m) | ||
+ | integer m,n | ||
+ | begin | ||
+ | if m>n then larger :=m | ||
+ | else larger := n | ||
+ | end; | ||
+ | 첫줄에 나오는 integer는, C언어에서와 마찬가지로 return되는 값의 데이타 타입을 정의하고 있다. C언어는 이 ALGOL을 모태로 탄생되었다. | ||
+ | 또한 서브프로그래에 값을 전달하는 방법이 두가지(reference by value, reference by address) 다 가능하다.<ref>박홍균, 〈[http://hkpark.netholdings.co.kr/web/inform/default/inform_view.asp?menu_id=9730&parent_id=1517&id=1456 1960년 ALGOL]〉, 《원리한자》</ref> | ||
+ | |||
+ | 스택이란 쌓아 올린 더미를 의미하는데 자료구조에서 기억 장치에 데이터를 일시적으로 겹쳐 쌓아 두었다가 필요할 때에 꺼내서 사용할 수 있게 주기억장치(main memory)나 레지스터(register)의 일부를 할당하여 사용하는 임시 기억장치를 말한다.<ref>두산백과, 〈[https://terms.naver.com/entry.nhn?docId=2837556&cid=40942&categoryId=32841 스택]〉, 《네이버 지식백과》</ref> | ||
+ | 알골은 이 스택을 사용하여 기억 영역을 할당하는 기법의 하나로 필요가 발생한 시점에서 적용되는 기준에 따라 프로그램 및 데이터에 대하여 기억 영역을 분배하는 방식인 동적 할당( dynamic allocation)을 사용할 수 있었다. <ref>컴퓨터인터넷IT용어대사전, 〈[https://terms.naver.com/entry.nhn?docId=1914165&cid=50372&categoryId=50372 동적할당 - 용어 해설]〉, 《네이버 지식백과》</ref> | ||
+ | |||
+ | 되부름(recursion)은 주어진 문제를 해결하기 위해 하나의 함수에서 자신을 다시 호출하여 작업을 수행하는 방식으로 어떤 루틴이나 프러시저가 자기 자신을 반복 호출하여 문제를 풀어 나가는 알고리즘으로, 이를 이용하기 위해서는 스택을 사용한다. 간단한 루틴을 풀 수 있는 반면 처리 속도가 느리고, 횟수가 지나치게 많으면 프로그램이 정지하기도 한다.<ref>* IT용어사전, 〈[https://terms.naver.com/entry.nhn?docId=1914200&cid=50372&categoryId=50372 되부름 - 용어 해설]〉, 《네이버 지식백과》 | ||
+ | </ref> | ||
+ | |||
+ | ==활용== | ||
+ | 다음은 n×m의 2 차원 배열 중 절대값이 가장 큰 요소를 찾아, 그 절대 값을 y에, 첨자를 i와 k에 저장하는 함수이다. | ||
+ | |||
+ | *알골 60 | ||
+ | PROCEDURE Absmax(a) Size:(n, m) Result:(y) Subscripts:(i, k) ; | ||
+ | VALUE n, m ; ARRAY a ; INTEGER n, m, i, k ; REAL y ; | ||
+ | COMMENT The absolute greatest element of the matrix a, of size n by m | ||
+ | is transferred to y, and the subscripts of this element to i and k ; | ||
+ | BEGIN | ||
+ | INTEGER p, q ; | ||
+ | y := 0 ; i := k := 1 ; | ||
+ | FOR p := 1 STEP 1 UNIT n DO | ||
+ | FOR q := 1 STEP 1 UNTIL m DO | ||
+ | IF abs (a[p, q]) > y THEN | ||
+ | BEGIN | ||
+ | y := abs (a[p, q]) ; | ||
+ | i := p; k := q | ||
+ | END | ||
+ | END Absmax | ||
+ | *알골 68 | ||
+ | PROC ABS max = ([,]real a, REF real y, REF int i, k)real: | ||
+ | COMMENT The absolute greatest element of the matrix a, of size ⌈a by 2⌈a | ||
+ | is transferred to y, and the subscripts of this element to i and k; COMMENT | ||
+ | BEGIN | ||
+ | real y := 0; i := ⌊a; k := 2⌊a; | ||
+ | FOR p FROM ⌊a TO ⌈a DO | ||
+ | FOR q FROM 2⌊a TO 2⌈a DO | ||
+ | IF ABS a[p, q] > y THEN | ||
+ | y := ABS a[p, q]; | ||
+ | i := p; k := q | ||
+ | FI | ||
+ | OD | ||
+ | OD; | ||
+ | y | ||
+ | END # abs max # <ref>〈[https://ko.wikipedia.org/wiki/%EC%95%8C%EA%B3%A8_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4) 알골]〉, 《위키백과》 | ||
+ | </ref> | ||
− | + | BNF는 배커스-나우르표기법의(Backus–Naur form)약칭으로 문맥 무관 문법을 나타내기 위해 만들어졌다. 존 배커스와 페테르 나우르의 이름을 붙여서 만들었고 | |
+ | 프로그래밍 언어의 구문을 기술하기 위하여 가장 일반적으로 사용되는 표기법이며 1960년 ALGOL 60이란 언어의 구문을 정의할 때 최초로 사용되었다. | ||
+ | BNF는 기본적으로 다음의 문법을 사용한다. | ||
+ | L :: = R | ||
+ | 이 규칙은 왼쪽의 L이 오른쪽의 R로 정의됨을 의미한다. 다음과 같이 왼쪽 부분이 같은 규칙이 두 개일 때 ‘|’를 이용해서 하나의 규칙으로 나타낼 수 있다. ‘|’ 기호는 선택적인 구조일 때 사용한다. | ||
+ | L :: = R1 | ||
+ | L :: = R2 = L ::= R1 | R2 | ||
+ | 그러면 BNF 표기법의 예를 살펴보자. 첫 자가 영문자로 시작하고, 두 번째 문자부터 영문자나 숫자로 이루어진 식별자에 대한 BNF 표기법은 다음과 같다. | ||
+ | 규칙 1 : <식별자> ::= <영문자> | <식별자><영문자> | <식별자><숫자> | ||
+ | 규칙 2 : <영문자> ::= A | B | C | ···1) | Y | Z | ||
+ | 규칙 3 : <숫자> ::= 0 | 1 | 2 | ··· |8 | 9 | ||
+ | 여기에서 <식별자>, <영문자>와 같이 ‘’로 묶인 기호를 비단말(nonterminal) 기호라 하고, A, B, 0, 1과 같이 프로그램에 직접 나타날 수 있는 기호를 단말(terminal) 기호라 한다. | ||
+ | ‘AA2’라는 식별자가 문법에 맞는지 살펴보고 문법 규칙에 따라 유도가 되면 문법에 맞는 것이고, 유도가 되지 않으면 문법에 맞지 않는 것이다.<ref>컴퓨터개론, 〈[https://terms.naver.com/entry.nhn?docId=2270400&cid=51173&categoryId=51173 프로그래밍 언어의 구문 정의]〉, 《네이버 지식백과》 | ||
+ | </ref> | ||
− | == | + | 16진수를 BNF 표기법으로 나타내면 다음과 같다. |
+ | <digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | ||
+ | <letter> ::= "A" | "B" | "C" | "D" | "E" | "F" | ||
+ | <number> ::= <digit> | <letter> | ||
+ | <integer> ::= <number> | <number><integer> | ||
− | + | ==문제점== | |
− | + | 알골 언어는 활성화 되지 못했는데, 가장 큰 이유는 형식(format)을 갖는 입력문과 출력문을 만들지 않았기 때문에 실용적인 목적으로 사용하는데 한계가 있었다. 입력문과 출력문은 당시로는 컴퓨터에 종속되었기 때문에 범용적인 언어를 만든다는 목적에 위배되어 만들지 않았다. 당시로는 IBM이 컴퓨터 업계를 지배하고 있었고 IBM에서 ALGOL을 채택하지 않고 자신들이 만들었던 [[포트란]](FORTRAN)을 지원했기 때문이다. | |
− | + | 너무 복잡하고 방대한 사양을 요구했기 때문에 ALGOL 68 컴파일러는 실제 구현이 어려웠고, Wijngaarden 표기법 또한 난해하여 실용적으로 보급되지 못했다. 여러 시행착오가 있어서 같은 코드가 서로 다른 의미로 해석될 수 있는 경우도 발견되는 등 혼란이 있었다. 덕분에 실무에는 거의 사용되지 않고 교육용으로 사용되었다. | |
− | + | ==평가== | |
− | + | 알골언어는 정연한 언어이론을 바탕으로 설계된 최초의 언어로서,알골계(ALGOL-like) 언어라는 용어도 생길 만큼 [[파스칼]](Pascal)언어, 모듈러-투(Modula-2), [[C 언어]] 등등 프로그래밍 언어 이론에 많은 영향을 끼쳤다. | |
− | |||
− | + | 절차형 언어로는 최초로 재귀호출이 가능하고 구문 표기법으로 형식문법을 최초로 상용한 언어이기도 한 알골은 최초라는 타이틀을 엄청나게 많이 가진 언어이다. 그러나 지나치게 이상적인 언어로 설계되었고 입출력 기능도 약한다데가 복잡하고 방대한 사양을 요구한 덕분에 현재는 거의 사장되긴 했지만 어쨌든 프로그래밍 언어의 역사에서 한 획을 그은 중요한 언어라고 볼 수 있다. | |
− | 알골은 | ||
− | |||
− | |||
{{각주}} | {{각주}} | ||
− | == | + | == 참고자료 == |
− | + | * 전기용어사전, 〈[https://terms.naver.com/entry.nhn?docId=2053754&cid=50372&categoryId=50372 알골 - 용어 해설]〉, 《네이버 지식백과》 | |
− | * 전기용어사전, 〈[https://terms.naver.com/entry.nhn?docId=2053754&cid=50372&categoryId=50372]〉, 《네이버 지식백과》 | + | * 시사상식사전, 〈[https://terms.naver.com/entry.nhn?docId=932263&cid=43667&categoryId=43667 알골 - 시사상식사전]〉, 《네이버 지식백과》 |
+ | * 컴퓨터인터넷IT용어대사전, 〈[https://terms.naver.com/entry.nhn?docId=814912&cid=50376&categoryId=50376 알골 68]〉, 《네이버 지식백과》 | ||
+ | * 이성규 기자, 〈[http://www.bloter.net/archives/196547 IT 거인들은 왜 프로그래밍 언어에 집착할까]〉, 《블로터》, 2014-06-18 | ||
* 담 정, 〈제3세대언어-고급언어〉, 《소프트웨어 문화개론》, 좋은땅, 2016-08-31 | * 담 정, 〈제3세대언어-고급언어〉, 《소프트웨어 문화개론》, 좋은땅, 2016-08-31 | ||
+ | * 박홍균, 〈[http://hkpark.netholdings.co.kr/web/inform/default/inform_view.asp?menu_id=9730&parent_id=1517&id=1456 1960년 ALGOL]〉, 《원리한자》 | ||
+ | * 컴퓨터인터넷IT용어대사전, 〈[https://terms.naver.com/entry.nhn?docId=1914165&cid=50372&categoryId=50372 동적할당 - 용어 해설]〉, 《네이버 지식백과》 | ||
+ | * 두산백과, 〈[https://terms.naver.com/entry.nhn?docId=2837556&cid=40942&categoryId=32841 스택]〉, 《네이버 지식백과》 | ||
+ | * IT용어사전, 〈[https://terms.naver.com/entry.nhn?docId=1914200&cid=50372&categoryId=50372 되부름 - 용어 해설]〉, 《네이버 지식백과》 | ||
+ | *〈[https://ko.wikipedia.org/wiki/%EB%B0%B0%EC%BB%A4%EC%8A%A4-%EB%82%98%EC%9A%B0%EB%A5%B4_%ED%91%9C%EA%B8%B0%EB%B2%95 배커스-나우르 표기법]〉, 《위키백과》 | ||
+ | *〈[https://ko.wikipedia.org/wiki/%EC%95%8C%EA%B3%A8_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4) 알골]〉, 《위키백과》 | ||
+ | *〈[https://namu.wiki/w/%EC%95%8C%EA%B3%A8 알골]〉, 《나무위키》 | ||
== 같이 보기 == | == 같이 보기 == | ||
− | |||
* [[포트란]] | * [[포트란]] | ||
* [[알고리즘]] | * [[알고리즘]] | ||
− | {{프로그래밍 언어| | + | {{프로그래밍 언어|검토 필요}} |
2020년 12월 28일 (월) 13:28 기준 최신판
알골(ALGOL)은 Algorithmic Language의 약자로서, 1950년대 후반 유럽을 중심으로 개발된 프로그래밍 언어이다. 당시 미국 IBM에서 개발한 포트란(Fortran)에 대항하기 위해 1958년 스위스 취리히의 국제회의에서 제안되었다. 알고리즘의 연구 개발에 이용되었으나, 널리 보급되지는 못하였다.
개요[편집]
알골(ALGOL)은 알고리즘언어(ALGOrithmic Language)의 약자로 이 언어는 계산과정묘사 지향적인 언어이자 알고리즘 묘사 지향적인 언어이다. 대표적인 블록구조 언어이기도하다. 대수 계산이나 논리적인 연산 처리를 하는 경우에 적합한 프로그램 언어이다. 1960년에 ALGOL 60으로서 문법서가 제정되었다. 그 후 ALGOL 68도 발표되었다. [1] 알골은 세계 최초의 구조화언어로서 엄격한 기초이론과 형식화된 어법 규칙을 가진다.
역사[편집]
- 알골은 1958년 IBM의 연구 개발팀이 개발한 것으로 같은 해 취히리에서 개최한 국제 상업 학술 컴퓨터 위원회에서 ACM(Association of Computing Machinery) 팀과 당시 연방 독일의 응용수학과 역학협회(GAMM)가 건의한 알고리즘 표시법을 종합해 ALGOL 58을 만들었다. 1959년에 IBM은 ALGOL 코드를 실행시켰다.
- 1960년 국제정보처리학회연합(IFIP)에서 유럽의 학자들을 중심으로 만들어졌다. 1월 튜링상 수상자 앨런 펄리스는 파리에서 열린 전 세계 일류 소프트웨어 전문가들이 참석한 토론회에서 <알고리즘 언어 ALGOL 60 보고>를 발표해, 알고리즘 언어 ALGOL 60을 확립했다. [2] 유럽의 학자들 중심으로 만들어졌기 때문에 유럽쪽에서 많이 사용되었고 미국쪽에서는 포트란을 많이 사용하였다고 한다.
- 알골 58 : 1958년 취리히에서 열린 국제회의에서 제안된 것이 그 기원으로 여겨진다.(이 언어는 후에 ALGOL 58로 불리게 되지만, 당초의 이름은 IAL이었다.) 알골 58은 코드 블록 및 이들을 제거할 begin과 end 쌍을 도입하였다.
- 알골 60 : 1960의 준말로 문법이 BNF 표기법으로 기술,구조화된 프로그래밍의 형태를 갖춘다. BCPL, B, 파스칼, 시뮬라, C 등의 다른 수많은 프로그래밍 언어에 영향을 주었다.또한 알골 60은 어휘 범위의 네스티드 함수 정의를 처음 추가한 언어이다. 알골 60'이라는 새로운 언어는 신대륙의 포트란에 대항하기 위해 만들어졌다.[3] 알골은 포트란(FORTRAN) 언어와 비교했을 때 두 가지 장점이 있다.
- 프로그래밍 언어 중에서 처음으로 지역 변수를 사용 : FORTRAN 언어는 전역변수(하나의 변수는 모든 코드에서 하나의 의미로만 사용)만 사용 가능했지만, ALGOL은 지역변수를 사용하면서 하나의 코드 안에서 다른 함수라면 다른 의미를 가질 수 있었다.
- 재귀라는 프로그래밍 설계 사상 : 재귀는 하나의 문제를 여러 개의 작은 문제로 나누고, 각각의 작은 문제 안에서 해결하고 전체적인 답을 얻는 것을 말한다. 포트란 언어의 설계자인 배커스는 ALGOL 문법을 설계하던 중 전후 문맥이 무관한 문법형식이라는 그의 최신 연구 결과를 사용해 ALGOL 언어 회의에서 논문을 교류했다. 마감일을 넘겨 논문집에 실리지는 못했지만 덴마크의 수학자 페테르 나우르가 큰 영감을 받았고 배커스의 문법에 대한 감수와 수정을 해서 더욱 완벽하게 만들었다. 여기서 컴퓨터계의 유명한 베커스-나우르 표기법(BNF)이 탄생했다. 이 표기법은 <알고리즘 언어 ALGOL 60 보고>안에 쓰였다. [2]
- 알골 68 :1968년에는 ALGOL 68이 개발되었다. ALGOL-10과 매우 유사하며, IFIP(국제 정보 처리 학회)에서 발표된 언어의 이름으로 알골 60을 발전시켜 다목적용의 강력한 언어로 만들 계획으로 설계했다. 2단계 문법 Wijngaarden 표기법으로 문법이 기술했고, 다양한 데이터형을 다루는 융통성이 주어져 과학 계산용의 범주를 벗어나 사무 처리용까지 적용범위를 확대했다.[4] 기능이 너무 복잡해 실제로는 많이 사용되지 않고 있다. 일괄처리 체제에 적합한 입출력 방식으로 되어있어 주로 일괄처리시스템에 사용된다.[5]
- 표준으로 IFIP TC/WG2.1에서 ALGOL 60이 제정되었다. 이후에는 이어지는 표준화 작업은 진행되지 않고 1984년에야 ALGOL 60에 상당하는 것이 ISO 표준으로 지정되었다. z 1968년에는 ALGOL 68이 개발되었다. ALGOL 68에서는 2단계 문법 Wijngaarden 표기법으로 문법이 기술되었다. ALGOL 60의 후계 언어가 제정되기까지 파스칼을 설계한 Wirth의 ALGOL W를 비롯한 여러 후보자가 있었지만, 결국은 ALGOL 68이 후계로 지정되었다. 그러나 너무 복잡하고 방대한 사양을 요구했기 때문에 ALGOL 68 컴파일러는 실제 구현이 어려웠고, Wijngaarden 표기법 또한 난해하여 실용적으로 보급되지 못했다.
알골은 후에 알골(ALGOL) -> BCPL -> B 언어의 개발 과정으로 C언어를 개발하는데 큰 영향을 끼쳤다. 1963년 ALGOL60 보다 더 다양한 용도로 확장하기 위해 CPL 언어를 케임브리지 대학교의 수학 연구소와 런던 대학교의 컴퓨터 공학부에서 공동 개발하였다. 이후 1967년 마틴 리차드는 CPL을 더욱 단순화 시킨 BCPL(Basic CPL)을 개발하였고, 1969년 경 BCPL이 미국으로 넘어와서 켄 톰슨에 의해 B언어를 개발하였다. [6] 켄 톰슨(Ken Thompseon)이 벨 연구소에서 MULTICS 운영체제를 개조하여 유닉스를 만들던 중 기계마다 운영체계를 제작 하다시피 하여 만드는 애로사항을 해결하고자 이식성이 좋고, 호환성이 좋은 언어로 제작하여야겠다는 필요성을 가졌다. 이때 데니스 리치(Dennis Ritchie)가 B 언어를 개조하여 1972년 C 언어를 제작하게 된것이다.
특징[편집]
알고리즘 언어의 목적은 계산 프로세스를 설명하는 것이다. 계산 규칙의 설명에 사용되는 기본 개념은 숫자, 변수 및 함수를 구성 요소로 포함하는 잘 알려진 산술 표현식이다. 수치 계산 절차를 표준화된 형태로 정확하게 컴퓨터에 나타내는 데 쓰이는 산술 언어로 이 언어는 컴파일러가 있는 상황에서 컴퓨터에 수치 계산 과정을 인식시키는 것 외에 개인 간에 수치 계산 과정을 전달하기 위한 수단으로도 사용된다. 국제 협약에 의해 표준화된 국제 대수 언어(International Algebraic Lan-guage)는 알골의 전신이다. [7]
프로그램을 여러 단계의 블록으로 나누어 작성할 수 있도록 해 주는 언어의 구조. 즉 프로그램 작성 시 일련의 문장을 하나의 프로시저나 함수로 묶고 이러한 프로시저나 함수들을 계층적으로 조직하여 하나의 프로그램을 만들어 내는 블록구조를 사용하여 하향식 설계를 자연스럽게 구현하여 프로그램을 이해하기 쉽다. 또한 지역 변수와 다른 블록을 포함하며 변수의 유효 범위가 블록 내로 제한되므로, 기억 장소가 절약되고 오류의 가능성이 적다.[8]
ALGOL에서의 서브프로그램은 procedure라고 부르며 넘겨주는 변수가 없다는 것이 특징이다. BASIC언어에서 사용하는 GOSUB와 동일하다고 보면 된다. 즉 서브프로그램에서 사용하는 변수의 이름을 메인프로그램의 변수 이름과 동일하게 해야한다. procedure NAME begin ... end 하지만 ALGOL에서는 다른 언어에서 사용하는 함수기능을 가지고 있다. 함수는 서버 프로그램과 마찬가지로 procedure를 사용한다. 아래는 두개의 정수 n,m을 변수로 받아 큰 수를 찾아주는 larger라는 함수의 예이다.
integer procedure larger(n,m) integer m,n begin if m>n then larger :=m else larger := n end;
첫줄에 나오는 integer는, C언어에서와 마찬가지로 return되는 값의 데이타 타입을 정의하고 있다. C언어는 이 ALGOL을 모태로 탄생되었다. 또한 서브프로그래에 값을 전달하는 방법이 두가지(reference by value, reference by address) 다 가능하다.[9]
스택이란 쌓아 올린 더미를 의미하는데 자료구조에서 기억 장치에 데이터를 일시적으로 겹쳐 쌓아 두었다가 필요할 때에 꺼내서 사용할 수 있게 주기억장치(main memory)나 레지스터(register)의 일부를 할당하여 사용하는 임시 기억장치를 말한다.[10] 알골은 이 스택을 사용하여 기억 영역을 할당하는 기법의 하나로 필요가 발생한 시점에서 적용되는 기준에 따라 프로그램 및 데이터에 대하여 기억 영역을 분배하는 방식인 동적 할당( dynamic allocation)을 사용할 수 있었다. [11]
되부름(recursion)은 주어진 문제를 해결하기 위해 하나의 함수에서 자신을 다시 호출하여 작업을 수행하는 방식으로 어떤 루틴이나 프러시저가 자기 자신을 반복 호출하여 문제를 풀어 나가는 알고리즘으로, 이를 이용하기 위해서는 스택을 사용한다. 간단한 루틴을 풀 수 있는 반면 처리 속도가 느리고, 횟수가 지나치게 많으면 프로그램이 정지하기도 한다.[12]
활용[편집]
다음은 n×m의 2 차원 배열 중 절대값이 가장 큰 요소를 찾아, 그 절대 값을 y에, 첨자를 i와 k에 저장하는 함수이다.
- 알골 60
PROCEDURE Absmax(a) Size:(n, m) Result:(y) Subscripts:(i, k) ; VALUE n, m ; ARRAY a ; INTEGER n, m, i, k ; REAL y ; COMMENT The absolute greatest element of the matrix a, of size n by m is transferred to y, and the subscripts of this element to i and k ; BEGIN INTEGER p, q ; y := 0 ; i := k := 1 ; FOR p := 1 STEP 1 UNIT n DO FOR q := 1 STEP 1 UNTIL m DO IF abs (a[p, q]) > y THEN BEGIN y := abs (a[p, q]) ; i := p; k := q END END Absmax
- 알골 68
PROC ABS max = ([,]real a, REF real y, REF int i, k)real: COMMENT The absolute greatest element of the matrix a, of size ⌈a by 2⌈a is transferred to y, and the subscripts of this element to i and k; COMMENT BEGIN real y := 0; i := ⌊a; k := 2⌊a; FOR p FROM ⌊a TO ⌈a DO FOR q FROM 2⌊a TO 2⌈a DO IF ABS a[p, q] > y THEN y := ABS a[p, q]; i := p; k := q FI OD OD; y END # abs max # [13]
BNF는 배커스-나우르표기법의(Backus–Naur form)약칭으로 문맥 무관 문법을 나타내기 위해 만들어졌다. 존 배커스와 페테르 나우르의 이름을 붙여서 만들었고 프로그래밍 언어의 구문을 기술하기 위하여 가장 일반적으로 사용되는 표기법이며 1960년 ALGOL 60이란 언어의 구문을 정의할 때 최초로 사용되었다. BNF는 기본적으로 다음의 문법을 사용한다.
L :: = R
이 규칙은 왼쪽의 L이 오른쪽의 R로 정의됨을 의미한다. 다음과 같이 왼쪽 부분이 같은 규칙이 두 개일 때 ‘|’를 이용해서 하나의 규칙으로 나타낼 수 있다. ‘|’ 기호는 선택적인 구조일 때 사용한다.
L :: = R1 L :: = R2 = L ::= R1 | R2
그러면 BNF 표기법의 예를 살펴보자. 첫 자가 영문자로 시작하고, 두 번째 문자부터 영문자나 숫자로 이루어진 식별자에 대한 BNF 표기법은 다음과 같다.
규칙 1 : <식별자> ::= <영문자> | <식별자><영문자> | <식별자><숫자> 규칙 2 : <영문자> ::= A | B | C | ···1) | Y | Z 규칙 3 : <숫자> ::= 0 | 1 | 2 | ··· |8 | 9
여기에서 <식별자>, <영문자>와 같이 ‘’로 묶인 기호를 비단말(nonterminal) 기호라 하고, A, B, 0, 1과 같이 프로그램에 직접 나타날 수 있는 기호를 단말(terminal) 기호라 한다. ‘AA2’라는 식별자가 문법에 맞는지 살펴보고 문법 규칙에 따라 유도가 되면 문법에 맞는 것이고, 유도가 되지 않으면 문법에 맞지 않는 것이다.[14]
16진수를 BNF 표기법으로 나타내면 다음과 같다.
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" <letter> ::= "A" | "B" | "C" | "D" | "E" | "F" <number> ::= <digit> | <letter> <integer> ::= <number> | <number><integer>
문제점[편집]
알골 언어는 활성화 되지 못했는데, 가장 큰 이유는 형식(format)을 갖는 입력문과 출력문을 만들지 않았기 때문에 실용적인 목적으로 사용하는데 한계가 있었다. 입력문과 출력문은 당시로는 컴퓨터에 종속되었기 때문에 범용적인 언어를 만든다는 목적에 위배되어 만들지 않았다. 당시로는 IBM이 컴퓨터 업계를 지배하고 있었고 IBM에서 ALGOL을 채택하지 않고 자신들이 만들었던 포트란(FORTRAN)을 지원했기 때문이다.
너무 복잡하고 방대한 사양을 요구했기 때문에 ALGOL 68 컴파일러는 실제 구현이 어려웠고, Wijngaarden 표기법 또한 난해하여 실용적으로 보급되지 못했다. 여러 시행착오가 있어서 같은 코드가 서로 다른 의미로 해석될 수 있는 경우도 발견되는 등 혼란이 있었다. 덕분에 실무에는 거의 사용되지 않고 교육용으로 사용되었다.
평가[편집]
알골언어는 정연한 언어이론을 바탕으로 설계된 최초의 언어로서,알골계(ALGOL-like) 언어라는 용어도 생길 만큼 파스칼(Pascal)언어, 모듈러-투(Modula-2), C 언어 등등 프로그래밍 언어 이론에 많은 영향을 끼쳤다.
절차형 언어로는 최초로 재귀호출이 가능하고 구문 표기법으로 형식문법을 최초로 상용한 언어이기도 한 알골은 최초라는 타이틀을 엄청나게 많이 가진 언어이다. 그러나 지나치게 이상적인 언어로 설계되었고 입출력 기능도 약한다데가 복잡하고 방대한 사양을 요구한 덕분에 현재는 거의 사장되긴 했지만 어쨌든 프로그래밍 언어의 역사에서 한 획을 그은 중요한 언어라고 볼 수 있다.
각주[편집]
- ↑ 전기용어사전,〈알골 - 용어 해설〉 , 《네이버 지식백과》
- ↑ 2.0 2.1 담 정,〈제3세대언어-고급언어〉 , 《소프트웨어 문화개론》, 2016-08-31
- ↑ 이성규 기자, 〈IT 거인들은 왜 프로그래밍 언어에 집착할까〉, 《블로터》, 2014-06-18
- ↑ 시사상식사전,〈용어-시사상식사전〉 , 《네이버 지식백과》
- ↑ 컴퓨터인터넷IT용어대사전,〈알골 68〉 , 《네이버 지식백과》
- ↑ luckey, 〈C언어의 유래와 역사〉, 《티스토리》, 2009-03-19
- ↑ 컴퓨터인터넷IT용어대사전〈알골 60〉 , 《네이버 지식백과》
- ↑ IT용어사전〈블록 구조〉 , 《네이버 지식백과》
- ↑ 박홍균, 〈1960년 ALGOL〉, 《원리한자》
- ↑ 두산백과, 〈스택〉, 《네이버 지식백과》
- ↑ 컴퓨터인터넷IT용어대사전, 〈동적할당 - 용어 해설〉, 《네이버 지식백과》
- ↑ * IT용어사전, 〈되부름 - 용어 해설〉, 《네이버 지식백과》
- ↑ 〈알골〉, 《위키백과》
- ↑ 컴퓨터개론, 〈프로그래밍 언어의 구문 정의〉, 《네이버 지식백과》
참고자료[편집]
- 전기용어사전, 〈알골 - 용어 해설〉, 《네이버 지식백과》
- 시사상식사전, 〈알골 - 시사상식사전〉, 《네이버 지식백과》
- 컴퓨터인터넷IT용어대사전, 〈알골 68〉, 《네이버 지식백과》
- 이성규 기자, 〈IT 거인들은 왜 프로그래밍 언어에 집착할까〉, 《블로터》, 2014-06-18
- 담 정, 〈제3세대언어-고급언어〉, 《소프트웨어 문화개론》, 좋은땅, 2016-08-31
- 박홍균, 〈1960년 ALGOL〉, 《원리한자》
- 컴퓨터인터넷IT용어대사전, 〈동적할당 - 용어 해설〉, 《네이버 지식백과》
- 두산백과, 〈스택〉, 《네이버 지식백과》
- IT용어사전, 〈되부름 - 용어 해설〉, 《네이버 지식백과》
- 〈배커스-나우르 표기법〉, 《위키백과》
- 〈알골〉, 《위키백과》
- 〈알골〉, 《나무위키》
같이 보기[편집]