본문 바로가기
프로그램개발/ServerSide(PHP,Node.js)

프로그래밍 언어의 10가지 골칫거리들

by 크레도스 2014. 9. 12.

출처: http://www.itworld.co.kr/slideshow/89395

 

모든 프로그래밍 언어에는 이상한 구문, 별난 기능, 비표준 구현과 같은 나름의 골치 아픈 부분들이 있다. 이로 인해 그 언어를 처음 접하는 개발자는 물론 숙련된 전문가들도 혼란에 빠져 머리를 긁적이고는 한다. 프로그래머는 이러한 골치덩이들을 큰 장애물로 인식하기도 하지만, 나중에는 이 점을 이해하고 그 언어만의 특징으로 좋아하기도 한다. 프로그래밍 언어에는 본래 무수히 많은 특이점이 있는데, 여기서 소개하는 별난 부분 10가지는 개발자들의 입에서 "뭐야 이거"라는 말이 튀어나오게끔 하는 단골 메뉴들이다. editor@itworld.co.kr

자바스크립트에서 ‘+’는 연결 연산자다. 골칫거리 : 자바스크립트는 + 연산자로 넘쳐난다. 숫자에는 더하기 연산자, 문자열에는 연결 연산자로 쓰인다. 하나의 피연산자가 문자열일 경우, 자바스크립트는 다른 변수를 문자열로 변환한 뒤, 두 문자열을 접합한다. 그래서 '1' + 1은 11이 된다. 이유: 근본적인 이유는 자바스크립트의 느슨한 형식 지정에 있다. 예를 들어 파이썬도 문자열 연결에 +를 사용하지만 강력한 형식 지정 언어이므로 문자열과 정수를 더하려고 하면 오류가 발생한다. - "문제는 이러한 느슨한 형식 지정이 예측 불가능한 결과를 만들 수 있다는 점이다.” Anonymous - “자바스크립트는 이런 경우 예외를 일으켜야 한다." crgwbr - “문자열 연결에 +를 사용하는 건 정말 좋지 않다" Matteo Riva

펄 모듈은 TRUE를 반환해야 한다. 골칫거리: 펄 모듈은 거의 항상 1; 문으로 끝난다. 그러므로 1; 로 끝나지 않거나 마지막 문이 TRUE 값을 반환하지 않을 경우에는 오류가 발생한다. 이유: 펄 모듈에는 서브루틴뿐만 아니라 초기화 코드도 포함될 수 있다. 파일이 로드된 후 펄은 TRUE 반환 값을 조회하여 초기화 코드가 성공적으로 실행되었는지를 확인한다. 초기화 코드가 없는 경우에도 펄은 최종 문이 TRUE를 반환하는지 확인하며 그렇지 않을 경우 예외를 일으킨다. - "욕이 저절로 튀어나오는 부분이다….” Drew Hall - “쓸모가 없을뿐더러, 끊임없는 짜증만 유발할 뿐이다.” Schwern

C와 C++의 트라이그래프 골칫거리: C(C++도 마찬가지)는 3가지 문자 조합(두 개의 물음표 이용)으로 9개의 트라이그래프(trigraphs)를 지원하며, 이는 컴파일 되기 전에 자동으로 단일 문자로 변환된다. 예를 들어 ‘??!’는 ‘|’로 변환된다. 이는 예기치 못한 동작으로 이어지고 소스 코드를 이해하기 어렵게 하는 요소다. 이유: 트라이그래프는 초창기 C 프로그래머들에게 키보드가 지원하지 않는 특정 문자(예: 중괄호)를 생성할 수 있는 방편이었다. - “??!??!같은 검색어는 구글로도 찾을 수 없다.”Isaac - “모두가 트라이그래프를 지독하게 싫어한 나머지 C99는 그 대안으로 다이그래프(digraph)를 추가했을 정도다. 그래서 혼란만 가중됐다.” dododge - “참 유용한 트라이그래프! 1977년 이후 C를 읽을 수 없도록 하고 있음.” Martin Beckett

PHP의 대소문자 비구분 골칫거리: 다른 많은 언어의 식별자가 보통 대소문자를 구분하는 것과 달리, PHP 함수 이름(클래스 및 메소드 이름도 마찬가지)은 대소문자를 구분하지 않는다. 정말 개발자를 혼란스럽게 하는 부분은 따로 있다. 바로 PHP의 변수 이름, 상수, 클래스 속성은 대소문자를 구분한다는 점이다. 이유: CGI 스크립트에서 완전한 프로그래밍 언어로 발달되는 과정에서 발생한 결함일 것이다. - “뭐 PHP에서 놀라운 일도 아니다.”Grzechooo - “그래서 PHP 프로그래머들은 함수 이름을 지을 때 캐멀케이스(camelcase) 대신 밑줄을 사용한다.” paperstreet7 - “나는 프로그래밍 언어를 쓰는 방법에 대해 전혀 모른다.” PHP제작자 라스무스 러도프 - “PHP에선 ‘뭐야 이거'라는 말이 튀어나오지 않는 부분을 찾는 게 더 어렵다" Lambda Fairy

