為什麼字符串稱為字符串?
核心要點
- 編程術語“字符串”(string)的起源被認為與印刷術時代相關,當時印刷商根據印刷材料的長度(以英尺為單位)收費。他們將印刷好的材料串在一起,用“string”(字符串)這個詞來表示字符序列。
- 在20世紀40年代和50年代發表的論文中,發現了最早使用“string”來表示與現代編程類似含義的學術參考文獻。這些早期用法指的是相同符號的序列或標點符號或空格之間連續的字母串。
- 我們今天在編程中所知的“string”(字符串)這個術語似乎在20世紀60年代得到了確立,出現在各種學術論文和資源中。它用於表示一組具有含義並帶來某些成本的字符,類似於它在印刷術時代的用法。
- 儘管“string”(字符串)這個術語在現實世界中沒有等效詞(我們不會將書頁上的文字稱為“strings”),但它已成為計算機科學中一個普遍理解的術語,代表著一種流行的數據類型。作者認為,可能沒有其他術語比這個術語更適合這種數據類型。
這是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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。
