시뮬라
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
시뮬라는 크리스텐 니가드와 올레 요한 달이 개발한 객체 지향 프로그래밍 언어이다. 1957년 시뮬레이션 프로그램 작성을 시작하여 1962년 주요 개념이 정립되었으며, 이산 사건 시스템을 시뮬레이션하기 위한 특수 목적 프로그래밍 언어 SIMULA I이 탄생했다. 이후 Simula 67로 표준화되었고, 스몰토크 및 객체 지향 프로그래밍 언어 개발에 영향을 미쳤다. 시뮬라는 객체, 클래스, 서브클래스, 상속, 동적 바인딩 등의 객체 지향 프로그래밍 개념을 제공하며, 코루틴과 이산 사건 시뮬레이션을 위한 패키지를 포함한다.
더 읽어볼만한 페이지
- 1962년 개발된 프로그래밍 언어 - SNOBOL
SNOBOL은 1960년대에 개발된 문자열 처리 중심의 프로그래밍 언어이며, 패턴 매칭 기능을 통해 텍스트 처리에 강점을 보이고, SNOBOL4를 통해 다양한 자료형과 이식성을 강화했다. - 노르웨이의 과학과 기술 - 스발바르 국제 종자 저장고
스발바르 국제 종자 저장고는 미래 식량 안보를 위해 노르웨이 스발바르 제도에 건설된 세계 최대 규모의 종자 보관 시설로, 전 세계 유전자 은행 종자들의 백업 시스템이자 '최후의 날 저장고' 역할을 한다. - 노르웨이의 과학과 기술 - 노르웨이 과학기술대학교
노르웨이 과학기술대학교(NTNU)는 1996년 여러 교육 기관의 통합으로 설립되었으며, 트론헤임, 올레순, 예비크에 캠퍼스를 두고 공학, 자연 과학 등 다양한 분야의 학위 과정을 제공하며 SINTEF와의 협력을 통해 연구 역량을 강화한다. - 노르웨이의 발명품 - 가스 터빈
가스 터빈은 브레이턴 사이클 기반의 열기관으로, 연소 가스의 열에너지를 회전 운동으로 변환하여 항공기 엔진, 발전 설비, 선박 등 다양한 분야에 활용되며 소형화 기술 개발이 활발히 이루어지고 있다. - 노르웨이의 발명품 - 클립
클립은 종이, 문서 등을 묶는 도구로, 강철, 금속, 플라스틱 등으로 만들어지며 젬 클립, 제비 클립 등 다양한 종류가 있고, 사무용품 외 다양한 용도로 사용되며, 역사적으로 저항 운동의 상징으로도 사용되었다.
시뮬라 - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
![]() | |
개발자 | 올레-요한 달 크리스텐 니가드 |
설계자 | 올레-요한 달 |
출시일 | 1962년 |
최신 버전 출시일 | 시뮬라 67, 시뮬라 I |
자료형 | 정적 명목적 |
영향받은 언어 | ALGOL 60 Simscript |
영향을 준 언어 | 객체 지향 프로그래밍 언어 |
운영 체제 | 유닉스 계열 윈도우 z/OS TOPS-10 MVS |
웹사이트 | Simula 67 |
패러다임 | |
프로그래밍 패러다임 | 멀티 패러다임 구조적 프로그래밍 객체 지향 프로그래밍 명령형 절차적 |
기타 정보 | |
계열 | ALGOL |
프로그래밍 언어 | ALGOL 60(주로); 일부 컴포넌트 Simscript |
스코프 | 어휘적 |
영향 | BETA CLU Eiffel Emerald Pascal Smalltalk C++ 기타 객체 지향 프로그래밍 언어 |
2. 역사
크리스텐 니가드는 1957년에 컴퓨터 시뮬레이션 프로그램 작성을 시작했다. 니가드는 시스템의 이질성과 작동을 더 잘 설명할 필요성을 느꼈다. 그는 시스템을 설명하기 위한 형식적 컴퓨터 언어에 대한 자신의 아이디어를 발전시키기 위해, 자신보다 더 많은 컴퓨터 프로그래밍 기술을 가진 사람이 필요하다는 것을 깨달았다. 올레 요한 달이 1962년 1월 그의 작업에 합류했고, ALGOL 60을 기반으로 언어를 설계하기로 결정했다. 1962년 5월까지, 시뮬레이션 프로그래밍 언어의 주요 개념이 정립되었다. ''SIMULA I''이 탄생했는데, 이는 이산 사건 시스템을 시뮬레이션하기 위한 특수 목적 프로그래밍 언어였다.
1962년 말, 니가드는 UNIVAC의 밥 베머에게 Simula 아이디어를 제시했고, 베머는 이를 지지하며 니가드를 국제 정보 처리 연맹(IFIP) 컨퍼런스에 초청했다. 1963년 8월, 노르웨이 컴퓨팅 센터는 UNIVAC 1107을 도입했고, 달은 UNIVAC과의 계약에 따라 SIMULA I을 구현했다. 이 구현은 UNIVAC ALGOL 60 컴파일러를 기반으로 했다. 1965년 1월, UNIVAC 1107에서 SIMULA I이 완전히 작동하게 되었다. 이후 달과 니가드는 Simula를 가르치는 데 많은 시간을 보냈고, Simula는 전 세계 여러 국가로 퍼져나갔다.
1966년, C. A. R. 호어가 레코드 클래스 구성의 개념을 도입했고, 달과 니가드는 이를 확장하여 일반화된 프로세스 개념을 만들었다. 1967년 5월, 달과 니가드는 오슬로에서 열린 IFIP 시뮬레이션 언어 워킹 컨퍼런스에서 클래스 및 서브클래스 선언에 관한 논문을 발표했고, 이는 Simula 67의 첫 번째 공식 정의가 되었다. 1968년 2월, Simula 표준 그룹(SSG)의 첫 번째 회의에서 Simula 67이 공식적으로 표준화되었다.
1960년대 후반과 1970년대 초반에는 다음과 같은 네 가지 주요 Simula 구현이 있었다.
구현 | 제작 |
---|---|
유니백(UNIVAC) 1100 | 노르웨이 컴퓨팅 센터(NCC) |
시스템/360 및 시스템/370 | NCC |
CDC 3000 | 오슬로 대학교의 킬러 공동 컴퓨터 설비 |
TOPS-10 | 스웨덴 국방 연구소(FOA) |
thumb
1986년, Simula Standard 1986이 최신 표준으로 발표되었고, 다음과 같은 네 가지 주요 구현이 있다.
2001년 11월, 달과 니가드는 객체 지향 프로그래밍의 기본 개념을 소개한 공로로 IEEE 존 폰 노이만 메달을 수상했다.[10] 2002년 4월, 달과 니가드는 객체 지향 프로그래밍의 출현에 근본적인 아이디어를 제공한 공로로 ACM 튜링상을 수상했다.[11] 시뮬라 연구소는 Simula 언어의 이름을 따서 명명된 연구소이며, 니가드는 2001년 개관 이후 시간제 직책을 맡았다.
2. 1. 한국에의 영향
Simula는 C++Java 등 객체 지향 프로그래밍 언어에 필요한 기술적 사상을 제공했지만, 1970~80년대 한국의 소프트웨어 개발 및 교육 환경의 열악함, Simula 자체의 낮은 보급률 등의 이유로 인해 대한민국에서는 널리 쓰이지 못했다.[5][6] 그러나 Simula가 객체 지향 프로그래밍의 기반을 다졌다는 점을 고려하면, Simula가 한국의 프로그래밍 발전에 기여한 점은 분명히 존재한다. 1990년대 후반, 대한민국에서 인터넷 사용이 폭발적으로 증가하고, 웹 개발자 및 응용 소프트웨어 개발자의 수요가 급증하면서, 객체 지향 프로그래밍에 대한 관심도 증가하였다. Java, C++ 등이 대중화되면서, 객체 지향 프로그래밍은 필수적인 기술적 소양이 되었다.3. 주요 특징
시뮬라는 객체 지향 프로그래밍의 핵심 개념인 클래스, 상속, 가상 함수 등을 최초로 도입한 언어이다. 코루틴을 지원하여 동시성을 표현할 수 있었고, 이산 사건 시뮬레이션을 위한 패키지를 포함하여 복잡한 시스템의 동작을 모델링하고 분석하는 데 유용하게 사용되었다.
크리스텐 니가드와 올레 요한 달이 오슬로의 노르웨이 계산 센터에서 1962년부터 1967년에 걸쳐 개발했다. 주로 북유럽권에서 사용되었으며, 언어적 완성도가 높지 않아 널리 보급되지는 못했지만, 스몰토크와 C++ 등 후대에 개발된 언어들에 큰 영향을 주었다. 특히 C++영어는 C언어에 Simula영어의 클래스 등의 기능을 추가한 형태였다.[5][6]
Simula영어는 VLSI 설계, 프로세스, 프로토콜, 알고리즘과 같은 시뮬레이션이나, 조판, 컴퓨터 그래픽스, 교육과 같은 응용 소프트웨어에 이용되었다.
3. 1. 객체 지향 프로그래밍
시뮬라는 객체 지향 프로그래밍의 기본 개념을 확립한 언어로, 객체, 클래스, 서브클래스, 상속, 동적 바인딩(가상 함수) 등의 기능을 제공한다.[10] 시뮬라의 객체는 속성을 가지며, 클래스는 객체의 틀을 정의한다. 서브클래스는 상위 클래스의 속성과 메서드를 상속받고, 필요한 기능을 추가하거나 재정의할 수 있다. 가상 함수는 동적 바인딩을 통해 실행 시간에 호출될 메서드를 결정하는 기능이다.시뮬라 67에서는 객체, 클래스, 서브클래스, 상속, 동적 바인딩(가상 함수), 코루틴, 이산 사건 시뮬레이션, 가비지 컬렉션 기능을 가지며, 객체 지향 프로그래밍의 기본 개념은 모두 여기서 발상되었다고 할 수 있다.[10]
시뮬라는 프로그래밍 패러다임으로서 최초의 객체 지향 언어로 여겨진다. 그 이름이 나타내는 바와 같이 시뮬라는 시뮬레이션을 수행하기 위해 설계되었고, 그 필요성으로부터 오늘날의 객체 지향 언어에서 사용되는 많은 기능을 위한 프레임워크를 제공했다.[10] 시뮬라 당시에는 "객체 지향"이라는 단어는 아직 없었다. 이 용어는 앨런 케이가 시뮬라의 개념으로서 70년대 즈음에 사용하기 시작한 것이 시초라고 알려져 있다. 따라서, 그 의미에서 시뮬라는 세계 최초의 객체 지향 언어이며, 시뮬라는 "객체 지향으로 재인식이 가능한 가장 오래된 언어"라고 할 수 있다.
3. 2. 코루틴
Simula는 코루틴을 지원하여, 여러 개의 실행 흐름을 번갈아 가며 실행할 수 있는 기능을 제공한다. 코루틴은 협력적인 멀티태스킹을 구현하는 데 사용될 수 있으며, 시뮬레이션과 같은 응용 분야에서 유용하게 활용된다.[7] Simula는 코루틴만 지원하고 진정한 동시성은 지원하지 않지만, 액터 모델의 동시 계산에 영감을 주었다.[7]3. 3. 이산 사건 시뮬레이션
시뮬라는 이산 사건 시뮬레이션을 위한 시뮬레이션 패키지를 포함하고 있다. 이 패키지는 시간의 흐름에 따라 발생하는 사건들을 모델링하고 처리할 수 있도록 해준다. 시뮬레이션 패키지는 객체 지향과 코루틴 개념을 기반으로 하며, 복잡한 시스템의 동작을 시뮬레이션하는 데 필요한 기능을 제공한다.[5][6]4. 샘플 코드
시뮬라는 대소문자를 구별한다.[1]
최소 프로그램빈 블록은 시뮬라에서 최소한의 프로그램으로, 실행을 시작하고 즉시 종료된다.[1]
```text
'''Begin'''
'''End''';
```
시뮬라 프로그램에는 반환 값이 없다.[1]
Hello world 프로그램시뮬라에서 "Hello World!"를 출력하는 프로그램의 예시는 다음과 같다.[1]
```text
Begin
OutText ("Hello World!");
Outimage;
End;
```
클래스, 서브클래스 및 가상 프로시저다음은 클래스, 서브클래스 및 가상 프로시저를 사용한 예시이다.[1]
```text
'''시작'''
'''클래스''' 글리프(Glyph);
'''가상''': '''프로시저''' print '''Is''' '''프로시저''' print;;
'''시작'''
'''종료''';
글리프 '''클래스''' 문자(Char)(c);
'''문자''' c;
'''시작'''
'''프로시저''' print;
OutChar(c);
'''종료''';
글리프 '''클래스''' 라인(Line)(elements);
'''참조''' (Glyph) '''배열''' elements;
'''시작'''
'''프로시저''' print;
'''시작'''
'''정수''' i;
'''For''' i:= 1 '''Step''' 1 '''Until''' UpperBound (elements, 1) '''Do'''
elements (i).print;
OutImage;
'''종료''';
'''종료''';
'''참조''' (Glyph) rg;
'''참조''' (Glyph) '''배열''' rgs (1 : 4);
''! 주 프로그램;''
rgs (1):- '''New''' 문자 ('A');
rgs (2):- '''New''' 문자 ('b');
rgs (3):- '''New''' 문자 ('b');
rgs (4):- '''New''' 문자 ('a');
rg:- '''New''' 라인 (rgs);
rg.print;
'''종료''';
```
위 예제는 하나의 슈퍼클래스 (글리프(Glyph))와 두 개의 서브클래스 (Char, Line)를 가지고 있으며, 가상 프로시저가 두가지 구현되어 있다. 실행은 주 프로그램을 실행하면서 시작된다. 시뮬라는 순수 가상 프로시저를 가진 클래스를 인스턴스화할 수 있기 때문에, 추상 클래스의 개념이 없다. 즉, 위 예제에서 모든 클래스를 인스턴스화할 수 있다. 하지만 순수 가상 프로시저를 호출하면 런타임 오류가 발생한다.
이름에 의한 호출(Call by name)시뮬라는 이름으로 호출[1]을 지원하므로 젠센 장치를 쉽게 구현할 수 있다. 단순 매개변수의 기본 전달 모드는 값으로 호출이며, 이는 ALGOL이 이름으로 호출을 사용했던 것과는 대조적이다. 따라서 젠센 장치의 소스 코드는 시뮬라 컴파일러로 컴파일할 때 매개변수에 대해 이름으로 호출을 지정해야 한다.
다음은 합산 함수 를 구현한 간단한 예이다.
```text
'''실수''' '''절차''' 시그마 (k, m, n, u);
'''이름''' k, u;
'''정수''' k, m, n; '''실수''' u;
'''시작'''
'''실수''' s;
k:= m;
'''동안''' k <= n '''을 수행한다''' '''시작'''
s:= s + u; k:= k + 1;
'''종료''';
시그마:= s;
'''종료''';
```
위 코드는 제어 변수(k)와 표현식(u)에 대해 이름으로 호출을 사용한다. 이를 통해 제어 변수를 표현식에서 사용할 수 있다.
시뮬라 표준은 for 루프에서 제어 변수에 대한 특정 제한을 허용한다. 따라서 위 코드는 최대한의 이식성을 위해 while 루프를 사용한다.
다음 식은
:
아래와 같이 구현할 수 있다.
:Z:= 시그마 (i, 1, 100, 1 / (i + a) ** 2);
시뮬레이션시뮬라영어는 이산 사건 시뮬레이션[1]을 위한 시뮬레이션 패키지를 포함한다. 이 시뮬레이션 패키지는 시뮬라의 객체 지향 기능과 코루틴[1] 개념을 기반으로 한다.
다음은 옷 가게의 탈의실 사용을 시뮬레이션하는 예제이다.
샘(Sam), 샐리(Sally), 앤디(Andy)는 옷을 사러 쇼핑을 간다. 그들은 탈의실을 하나만 공유해야 한다. 그들 각자는 정규 분포에 따라 약 12분 동안 매장을 둘러본 다음, 약 3분 동안 탈의실을 독점적으로 사용한다.
탈의실 객체는 탈의실 접근을 위해 큐(queue, `door`)를 사용한다. 누군가 탈의실을 요청했는데 사용 중인 경우 이 큐에서 대기해야 한다(`Wait (door)`). 누군가 탈의실을 떠나면 큐에서 첫 번째 사람(있는 경우)이 해제되고(`'''Activate''' door.first`), 이에 따라 door 큐에서 제거된다(`door.First.Out`).
`Person`은 `Process`의 서브클래스이며, 그 활동은 `hold` (매장을 둘러보는 시간과 탈의실에서 보낸 시간)를 사용하여 설명되고, 탈의실 객체의 절차를 호출하여 탈의실을 요청하고 떠난다.
메인 프로그램은 모든 객체를 생성하고 모든 사람 객체를 활성화하여 이벤트 큐에 넣는다. 메인 프로그램은 프로그램이 종료되기 전에 100분 동안 시뮬레이션 시간을 유지한다.
4. 1. 최소 프로그램
빈 블록은 시뮬라에서 최소한의 프로그램으로, 실행을 시작하고 즉시 종료된다.[1]'''Begin'''
'''End''';
시뮬라 프로그램에는 반환 값이 없다.[1]
4. 2. Hello world 프로그램
시뮬라에서 "Hello World!"를 출력하는 프로그램의 예시는 다음과 같다.[1]```text
Begin
OutText ("Hello World!");
Outimage;
End;
```
시뮬라는 대소문자를 구별한다.[1]
4. 3. 클래스, 서브클래스 및 가상 프로시저
다음은 클래스, 서브클래스 및 가상 프로시저를 사용한 예시이다.[1]```text
'''시작'''
'''클래스''' 글리프(Glyph);
'''가상''': '''프로시저''' print '''Is''' '''프로시저''' print;;
'''시작'''
'''종료''';
글리프 '''클래스''' 문자(Char)(c);
'''문자''' c;
'''시작'''
'''프로시저''' print;
OutChar(c);
'''종료''';
글리프 '''클래스''' 라인(Line)(elements);
'''참조''' (Glyph) '''배열''' elements;
'''시작'''
'''프로시저''' print;
'''시작'''
'''정수''' i;
'''For''' i:= 1 '''Step''' 1 '''Until''' UpperBound (elements, 1) '''Do'''
elements (i).print;
OutImage;
'''종료''';
'''종료''';
'''참조''' (Glyph) rg;
'''참조''' (Glyph) '''배열''' rgs (1 : 4);
''! 주 프로그램;''
rgs (1):- '''New''' 문자 ('A');
rgs (2):- '''New''' 문자 ('b');
rgs (3):- '''New''' 문자 ('b');
rgs (4):- '''New''' 문자 ('a');
rg:- '''New''' 라인 (rgs);
rg.print;
'''종료''';
```
위 예제는 하나의 슈퍼클래스 (글리프(Glyph))와 두 개의 서브클래스 (Char, Line)를 가지고 있다. 두 개의 구현을 가진 하나의 가상 프로시저가 있다. 실행은 주 프로그램을 실행하면서 시작된다. 시뮬라는 순수 가상 프로시저를 가진 클래스를 인스턴스화할 수 있기 때문에, 추상 클래스의 개념이 없다. 즉, 위 예제에서 모든 클래스를 인스턴스화할 수 있다. 하지만 순수 가상 프로시저를 호출하면 런타임 오류가 발생한다.
4. 4. 이름에 의한 호출(Call by name)
시뮬라는 이름으로 호출[1]을 지원하므로 젠센 장치를 쉽게 구현할 수 있다. 단순 매개변수의 기본 전달 모드는 값으로 호출이며, 이는 ALGOL이 이름으로 호출을 사용했던 것과는 대조적이다. 따라서 젠센 장치의 소스 코드는 시뮬라 컴파일러로 컴파일할 때 매개변수에 대해 이름으로 호출을 지정해야 한다.다음은 합산 함수 를 구현한 간단한 예이다.
```text
'''실수''' '''절차''' 시그마 (k, m, n, u);
'''이름''' k, u;
'''정수''' k, m, n; '''실수''' u;
'''시작'''
'''실수''' s;
k:= m;
'''동안''' k <= n '''을 수행한다''' '''시작'''
s:= s + u; k:= k + 1;
'''종료''';
시그마:= s;
'''종료''';
```
위 코드는 제어 변수(k)와 표현식(u)에 대해 이름으로 호출을 사용한다. 이를 통해 제어 변수를 표현식에서 사용할 수 있다.
시뮬라 표준은 for 루프에서 제어 변수에 대한 특정 제한을 허용한다. 따라서 위 코드는 최대한의 이식성을 위해 while 루프를 사용한다.
다음 식은
:
아래와 같이 구현할 수 있다.
:Z:= 시그마 (i, 1, 100, 1 / (i + a) ** 2);
4. 5. 시뮬레이션
시뮬라영어는 이산 사건 시뮬레이션[1]을 위한 시뮬레이션 패키지를 포함한다. 이 시뮬레이션 패키지는 시뮬라의 객체 지향 기능과 코루틴[1] 개념을 기반으로 한다.다음은 옷 가게의 탈의실 사용을 시뮬레이션하는 예제이다.
샘(Sam), 샐리(Sally), 앤디(Andy)는 옷을 사러 쇼핑을 간다. 그들은 탈의실을 하나만 공유해야 한다. 그들 각자는 정규 분포에 따라 약 12분 동안 매장을 둘러본 다음, 약 3분 동안 탈의실을 독점적으로 사용한다.
탈의실 객체는 탈의실 접근을 위해 큐(queue, `door`)를 사용한다. 누군가 탈의실을 요청했는데 사용 중인 경우 이 큐에서 대기해야 한다(`Wait (door)`). 누군가 탈의실을 떠나면 큐에서 첫 번째 사람(있는 경우)이 해제되고(`'''Activate''' door.first`), 이에 따라 door 큐에서 제거된다(`door.First.Out`).
`Person`은 `Process`의 서브클래스이며, 그 활동은 `hold` (매장을 둘러보는 시간과 탈의실에서 보낸 시간)를 사용하여 설명되고, 탈의실 객체의 절차를 호출하여 탈의실을 요청하고 떠난다.
메인 프로그램은 모든 객체를 생성하고 모든 사람 객체를 활성화하여 이벤트 큐에 넣는다. 메인 프로그램은 프로그램이 종료되기 전에 100분 동안 시뮬레이션 시간을 유지한다.
참조
[1]
간행물
Common Base Language
http://www.edelweb.f[...]
Norwegian Computing Center
2020-11-17
[2]
웹사이트
The Development of the Simula Languages
https://hannemyr.com[...]
1978
[3]
논문
The development of the SIMULA languages
1978
[4]
웹사이트
Before C, What Did You Use?
http://www.electroni[...]
2017-05-22
[5]
학술지
Compiling Simula: A historical study of technological genesis
http://www.idi.ntnu.[...]
2010-05-12
[6]
웹사이트
Compiling Simula
http://heim.ifi.uio.[...]
Institute for Studies in Research and Higher Education
2017-04-19
[7]
서적
Concurrent Objects and Beyond
Springer
[8]
웹사이트
GNU Cim
https://www.gnu.org/[...]
[9]
웹사이트
Portable Simula Revisited
https://portablesimu[...]
2019-06-17
[10]
웹사이트
ACM Ole-Johan Dahl and Kristen Nygaard - Obituary
http://www.acm.org/a[...]
Acm.org
2012-01-14
[11]
웹사이트
ACM Turing Award Lectures
http://www.informati[...]
Informatik.uni-trier.de
2012-01-14
[12]
문서
1966
[13]
문서
1975
[14]
웹사이트
2001 TURING AWARD WINNERS SUCCUMB WITHIN TWO MONTHS OF EACH OTHER
http://www.acm.org/a[...]
2002-07-29
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com