루비에서는 0이 TRUE다. 골칫거리: 루비에서는 0 값이 TRUE로 계산된다. C나 파이썬 등 다른 많은 언어에서 0은 FALSE로 계산되므로 새로 루비를 배우는 개발자들이 적응하기 어려워하는 경우가 많다. 이유: 루비에서는 오로지 부울 FALSE와 nil만 FALSE로 계산된다. 그 외의 모든 것은 TRUE다. 0도 다른 숫자와 마찬가지로 취급된다. - “좋은 기능이라고 생각하지만, 분명 황당하게 여겨질 수 있는 소지는 있다.” Chris Lutz - “루비를 좋아하는 이유 중의 하나. 더 이상 0-FALSE 문제와 씨름할 필요가 없다” Edditoria - “0==true // 으악, 내 머리 속의 C 컴파일러가 폭발할 지경이다!!”kenny

파이썬에서 들여쓰기는 블록을 표시하는 데 사용된다. 골칫거리: 파이썬은 구두점이나 키워드가 아닌 들여쓰기 레벨을 사용해서 코드가 속한 블록을 표시한다. 공백의 수가 잘못되거나 스페이스와 탭이 섞인 경우 오류가 발생한다. 이유: 코드를 읽기 쉽게 만들고 키보드 입력의 양을 줄여주기 위해서다(많은 편집기가 자동으로 들여쓰기를 함). - “내가 파이썬을 절대 좋아할 수 없는 이유가 바로 이것” wazoox - “나는 파이썬의 공백을 좋아한다. 다만 한 가지 큰 단점은 웹에서 코드를 복사해 붙여 넣는 경우다. 스페이스와 탭이 섞여 있는 경우가 많아 정리하기가 번거롭다.” Greg - “강제 들여쓰기가 필요할 정도라면 당신은 너무 게으른 것이다.” Joris Meys

C의 배열 인덱싱은 포인터 연산처럼 수행된다. 골칫거리: 배열 a의 요소 i를 a[i]로 참조할 수 있을 뿐만 아니라, 동일한 요소를 i[a]로도 참조할 수 있다. 이유: C에서 배열은 메모리 블록에 대한 포인터와 같이 실행되므로 a[i] = *(a + i) = *(i + a) = i[a]가 성립한다. - “혼란스러운 C 만들기 대회 같은 것이 있다면 아주 유용할 것.” Confusion - “이것은 C의 본질을 그대로 드러내는 특징이다. 그 본질은 포인터, 그리고 우회를 최소화한 직접적인 메모리 접근이다. 어찌 보면 합리적이라고도 볼 수 있다.” Michael Neale

펄의 사전 정의 변수 골칫거리: 펄에는 애매한 이름을 가진 특수 변수가 많다(더 긴, 영어 버전의 변수도 있지만). 이 때문에 펄 전문가가 아닌 개발자는 계속 펄 설명서를 참조해야 하며, 코드를 읽는 것 조차 어렵게 만든다. 이유: 이러한 변수는 프로세스 ID($$), 오류 메시지($@), 정규식 매치($^R )와 같은 프로그램 실행의 다양한 측면에 대한 정보와 접근 기능을 제공한다. - “정말 짜증난다.” MatrixFrog “그래도 한 줄짜리 개발에는 적합하네.” niXar - “최악은 $@, @$이라고 생각한다. 두 가지 다 되는데 두 번째 것은 무엇을 하는 건지 지금도 모르겠다....” Artem Russakovskii - “사소하지만 이 변수들의 또 다른 문제점: 구글로 검색할 수 없다!” malvim

자바스크립트의 자동 세미콜론 삽입 골칫거리: 자바스크립트는 세미콜론을 사용해서 특정 문을 종결한다. 예를 들어 줄바꿈과 같이 세미콜론이 있어야 한다고 판단되는 부분에 자동으로 세미콜론을 삽입한다. 이는 예외가 발생하지 않는 오류 또는 당황스러운 결과로 이어지는 경우가 많다. 이유: 세미콜론 삽입은 새로운 개발자들이 자바스크립트의 C와 비슷한 구문을 더 쉽게 이해할 수 있도록 하기 위한 편의 기능으로 개발됐다. - “사용자들이 대부분 바보일 것이라고 가정하고 언어 기능을 설계하면 항상 문제가 발생하고는 한다.” Rob Van Dam - “세미콜론이 들어가는 부분을 확인한 뒤 올바른 위치에 배치하면 훨씬 낫다.” Doug Crockford - “세미콜론 삽입은 자바스크립트에서 가장 사악한 기능 중의 하나다.” fennec

자바의 Integer 캐싱과 오토박싱 골칫거리: 자바는 기본 자료형(숫자, 문자, 부울)을 객체로 자동 변환한다(오토박싱, 예를 들어 int를 Integer 객체로 변환). 또한 기본적으로 -128과 127의 값에 대해 Integer 객체를 캐시한다. 이는 ==를 사용하여 같은 값(-128과 127에서 TRUE, 그 외에는 FALSE)의 오토박싱된 Integer를 비교할 때 예기치 못한 동작으로 이어질 수 있다 이유: 오토박싱은 개발자가 작성해야 하는 코드의 양을 줄여주며, Integer 캐싱은 성능을 개선한다. - “섣부른 최적화의 결과”Joschua - “숫자, 부울 등에 자바 기본 내장 객체를 사용해야 하는 이유가 바로 이것 때문……” Ravi Wallau - “C# 프로그래머라는 게 정말 다행이다.”” Will