목록프로그래밍 (12)
살아가는 이야기
C의 gets는 매우 사용하기 편리하지만, 초기 설계의 문제로 인해 버퍼 오버플로(buffer overflow: 지정한 영역을 넘어 기록하는 현상)가 발생한다는 치명적 오류가 있다. 그래서 지속적으로 지원 중단 예정(deprecated) 함수로 지정되었다가 C11 이후로는 아예 지원되지 않는다. 문제는 이전에 gets를 이용하여 사용하던 코드의 경우 다시 작성해야 하는데, 이때 fgets를 사용해야 한다. fgets의 프로토타입은 다음과 같다. char *fgets(char *버퍼, size_t 크기, FILE *입력스트림); 따라서 gets로 다음과 같이 작성된 코드가 있다고 하면 gets(line); 다음과 같이 다시 작성해야 한다. fgets(line, sizeof line, stdin); 다만 줄..
인터넷과 웹이 발전함에 따라 이제 프로그래밍도 웹으로 할 수 있게 되었다. 대표적인 언어에 대해 온라인 컴파일러(인터프리터) 목록을 여기 정리한다.Python: https://repl.it/languages/python3C/C++: http://cpp.sh/Java: https://www.compilejava.net/Prolog: https://swish.swi-prolog.org/기타 다양한 언어: https://tio.run/첫 번째 사이트인 repl.it에는 Python 외에도 상당히 많은 언어를 지원하고 있다. 또 마지막 사이트 tio는 상당히 투박한 사이트이지만 엄청나게 많은 언어를 지원하고 있다.이제 간단한 프로그램은 온라인에서 거의 모두 테스트해 볼 수 있다.
langpop.com이라는 사이트에 언어 인기도가 실시간으로 게시된다. 그러나 전에도 말했듯이 특정 시점의 언어 인기도가 중요하다는 생각이 든다. 그래서 여기 캡처해 둔다. 일년 전과 달리 C가 Java를 역전했다. 임베디드 프로그래밍 때문일까?
언제부터인가 Java에 익명 클래스(anonymous class)가 생겼다. 이벤트 리스너(listener)를 등록할 때 자주 사용되는데, 예제 파일을 하나 첨부한다. import javax.swing.*; import java.awt.event.*; @SuppressWarnings("serial") public class HelloFrame extends JFrame { public HelloFrame() { setTitle("Hello Frame"); setSize(300,200); setLocation(100, 200); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); }..
컴퓨터 프로그램의 시간 복잡도를 계산할 때, 가장 많이 사용되는 것은 최악 시간 복잡도(worst-case time complexity)다. 어떤 입력이 들어왔을 때, 가장 오래 걸리는 시간을 추정하는 것이다. 그 다음으로 많이 사용되는 것은 평균 시간 복잡도(average-case time complexity)다. 시간을 가장 많이 끄는 입력이 천 번에 한 번꼴로만 발생한다면 모든 입력을 최악 조건으로 생각할 필요는 없기 때문이다. 할부 시간 복잡도(amortized time complexity)는 각 입력의 처리시간을 고려한다는 점에서 평균 시간 복잡도와 유사하다. 그러나 각 입력이 들어올 빈도를 별도로 고려하지 않는다는 점에서 평균 시간 복잡도와는 차이가 있다. 할부 시간 복잡도를 계산할 때는 각 ..
프로그래밍 언어를 구현하는 방법 중에서 인터프리터(해석기) 방식이 있다. 사용자가 입력한 프로그램을 읽고 값을 계산한 다음 출력하는 일을 반복한다. 이렇게 읽고(read), 계산하고(evaluate), 출력하는(print) 반복 구조를 REPL(read-eval-print loop)이라고 한다. REPL을 REPL 루프라고 부르기도 한다. 외가를 외갓집으로 부르는 것처럼 루프란 말을 반복하여 부른다. REPL은 CPU의 fetch-decode-execute 사이클과 유사하다(최홍석 2008). 따라서 인터프리터는 사실 하드웨어를 높은 수준으로 끌어올린 것이라고 할 수 있다. 그래서 바이트코드를 수행하는 인터프리터를 가상기계(virtual machine)이라고 부르기도 한다. 가상기계는 JVM(Java 가..
어떤 언어를 많이 쓰는가에 대해 예전에 랩 블로그에 글을 게시한 적이 있다. langpop.com이라는 사이트를 소개하는 글이었는데, 문득 이 사이트 자체 보다도 특정 날짜의 언어 순위가 중요하다는 생각이 들었다. 그래서 오늘 날짜(2010년 8월 17일) 그 사이트의 Normalized Comparison 결과를 캡춰하였다. 나중에 또 생각나면 캡춰해야 되겠다.
C++ 컴파일러 오류 중에서 위 제목과 같은 오류가 발생하는 경우가 있다. 이것은 스트림 생성 오류다. 입출력 스트림 객체는 복사하면 곤란한 상황이 발생한다. 따라서 스트림 객체를 넘겨줄 때는 항상 참조(reference, &)로 넘겨주어야 한다. 그런데 스트림 객체를 그냥 복사하라고 한다면(예컨대 참조형이 아닌 인수로 넘기거나 변수에 대입 연산을 하는 경우를 들 수 있음), 위와 같은 오류가 발생한다. 이런 오류가 발생했다면 스트림을 복사하지 않았는지 잘 살펴보자.