International Essays |
새로운 기능 전면 도입: Wolfram 언어 및 Mathematica 버전 14.3 출시
새로운 기능 전면 도입: Wolfram 언어 및 Mathematica 버전 14.3 출시
2025년 8월 5일
대규모 업데이트
대규모 업데이트
2025년 1월 23일 버전 14.2가 출시되었습니다. 드디어 오늘, 버전 14.2가 출시된지 6개월이 조금 지난 시점에, 버전 14.3을 선보이게 되었습니다. 비록 소수점 단위의 .x 버전으로 표기되지만, 이번 버전은 시스템의 핵심 영역을 중심으로 중요한 신규 기능과 개선된 기능이 다수 포함된 대규모 업데이트입니다.
이번 출시를 통해 오랫동안 요청되어온 여러가지 기능을 다수 제공할 수 있게 되어 특히 기쁘게 생각합니다. 그렇다면 왜 더 일찍 제공하지 못했을까요? 이유는 간단합니다. 최소한 우리 기준에 부합하는 수준으로 구현하기가 매우 어려웠기 때문입니다. 하지만 이제 이러한 기능이 준비되었고, 누구나 활용할 수 있게 되었습니다.
라이브 스트리밍 소프트웨어 디자인 리뷰(버전 14.2 이후 총 42시간 진행)를 꾸준히 시청하신 분은, 올바른 설계를 구현하기 위해 우리가 기울인 노력을 어느 정도 짐작하실 수 있을 것입니다. 실제로 우리는 버전 1.0의 개발을 시작한 이래 거의 40년 동안 지속적으로 이러한 노력을 이어왔습니다. 그 결과, 소프트웨어 분야에서 전례를 찾기 어려운 처음부터 끝까지 일관성과 체계를 유지하면서 37년간 호환성을 보장하는 시스템을 구축할 수 있었습니다.
현재 이 시스템은 매우 방대해졌으며, 저조차도 때때로 그 놀라운 기능을 모두 기억하지 못할 때가 있습니다. 하지만 이런 순간마다 적절한 도움을 주는 도구인 Notebook Assistant가 지난해 말 출시되었습니다. 이제 어떤 작업을 수행하는 방법을 찾고자 할 때, Notebook Assistant에 원하는 바를 대략적으로 설명하는 내용을 입력하기만 하면 Notebook Assistant는 사용자의 요청 내용을 “명확히 다듬어서” 관련성 높은 Wolfram 언어 코드로 생성하는 데 매우 뛰어난 성능을 발휘합니다.
제가 입력한 설명 내용이 다수 모호할 때는 처음 제시된 코드가 원하는 작업과 정확히 일치하지 않는 경우도 종종 있었지만, Notebook Assistant는 대체로 올바른 방향을 제시해 주었으며, 약간의 수정만 거치면 제가 필요로 하는 정확한 코드가 됩니다.
이는 최신 AI 기술과 Wolfram 언어의 고유한 특성을 결합함으로써 가능해진 매우 효율적인 작업 흐름입니다. 제가 다소 모호하게 요청을 입력하더라도 Notebook Assistant는 이에 대해 정확한 코드를 제시해 줍니다. 하지만 중요한 점은, 이 코드가 일반적인 프로그래밍 언어 코드가 아닌 Wolfram 언어의 계산 가능한 언어 코드라는 사실입니다. 즉, 이 코드는 인간이 읽을 수 있도록 설계되었으며, 가능한 한 높은 수준에서 세계를 계산적으로 표현하도록 고안된 코드입니다. AI는 본질적으로 특유의 휴리스틱적 방식에 따라 작동하지만, 사용자가 원하는 Wolfram 언어 코드를 선택하면, 이를 기반으로 정확성과 신뢰성을 갖춘 결과물을 얻어 그 위에 새로운 것을 구축할 수 있습니다.
Wolfram 언어의 설계 일관성이 여러 방면에서 얼마나 중요한 의미를 갖는지 놀라울 따름입니다. 바로 이 일관성 덕분에 언어의 서로 다른 측면을 매끄럽게 상호 운용할 수 있게 하고, 또한 언어의 새로운 영역을 학습하는 과정을 용이하게 해 줍니다. 그리고 오늘날에는 AI가 언어를 효과적으로 활용할 수 있게 해 주는 데에도 이 일관성이 큰 역할을 합니다. 즉, AI가 인간과 마찬가지로 Wolfram 언어를 도구로 호출하여 잘 활용할 수 있도록 해 주는 것입니다.
Wolfram 언어가 설계상 일관성을 유지하고 있으며 그 안에 풍부한 기능을 내장하고 있다는 사실은 또 다른 의미에서 중요한 결과를 낳습니다. 바로 언어 확장이 용이하다는 점입니다. 지난 6년 동안 Wolfram Function Repository에는 무려 3200개 이상의 추가 함수가 게시되었습니다. 물론 이들 중 상당수가 때로는 정식 내장 함수로 발전하기까지 10년 이상이 걸리기도 합니다. 하지만 현재 시점에서 Notebook Assistant는 이러한 함수를 현재 형태 그대로 인식하고 있으며, 사용자가 수행하고 있는 작업에 이 함수가 어디에 활용될 수 있는지를 자동으로 제시할 수 있습니다.
그럼 이제 다시 버전 14.3 이야기로 돌아가 보겠습니다. 전해야 할 내용이 매우 많습니다.
다크 모드 도입: 화면을 어둡게 전환하기
다크 모드 도입: 화면을 어둡게 전환하기
저는 1976년에 화면이 있는 컴퓨터를 처음 사용하기 시작했습니다. 그 당시 모든 화면은 검은색이었고, 그 위에 텍스트는 흰색이었습니다. 1982년 “워크스테이션(workstation)” 컴퓨터가 등장하면서 화면 구성이 뒤바뀌었고, 인쇄된 페이지와 유사한 흰색 배경에 검은색 텍스트를 쓰는 디스플레이를 사용하기 시작했습니다. 그리고 이러한 방식이 수십 년 동안 일반적인 표준으로 자리 잡았습니다. 그런데 약 5년전부터 “다크 모드”가 유행하기 시작했고 이제는 완전한 컬러와 훨씬 높은 해상도 등을 갖추고 이전과 비슷한 1970년대 스타일의 디스플레이로 되돌아간 셈이 되었죠. 노트북에서는 예전부터 “다크 모드 스타일”을 사용할 수 있었지만, 이제 버전 14.3에서는 다크 모드를 전면적으로 지원합니다. 시스템을 다크 모드로 설정하면, 버전 14.3에서는 모든 노트북이 기본적으로 자동 다크 모드로 표시됩니다.
다크 모드를 구현하는 게 그렇게 어려운 일일까?라고 생각할 수도 있습니다. “배경을 검은색으로, 텍스트를 흰색으로 바꾸기만 하면 되는 것 아닌가?”하고 말이죠. 그러나 실제로는 그보다 훨씬 많은 요소가 얽혀 있습니다. 결국 이는 상당히 복잡한 사용자 인터페이스 및 알고리즘적 도전 과제인데, 저는 이번 버전 14.3에서 이를 매우 깔끔하게 해결했다고 생각합니다.
여기서 기본적인 질문 하나를 해보겠습니다. 다크 모드로 전환할 때 플롯에는 어떤 변화가 있어야 할까요? 축은 흰색으로 바뀌어야 하지만, 곡선은 원래 색을 그대로 유지해야 합니다. 그렇지 않으면 곡선 색상을 기준으로 텍스트가 참조될 때 문제가 발생하겠죠. 그리고 바로 이 동작이 버전 14.3에서 정확히 구현됩니다.
In[]:=
Plot[{Sin[x],Cos[x],Tan[x]},{x,0,10}]
In[]:=
Plot[{Sin[x],Cos[x],Tan[x]},{x,0,10}]
말할 필요도 없이, 한 가지 까다로운 점은 곡선의 색이 라이트 모드와 다크 모드 모두에서 잘 어울리도록 선택해야 한다는 것입니다. 실제로 버전 14.2에서 플롯의 기본 색상을 새롭게 “다듬어” 만들었을 때, 이는 바로 다크 모드를 염두에 두고 대비한 조치이기도 합니다.
버전 14.3에서는(아래에서 자세히 논의하겠지만) 그래픽 색상을 계속해서 개선하여 까다로운 상황을 고려하여 모두 반영했으며, 라이트 모드뿐만 아니라 다크 모드에서도 잘 보이도록 설정했습니다.
In[]:=
ArrayPlot3D[Total[CellularAutomaton[<|"Dimension"3,"GrowthCases"{1,2,3}|>,{{{{1}}},0},15]]]
In[]:=
ArrayPlot3D[Total[CellularAutomaton[<|"Dimension"3,"GrowthCases"{1,2,3}|>,{{{{1}}},0},15]]]
다크 모드의 영향을 받는 것은 계산을 통해 생성되는 그래픽만이 아닙니다. 예를 들어, 무수한 사용자 인터페이스 요소 역시 다크 모드에서 보기 좋게 표시되도록 조정되어야 합니다. 전체적으로 영향을 받는 색상이 수천 가지에 이르며, 이를 모두 일관되고 미적으로 아름답게 처리해야 합니다. 이를 위해 결국 다양한 방법과 알고리즘을 고안하게 되었으며 이는 추후 패클릿 형태로 외부에 제공할 예정입니다.
그 결과, 예를 들어 노트북과 같은 환경도 사실상 자동으로 구성되어 다크 모드에 맞게 설정될 수 있게 되었습니다.
그렇다면 내부적으로는 어떤 일이 일어나고 있을까요? 물론 여기에는 기호적 표현이 사용됩니다. 일반적으로 색상을 지정할 때는 예를 들어 [1,0,0]처럼 지정합니다. 그러나 버전 14.3에서는 대신 다음과 같은 기호적 표현을 사용할 수 있습니다.
In[]:=
LightDarkSwitched[Red,LightBlue]