hotchpotch/wikipedia-multilingual-ir-pairs huggingface dataset:
해상 실크로드
해상 실크로드 또는 해상 실크루트는 동남아시아, 동아시아, 인도 아대륙, 아라비아반도, 동아프리카, 유럽을 연결하는 역사적인 비단길의 해상 구간이다. 기원전 2세기에 시작되어 서기 15세기까지 번성했다. 해상 실크로드는 주로 대형 원양 널빤지 이음선 및 묶음돌기선 무역선을 항해했던 동남아시아의 오스트로네시아 선원들에 의해 개척되고 운영되었다.(p. 11) 이 항로는 아라비아해 및 그 너머에서 페르시아 및 아랍 상인들의 다우선과(p. 13) 타밀족 상인들의 남아시아에서도 활용되었다.(p. 13) 중국 또한 후기인 서기 10세기부터 15세기에 걸쳐 자체 정크선을 건조하고 이 항로를 따르기 시작했다.
이 무역망은 동남아시아의 오래된 오스트로네시아 비취 해상 네트워크와 동남아시아와 남아시아 간의 해상 향신료 네트워크, 그리고 아라비아해 및 그 너머의 서아시아 해상 네트워크의 발자취를 따라 현재 시대까지 이 고대 해상 무역로와 일치하게 되었다.
해상 실크로드
"해상 실크로드"라는 용어는 육상 실크로드와의 유사성에서 비롯된 현대적인 이름이다. 육상 비단길 자체도 현대적인 이름으로, 이 개념은 1877년 프로이센 지리학자 바론 폰 리히트호펜이 중국과 독일을 철도로 연결하기 위한 중국 지질 조사를 하면서 처음 만들어졌으며, "비단길"이라는 용어는 스웨덴 탐험가 스벤 헤딘의 대중적인 책이 출판된 1938년에야 영어에 들어왔다. 인도-서태평양 (동남아시아 및 인도양)을 통한 고대 해상 항로는 매우 긴 역사 동안 특별한 이름이 없었다. 현대적인 이름에도 불구하고, 해상 실크로드는 비단이나 아시아 수출품뿐만 아니라 매우 광범위한 지역에서 다양한 종류의 상품 교환을 포함했다.
해상 실크로드 역사
해상 비단길은 신석기 시대 링링오 비취 해상 무역 네트워크에서 발전했으며, 동남아시아의 오스트로네시아족에 의해 구축되었다. 남중국해 주변 3000킬로미터 지역을 아우르는 이 광범위한 고대 해상 무역 네트워크는 해상 실크로드보다 훨씬 이전에 존재했다. 이는 기원전 2000년부터 기원후 1000년까지 약 3,000년 동안 지속되었으며, 해상 비단길과 부분적으로 겹쳤다. 이 네트워크는 처음에는 타이완과 필리핀 북부의 원주민에 의해 구축되었다. 원료 연옥 (펑톈 비취)은 타이완 동부의 광산에서 채취되었으며, 필리핀에서 장식품과 도구로 가공되었다 (가장 주목할 만하고 가장 많은 것은 링링오로 알려진 두 개의 머리가 달린 팬던트와 반고리 귀걸이이다). 이 네트워크는 나중에 베트남 남부 (사후인 문화), 보르네오섬, 반도 말레이시아 동부, 캄보디아 동부, 태국 반도, 그리고 이 비취 장식품과 다른 무역 상품이 제조 및 교환되었던 동남아시아의 다른 지역 (또한 사후인-칼라나이 상호작용권으로 알려짐)을 포함했다. 타이완산 비취는 기원전 500년경 이후 사용이 줄어들었고, 비타이완산 비취와 다른 재료가 더 흔해졌다. 이러한 비취 유물의 분포는 특히 신석기 필리핀, 베트남 남부, 보르네오의 오스트로네시아족 간의 해상 무역과 공유된 물질 문화의 다른 증거와 함께 발견되었다.
해상 실크로드 역사
섬 동남아시아 전역에서 발견되는 베트남 북부 동선 문화에서 유래한 의식용 청동 북 ( 기원전 600년~기원후 400년c.)의 광범위한 분포는 이 선사 시대 동남아시아 해상 네트워크의 고대성과 밀도를 증명한다.
해상 실크로드 역사
비취 유물 무역이 이루어지는 동안, 스리랑카와 남인도 간의 오스트로네시아 향신료 무역 네트워크 또한 동남아시아의 섬주민에 의해 기원전 1500년에서 600년 사이에 구축되었다. 이러한 초기 접촉은 빈랑 씹기, 코코넛, 단향, 길들인 바나나, 토란, 사탕수수, 정향나무, 그리고 육두구와 같은 오스트로네시아 작물 및 물질 문화를 남아시아에 도입하게 되었다. 또한 스리랑카와 남인도에서 여전히 사용되는 아웃리거 보트와 같은 오스트로네시아 항해 기술도 도입되었다. 북인도 디자인을 보여주는 반귀석과 유리 장식품은 태국의 카오 삼 카이오 ( 기원전 400-100년c.)와 반 돈 타 펫 ( 기원전 24년~기원후 276년c.) 고고학 유적지에서 오스트로네시아 사후인-칼라나이 상호작용권의 무역 상품과 함께 발견되었다. 두 유적지 모두 해안 정착지이며 비취 무역 네트워크의 일부로, 이 시기까지 오스트로네시아족의 해상 항로가 이미 남아시아에 도달했음을 보여준다. 녹두와 호스그램과 같은 남아시아 작물도 카오 삼 카이오에 존재하여 교환이 상호적이었음을 나타낸다. 기원전 1천년기 아프리카에서 바나나, 토란, 닭, 자색얌과 같은 오스트로네시아 길들인 동식물의 존재와 확산을 기반으로 한 아프리카와의 매우 초기 오스트로네시아 접촉에 대한 간접적인 증거도 있다.
해상 실크로드 역사
해상 비단길의 서쪽 회로는 서아시아의 이전 해상 무역로에서 발전했다. 이들은 스리랑카, 인도의 말라바르 해안, 페르시아, 메소포타미아, 아라비아, 이집트, 아프리카의 뿔, 그리고 지중해의 그리스-로마 문명을 연결했다. 이 무역로 (처음에는 해안 근처의 단거리, 소규모에 불과했지만)는 신석기 시대부터, 적어도 메소포타미아의 우바이드 시대 ( 기원전 5000년경c.)부터 존재했다. 이들은 기원전 1천년기까지 서아시아의 도시 중심지 간의 정기적인 무역로가 되었다.
기원전 2세기경까지 동남아시아의 선사 시대 오스트로네시아 비취 및 향신료 무역 네트워크는 남아시아, 중동, 동아프리카, 지중해의 해상 무역로와 완전히 연결되어 오늘날 해상 비단길로 알려지게 되었다. 10세기 이전에는 주로 동남아시아 오스트로네시아 상인들이 독특한 널빤지 이음선 및 묶음돌기선 선박을 사용하여 항로의 동쪽 부분을 이용했지만, 페르시아 및 타밀족 상인들도 항로의 서쪽 부분을 항해했다. 이를 통해 한쪽 끝으로는 동아시아와 동남아시아, 다른 한쪽 끝으로는 유럽과 동아프리카까지 상품을 교환할 수 있었다.
해상 실크로드 역사
오스트로네시아 해양제국들은 해상 비단길 동부 지역의 무역 흐름을 통제했는데, 특히 믈라카와 방카 해협, 말레이반도, 그리고 메콩강 삼각주 주변의 정치체들이 그러했다. 이 지역들을 통해 서아시아에서 번성하던 당나라 시장으로 고급 향료와 불교 유물이 전달되는 주요 오스트로네시아 무역선 항로가 교지 (통킹만에 위치)와 광저우시 (중국 남부)로 이어졌다 (후에 10세기에는 취안저우시도 포함되었다). 중국 기록들은 이 지역의 인도화 때문에 이 왕국들을 "인도"로 오인했다. 보조 항로들은 또한 타이만의 해안선을 따라 지나갔으며, 자와해, 술라웨시해, 반다해, 술루해를 거쳐 북부 필리핀과 타이완을 통해 주요 항로와 다시 연결되었다. 보조 항로들은 또한 동중국해와 황해로 제한적으로 계속 이어졌다. 인도와 이집트에서 동남아시아와 남아시아 항구의 유리세공사를 거쳐온 유리 유물들이 한반도의 무덤 ( 서기 2-6세기c.)에서 발견되었는데, 이는 해상 실크로드의 가장 북동쪽 확장 범위를 보여준다.
해상 실크로드 역사
해상 실크로드 서부 지역의 주요 항로는 수마트라섬의 북단 (또는 순다 해협을 통해)에서 스리랑카, 남인도, 방글라데시, 그리고 몰디브로 인도양을 직접 횡단한다. 이곳에서 오만만 ( 페르시아만으로)과 아덴만 ( 홍해로)을 통해 아라비아해로 들어가는 항로로 분기된다. 보조 항로들은 또한 벵골만, 아라비아해의 해안선을 따라, 그리고 남쪽으로 동아프리카 해안을 따라 잔지바르, 코모로, 마다가스카르, 그리고 세이셸로 지나간다. 몰디브는 서부 항로를 통해 모험을 떠나는 오스트로네시아 선원들에게 주요 허브로서 특히 중요했다.
이 항로는 힌두교와 불교가 동쪽으로 일찍 확산되는 데 큰 영향을 미쳤다. 이 종교들이 남아시아와의 무역과 밀접하게 연결되면서 서기 4세기까지 초기 해상 비단길에서 산스크리트어가 무역 링구아 프랑카로 널리 채택되었다. 한나라와 당나라 시대 중국 기록 또한 초기 중국 불교 순례자들이 남아시아로 가는 길을 광저우시 항구 도시에서 무역했던 오스트로네시아 선박 (그들이 쿤룬포라고 불렀던)을 타고 예약했음을 보여준다. 중국 승려 완첸과 후이린이 쓴 책에는 적어도 서기 3세기부터 동남아시아에서 온 대형 무역선에 대한 상세한 기록이 담겨 있다.
해상 실크로드 역사
오스트로네시아족은 이미 초기 시대부터 동아프리카와 아라비아반도까지 항해했다. 오스트로네시아족은 서기 1세기에서 서기 6세기 또는 7세기 사이에 아프리카 해안의 마다가스카르 섬에 식민지를 건설했다. 마다가스카르는 인근 아프리카, 아랍, 페르시아 무역항인 킬와 키시와니와 잔지바르 (탄자니아), 그리고 현대 소말리아, 케냐, 모잠비크의 본토 해안을 따라 있는 다른 항구들과 함께 해상 실크로드의 일부로 남아있었다. 15세기 후반과 16세기 초반의 포르투갈 탐험가들의 기록에 따르면, 인도네시아와 마다가스카르 간의 직접적인 해상 연결은 식민지 시대 직전까지 지속되었다.
해상 실크로드 역사
서기 682년 팔렘방에 세워진 힌두교-불교 오스트로네시아 정치체인 스리위자야는 믈라카 해협과 순다 해협, 그리고 남중국해 엠포리움 주변의 무역을 지배하여 서아시아에서 번성하던 당나라 시장으로 고급 향료와 불교 유물 무역을 통제했다.(p. 12) 스리위자야는 주변 해양제국들을 정복하고 복속시키면서 부상했다. 이들 중에는 믈라유 왕국, 크다주, 타루마나가라, 그리고 마타람 왕국 등이 포함되었다. 이 정치체들은 동남아시아의 해상 교통로를 통제하고 향신료 제도의 향신료 무역뿐만 아니라 인도와 중국 간의 해상 무역로를 활용했다.
서기 7세기경, 아랍 다우 상인들도 이전 페르시아 상인들이 스리랑카로 개척했던 항로에 진출했는데, 이는 서아시아 전역에 걸친 이슬람교의 확산과 일치했다. 그들은 스리위자야와 광저우시로 더 깊이 동진하여 동남아시아 정치체로의 초기 이슬람교 확산을 이끌었다. 이 시기 동안, 페르시아어는 해상 및 육상 비단길 모두에서 지배적인 링구아 프랑카가 되었다.
해상 실크로드 역사
필리핀의 부투안 배무덤에는 오스트로네시아 조선 전통의 묶음돌기선 잔해 11척 (개별적으로 서기 689년에서 988년까지 연대 측정됨)이 있으며, 중국, 캄보디아, 태국 (하리푼차이 및 사팅프라), 베트남, 그리고 멀리 페르시아까지의 많은 무역품과 함께 발견되어 중동까지 무역했음을 나타낸다.
10세기에서 13세기까지 해상 무역에서 경제적 번영이 있었는데, 이는 주로 송나라가 해상 항로를 항해할 수 있는 자체 무역선(정크)을 건조하기 시작했기 때문이다. 송나라 조정은 전통적인 중국 유교의 무역 경멸에도 불구하고 사적 무역에 대한 제한을 완화했다. 이는 부분적으로 송나라가 육상 비단길에 대한 접근권을 잃었기 때문이었다. 송나라 해상 기술은 동남아시아 오스트로네시아 선박을 관찰하여 개발되었다. 이전에 중국 선박은 본질적으로 내륙(강)에서 사용되었고 항해에 적합하지 않았다.
해상 실크로드 역사
송나라는 난하이 (중국어: 南海, 병음: Nánhǎi, 직역: 남해)라고 불리는 지역에 무역 원정대를 보내기 시작했으며, 이 지역은 여전히 대부분 스리위자야가 지배하고 있었고, 남쪽으로는 술루해와 자와해까지 진출했다. 이는 동남아시아에 "용뇌향" (장뇌)과 다른 이국적인 물품에 대한 중국의 수요를 충족시키기 위한 새로운 무역항 (예: 자와섬과 수마트라섬)의 설립으로 이어졌다. 취안저우시 또한 이 시기에 주요 중국 무역항이 되었으며, 기존의 광저우시 무역항과 합류했다. 두 항구는 동남아시아의 대응 항구들과 긴밀하게 연결되어, 역사가들은 이 지역의 독특한 무역 회로를 지중해 무역과의 유사성에서 "아시아 지중해"로 특징짓게 되었다. 그러나 송나라는 무역선이 해상에 머무를 수 있는 기간을 9개월로 제한하여 중국 무역선이 동남아시아에 도달할 수 있는 범위를 제한했다.
해상 실크로드 역사
아랍과 타밀 상인들도 10세기부터 13세기까지 믈라카 해협을 통해 중국 항구와의 직접 무역 참여를 늘렸다. 1025년 타밀 촐라 제국의 라젠드라 1세가 스리위자야의 해협 항구에 대한 깜짝 해군 원정은 스리위자야가 타밀 무역 길드를 규제하거나 막으려 했기 때문에 발생했을 수도 있다. 촐라의 침략은 스리위자야의 믈라카 해협 항로 독점을 약 1세기 동안 종식시켰으며, 이 기간 동안 많은 스리위자야 도시가 촐라에 점령되었다. 스리위자야는 크게 약화되었고, 결국 1275년경 싱하사리 왕국에 복속된 후, 최종적으로 후계 해양제국인 마자파힛 제국 (1293–1527)에 흡수되었다.
해상 실크로드 역사
13세기에 몽골 원나라가 중국을 침략했다. 이 시기 중국의 해운업은 원나라 정부와 오르톡 관계를 맺은 외국 무슬림 상인을 통해 국가에 의해 독점되었다. 그러나 송나라와 달리 원나라는 9개월 제한을 해제하여 중국 무역이 남아시아까지 진출할 수 있도록 했다. 원나라는 또한 일본, 마자파힛, 베트남 (오스트로네시아 참파, 그리고 비엣 대월)에 대한 해군 침공을 시도했다. 이 모든 시도는 실패했다. 중국 자체는 나중에 홍수, 가뭄, 기근으로 황폐해졌다. 동시에 흑사병이 유럽과 서아시아를 휩쓸고 있었다. 이 모든 요인들은 14세기에 해상 실크로드 무역의 침체를 가져왔다.
14세기 후반, 팔렘방 시국 (이슬람화된 스리위자야의 옛 수도)은 원나라를 전복한 명나라의 초대 황제인 홍무제에게 무역로 재건을 위해 사절을 보냈다. 팔렘방의 통치자는 힌두교-불교 마자파힛 제국으로부터 독립하여 도시의 옛 부를 되찾기를 희망했다. 마자파힛의 하얌 우룩은 봉신국의 행동에 분노하여 1377년 팔렘방에 징벌적인 해군 공격을 가했으며, 이로 인해 왕자들과 귀족들이 싱가푸라 왕국으로 흩어졌다. 싱가푸라는 차례로 1398년에 공격받고 약탈당했다. 팔렘방 출신이자 싱가푸라의 마지막 통치자였던 파라메스와르는 말레이반도 서해안으로 도피하여 15세기 초 이슬람 믈라카 술탄국을 세웠다.
같은 시기인 15세기 초, 명나라는 정화의 원정을 시작했는데, 이는 동남아시아의 "야만적인 왕"들이 명나라 조정에 "조공" (즉, 정기적인 무역로)을 다시 보내도록 강요하는 것을 목표로 했다. 이는 당시 "무역을 조공으로 여기는" 중화사상의 전형적인 모습이었다. 정화의 원정은 황실 자금의 고갈과 북방 침략의 위협으로 인해 선덕제가 원정을 중단하면서 단명했다. 그는 곧이어 해금 정책을 시행하고 해외 무역을 전면 금지했다. 그러나 궁극적으로 정화의 원정은 동남아시아 (믈라카)와 명나라 간의 무역 관계를 복원하는 목표에 성공했다. 15세기 중반경, 믈라카 술탄국은 믈라카 해협에 대한 효과적인 통제권을 얻었다. 이는 이미 내부 반란으로 고통받던 마자파힛의 영향력을 크게 약화시켰다. 믈라카로부터의 무역은 마자파힛의 멸망, 포르투갈의 믈라카 침공, 그리고 만주족의 침략으로 인한 명나라의 멸망 직전의 짧은 기간 동안 중국 항구에 계속 도착했다.
해상 실크로드는 15세기 식민지 시대에 붕괴되었고, 본질적으로 유럽 무역로로 대체되었다. 이전에 지배적이었던 동남아시아 무역선 (영어 용어 "junk"의 어원인 용선)의 건조는 17세기까지 완전히 중단될 때까지 쇠퇴했다. 그러나 중국산 정크선은 현대까지 살아남았다. 동남아시아의 향신료와 인도 및 중국의 직물에 대한 새로운 수요가 있었지만, 이들은 이제 지역 항구를 통하는 대신 유럽 시장으로 직접 연결되는 무역로와 연결되었다.
16세기에 대항해시대가 시작되었다. 포르투갈 제국이 믈라카를 점령하면서 무역 중심지는 아체 술탄국과 조호르 술탄국으로 이전되었다. 필리핀의 스페인 제국은 마닐라-아카풀코 갈레온 무역을 구축했는데, 이는 취안저우와 장저우에서 중국 자기와 비단, 그리고 라틴아메리카와 유럽 시장을 위한 향신료 (주로 말루쿠 향신료 제도에서)를 획득했다. 이 모든 것은 태평양을 가로질러 멕시코의 아카풀코와 스페인 아메리카 전역으로, 그리고 나중에는 스페인 보물 함대를 통해 멕시코의 베라크루스에서 스페인의 세비야로, 그리고 유럽 전역으로 무역되었다. 마닐라-아카풀코 갈레온 무역로는 태평양을 가로지르는 최초의 영구적인 무역로였다. 마찬가지로, 서인도 제도의 스페인 보물 함대는 역사상 최초의 영구적인 대서양 횡단 무역로였다. 둘 다 인도양 해상 실크로드를 완전히 우회했다.
해상 실크로드 고고학
해상 실크로드의 고고학적 증거로는 항로를 따라 회수된 수많은 난파선이 있으며, 이들 난파선은 멀리 떨어진 다양한 항구에서 조달된 무역품을 운반했거나 관련되어 있다. 이러한 초기 선박의 기원은 독특한 특징과 사용된 조선 기술 (예: 묶음돌기선 및 꿰맨 배 전통)의 조합으로 쉽게 식별할 수 있다. 여기에는 폰티안 선박 ( 서기 260–430년c.), 푼줄하르조 선박 ( 서기 660-780년c.), 부투안 배무덤 ( 서기 689년~988년c. 사이의 여러 선박), 차우탄 난파선 ( 8세기 후반~9세기 초반c.), 인탄 난파선 ( 10세기 초반~중반c.), 카라왕 난파선 ( 10세기c.), 그리고 치르본 난파선 ( 10세기 후반c.) 등이 포함된다.(p. 12)
해상 실크로드 고고학
10세기 이전에 동남아시아에서 회수된 거의 모든 선박은 오스트로네시아 조선 전통에 속하며, 널빤지 이음선과 묶음돌기 기술의 변형 및 조합을 보여준다. 또 다른 초기 부분 난파선인 파크 클롱 클루아이 난파선 ( 서기 2세기c.)은 독특하게 못 박힌 장부이음을 사용하여 널빤지를 연결했다. 비록 이것이 페니키아와 이후 그리스-로마 조선 기술과 유사하지만, 이 선박 또한 오스트로네시아 선박으로, 동남아시아 나무에서 조달된 목재와 내부 표면에 묶음돌기 기술의 증거가 있다. 일부 저자들은 이를 페니키아 장부이음 조선 기술이 원래 지중해 외부에서 발전했다는 증거로 지적했다.
해상 실크로드 고고학
서기 10세기 이전에 동남아시아에서 발견된 난파선 중 오스트로네시아 선박이 아니며 초기 아랍 다우 조선 기술을 보여주는 것은 단 두 척뿐이다: 파놈-수린 선박 ( 서기 7세기c.)과 벨리퉁 난파선 ( 서기 826년c.). 다우 선은 유사하게 널빤지 이음 기술을 사용하지만, 스티치가 내부 표면에서만 보이고 불연속적이라는 점에서 오스트로네시아 널빤지 이음 기술과 다르다. 또한 다우 선은 원래 묶음돌기 기술을 사용하지 않았지만, 나중에 벨리퉁 난파선과 같은 선박은 오스트로네시아 조선업자와의 접촉으로 이를 채택했다. 파놈-수린 선박의 주요 부품에 사용된 목재 중 일부는 서아시아 건축 방식에도 불구하고 동남아시아 나무에서 조달되었다. 마찬가지로, 일부 후기 오스트로네시아 선박은 서아시아 조선 기술의 요소 (예: 십자형 닻)를 보여주는데, 이는 선박이 원래 건조된 곳과 관계없이 선박의 상인과 선원들이 다국적 출신이었음을 시사한다.
해상 실크로드 고고학
중국은 송나라 ( 서기 10세기c.)까지 해상 실크로드를 항해하는 원양 선박을 건조하기 시작하지 않았다. 해상 실크로드에서 발견된 가장 오래된 중국 난파선은 명나라 시대의 투리앙 난파선 ( 서기 1305–1370년c.)과 바카우 난파선 ( 15세기 초c.). 중국산 선박 (정크) 또한 철 못과 클램프로 건조된 것으로 쉽게 식별할 수 있는데, 이는 나무 접합과 섬유 묶음으로만 건조된 오스트로네시아 및 서아시아 선박과 대조된다. 중국 선박의 다른 독특한 특징은 이전의 내륙 (강) 선박 기술에서 발전한 것으로, 평평한 바닥 디자인 (용골 없음), 중앙 방향키 (두 개의 측면 장착된 쿼터 방향키 대신), 그리고 선체를 방수 구획으로 나누는 것이다. 14세기와 15세기에 해상 실크로드가 끝나갈 무렵에는 중국과 오스트로네시아 조선 전통의 특징을 결합한 선박들도 나타나기 시작했으며, 심지어 인도까지 도달했다.
인도 선박은 서기 10세기 이전 해상 실크로드 동부 항로의 고고학적 맥락에서 마찬가지로 부재한다.:10 고다바야 난파선 ( 서기 2세기c.)은 인도양에서의 해상 네트워크의 가장 초기 증거이지만, 이는 남인도 해안을 따라 원자재의 지역 교환에만 관여했다.
고고학적 증거는 남중국해와 인도양의 무역선이 서기 10세기 이전에 오스트로네시아 널빤지 이음선과 묶음돌기선 선박, 그리고 아랍 다우 선박이었다는 것을 보여준다. 오스트로네시아 선박은 해상 비단길 역사의 대부분 기간 동안 장거리 해상 무역을 지배했다.:10
중국 도자기는 상대적으로 파괴되지 않고 정확하게 연대를 측정할 수 있다는 사실 때문에 해상 실크로드의 중요한 고고학적 표지물이다. 이들은 기원전 2세기에 고대 오스트로네시아 해상 네트워크를 통해 동남아시아에 처음 유입되었지만, 초기에는 중국의 주요 수출품이 아니었다. 당나라 (618-907 CE) 시대에 수출되기 시작하여 송나라 (960-1279 CE)와 원나라 (1279-1367 CE) 시대에 급격히 증가하다가 명나라 (1368-1643 CE) 시대에 감소했으며, 15세기에는 완전히 중단되었다. 동남아시아 무역망 전반에 걸친 이들의 분포는 지역 수요, 구매력, 무역 전문화의 차이를 반영하여 불균등하다. 중국 도자기의 가장 큰 집중은 믈라카 해협과 자와섬을 따라 발견되며, 술라웨시섬, 보르네오섬, 리아우 제도, 필리핀에서도 상당한 집중이 나타난다.
해상 실크로드 범위
유럽중심주의와 중화사상의 로마와 중국 제국의 사치품과 이국적인 것에 대한 수요 (따라서 이름에 비단이 붙은 것)의 맥락에서 현대에 주로 이야기되지만, 무역선이 운반하는 상품은 지역과 항구의 수요에 따라 다양했다. 여기에는 도자기, 유리, 구슬, 보석, 상아, 향목, 금속 (원료 및 완제품), 직물 (비단 포함), 식량 (곡물, 와인, 향신료 포함), 향료, 동물 등이 포함되었다. 특히 상아는 동아프리카의 중요한 수출품이었으며 (아프리카 내륙을 통한 육상 무역로에서 유래), 치리쿠레 (2022)는 무역로의 서쪽 구간을 "해상 상아길"이라고 불렀다.
일부 초기 역사가들이 가정했던 것처럼 소규모 무역이나 고가치-저량 무역이 아니었다. 회수된 난파선이 운반하던 상품들은 그들이 상업자본주의에 참여했음을 보여준다. 매우 많은 양의 상품, 종종 대량 생산된 상품들이 이 경로를 따라 거래되었다.
해상 실크로드 범위
무역로는 남중국해, 믈라카 해협, 인도양, 벵골만, 아라비아해, 페르시아만, 홍해를 포함한 수많은 바다와 대양을 아우른다. 해상 항로는 역사적인 동남아시아 해상 무역, 향신료 무역, 인도양 무역과 8세기 이후의 아랍 해군 무역망과 겹친다. 이 네트워크는 또한 동쪽으로 동중국해와 황해까지 확장되어 중국을 한반도와 일본 열도와 연결한다.
해상 실크로드는 그 이름이 유래한 육상 실크로드와는 여러 면에서 상당히 달랐으며, 따라서 단순히 육상 실크로드의 연장선으로 보아서는 안 된다. 해상 실크로드를 통과하는 상인들은 육상 경로와 같이 지역별 중계를 거치지 않고 해상 경로의 전체 거리를 이동할 수 있었다. 선박은 훨씬 더 많은 양의 상품을 운반할 수 있었고, 이는 각 교환마다 더 큰 경제적 영향을 미쳤다. 선박이 운반하는 상품 또한 캐러밴이 운반하는 상품과 달랐다. 해상 경로의 상인들은 날씨나 해적과 같은 다른 위험에 직면했지만, 정치적 불안정의 영향을 받지 않았고 단순히 분쟁 지역을 피할 수 있었다.
해상 실크로드 세계유산 등재 제안
2017년 5월, 다양한 분야의 전문가들이 런던에서 "해상 실크로드"를 새로운 유네스코 세계유산으로 등재 제안을 논의하기 위한 회의를 개최했다.
해상 실크로드 정치적 활용
고대 해상 비단길에 대한 학술 연구는 현대 국가들에 의해 정치적인 이유로 전유되고 신화화되었다. 특히 중화인민공화국은 2015년 시진핑이 인도네시아 방문 중 처음 제안한 일대일로 사업을 위해 해상 실크로드의 신화화된 이미지를 사용한다. 이는 동남아시아와 인도양의 항구 도시 간의 옛 무역로를 다시 연결하려는 시도이며, 중국 선원들이 이 경로를 개발하는 데 주요 역할을 했다는 잘못된 가정을 전제한다.
인도 또한 2014년에 시작된 프로젝트 마우삼으로 해상 실크로드를 신화화했는데, 이는 인도양 주변 국가들과의 옛 무역 관계를 다시 연결하려는 유사한 시도이다. 인도 또한 해상 실크로드에서 중심적인 역할을 수행한다고 묘사하며, 초기 인도 민족주의 역사가들은 인도의 무역 연결과 압도적인 일방적인 문화 확산을 대인도의 비전 아래 "인도 식민지화"로 묘사했다.
해상 실크로드 각주
틀:Trade route 2
틀:오스트로네시아 선박
틀:고대 항해
에이전트 지향 프로그래밍
에이전트 지향 프로그래밍(Agent-oriented programming, AOP)은 소프트웨어 에이전트의 개념을 중심으로 소프트웨어의 구성이 이루어지는 프로그래밍 패러다임이다. 핵심에 (가변 파라미터를 가진 메서드를 제공하는) 객체를 두는 객체 지향 프로그래밍과 달리, AOP는 (인터페이스와 메시징 기능을 가진) 외부에 지정된 에이전트를 핵심에 둔다. 이는 객체의 추상화로 생각할 수 있다. 교환된 메시지는 수신 "에이전트"에 의해 해당 에이전트 클래스에 특정한 방식으로 해석된다.
에이전트 지향 프로그래밍 역사
역사적으로, 에이전트 지향 프로그래밍의 개념과 에이전트 개념을 중심으로 소프트웨어를 구성하는 아이디어는 1990년 요아브 쇼햄이 자신의 인공지능 연구에서 도입했다. 그의 에이전트들은 하나의 파라미터를 가진 하나의 메서드만을 가지므로 그의 패러다임에 특화되어 있다. 1990년 쇼햄의 논문에서 AOP와 OOP의 기본적인 차이점을 인용하면 다음과 같다:
... 객체 지향 프로그래밍의 특화된 형태로 볼 수 있는 에이전트 지향 프로그래밍(AOP).
에이전트 지향 프로그래밍 프레임워크
쇼햄의 프로그래밍 패러다임을 구현하는 여러 AOP '프레임워크'가 있으며, 이를 에이전트 플랫폼이라고도 한다. 다음 예시들은 기본 에이전트가 헬로월드 프로그램으로 어떻게 프로그래밍되는지 보여준다.
자바 플랫폼을 위한 프레임워크 중 하나는 JADE이다.
다음은 코드를 실행하는 에이전트의 매우 기본적인 예시이다.
JADE의 AOP 모델의 핵심은 API가 표준 FIPA 에이전트 통신 언어를 지원한다는 것이다.
에이전트 스피크는 논리 프로그래밍과 신념-욕망-의도 소프트웨어 모델 (BDI) 아키텍처를 기반으로 하는 에이전트 지향 프로그래밍 언어이다.
JADE와 같이 자바 및 객체 지향성 뒤에 숨겨지지 않고 에이전트 지향 개념을 문자 그대로 번역한 Agent Speak (Jason)는 에이전트를 위한 "자연어"를 제공한다.
에이전트 지향 프로그래밍 프레임워크
GOAL은 인지 에이전트를 프로그래밍하기 위한 프로그래밍 언어이다. GOAL 에이전트는 자신의 신념과 목표로부터 행동 선택을 도출한다. 이 언어는 에이전트의 신념과 목표를 조작하고 의사결정을 구조화하는 것을 허용하고 용이하게 하는 프로그래밍 구성을 통해 인지 에이전트를 설계하고 구현하기 위한 기본적인 빌딩 블록을 제공한다. 이 언어는 상식 또는 실용적 추론을 기반으로 하는 직관적인 프로그래밍 프레임워크를 제공한다.
SARL은 다중 에이전트 시스템 코딩을 위한 기본적인 추상화를 제공한다. 이는 스크립트와 유사한 구문(스칼라 및 루비에서 영감을 얻음)을 사용한다.
PADE는 파이썬 언어로 지능형 에이전트를 개발하기 위한 파이썬 패키지이다. 이 프레임워크는 FIPA 및 ACL 표준을 준수한다.
에이전트 지향 프로그래밍 미들웨어
모듈식 또는 확장 가능한 AOP 지원을 구현하는 한 가지 방법은 그 자체로 소프트웨어 에이전트로 구현되는 미들웨어 함수에 표준 AOP API를 정의하는 것이다. 예를 들어, 디렉토리 서비스는 FIPA 디렉토리 퍼실리테이터 또는 DF 소프트웨어 에이전트로 구현될 수 있다. 에이전트를 시작, 중지, 일시 중단 및 재개하는 생명 주기 관리는 FIPA 에이전트 관리 서비스 또는 AMS 에이전트로 구현될 수 있다. AOP 접근 방식의 이점은 다양한 응용 프로그램, 서비스 및 네트워크의 사용자 및 제공자 간에 더 동적인 역할을 지원한다는 것이다. 예를 들어, 전통적으로 네트워크 및 서비스는 일반적으로 고객을 대신하여 네트워크 및 서비스 제공자에 의해 관리되었고 단일 가상 네트워크 서비스로 제공되었지만, 고객 자신도 자신의 서비스를 통합하고 관리하는 데 더 많은 권한을 얻고 있다. 이는 AOP 및 유연하고 동적으로 통신을 관리할 수 있는 미들웨어 에이전트에 대한 API를 통해 달성될 수 있다.
속성 지향 프로그래밍
속성 지향 프로그래밍 (Attribute-oriented programming, @OP)은 프로그램 코드 내에 속성이라는 메타데이터를 포함하는 기술이다.
속성 지향 프로그래밍 다양한 언어에서의 속성 지향 프로그래밍
Metadata Facility for Java(JSR-175)가 J2SE 5.0 릴리스에 포함되면서 속성 지향 프로그래밍을 바로 사용할 수 있게 되었다.
XDoclet 라이브러리를 사용하면 이전 버전의 자바에서도 속성 지향 프로그래밍 접근 방식을 사용할 수 있다.
C# 언어는 첫 릴리스부터 속성을 지원했다. 이러한 속성은 런타임 정보를 제공하는 데 사용되었으며 전처리기에서는 사용되지 않았다. 현재 소스 생성기를 사용하면 컴파일 시 추가 코드 생성을 주도하는 데 속성을 사용할 수 있다.
통합 모델링 언어 (UML)는 스테레오타입이라는 속성을 지원한다.
핵 프로그래밍 언어는 속성을 지원한다. 속성은 다양한 프로그램 엔티티에 첨부될 수 있으며, 해당 속성에 대한 정보는 리플렉션을 통해 런타임에 검색할 수 있다.
배열 프로그래밍
컴퓨터 과학에서 배열 프로그래밍(Array programming, 어레이 프로그래밍)은 전체 값 집합에 대해 한 번에 연산을 적용할 수 있는 솔루션을 의미한다. 이러한 솔루션은 일반적으로 계산과학 및 엔지니어링 환경에서 사용된다.
배열 프로그래밍을 지원하는 최신 프로그래밍 언어(또는 벡터 또는 다차원 언어라고도 함)는 스칼라에 대한 연산을 벡터, 행렬, 그리고 고차원 배열에 투명하게 적용하도록 특별히 설계되었다. 여기에는 APL, J, 포트란, 매트랩, Analytica, GNU 옥타브, R, 실크 플러스, 줄리아, 펄 데이터 언어(PDL), 라쿠가 포함된다. 이 언어들에서 전체 배열에 대해 작동하는 연산을 벡터화된 연산이라고 부를 수 있으며, 벡터 프로세서에서 실행되는지 여부와는 관계없이 벡터 명령을 구현한다. 배열 프로그래밍 프리미티브는 데이터 조작에 대한 광범위한 아이디어를 간결하게 표현한다. 간결성의 수준은 특정 경우에 극적일 수 있다. 객체 지향 코드 몇 페이지를 요구하는 배열 프로그래밍 언어 원 라이너를 흔히 볼 수 있다.
배열 프로그래밍 배열의 개념
배열 프로그래밍의 기본 아이디어는 연산이 한 번에 전체 값 집합에 적용된다는 것이다. 이는 프로그래머가 개별 스칼라 연산의 명시적 루프에 의존할 필요 없이 전체 데이터 집합을 생각하고 조작할 수 있도록 해주기 때문에 고급 프로그래밍 모델이 된다.
케네스 아이버슨은 배열 프로그래밍(실제로는 APL을 지칭)의 근거를 다음과 같이 설명했다.
배열 프로그래밍 배열의 개념
대부분의 프로그래밍 언어는 수학적 표기법에 비해 현저히 떨어지며, 응용 수학자들이 중요하다고 여길 만한 방식으로 사고 도구로 거의 사용되지 않는다.
본 논문의 요지는 프로그래밍 언어에서 발견되는 실행 가능성 및 보편성의 장점을 수학적 표기법이 제공하는 장점과 하나의 일관된 언어 내에서 효과적으로 결합할 수 있다는 것이다. 표기법을 묘사하고 배우는 어려움과 그 함의를 숙달하는 어려움을 구별하는 것이 중요하다. 예를 들어, 행렬 곱셈의 규칙을 배우는 것은 쉽지만, 그 함의(예: 결합성, 덧셈에 대한 분배성, 선형 함수 및 기하학적 연산을 나타내는 능력)를 숙달하는 것은 다르고 훨씬 더 어려운 문제이다.
실제로 표기법의 시사성은 탐색을 위해 제안하는 많은 속성 때문에 배우기 더 어렵게 만들 수도 있다.
[...]
컴퓨터 및 프로그래밍 언어 사용자는 종종 알고리즘 실행의 효율성에 주로 관심을 가지므로, 여기에 제시된 많은 알고리즘을 즉시 기각할 수 있다. 이러한 기각은 단기적인 시각이다. 왜냐하면 알고리즘의 명확한 서술은 일반적으로 더 효율적인 알고리즘을 쉽게 도출할 수 있는 기반으로 사용될 수 있기 때문이다.
배열 프로그래밍 및 사고의 기본은 개별 요소가 유사하거나 인접한 데이터의 속성을 찾아 활용하는 것이다. 데이터를 구성 요소(또는 스칼라 양)로 암묵적으로 분해하는 객체 지향과 달리, 배열 지향은 데이터를 그룹화하고 균일하게 처리하려고 한다.
함수 랭크는 일반적으로 배열 프로그래밍 언어에 중요한 개념이며, 수학의 텐서 랭크에 비유할 수 있다. 데이터에 대해 작동하는 함수는 작동하는 차원의 수에 따라 분류될 수 있다. 예를 들어, 일반적인 곱셈은 0차원 데이터(개별 숫자)에 대해 작동하므로 스칼라 랭크 함수이다. 벡터곱 연산은 스칼라가 아닌 벡터에 대해 작동하므로 벡터 랭크 함수의 예이다. 행렬 곱셈은 2차원 객체(행렬)에 대해 작동하므로 2랭크 함수의 예이다. 축소 연산자는 입력 데이터 배열의 차원을 하나 이상 줄인다. 예를 들어, 요소에 대한 합계는 입력 배열을 1차원 줄인다.
배열 프로그래밍 사용법
배열 프로그래밍은 암묵적 병렬화에 매우 적합하다. 이는 오늘날 많은 연구가 진행되는 주제이다. 또한, 1997년 이후 개발 및 생산된 인텔 및 호환 CPU는 MMX부터 시작하여 SSSE3 및 3D나우!까지 다양한 명령어 집합 확장을 포함했으며, 이는 기본적인 단일 명령 다중 데이터 배열 기능을 포함한다. 이는 2020년대까지 AVX-512와 같은 명령어 집합으로 이어져 현대 CPU를 정교한 벡터 프로세서로 만들고 있다. 배열 처리는 병렬 처리와 구별된다. 배열 처리에서는 하나의 물리적 프로세서가 항목 그룹에 대해 동시에 연산을 수행하는 반면, 병렬 처리는 더 큰 문제를 더 작은 문제(다중 명령 다중 데이터)로 분할하여 여러 프로세서가 조각별로 해결하는 것을 목표로 한다. 2023년 현재 다중 코어 프로세서와 수천 개의 범용 컴퓨팅 코어를 갖춘 GPU가 일반적이다.
배열 프로그래밍 언어
배열 프로그래밍 언어의 전형적인 예는 포트란, APL, J이다. 다른 언어로는 A+, Analytica, 채플, 대화형 데이터 언어, 줄리아, K, Klong, Q, 매트랩, GNU 옥타브, 싸이랩, FreeMat, 펄 데이터 언어(PDL), R, 라쿠, S-Lang, SAC, Nial, ZPL, Futhark, 그리고 TI-BASIC이 있다.
C 및 파스칼과 같은 스칼라 언어에서는 연산이 단일 값에만 적용되므로 a+b는 두 숫자의 덧셈을 표현한다. 이러한 언어에서 한 배열을 다른 배열에 더하려면 인덱싱과 루프가 필요하며, 이는 코딩하기 번거롭다.
배열 기반 언어, 예를 들어 포트란에서는 위의 중첩된 for-루프를 한 줄로 배열 형식으로 작성할 수 있다.
또는 객체의 배열 속성을 강조하기 위해 다음과 같이 작성할 수도 있다.
배열 프로그래밍 언어
C와 같은 스칼라 언어는 언어 자체의 기본 배열 프로그래밍 요소를 가지고 있지 않지만, 그렇다고 해서 이 언어로 작성된 프로그램이 벡터화의 기본 기술(즉, CPU에 벡터 기반 명령어가 있다면 이를 활용하거나 여러 CPU 코어를 사용하는 것)을 활용하지 않는다는 의미는 아니다. GCC와 같은 일부 C 컴파일러는 특정 최적화 수준에서 휴리스틱에 따라 이점을 얻을 수 있는 코드 섹션을 감지하고 벡터화한다. 또 다른 접근 방식은 OpenMP API에서 제공되며, 이를 통해 여러 CPU 코어를 활용하여 해당 코드 섹션을 병렬화할 수 있다.
배열 언어에서는 연산이 스칼라와 배열 모두에 적용되도록 일반화된다. 따라서 a+b는 a와 b가 스칼라일 경우 두 스칼라의 합을 표현하고, 배열일 경우 두 배열의 합을 표현한다.
배열 프로그래밍 언어
배열 언어는 프로그래밍을 단순화하지만, 추상화 패널티라는 비용이 발생할 수 있다. 덧셈이 코딩의 나머지 부분과 분리되어 수행되기 때문에 최적으로 효율적인 코드를 생성하지 못할 수 있다. (예를 들어, 동일한 배열의 다른 요소에 대한 덧셈이 동일한 실행 중에 나중에 발생하여 불필요한 반복 조회를 야기할 수 있다.) 가장 정교한 최적화 컴파일러조차도 프로그래머가 쉽게 수행할 수 있는 두 개 이상의 분명히 다른 함수를 통합하는 것은 매우 어려울 것이다. (프로그래머는 배열에 대한 동일한 패스에서 합계를 집계하여 계산 오버헤드를 최소화할 수 있다.)
이전 C 코드는 에이다 언어에서 다음과 같이 변경될 것이다. 이 언어는 배열 프로그래밍 구문을 지원한다.
APL은 구문적 설탕 없이 단일 문자 유니코드 심볼을 사용한다.
이 연산은 임의의 랭크(랭크 0 포함)의 배열, 그리고 스칼라와 배열에 대해 작동한다. Dyalog APL은 증가 할당으로 원래 언어를 확장한다.
Analytica는 에이다와 동일한 표현의 경제성을 제공한다.
다트머스 베이직은 세 번째 에디션(1966년)에 행렬 및 배열 조작을 위한 MAT 문을 가지고 있었다.
배열 프로그래밍 언어
Stata의 행렬 프로그래밍 언어 Mata는 배열 프로그래밍을 지원한다. 아래에서는 덧셈, 곱셈, 행렬과 스칼라의 덧셈, 요소별 곱셈, 첨자, 그리고 Mata의 많은 역행렬 함수 중 하나를 보여준다.
매트랩에서의 구현은 포트란 언어에서 허용되는 것과 동일한 경제성을 허용한다.
매트랩 언어의 변형인 GNU 옥타브 언어는 원래 언어를 증강 할당으로 확장한다.
매트랩과 GNU 옥타브 모두 행렬 곱셈, 역행렬, 연립 일차 방정식의 수치 해법과 같은 선형대수학 연산을 기본적으로 지원하며, 무어-펜로즈 유사역행렬도 사용한다.
두 배열의 내적에 대한 Nial 예제는 기본 행렬 곱셈 연산자를 사용하여 구현할 수 있다. a가 [1 n] 크기의 행 벡터이고 b가 [n 1] 크기의 해당 열 벡터인 경우.
대조적으로, 요소별 곱은 다음과 같이 구현된다.
동일한 수의 요소를 가진 두 행렬 간의 내적은 주어진 행렬을 열 벡터로 변형하는 보조 연산자 (:)와 전치 행렬 연산자 '를 사용하여 구현할 수 있다.
rasdaman 쿼리 언어는 데이터베이스 지향적인 배열 프로그래밍 언어이다. 예를 들어, 두 배열은 다음 쿼리로 추가될 수 있다.
R 언어는 기본적으로 배열 패러다임을 지원한다. 다음 예제는 두 행렬의 곱셈과 스칼라(실제로는 한 요소 벡터) 및 벡터의 덧셈 과정을 보여준다.
라쿠는 메타 연산자를 통해 배열 패러다임을 지원한다. 다음 예제는 더하기 연산자와 함께 하이퍼 연산자를 사용하여 배열 @a와 @b를 더하는 것을 보여준다.
배열 프로그래밍 수학적 추론과 언어 표기법
행렬 왼쪽 나눗셈 연산자는 행렬의 일부 의미론적 속성을 간결하게 표현한다. 스칼라 등가물과 마찬가지로, 계수 (행렬) A의 (행렬식이) 널이 아니면 양변에 A의 역행렬 A−1 (매트랩 및 GNU 옥타브 언어에서 A^-1)를 왼쪽에서 곱하여 (벡터) 방정식 A * x = b를 풀 수 있다. 다음 수학적 진술은 A가 풀 랭크 정사각 행렬일 때 유효하다.
A^-1 *(A * x)==A^-1 * (b)
(A^-1 * A)* x ==A^-1 * b        (행렬 곱셈 결합성)
x = A^-1 * b
여기서 ==는 동등 관계연산자이다.
이전 진술은 세 번째가 다른 것들보다 먼저 실행되면 유효한 매트랩 표현식이기도 하다 (반올림 오류로 인해 수치 비교가 거짓일 수 있음).
만약 시스템이 과결정되어 A가 열보다 행이 많다면, 유사역행렬 A+ (매트랩 및 GNU 옥타브 언어에서는 pinv(A))가 역행렬 A−1를 대체할 수 있다.
pinv(A) *(A * x)==pinv(A) * (b)
(pinv(A) * A)* x ==pinv(A) * b       (행렬 곱셈 결합성)
배열 프로그래밍 수학적 추론과 언어 표기법
x = pinv(A) * b
그러나 이러한 해결책은 가장 간결하지도 않고 (예를 들어, 과결정된 시스템을 표기상으로 구별해야 하는 필요성이 여전히 남아 있음) 계산적으로도 가장 효율적이지 않다. 후자의 점은 스칼라 등가물 a * x = b를 다시 고려할 때 쉽게 이해할 수 있다. 이 경우 해결책 x = a^-1 * b는 더 효율적인 x = b / a 대신 두 가지 연산이 필요할 것이다.
문제는 일반적으로 행렬 곱셈이 교환적이지 않다는 점이다. 이는 스칼라 해결책을 행렬 사례로 확장할 때 필요할 것이다.
(a * x)/ a ==b / a
(x * a)/ a ==b / a       (교환성은 행렬에 대해 성립하지 않는다!)
x * (a / a)==b / a       (결합성은 행렬에 대해서도 성립한다)
x = b / a
매트랩 언어는 스칼라 사례와의 유사성의 본질적인 부분을 유지하기 위해 왼쪽 나눗셈 연산자 \를 도입하여 수학적 추론을 단순화하고 간결성을 보존한다.
배열 프로그래밍 수학적 추론과 언어 표기법
A \ (A * x)==A \ b
(A \ A)* x ==A \ b       (결합성은 행렬에 대해서도 성립하며, 교환성은 더 이상 필요하지 않다)
x = A \ b
이는 코딩 관점에서 간결한 배열 프로그래밍의 예일 뿐만 아니라 계산 효율성 측면에서도 그러하다. 여러 배열 프로그래밍 언어에서는 ATLAS 또는 LAPACK과 같은 매우 효율적인 선형 대수 라이브러리의 이점을 누린다.
아이버슨의 이전 인용으로 돌아가면, 그 뒤에 숨겨진 근거는 이제 명백해질 것이다.
표기법을 묘사하고 배우는 어려움과 그 함의를 숙달하는 어려움을 구별하는 것이 중요하다. 예를 들어, 행렬 곱셈의 규칙을 배우는 것은 쉽지만, 그 함의(예: 결합성, 덧셈에 대한 분배성, 선형 함수 및 기하학적 연산을 나타내는 능력)를 숙달하는 것은 다르고 훨씬 더 어려운 문제이다.
실제로 표기법의 시사성은 탐색을 위해 제안하는 많은 속성 때문에 배우기 더 어렵게 만들 수도 있다.
배열 프로그래밍 타사 라이브러리
더 간결한 추상화를 제공하기 위해 특수하고 효율적인 라이브러리를 사용하는 것은 다른 프로그래밍 언어에서도 흔히 볼 수 있다. C++에서는 여러 선형대수 라이브러리가 언어의 연산자 오버로딩 기능을 활용한다. 어떤 경우에는 파이썬의 NumPy 확장 라이브러리, 아르마딜로 및 Blitz++ 라이브러리가 그러하듯이, 이러한 언어에서 매우 간결한 추상화가 배열 프로그래밍 패러다임의 명시적인 영향을 받는다.
오토마타 기반 프로그래밍
오토마타 기반 프로그래밍(Automata-based programming)은 프로그램 또는 프로그램의 일부가 유한 상태 기계(FSM) 또는 다른 (종종 더 복잡한) 형식 오토마톤의 모델로 생각되는 프로그래밍 패러다임이다. 때로는 잠재적으로 무한한 상태 집합이 도입되기도 하는데, 이러한 집합은 단순히 열거에 그치지 않고 복잡한 구조를 가질 수 있다.
유한 상태 기계 기반 프로그래밍은 일반적으로 동일하지만, 형식적으로는 모든 가능한 변형을 다루지는 않는다. FSM이 유한 상태 기계를 의미하며, 오토마타 기반 프로그래밍이 엄격한 의미에서 FSM을 반드시 사용하는 것은 아니기 때문이다.
다음 속성들은 오토마타 기반 프로그래밍의 핵심 지표이다.
오토마톤 단계 간의 모든 통신은 오토마톤 상태라고 명시적으로 표시된 변수 집합을 통해서만 가능하다. 두 단계 사이에서 프로그램은 지역 변수 값, 반환 주소, 현재 명령 포인터 등과 같은 상태의 암시적 구성 요소를 가질 수 없다. 즉, 오토마톤 단계에 진입하는 두 순간에 전체 프로그램의 상태는 오토마톤 상태로 간주되는 변수의 값에서만 다를 수 있다.
오토마타 기반 프로그래밍
오토마타 기반 코드의 전체 실행은 오토마톤 단계의 주기이다.
오토마타 기반 프로그래밍의 개념을 사용하는 또 다른 이유는 이 기법에서 프로그램에 대해 생각하는 프로그래머의 사고방식이 튜링 기계, 마르코프 알고리즘 등을 사용하여 수학적 작업을 해결하는 데 사용되는 사고방식과 매우 유사하기 때문이다.
오토마타 기반 프로그래밍 예시
표준 입력에서 텍스트를 한 줄씩 읽어 각 줄의 첫 단어를 표준 출력에 쓰는 작업을 고려해 보자. 먼저 선행하는 공백 문자가 있으면 모두 건너뛴다. 그런 다음 첫 단어의 모든 문자를 출력한다. 마지막으로 새줄 문자가 나타날 때까지 후행 문자를 모두 건너뛴다. 스트림의 시작이 아닌 곳에서 새줄 문자 시퀀스가 나타나면 첫 번째만 출력하고 나머지는 건너뛴다. 그렇지 않으면 모두 건너뛴다. 다음으로 다음 줄에서 프로세스를 다시 시작한다. 파일 끝 조건이 발생하면(단계에 관계없이) 중지한다.
위 작업을 수행하는 C 언어의 전통적인 프로그램은 다음과 같을 수 있다.
예를 들어, 위 프로그램을 다음 입력으로 컴파일하고 실행하면:
다음과 같은 결과가 나온다.
동일한 작업은 유한 상태 기계 관점에서 생각하여 해결할 수 있다. 한 줄의 파싱은 세 단계로 나뉜다. 선행 공백 문자를 건너뛰는 단계, 첫 번째 단어의 문자를 출력하는 단계, 그리고 후행 문자를 건너뛰는 단계이다. 이 상태들을 BEFORE, INSIDE, AFTER라고 부른다. 오토마타 기반 프로그램 버전은 다음과 같을 수 있다.
오토마타 기반 프로그래밍 예시
프로그램이 더 길어졌지만, 적어도 한 가지 중요한 장점이 있다. 읽기(즉, getchar 함수 호출) 명령이 하나뿐이다. 게다가 전통적인 버전이 네 개였던 루프 대신 루프가 하나뿐이다. while 루프의 본문은 오토마톤 단계이고, 루프 자체는 오토마톤 단계의 주기이다. 이 프로그램은 상태도에 표시된 유한 상태 기계의 작동을 구현한다.
이 프로그램의 가장 중요한 속성은 오토마톤 단계 코드 섹션이 명확하게 지역화되어 있다는 것이다. 오토마톤 단계를 위한 명시적인 step 함수를 사용하면 이 속성을 더 잘 보여준다.
이제 프로그램은 오토마타 기반 코드의 기본 속성을 명확하게 보여준다.
유한 오토마톤은 상태 전이표로 정의될 수 있으며, 행은 현재 상태를 나타내고, 열은 입력을 나타내며, 셀은 다음 상태와 수행할 동작을 나타낸다.
일반적으로 오토마타 기반 프로그램은 이 접근 방식을 자연스럽게 사용할 수 있다. 상태 전이표를 위한 명시적인 2차원 배열 transitions를 사용하면 프로그램은 이 접근 방식을 사용한다.
오토마타 기반 프로그래밍 예시
구현 언어가 객체 지향 프로그래밍을 지원한다면, 프로그램의 간단한 리팩토링은 오토마톤을 객체로 캡슐화하여 구현 세부 사항을 숨기는 것이다. 객체 지향 스타일을 사용하는 C++ 프로그램은 다음과 같을 수 있다.
문서의 주제와 직접적으로 관련 없는 변경 사항을 최소화하기 위해 C 표준 라이브러리의 입출력 getchar 및 putchar 함수가 사용되고 있다.
상태 디자인 패턴은 객체가 대규모 조건문이나 테이블 검색에 의존하지 않고 가상 함수 호출 덕분에 내부 상태에 따라 런타임에 동작을 변경하는 방법이다. 대규모 조건문을 사용하는 코드에 비해 주요 장점은 상태별 코드가 단일 블록에 집중되지 않고 여러 객체에 분산되어 유지보수성이 향상된다는 것이다. 상태 전이표를 사용하는 코드에 비해 주요 장점은 가상 함수 호출이 테이블 검색보다 효율적인 경우가 많고, 상태 전이 기준이 표 형식보다 더 명시적이며, 상태 전이에 수반되는 동작을 추가하기가 더 쉽다는 것이다. 그러나 새로운 문제가 발생한다. 클래스 수가 코드의 압축성을 다른 접근 방식보다 떨어뜨린다. 상태 디자인 패턴을 사용하는 프로그램은 다음과 같을 수 있다.
오토마타 기반 프로그래밍 예시
오토마타 기반 프로그래밍은 실제로 자동화 분야에서 발견되는 프로그래밍 요구 사항과 밀접하게 일치한다.
생산 주기는 일반적으로 다음과 같이 모델링된다.
다양한 전용 프로그래밍 언어는 이러한 모델을 다소 정교한 방식으로 표현할 수 있도록 한다.
위에 제시된 예시는 다음 의사코드와 같이 이 관점에 따라 표현될 수 있다 ('set'은 논리 변수를 활성화하고, 'reset'은 논리 변수를 비활성화하며, ':'는 변수를 할당하고, '='는 동등성을 테스트한다).
사이클 진행을 표현하는 루틴과 실제 동작(입력 및 출력 일치)을 표현하는 루틴을 분리하면 더 명확하고 간단한 코드를 얻을 수 있다.
자동화 분야에서는 단계별 진행이 기계 자체에서 오는 입력 데이터에 따라 달라진다. 이는 프로그램에서 텍스트에서 문자를 읽는 것으로 표현된다. 실제로는 이러한 데이터가 기계의 주요 요소의 위치, 속도, 온도 등을 알려준다.
GUI 프로그래밍에서와 마찬가지로, 기계 상태의 변경은 최종 상태에 도달할 때까지 한 상태에서 다른 상태로의 전환을 유발하는 이벤트로 간주될 수 있다. 가능한 상태의 조합은 다양한 이벤트를 생성하여 더 복잡한 생산 주기를 정의한다. 결과적으로 주기는 일반적으로 단순한 선형 시퀀스와는 거리가 멀다. 일반적으로 동시에 실행되는 병렬 분기와 다양한 이벤트에 따라 선택되는 대안이 있으며, 이는 아래에 개략적으로 표시되어 있다.
오토마타 기반 프로그래밍 응용 분야
오토마타 기반 프로그래밍은 어휘 및 구문 분석에서 널리 사용된다.
그 외에도 오토마타 관점에서 생각하는 것(즉, 실행 프로세스를 오토마톤 단계로 분해하고 명시적인 오토마톤 상태를 통해 단계별로 정보를 전달하는 것)은 병렬 프로세스나 스레드를 사용하는 유일한 대안으로서 사건 기반 프로그래밍에 필요하다.
상태 및 상태 기계의 개념은 형식 명세 분야에서 자주 사용된다. 예를 들어, UML 기반 소프트웨어 아키텍처 개발은 프로그램의 동작을 지정하기 위해 상태도를 사용한다. 또한 다양한 통신 프로토콜도 종종 명시적인 상태 개념을 사용하여 지정된다(예: RFC 793).
오토마타 관점(단계 및 상태)에서 생각하는 것은 일부 프로그래밍 언어의 의미를 설명하는 데에도 사용될 수 있다. 예를 들어, 레팔 언어로 작성된 프로그램의 실행은 소위 추상 레팔 기계의 단계 시퀀스로 설명된다. 기계의 상태는 뷰(변수 없는 임의의 레팔 표현식)이다.