Written by JS970
on
on
프로그래밍언어론 2023-03-21 수업정리
Flow
- Simula I(1962) and Simula 67
- Smalltalk(1972)
- Traditional C(K&R C) (1972)
- Objective-C(1984)
- C++(1985)
- Java(1995)
- JavaScript(1995) and PHP(1994)
- Perl(1987), Python(1991), Ruby(1990)
Simula I(1962) and Simula 67
- SIMUlation Language -> SIMULA
- Ole-Johan Dahl에 의해 1962년 개발되었다.(APL과 비슷한 시기에 개발됨)
- 시스템 시뮬레이션 목적으로 개발되었다.
- data와 functionality를 한 덩어리로 봤다. -> class
평가
- Class, 객체, 상속, 추상화 개념을 도입했다. -> Smalltalk, Objective-C, C++에 많은 영향을 줌
Smalltalk(1972)
- Xerox PARC(Xerox Palo Alto Research Center)에서 개발되었다.
- 아래와 같은 메시지 전달 매커니즘 등 진보된 객체 지향 개념을 확립했다.
- a+b => a.+(b)
- a : object
-
- : method
- b : argumen
- 전체 식(a+b)은 class에 보내는 메시지로 해석한다.
- a+b => a.+(b)
- Smalltalk-80 이후로 더 이상 개발은 진행되지 않았다.
평가
- object-oriented 로 완전히 구현된 첫 번쨰 프로그래밍 언어이다.
- data abstraction
- inheritance
- dynamic type binding
- GUI computing환경을 개척했다.
- 스티브 잡스가 이걸 보고 매킨토시를 개발했다고 한다...
- GUI Windowing system에 많은 기여를 했다.
Traditional C(K&R C)(1972)
- 이전 글의 C 문단에서 이어진다.
- type checking이 부족하다고 했는데 아래와 같은 코드에서 확실히 확인할 수 있다.
- return type, argument의 타입을 명시하지 않았다.
- default type으로 int를 사용했다.
add(a, b)
int a, b;
{
return a + b;
}
- 현대 C언어(ANSI-C)에서 Traditional C언어의 잔해를 찾아볼 수 있다.
main() // 어떤 argument든 받을 수 있음을 의미
main(void) // argument를 받지 않겠다는 것을 의미
Objective-C(1984)
- Brad Cox와 Tom Love에 의해 개발되었다.
- 소프트웨어의 재사용성을 높이려는 개발 의도가 있었다.
- NeXT(NeXTSTEP build, MacOS의 전신)에 의해 유명해졌다.
- C의 헤더를 그대로 계승했다.
- Smalltalk의 messaging concept을 가져왔다.
- type 개념과 객체 지향 개념을 모두 도입했다.
평가
- MacOS, iOS의 어플리케이션 개발에 주로 사용되었다.
- Swift(2014)에 많은 영향을 주었다.
C++(1985)
- Bell Lab의 Bjarne Stroustrup에 의해 개발되었다.
- 이 사람은 원래 Simula를 사용하던 사람인데, Simula의 개념을 C에 도입했다.
- Class, object mechanism을 가지고 있다.
- 연산자 오버로딩을 지원한다.
- 동적 바인딩, 가상 함수 등의 기능을 지원한다.
- Template(for functions and classes)개념과 Exception handling개념은 꽤 시간이 지난 후에 도입되었다.
- 1998년 ANSI C++이 발표되었다. 이후 오랜 기간 새로운 표준이 발표되지 않다가 2011년에 많은 기능을 폭발적으로 도입하였다. 이후로는 3년 단위로 새로운 표준을 발표한다.
- C++11에서 람다 함수 등 함수형 프로그래밍의 개념도 도입되었다.
평가
- 객체 지향 프로그래밍(OOP)의 영향으로 엄청난 사용자 그룹의 성장을 이루어 냈다.(+ C언어의 인기)
Java(1995)
- 회사가 망하는 등 사연이 많았던 언어이다.
- JVM을 통해 임베디드를 타겟으로 개발했으나... 웹에서 사용했다.
- 이후 JavaScript, PHP가 웹에서의 역할도 대체했다.
- C++에 기반했지만 아래와 같은 복잡한 기능들을 없에 훨씬 단순하다.
- struct, union, enum, pointers, etc.
- 객체 지향 프로그래밍을 지원한다. -> 모든 것은 class로 정의된다.
- Garbage collection 지원
- Concurrency지원(thread개념을 도입했다)
평가
- C++보다 안전하지만 느리다.
- C++을 단순화 했다고는 하지만 여전히 복잡하다.
JavaScript and PHP
JavaScript
- Java와는 아무런 관계도 없다
- 주로 client-side를 담당했다(현재는 server-side도 담당한다)
- 브라우저를 클라이언트라고 하자. 웹 서버가 요청에 따라 페이지를 제공할 때 굳이 서버가 페이지를 수정하지 않고 브라우저 선에서 수정이 가능한 것들도 있다. 이를 client-side라고 한다.
- 서버가 직접 수정하는 것을 server-side라고 표현했다.
- Node.js를 통해 더욱 널리 퍼졌다.
PHP
- JavaScript가 client-side를 담당했다면 PHP는 server-side를 담당한다.
- PHP는 보안 관련 이슈가 있었지만 계속해서 표준을 갱신하는 중이다.
- PHP 5(2004), PHP 6(2006), PHP 7(2015), PHP 8(2020)
- HTML에 embed되어 사용된다.
Perl, Python, Ruby
Perl(1987)
- 가독성이 매우 좋지 않다.
- Multiparadigm language
Python(1991)
- Multiparadigm language
- 너무 느린 속도로 인해 발표 이후에는 별로 관심을 받지 못했지만, 컴퓨터 하드웨어의 발달로 현재는 매우 널리 쓰이고 있다.
Ruby(1995)
- 객체 지향 스크립트 언어이다.
- 별로 관심을 받지 못했지만 ROR(Ruby on rails, 웹 페이지를 뚝딱 만들 수 있다)에 의해 널리 사용되었다(현재는 다시 사장되는중)