학부 수준의 학생들에게 컴퓨터 프로그래밍 소개라는 과정을 가르치려고합니다. 조금 혼란 스러워요. 전산 물리학 과학자들은 C / C ++ 또는 Python 또는 Fortran, CUDA 등을 사용합니다. 무엇을 사용해야합니까? 나는 당신이 당신의 인생에서 언제든지 새로운 프로그래밍 언어를 배울 수 있다는 것을 알고 있지만 나중에 모든 기본 프로그래밍 개념과 OOP 개념을 구체화하는 것이 현명한 선택입니다.
학부 수준의 학생들에게 컴퓨터 프로그래밍 소개라는 과정을 가르치려고합니다. 조금 혼란 스러워요. 전산 물리학 과학자들은 C / C ++ 또는 Python 또는 Fortran, CUDA 등을 사용합니다. 무엇을 사용해야합니까? 나는 당신이 당신의 인생에서 언제든지 새로운 프로그래밍 언어를 배울 수 있다는 것을 알고 있지만 나중에 모든 기본 프로그래밍 개념과 OOP 개념을 구체화하는 것이 현명한 선택입니다.
답변:
첫째, 학부생들이 우리와 비슷하고 컴퓨터에 대한 사전 소개가 없다면 적절한 편집기 (예 : MS Word가 아닌), 명령 줄 등을 사용하는 기본적인 방법을 가르치는 데 시간을 할애해야합니다.
답은 코스의 초점을 어디에서 설정해야하는지 (또는 가르 칠 것이 무엇인지에 따라) 다소 다릅니다. 예를 들면 : 컴퓨터의 내부 작동은 어느 정도 관련이 있습니까? 클래스 및 기타 고급 OOP 구조가 필요하십니까? 효율적인 프로그램을 만드는 방법을 가르치고 싶거나 그들이 일하는 프로그램을 전혀 만들면 행복합니까? 또한 유능한 교사가 필요할 것임을 잊지 마십시오.
그러나 이제는 언어의 장단점에 익숙합니다. 이것은 주로 컴퓨터 물리학 자로서의 경험에 의한 것이며 일부는 특정 분야, 작업 그룹, 대학 등에 따라 다를 수 있습니다.
나는 일반적으로 거의 처음부터 Numpy를 사용하는 것이 좋으며 다음과 같이 사용한다고 가정합니다.
장점 :
print
, Numpy 's savetxt
및 loadtxt
, 및 로 완전히 다룰 수 있습니다 sys.argv
. 즉시 도입 할 수 있으며 프로그래밍 시간이 많이 걸리지 않습니다.단점 :
장점 :
단점 :
C에 비해 C ++의 주요 장점 (클래스, 템플릿)은 강의와 관련이 없으며 대규모 프로젝트에만 관련이 있습니다. 따라서 두 가지 중 C가 더 간결하므로 C를 선택합니다.
다른 언어에 대한 의견 :
¹ 최소한 우리 그룹의 표준 워크 플로우입니다.
2014 년에는 파이썬이라고 말했습니다. 2017 년에는 학부생들에게 줄 언어가 줄리아라고 진심으로 믿습니다.
교육은 항상 트레이드 오프에 관한 것입니다. 한편으로는 파악하기 쉬운 간단한 것을 선택하려고합니다. 그러나 둘째로, 당신은 힘을 유지하는 무언가, 즉 당신과 함께 성장할 수있는 무언가를 가르치기를 원합니다. 공통 동적 언어 (Python / MATLAB / R)는 모두 존재하지 않는 상용구 코드와 통역사 열기 및 코드 분리의 용이성으로 인해 카테고리 1에 쉽게 속하지만 C / C ++ / Fortran은 오늘날 세계의 핵심 고성능 소프트웨어가 작성된 언어.
그러나 다른 범주를 완전히 포착하지 못하는 언어를 사용하는 데 문제가 있습니다. 파이썬과 같은 언어를 사용할 때 유형과 정수 오버플로와 같은 것들을 멋지게 추상화합니다. 이것은 첫 학기 컴퓨팅을 가르치는 데는 좋지만 실제로 실제로 어떻게 작동하는지에 대해 더 깊이 파고 들고 싶을 때 파이썬의 언어는 기본 금속에서 너무 추상화되어 좋은 교육 도구가 아닙니다. 그러나 C / C ++ / Fortran (또는 Java ... Java를 먼저 배웠습니다 ...)은 모두 시작 비용이 너무 커서 배우기 가장 어려운 것은 헤더 설정 및 main
컴파일 방법을 배우는 것 입니다. 실제 학습에서 프로그램으로 산만 .
줄리아를 입력하십시오. Julia를 처음 사용할 때는 유형에 대한 전체 아이디어를 추상화하여 MATLAB 또는 Python처럼 사용할 수 있습니다. 그러나 더 많은 것을 배우고 자한다면 언어에 깊이있는 "토끼 구멍"이 있습니다. 형식 시스템과 LLVM을 통한 다중 디스패치에 기반한 추상화 계층이기 때문에 본질적으로 "정적으로 컴파일 된 코드를 작성하는 쉬운 방법"입니다 (그리고 형식 안정 함수는 실제로 정적으로 컴파일 될 수 있음). 이것이 의미하는 것은 C / C ++의 세부 사항에도 액세스 할 수 있다는 것입니다. 상용구 코드없이 간단한 루프와 함수를 작성하고 함수 포인터를 파는 방법을 배울 수 있습니다. Julia의 메타 프로그래밍 기능을 사용하면 AST에 직접 액세스 할 수 있으며 컴파일 체인의 모든 부분을 보여주는 매크로가 있습니다. 또한 Lisp로서 기능적 프로그래밍 스타일을 사용할 수 있습니다. 그리고 그것은 많은 병렬 컴퓨팅 기능을 가지고 있습니다. 파라 메트릭 타이핑 및 타입 안정성과 같은 아이디어는 Julia에서 상당히 독특하고 깊습니다.
프로그래밍 언어 자체를 연구하려면 @code_lowered
낮추는 것이 무엇인지, 형식이 지정된 AST를 @code_typed
참조하고 LLVM IR을 사용 @code_llvm
하고 마지막 으로을 사용 하여 네이티브 어셈블리 코드를 사용하여 컴파일이 작동하는 단계를 배울 수 있습니다 @code_native
. 이것은 동적 변수의 비용이 무엇인지, 그리고 "변수 복싱"이 어떻게 작동하는지 정확하게 보여주기 위해 사용될 수 있으며 ,이 블로그 포스트 는 이러한 내부 검사 도구를 사용하여 컴파일러 최적화가 어떻게 발생할 수 있는지를 알려줍니다.
컴퓨터 과학 및 소프트웨어 공학 아이디어뿐만 아니라 풍부한 수학적 아이디어도 있습니다. Julia의 주요 라이브러리는 일반적인 타이핑을 염두에두고 작성되었으므로 매트릭스없는 연산자를 만들고 IterativeSolvers.jl을 사용하여 GMRES를 사용하는 것이 쉽지 않습니다. 내부 검사 도구를 사용 @which
하여 구현 방법을 정확하게 보여줄 수 있습니다. 예를 들어 어떻게 \
작동합니까?
@which rand(10,10)\rand(10)
#\(A::AbstractArray{T,2} where T, B::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T) in Base.LinAlg at linalg\generic.jl:805
그것은 바로 \의 정의 를 가리 킵니다 . 그것은 Julia에서 구현되므로 Julia를 아는 사람은 알고리즘과 알고리즘을 배우고 매트릭스 하위 유형을 식별하고 가능한 경우 전문화합니다 (가우시안 제거로 넘어 감). Julia의 코드는 MIT 라이센스가 있고 (거의 모든 패키지는 MIT 라이센스가 부여됨) 학생들은 대부분의 MATLAB 및 R 패키지의 경우와 같이 코드가 GPL 라이센스가 부여 된 경우 속성을 사용하여 자신의 코드에서 이러한 아이디어를 자유롭게 사용할 수 있습니다. 라이센스 문제에주의해야합니다!).
언어 핵심은 매우 활발한 오픈 소스 커뮤니티로 구축되므로 언어 개발의 역사에 대한 풍부한 리소스 인 Github 문제도 있습니다 . 실제로 행렬 전치가 무엇인지 와 같은 언어 질문을 이해 하고 있습니까? 이러한 수학적 대상을보다 자세하게 이해하기 위해 매우 깨달을 수 있습니다.
그러나 마지막으로 학생들에게 어떻게 만드는 법을 가르치기를 원합니다. 안타깝게도 Python 또는 R을 학습한다고해서 반드시 Python / R을 개발하는 데 필요한 것은 아니라고 할 수 있습니다. 널리 사용되고 잘 최적화 된 대부분의 패키지에는 상당한 양의 C / C ++ / Fortran 코드가 순서대로 포함되어 있기 때문입니다 성능을 얻을 수 있습니다. 따라서이 학생들이이 언어의 과학 생태계에 기여할 수있게하려면 결국 다른 언어를 배워야합니다. 그것이 완전히 끔찍한 것은 아니지만 이제 Julia가 존재하는 것은 차선책입니다. 안정된 Julia는 C / Fortran의 속도를 달성 할 수 있기 때문에 Julia 생태계의 패키지는 대부분 순수 Julia 코드입니다. Julia를 배우는 것은 Julia를 개발하는 법을 배웠 음을 의미합니다. Base Julia는 대부분 Julia 코드이기 때문에 (몇 가지 기본 요소 만 있고 파서는 그렇지 않습니다),
줄리아의 선택에는 몇 가지 단점이 있습니다. 하나는 다른 언어보다 훨씬 새롭기 때문에 리소스가 조금 더 부족하다는 것입니다. 자체적으로 많은 교육 도구를 제공하거나 Julia 웹 사이트에 나와 있는 웹의 리소스에서 가져와야 합니다. 또한 언어 세부 정보는 아직 정해지지 않았지만 1.0은 2017 년 말에 나올 예정입니다. 그리고 줄리아의 잠재적 인 교사 인 당신은 그 언어에 대한 경험이 많지 않을 것입니다. 그러나 이것들은 시간이 지남에 따라 사라지는 종류의 문제이지만, 위에서 언급 한 Julia의 이점은 언어 자체의 핵심입니다.
그리 멀지 않은 학부생이라고 말하고 CS 부서에서 가르치지 않는다고 가정 할 때 C, C ++ 또는 Fortran (또는 신 금지)과 같은 컴퓨터 프로그래밍을 학생들에게 소개하는 것은 재앙이라고 생각합니다 CUDA), 비록 다른 사람들이 과학 컴퓨팅의 현 상태라고 지적했습니다.
여러분이 가르치는 학생 과학 컴퓨팅에 기대하는 경우 와 같은 과정에서 프로그램에 소개, 난 당신이 MATLAB 나 파이썬 같은 인터프리터 언어에 충실하지 않는 한 그 학기에 너무 많이 커버에 내기 것이다. 내 경험에 따르면 학부 수준의 과학 컴퓨팅 수업은 대부분이 두 가지 방법 중 하나에서 어떻게 가르쳐지며 파이썬은 매일 생산 수준의 언어로 점점 더 유용 해지고 있으므로 여전히 실용적인 기술로 유용합니다 ( 프로그래밍 기초를 가르치는 것 이상입니다.
내 두 센트.
C, C ++, & Fortran (특별한 순서로 나열되지 않음)은 슈퍼 컴퓨터에서 큰 문제를 해결하려는 경우 계산 수학 / 물리에 사용되는 세 가지 주요 프로그래밍 언어입니다. CUDA는 가속 GPU 컴퓨팅을 위해 다른 언어와 함께 사용되는 라이브러리로 간주됩니다. Matlab과 python은 출력 진단을 실행하고 프로토 타입 모델을 만드는 방법을 익히는 데 매우 좋습니다. 그것들은 또한 배우기가 더 쉽고 프로그래밍 방법을 배우는 알고리즘 구절을 가로 질러 가고 싶은 코스에 더 좋습니다.
따라서 당신의 과정이 순전히 프로그래밍에 관한 것이라면 C ++을 선택하거나 이것이 학생이 처음 프로그래밍하는 경우 Python을 선택합니다. 이 두 언어는 과학 컴퓨팅 세계 밖에서 높은 유용성을 가지고 있습니다. 이 과정이 물리 기반 문제를 해결하기 위해 학습 알고리즘을 중심으로한다면 Matlab이 의심의 여지없이 승자라고 생각합니다.
short : 과학 컴퓨팅 자체가 복잡하다는 점을 고려하십시오. 프로그래밍 언어가 실제로 사용되기를 원하십니까?
수학은 추상화를 사용하여 직감으로는 해결할 수없는 문제를 해결합니다. 따라서 개념은 추상적 경향이 있습니다. 캡슐화 할 개념을 이해하는 것이 사소한 이유가 아닙니다. 과학 계산에서 "동물" "차량"과 같은 클래스의 일반적인 예는 다소 쓸모가 없습니다. 이것은 객체 지향 프로그래밍의 경우에 해당하지만 컴퓨터에서 추상적 개념을 재현하는 것이 명령형 프로그래밍에서도 사소한 것이 아니라고 생각합니다.
그렇기 때문에 여기서 우리는 두 가지 다른 노력, 즉 프로그래밍, 한쪽은 과학적 컴퓨팅, 다른 쪽은 과학적 컴퓨팅을 다루고 있다고 생각합니다. 학생들이 이질적인 배경에서 온 학부 수준에서는 동시에 두 가지 다른 것을 가르치게 될 수 있습니다.
당신의 목표가 과학 컴퓨팅을 가르치고 있다면 나는 그것이 어렵다고 생각합니다. 프로그래밍 언어 (C ++에는 교육이 필요하다는 데 동의 함)로 추가적인 장벽이 있으면 많은 학생들이 동기를 부여 할 수 있으므로 파이썬과 함께 갈 것을 제안합니다.
귀하의 코스가 "Introduction to SC"인 경우 파이썬이 최상의 결과 / 노력 비율이라고 생각합니다.
추신 : 이제 우리는 좋은 컴퓨터를 가지고 있으므로 학부 수준에서 효율성을 찾을 필요가 없습니다.