강력한 프로그래밍 언어의 조건?
http://slashdot.org 에 흥미로운 이야기거리가 올라와서 이곳에 그대로 옮겨 봅니다. slashdot의 기사내용은 관련 링크를 참조하십시오.
A not-so Anonymous Coward queries: "My company is about to start development on a new project, and I have to decide on a language and development environment. My boss gave me a set of criteria which needs to be filled: intuitive and easy to use IDE; simplified GUI design and event handling; advanced error handling; advanced object oriented design including multiple inheritance, abstract classes, and garbage collection; full support for operator and function overloading; and portable (at compile-time) across various platforms. I have already looked at C++, Java, C++, C#, Eiffel, and even VB.net; I may be missing something but as far as I can tell all of these languages are missing something from this list. Is there a language available that has all of these features? I thought that someone from Slashdot would be able to point me in the right direction?" If you were to design a language from the ground up, what features would you include and why?
딴건 몰라도 if를 이용한 분기만큼은 옛날 GW-BASIC이 가장 뛰어나
딴건 몰라도 if를 이용한 분기만큼은 옛날 GW-BASIC이 가장 뛰어나지 않았나 싶습니다...
그야말로 플로우 차트에 가장 충실한 제어가 가능했으니까요..
명령행에 번호를 매겨서 사용하는 GOTO가 대단히 강력했다고 보기에..
뭐 물론, 애초에 언어의 목적부터가 다르기 때문에 그런거지만..
C에도 goto문 있습니다.GW-BASIC은 영 아니라고 보는데요-_
C에도 goto문 있습니다.
GW-BASIC은 영 아니라고 보는데요-_-;
C보다도 어렵고 불편한게 GW-BASIC라고 전 생각합니다.
알죠..그러나, 번호를 매겨서 명령행을 나열해 놓은 방식 덕에 C의
알죠..
그러나, 번호를 매겨서 명령행을 나열해 놓은 방식 덕에 C의 goto보다는 더 쓸모 있었다고 봅니다..
뭐 물론, 언어의 기능으로는 GW-BASIC이 한 참 떨어지지만..
적어도 플로우 차트대로 구현하는 것이라면 C보다 더 편하다고 느껴지네요..
플로우 차트의 순서가 바뀌었을때 행번호 바꿔 쳐넣는 고통을 기억하시는지요
플로우 차트의 순서가 바뀌었을때 행번호 바꿔 쳐넣는 고통을 기억하시는지요? -_-; 또한, 200번 행과 210번 행 사이에 20줄을 추가하려 할때 그 뒤의 행번호 다 바꿔주는 고통은? -_-;
그것 때문에 줄 번호 정렬 명령이 있었죠.한번 쓰면 원하는 간격으로
그것 때문에 줄 번호 정렬 명령이 있었죠.
한번 쓰면 원하는 간격으로 줄 번호와 명령어 내부에 쓰인 줄 번호가 알아서 정렬됩니다.
(무슨 명령어인지는 잊어버렸습니다. -_-)
나쁜 언어의 징표같군요.한가지 기능만을 제공하는 명령이 언어 구성 요
나쁜 언어의 징표같군요.
한가지 기능만을 제공하는 명령이 언어 구성 요소로
존재한다는 것은 끔찍한 일입니다.
에,,, 그런 언어 나와있음 소개시켜주슈....
에,,, 그런 언어 나와있음 소개시켜주슈....
http://ropas.kaist.ac.kr/~kwang/function
http://ropas.kaist.ac.kr/~kwang/functional-ad.html
제대로 디자인된 언어의 장점
작고 간단하다
문법이 작고 간단할 뿐만 아니라 그 의미구조 또한 간결하다. 극명한 예로, ML 참고서가 총 261쪽이고, 초보자를 위한 Ullman의 입문서가 380쪽인 반면, C++ 의 경우는 각각 600쪽이 모두 넘는다.
안전하다
수행중인 프로그램의 완전한 안정성이 보장되어 있다. 즉, 컴파일러를 통과한 프로그램은 실행중에 파행적으로 중단되는 경우가 (core dump 나 segmentation fault등이) 발생하지 않는다.
이것은 언어 갖추고있는 강력한 타입 시스템 때문인데, ML에서는 특히, 타입 검사를 타입 유추를 이용해서 자동으로 하기 때문에 프로그래머가 변수의 타입을 표기할 필요가 없다.
타입에 얽매이지 않는 함수도 정의할 수 있다
하나의 함수로, 타입은 다르지만 하는 일이 같은 함수들을 표현할 수 있기 때문에 프로그램하기가 경제적이고, 타입검사를 하는 언어가 가지는 경직성이 없다.
편향된 프로그래밍 관성에서 벗어날 수 있다
함수가 특이한 대상이 아니고, 여타 다른값과 구분 없이 (higher-order functions) 다루어 진다. 따라서, 함수형 언어에서 개발된 프로그램 기술들이 (stream, infinite data structures, process networks 등이) 자연스럽게 표현될 수 있다.
또한, 메모리주소나 지정문 (assignment) 등으로 발생하는 메모리 반응들도 (side-effect들도) 표현가능 하다.
정제된 모듈 처리기능을 갖추고 있다
대형의 소프트웨어 개발에 꼭 필요한, 안전한 분리 컴파일 기능이 제공되어 있다.
또한, 모듈을 일반화 시켜서 (parameterized module을) 정의할 수 있기때문에, 하나의 모듈을 필요에 따라 구체화해서 재 사용할 수 있다.
자동으로 메모리를 관리해 준다
효율적인 메모리 재활용 시스템이 (garbage collection이) 제공되기 때문에 프로그래머가 메모리의 부족이나 재사용등에 대한 부담에서 자유롭다.
예외상황 관리 매카니즘을 갖추고 있다
이것을 이용 해서, 프로그램의 실행 중에 발생할 수 있는 긴급상황들을 (예를 들면, x/y 에서 y 값이 0인 경우들을) 정황에 맞게 적절히 처리할 수 있다.
정형적인 의미구조를 갖추고 있다
프로그램을 이해하는 데 필요한 정확한 정의가 제공되어 있다. 따라서, 프로그램의 의미에 혼동의 여지가 없으므로 프로그램을 분석하고 관리하는 작업이 용이하다.
프로그래밍의 미학
대형의 고난도 프로그램이 드러내는 복잡성을 다룰 수 있는 프로그래밍 원리와 미학이 자연스럽게 표현된다.
실무에서 강력한 프로그래밍 언어의 조건이랑은 좀
다를지도 모르겠지만...참고가 될듯해서 옮겨놨습니다.
이건 함수형언어의 장점일뿐이에요!위의 링크를 따라가서 한말씀해주고
이건 함수형언어의 장점일뿐이에요!
위의 링크를 따라가서 한말씀해주고 싶군요.
어떻게 C++ 이 제대로 디자인이 안되었다고 하는지...
어설프게 다른언어의 단점을 지적하지 말고 함수형언어의 장점만 주장하였으면 합니다.
정확한 지적이십니다.다만 언어란 하나의 도구일 뿐이라는 관점에서,
정확한 지적이십니다.
다만 언어란 하나의 도구일 뿐이라는 관점에서,
원론적인 관점에서 생각해 보는 것도 좋을 것 같습니다.
언어는 도구일 뿐이기 때문에 생산성 있고, 표현력 있고
강력한 언어가 좋은 언어일 것입니다.
이러한 관점에서 함수형 언어는 많은 장점을 가지고
있습니다. 물론 강력함(성능)이라는 관점에서는 C로 대표되는
절차형 언어가 우세합니다.
바로 여기에 문제가 있는 것이구요.
혹 함수형 언어가 필요한 부분에 과도하게 폭넓게 절차형 언어가
사용되고 있는 것은 아닐까... 하는.
동의합니다...^^;목적에 적합한 언어를 사용하는 것이 좋은거져...
동의합니다...^^;
목적에 적합한 언어를 사용하는 것이 좋은거져...
개인이 사용하는 것이라면...개인의 취향도 중요하겠구여...
그리고 저 개인적인 생각이지만... 다른 성향의 언어를 배운다는 것은
다른 관점을 배울 수도 있는것 같습니다.(말이 좀 이상한가여?)
전에 IBM developworks에서 Python으로 하는 함수적 프로그래밍이라는 글을
읽은 적이 있는데...
거기에 보면 똑같은 프로그램을 원래 Python스타일, SmallTalk스타일, Lisp스타일
등등으로 Python언어를 이용해서 만든 코드가 예제로 나옵니다.
똑같은 언어로도 접근하는 관점에 따라 이렇게 다른 결과가 나올 수 있다는 것이
재미있었습니다.
몇 가지 코드만 아래 예로 옮겨놨습니다.
* Python style
class TaxCalc:
def taxdue(self):
return (self.income-self.deduct)*self.rate
taxclass = TaxCalc()
taxclass.income = 50000
taxclass.rate = 0.30
taxclass.deduct = 10000
print "Pythonic OOP taxes due =", taxclass.taxdue()
* Smalltalk style
class TaxCalc:
def taxdue(self):
return (self.income-self.deduct)*self.rate
def setIncome(self,income):
self.income = income
return self
def setDeduct(self,deduct):
self.deduct = deduct
return self
def setRate(self,rate):
self.rate = rate
return self
print "Smalltalk-style taxes due =", \
TaxCalc().setIncome(50000).setRate(0.30).setDeduct(10000).taxdue()
* Lisp style
from functional import *
taxdue = lambda: (income-deduct)*rate
incomeClosure = lambda income,taxdue: closure(taxdue)
deductClosure = lambda deduct,taxdue: closure(taxdue)
rateClosure = lambda rate,taxdue: closure(taxdue)
taxFP = taxdue
taxFP = incomeClosure(50000,taxFP)
taxFP = rateClosure(0.30,taxFP)
taxFP = deductClosure(10000,taxFP)
print "Functional taxes due =",taxFP()
print "Lisp-style taxes due =", \
incomeClosure(50000,
rateClosure(0.30,
deductClosure(10000, taxdue)))()
원문은 아래 링크로...
http://www-903.ibm.com/developerworks/kr/linux/library/l-prog2.html?dwzone=linux
>>그리고 저 개인적인 생각이지만... 다른 성향의 언어를 배운다는 것은
>>그리고 저 개인적인 생각이지만... 다른 성향의 언어를 배운다는 것은
>>다른 관점을 배울 수도 있는것 같습니다.(말이 좀 이상한가여?)
아니요. 전적으로 동감입니다. 리스프나 포스를 공부하다 보면
컴퓨터의 하부 구조에 대해, 언어 자체에 대해 또 다른 관점을 갖게
됩니다. 또 다른 가능성, 또 다른 아이디어를...^^
또 리스프를 배우다 보면 자연히 추상적 사고가 몸에
배게 됩니다. C 계열 언어에서 억지로 익혀야 하는 요소들이
그저 자연스럽게 익혀집니다(이점에서 자바는 분명 계열이 다른
언어이고 정말로 좋은 언어라고 생각합니다. C#은 전혀 모르지만).
위의 분의 말도 맞는 것 같습니다.모든 언어에는 다 나름대로의 설
위의 분의 말도 맞는 것 같습니다.
모든 언어에는 다 나름대로의 설계 의도가 있으니까...
예를 들어 gabage collection만 해도 있는게 낫다 아니다..
여러가지 말이 많지만...C++의 경우에는 없는게 낫다는 쪽이 우세하져...^^;
functional language쪽을 좋아하시는 분이 쓴 글이라...
좀 편협할 수도 있겠네여...^^;
다만 우리나라에서는 특히나 functional language가 무시당하는
경향이 있는 것 같아서...개인적으로 좀 아쉬울때가 있습니다...ㅡㅡa
그렇다면 함수형언어를 주로 가르치는 곳은 어디인지요?대학교에서도
그렇다면 함수형언어를 주로 가르치는 곳은 어디인지요?
대학교에서도 잘안가르치는 것으로 알고 있는데
적어도 대학원은 가야된다는 것인지?...
// 공부하는 것은 밥먹는 것과 같으니, 편식은 하지 말아야 하는데 저도 아쉽습니다~
LISP는 인공지능 강의할 때 쓰더군요..그리고 PL에서 여러 잡다한
LISP는 인공지능 강의할 때 쓰더군요..
그리고 PL에서 여러 잡다한 언어 다해보니까..뭐 컴 전공자라면 한 번 쯤은 접해본다고도 할 수 있습니다..
프로그래밍 언어 같은 과목을 들으시면, 가르치는 교수들이 좀 있습니다.
프로그래밍 언어 같은 과목을 들으시면, 가르치는 교수들이 좀 있습니다.
(Lisp, Scheme, ML등 가르치는 학교를 몇 군대 봤습니다.)
다만 실용적일 정도로 가르치지를 않습니다만....
(저희학교에서는 Scheme으로 Scheme인터프리터 한 번 만들어보는 정도까지)
AI같은 과목에서 Lisp이나 Prolog를 가르치는 경우도 있습니다만,
역시 주가 아닌지라 실용적으로 쓸만큼 가르치지를 않습니다.
대학원 가서도 마찬가지로 다루는 데가 별로 없습니다.
고로 답은 혼자 공부해보는 수밖에 없습니다.
저도 혼자 공부하고 있는데, 관점이 틀려서 그런지
재미있는 것도 많지만, 몰라서 답답할때도 많습니다.
어떻게 해야될지 길이 잘 안 보일때가 많다고 해야될지, 물을 때도 별로 없고...
사실 C++ 나 C 나 메모리를 조작하는 언어란 관점에서 봤을때
사실 C++ 나 C 나 메모리를 조작하는 언어란 관점에서 봤을때
oop 란 놈도 다 메모리 조작으로 표현하는게 아닌가요.
특히나 메모리조작을 많이 하시는 분들은 아마 똑같아 보일겁니다.
메모리를 조작하는 언어란 무슨 뜻이져?모든 컴퓨터 언어는 결국은
메모리를 조작하는 언어란 무슨 뜻이져?
모든 컴퓨터 언어는 결국은 메모리에 저장된 이진 데이타 아닌가여?
모든 컴퓨터 언어는 다 메모리를 조작하는 언어 아닌가여?
함수란 것도 메모리에 저장되있고, 객체라는 것도 메모리에 저장되있는 것이져.
이해가 잘 안 가네요.
포인터로 메모리에 접근할 수 있는 점을 지적한 거 아닐까요?메모리의
포인터로 메모리에 접근할 수 있는 점을 지적한 거 아닐까요?
메모리의 어느 주소에 어느 변수가 할당될지 까지는 직접 조작하기 힘들지만, 그래도 최소한 포인터로 표시해서 마음대로 조작할 수 있으니까...
뭐 포트란이나 베이식 같은데서는 꿈도 못꿀 그런 것이지 않나요?
제가 생각하기에도 말씀하신 뜻은 포인터 사용이 가능하다는 것이 맞는 것
제가 생각하기에도 말씀하신 뜻은 포인터 사용이 가능하다는 것이 맞는 것 같습니다.
다만 포인터를 사용할 수 있다는 것이 오히려 비객체지향적인 스타일을 권장하면 권장했지 결코 객체지향성을 목표로 설계된 언어들과의 차이를 좁혀주지는 않습니다.
우리가 "사람"이란 대상을 모델링할 때 키, 나이, 이름 과 같은 속성들과 함께 걷는다, 먹는다 등의 메소드를 정의할 수 있습니다. 만일 언어가 접근자를 지원한다면 외부에서 접근하면 안되는 속성이나 메소드 - 예를들면 숨쉰다라던지 심장을 뛰게한다 정도? - 를 깔끔하게 숨길 수 있을 것입니다.
하지만 "나이를 메모리 xx번지에 xxx크기만큼 저장한다"는 객체 지향적 사고의 범주를 벗어나는 일입니다. 실제 세계의 사람은 메모리 주소나 포인터 등을 가지고 있지 않기 때문입니다.
이런 로우레벨의 접근이 가능하다고 해서 직접적으로 객체지향성을 떨어뜨리지는 않지만 자바의 경우 상대적으로 디자인과 직접적 관계가 없는 쓰레드나 메모리 관리 등을 VM차원에서 처리해 주는 대신 보다 OOP적인 디자인을 가능하게 해주는 여러 장치를 제공합니다. 그런 부분에서 C/C++세대와 Java/C#세대 언어의 차이가 있는 것이 아닌지 싶습니다.
위에 말씀하신분은 단지 C에 OOP 의기능이 없다하더라도 OOP 의 테크
위에 말씀하신분은 단지 C에 OOP 의기능이 없다하더라도 OOP 의 테크닉을 포인터로 발휘할수 있다라는 의미로 보이는데요.
그걸가지고 c/c++ 의 언어가 마치 java/C# 언어에 뒤쳐져 있
는것처럼 말하는건 우습군요.
예로 C++ 같은 언어는 님이 말씀하신 특성을 가지고 있을뿐만 아니라. C 퍼포먼스를 고스란히 가지고 있습니다.
C/C++ 이 java/C# 에 비해 퍼포먼스가 우수함을 관가 하시는것 같군요.
java 는 퍼포먼스가 너무 떨어집니다. 그래서 쓸수있는곳은 한정적이라는 생각이 듭니다.
님은 oop를 강조한나머지 퍼포먼스를 우습게 생각하시는거 같은데요 좋은 언어는 퍼포먼스와 생산성의 조합입니다.
그러한것을 고려했을때 현재는 c++가 oop의 생산성과 퍼포먼스를 적절히 조합된 언어가 아닌가 생각합니다
제 글을 오해하신 것 같습니다. 제가 올린 다른 글을 보셨다면 이해하셨겠
제 글을 오해하신 것 같습니다. 제가 올린 다른 글을 보셨다면 이해하셨겠지만 저는 언어 간의 단순비교는 무의미하다고 생각합니다.
설사 굳이 폭넓게 비교하고 싶다고 해도 성능/객체지향성의 이분법적 기준보다는 생산성, 지원 가능한 플랫폼, 디버그의 용이성, 사용할 수 있는 라이브러리, IDE등등의 여러 기준이 포함되어야 합니다.
어차피 그런 폭넓은 비교는 언어에 대한 "종교전쟁"으로 비화하기 쉽습니다. 제 글의 의도는 순수하게 객체지향적 측면에서 자바/C++을 비교한 것입니다. 위의분이 "어차피 메모리를 다루는 언어라면 객체지향을 구현하는데는 차이가 없지 않나" 하는 문제를 제기하신데 대한 반론일 뿐입니다.
그럼...
페이지