核心要點
這是SitePoint PHP通訊7月25日版的社論。
為什麼字符串被稱為字符串?你有沒有想過這個問題?除了編程之外,我們從未在其他語境中使用過這樣一個詞來表示粘在一起的一組字母,然而——在編程中,它就像“變量”這個詞一樣普遍。這是為什麼,它從哪裡來?
為了弄清楚,我們必須先解決一些相關的術語。歷史課時間!
單詞font(字體)源自法語fonte——熔化過的事物;鑄件。鑑於印刷機的字母確實是金屬製成的,並在鉛字鑄造廠熔化,這很有道理。
術語uppercase(大寫)和lowercase(小寫)指的是字體運輸所用字盒的字面部分。因此,印刷工(人)有一個沉重的字盒,他隨身攜帶或在印刷機上設置,在這個字盒中有兩個“級別”——一個大寫字母盒,一個小寫字母盒。大寫字母盒只包含——你猜對了——大寫字母,而小寫字母盒只包含小寫字母。
你會注意到,小寫字母比大寫字母多。這是可以預料的——一個字母在一頁上只能使用一次,畢竟,書面文本中的小寫字母比大寫字母多得多,因為那時還沒有Youtube評論和大小寫鎖定。
那麼這一切與字符串有什麼關係呢?
好吧,隨著印刷變得越來越主流,印刷機開始向個人提供服務,而不僅僅是報紙和出版商,據說他們決定根據印刷材料的長度(以英尺為單位)收費。當然,很多都是推測性的,但如果他們將生產的印刷材料串在一起,他們就可以很容易地估計成本並向客戶收費。因此,我們可以相當肯定地得出結論,他們在這種情況下使用string(字符串)這個詞來表示字符序列。
2017年7月26日編輯:正如下面的評論中所指出的,似乎確實有一根實際的繩子用於將字符塊捆綁在一起,因為它們在組裝後被運送到印刷機!一位Twitter粉絲甚至給我發了以下視頻,演示了這個過程!
儘管如此,這與編程領域有什麼關係呢?我的意思是,你可以說關於任何東西的任何東西的字符串,它在非編程世界中都會有一定的意義。它只是一個可以很容易地普遍應用於事物的詞,即使它通常不被使用。
如果我們看看學術界對第一份參考文獻的記載呢?
在1944年的《遞歸可枚舉的正整數集及其判定問題》中,我們提到了一種可能大致類似於現代定義的內容:
為了工作的目的,我們引入字母6,並考慮“字符串”1和b,例如11b1bb1。
在這篇論文中,這個術語指的是相同符號的序列,所以是一串1或一串b。這並不完全符合我們的定義,但這只是一個開始。
然後,整整14年後,在1958年的《一種用於機械翻譯的編程語言》中,這個詞是這樣使用的,而且只使用了一次:
標點符號或空格之間的每個連續字母串都在字典中查找。
好吧,有點類似於我們對字符串的概念,但看起來他只是在描述,嗯,單詞。顯然,這並不適用——它太籠統了。然而,由於某種原因,它似乎已經流行起來。
在1958年的《一種用於處理符號串的命令語言》中,string(字符串)這個詞的使用方式與我們今天完全相同,儘管沒有定義為這樣。
我們在1959年的《用於機械翻譯的COMIT系統》中找到了另一個參考文獻:
如果我們想用COS(F) D (F)替換D SIN(F),其中F不受限制,可以是任何任意的組成部分序列,我們使用符號$來表示這個字符串。
有趣!這是我們都從PHP中知道的美元符號,它實際上是BASIC中的字符串符號。
同樣在1959年,我們在《Share 709系統:符號編程的機器實現》中得到了一個更直接的定義:
文本是線性排序的位串,表示加載和列表過程中所需的其他信息。
事實上,正是通過1960年4月的ALGOL,字符串似乎採用了其現代的簡寫形式“string”(在此之前,人們說string of [something])。請參閱這篇論文的摘要。
然後,在1960年5月,《關於算法語言ALGOL 60的報告》以一種觸及核心內容的形式提到了它。
從那時起,它就像現代的模因一樣迅速傳播開來。
1963年的《METEOR:一種用於字符串轉換的LISP解釋器》使用了相當不具體的“[...]但某些線性列表(字符串)的簡單轉換在這個符號中很難定義。”
1964年的《關於聲明任意編碼字母表》提到“字符字符串”。
搜索ACM顯示了60年代及以後的許多其他資源,所有這些資源現在都定期使用這個術語,因此,60年代似乎是這個術語演變的催化劑,並使其成為今天的樣子,緩慢地,通過它所處的系統的需求。很有趣的是,它最終代表的概念與印刷術時代的概念相似——一組具有含義並帶來某些成本的字符(只是這次是在內存中)。
作為旁注——考慮一下60多年前的所有這些論文。 60年前,他們用穿孔卡片解決計算機科學問題,並在學術論文中寫到這些問題。而我們現在是2017年,有2017年的JavaScript框架,爭論著誰可以在Drupal的社區中與誰發生性關係,並試圖一遍又一遍地重新定義Facade這個詞。當我們爭論“東西進入盒子,東西從盒子出來”的現代網絡開發的火箭科學時,那些人通過將他們所處的模擬環境轉化為數字環境來塑造整個世界,通過本質上欺騙一小撮沙子來記住數字。
結論
所以現在我們知道了——或者至少認為我們知道——string(字符串)從哪裡來。計算機科學一直是一個充滿神秘和緩慢演變的黑暗空間,就像我們現在知道人眼在其過去有半階段和半眼一樣,計算機科學中的術語也已經超越並圍繞其原始含義演變,直到它們給了我們今天所擁有的東西。 20世紀60年代在各個地方同時誕生了相同名稱的相同概念,直到它演變成一個我們都理解和使用的統一術語,最重要的是,我們都能達成一致。
當你仔細想想,我們還能用一個更好的詞嗎?雖然由於與“現實世界”中類似術語的完全脫節,string(字符串)幾乎感覺不自然(我們不會將書頁上的文字稱為“strings”),但我無法想到任何更適合這種流行數據類型的術語。你能嗎?告訴我。
計算機編程中字符串的常見問題解答(FAQ)
計算機科學中“字符串”一詞被認為起源於“字符字符串”短語。它最早是在編程早期使用的,當時數據通常表示為字母數字字符的序列或“字符串”。這個術語被用來描述編程語言中作為字符序列的數據類型,並且它一直沿用至今。
字符串是字符序列,可以包括字母、數字和特殊字符。與整數或布爾值等其他數據類型(分別表示數值或真/假值)不同,字符串用於表示和操作文本。它們幾乎是所有編程語言中的基本數據類型,並且它們帶有多種內置方法用於操作和分析。
在Java和Python等一些編程語言中,字符串是不可變的。這意味著一旦創建了一個字符串,就不能更改它。這種設計選擇主要是出於效率和安全原因。由於字符串經常在程序中大量使用,因此使它們不可變可以使系統優化內存使用和處理速度。它還可以防止與可變字符串相關的潛在安全風險。
字符串通常存儲在內存中,作為字符序列,每個字符佔用一定數量的字節,具體取決於所使用的字符編碼。例如,在ASCII編碼中,每個字符佔用一個字節的內存,而在Unicode編碼中,字符可以佔用兩個或多個字節。字符串的結尾通常用特殊的空字符標記。
可以對字符串執行許多操作,包括連接(將兩個字符串連接在一起)、子字符串提取(獲取字符串的一部分)、字符串比較(檢查兩個字符串是否相等)和字符串搜索(在字符串中查找特定字符或子字符串)。這些操作通常作為編程語言中的內置方法提供。
大多數編程語言都提供函數或方法來將字符串轉換為其他數據類型。例如,在Python中,可以使用int()函數將數字字符串轉換為整數,或使用float()函數將其轉換為浮點數。但是,如果字符串不表示有效的數字,則這些轉換將失敗。
字符串插值是一種編程技術,其中變量或表達式直接插入到字符串中。這通常用於以更易讀和方便的方式格式化字符串。字符串插值的語法因編程語言而異。
字符串是字符序列,而字符數組是一個數組,其中每個元素都是一個字符。在C等一些編程語言中,字符串表示為以空字符結尾的字符數組。但是,在許多高級語言中,字符串是一種具有自身方法和屬性的單獨數據類型。
字符串文字是直接寫入程序源代碼的字符串。它通常用引號括起來,具體是單引號還是雙引號取決於編程語言。字符串文字被視為常數值,在某些語言中,它們是不可變的。
字符串中的特殊字符,如換行符、製表符或引號字符,通常使用轉義序列表示。轉義序列是一個反斜杠 () 後跟一個字符或字符序列。確切的語法和可用的轉義序列因編程語言而異。
以上是為什麼字符串稱為字符串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!