#acl All:read ProgrammingLanguage와 일반 language는 매우 유사하다. 마치 외국어를 공부하는 것과 같고, 역시 많이 사용해보는것이 공부하는데 도움이 된다. {{http://www.webopedia.com/FIG/PROG-LAN.gif}} <> == Programming language == === ProgrammingLanguage 의 종류 === * ProgrammingLanguage 들을 분류하면 http://cui.unige.ch/OSG/info/Langlist/intro.html 에서 얘기하는 것처럼 여러 가지로 나눠 집니다. * 204개의 ProgrammingLanguage 로 만들어진 HelloWorld 프로그램 입니다. http://www2.latech.edu/~acm/HelloWorld.shtml == Generation == * first generation: MachineLanguage * second generation: AssemblyLanguage * third generation: high-level programming languages, such as C, C++, and Java. * fourth generation: fourth-generation languages are programming languages closer to human languages than typical high-level programming languages. Most 4GLs are used to access databases. === MachineLanguage === * ProgrammingLanguage의 가장 하위 단계이며 모든 CPU 마다 그들만의 유일한 MachineLanguage가 존재한다. 즉 MachineLanguage는 CPU에 명령을 내릴 수 있는 상태의 ProgrammingLanguage이다. === AssemblyLanguage === * MachineLanguage와 1:1로 대응 되는 Language이다. MachineLanguage가 BinaryCode(숫자)로 구성되었지만 AssemblyLanguage는 사람이 이해하기 쉽게 각각의 Name을 갖고 있다. 각 CPU 마다 그들만의 유일한 MachineLanguage가 있는 것처럼 AssemblyLanguage도 CPU마다 서로 다르다. 그렇기 때문에 특정 Type의 CPU를 위해서 쓰여진 AssemblyLanguage는 다른 Type의 CPU에서는 동작하지 않는다. AssemblyLanguage가 Computer에서 실행되기 위해선 Assembler로 MachineLanguage로 변환해야 한다. === Code 가 동작하기 위한 두가지 방법 === * compile the program 컴파일은 SourceCode를 ObjectCode로 바꾸는 작업을 한다. ObjectCode는 MachineLanguage와 같거나 비슷하다. 최종적으로 ExecutableProgram을 만드는 것은 linker이다. Assemblers 로 AssemblyLanguage를 직접 Compile 할 때도 있다. * interpret the program Interpreter를 통해서 실행하는 방식. Compiler가 SourceCode를 MachineLanguage로 바꿔주는데 비해서 Interpreter는 Intermediate form으로 바꿔주고 그것을 실행한다. === Compile과 Interpret의 장단점 === * 일반적으로 Compile 하는 방법은 실행 속도가 Interpret 하는 방식보다 빠릅니다. * Interpret 방식은 실행시 Compile하는데 걸리는 시간이 없고, 실행중에 프로그램을 수정할 수 있습니다. 그렇기 때문에 개발 버젼에서는 Interpret 방식을 사용하는 언어를 쓰기도 한다고 합니다. BASIC 이나 LISP 가 이런 방식을 사용합니다. * Compile 방식을 사용하면 특정 processor에 대해 특정한 MachineLanguage가 존재하기 때문에 다른 processor를 사용할 경우 새로 Compile 해야 되지만 Interpret 방식을 사용할 때는 그럴 필요가 없습니다. === Java와 .Net 프로그램 === * Java와 .Net Framework에서 돌아가는 프로그램은 특정 플렛폼에 상관없이 돌아갑니다. 그 이유는 다음과 같습니다. * Java는 Compile 하면 bytecode(확장자가 .class 입니다)라고 불리는 형식의 파일로 변환됩니다. 그리고 실제 프로그램은 Java Virtual Machine이라는 Java Interpreter가 Runtime 때 실행을 시켜줍니다. 따라서 Java VM이 여러 Platform에 맞게 설치만 되어 있으면 실행되는 것입니다. 참고로 bytecode도 just-in-time compiler (JIT)를 사용하면 바로 MachineLanguage로 컴파일 되어서 이용됩니다. * .Net 프로그램은 Compile 하면 MicroSoft Intermediate Language (MSIL) 형식의 파일로 변환됩니다. 그리고 이 파일이 Common Language Runtime (CLR) 또는 Virtual Execution System (VES) 이라고 불리는 VM에 의해서 실행됩니다. Java와는 달리 이 VM은 Interpret하지 않고 JIT를 이용해서 MachineLanguage를 만들고 그 코드를 실행합니다. * 여튼 둘다 중간 코드로 변환하는 과정을 거치기 때문에 실행파일을 배포해도 어떤 플렛폼에서든 실행될 수 있는 장점을 갖고 있습니다. 하지만 이와 같은 점 때문에 decompiler를 사용해서 원래 소스를 볼 수 있는 취약점을 갖고 있습니다. === References === * http://cui.unige.ch/OSG/info/Langlist/intro.html, ProgrammingLanguage Classification * http://www2.latech.edu/~acm/HelloWorld.shtml, 204가지 ProgrammingLanguage로 구현된 HelloWorld * http://www.webopedia.com/TERM/F/fourth_generation_language.html, ProgrammingLanguage의 Generation에 대해서 * http://www.webopedia.com/TERM/P/programming_language.html, ProgrammingLanguage에 대해서 * http://www.webopedia.com/TERM/C/compile.html, Compile에 대해서 * http://www.webopedia.com/TERM/J/Java.html, Java에 대해서 * http://wwws.sun.com/software/solaris/jit/, Java JIT에 대해서 * http://www.haansoft.com/swlab/dev1_0/data/index_dot12.html, .NET에 대해서 * http://www.geocities.com/~sangcho/, Disassembler 에 대해서 == 수준별분류 == 제 1수준 (컴파일랭귀지) * [[Assembler]] * [[Cee]] * [[C++]] * [[Java]] * [[Fortran]] * [[Objective-C]] 제 2수준 (스크립트) * [[Python]] / [[Jython]] * [[Perl]] * [[Lisp]] * [[Smalltalk]] * [[Eiffel]] * [[PHP]] * VisualBasic 제 3수준 * [[Mathematica]] * MatLab * [[R]] * LabView * [[J]] == 방법별분류 == * ProcedualProgramming : [[Cee]], [[Perl]] * ObjectOrientedProgramming : CeePlusPlus, [[Java]], [[Smalltalk]], [[Python]] * FunctionalProgramming : [[Lisp]], [[Python]], [[Haskell]] * ValueOrientedProgramming : [[nML]], [[Haskell]] == 각종자료 == * 프로그래밍 언어 족보 http://www.levenez.com/lang/history.html * 족보 하나더 http://people.mandrakesoft.com/~prigaux/language-study/diagram.pdf * 언어별 점수매기기 http://www.bagley.org/%7Edoug/shootout/craps.shtml == 토론 == 보통 새로운 언어를 배울때 HelloWorld부터 시작한다. [[Assembler]]를 어따가 넣어야하나 ''[[Assembler]]도 컴파일을 해야되니 1수준에 넣어야 될듯 한데요. '' --[[destine]] OK~ 참고, Wiki:ProgrammingLanguages 수준별 분류가 어떻게 분류된 건지 설명 해주세요. [[destine]], 2003-05-14 ''아마 Capers Jones의 FP estimation 테크닉에 의한 backfiring 구분(Average Source Statements Per Function Point)이 아닌가 합니다. --[[김창준]]'' ---- CategoryLanguage