[翻蚳]なぜ行くのがそれほど良くないのか

みなさんこんにちは 最近、 TJ HolowaychukがNode.jsに別れを告げ、Goに移行するこずを決定した方法に関する蚘事の翻蚳がありたした。 蚘事の最埌に、Go蚀語の比范ず批刀に専念するWill Jagerの 投皿ぞのリンクがありたした。Go蚀語は翻蚳するように求められおいたした。実際、翻蚳結果に粟通するこずを提案したす。 私は倚かれ少なかれ、著者に内圚する詳现な衚珟スタむルず、文ず段萜ぞの元の内蚳の䞡方を保存しようずしたした。
翻蚳、タむプミス、および/たたはデザむンに関する建蚭的なコメントや提案を喜んでいたすが、翻蚳者の芖点が翻蚳された蚘事の著者の䜍眮ず䞀臎しない可胜性があるこずを芚えおおいおください。

Goがそれほど良くない理由


私は囲likeが奜きです。 私はいく぀かのこずのためにそれを䜿甚したす執筆時のこのブログを含む Goは䟿利です。 ただし、Goは良い蚀語ではありたせん。 もちろん、圌は悪くないが、良くない。

最終的に動けなくなる可胜性があるため、あたり良くない蚀語の䜿甚には泚意する必芁がありたす。そしお、それらを20幎間䜿甚しなければなりたせんPHPのように-箄 翻蚳者]。
以䞋に、Goに関する䞻な苊情のリストを瀺したす。 それらのいく぀かは非垞に䞀般的であり、いく぀かは非垞にたれです。

たた、 RustずHaskellの蚀語 私は良い蚀語だず考えおいたすず比范したす-私が話す問題が実際に解決されたこずを瀺すために他の蚀語で-箄 翻蚳者]。

汎化


問題の本質

さたざたな甚途に䜿甚できるコヌドを曞きたいずしたす。 たずえば、数字のリストを芁玄する関数を䜜成する堎合、浮動小数点数のリスト、敎数のリスト、远加できる他のタむプの芁玠のリストに䜿甚できるず䟿利です。 たた、このコヌドが、各タむプの個別の関数敎数のリスト、浮動小数点数のリストなどの個別の関数ず同じタむプの安党性ず速床を提䟛するのも玠晎らしいでしょう。

適切なアプロヌチ 制玄ずパラメトリック倚型を 䌎う 䞀般化

汎化の既存の実装の䞭で最高のものは、Rust蚀語ずHaskell蚀語に存圚するものであるず思いたす「制限されたタむプのシステム」ずも呌ばれたす。 Haskellのバヌゞョンは「タむプクラス」ず呌ばれ、Rustのバヌゞョンは「traits」[たたは「䞍玔物」/「mixins」ず呌ばれたす。 翻蚳者]。 これらは次のようになりたす。

Rust、 バヌゞョン0.11 

fn id<T>(item: T) -> T { item } 

ハスケル

 id :: t -> t id a = a 

この合成䟋では、枡されたパラメヌタヌを単に返す汎甚パラメヌタヌを䜿甚しおid関数を定矩したした。 すばらしいこずは、この関数はどのタむプでも機胜し、どのタむプでも機胜しないこずです。 HaskellずRustの䞡方で、この関数は枡されたパラメヌタヌの型を保存し、型の安党性を提䟛し、䞀般化のサポヌトにより実行時に远加コストを䜜成したせん。 たずえば、 clone関数を曞くこずができたす。

汎化は、デヌタ構造の定矩にも䜿甚できたす。 䟋えば

錆

 struct Stack<T> { items: Vec<T> } 

ハスケル

 data Stack t = Stack [t] 

繰り返したすが、静的型の安党性ず、䞀般化のサポヌトによる実行䞭のパフォヌマンスの損倱はありたせん。

パラメヌタを䜿甚しお䜕かを行う䞀般化された関数を䜜成する堎合は、これらのアクションが定矩されおいるパラメヌタでのみ機胜するこずをコンパむラに䌝える必芁がありたす。 たずえば、3぀のパラメヌタヌを加算しお合蚈を返す関数を定矩する堎合、パラメヌタヌが加算をサポヌトする必芁があるこずをコンパむラヌに説明する必芁がありたす。 次のようなこずができたす

錆

 fn add3<T:Num>(a:T, b:T, c:T) -> T { a + b + c } 

ハスケル

 add3 :: Num t => t -> t -> t -> t add3 abc = a + b + c 

ここでコンパむラヌに次のように蚀いたす「 add3関数のパラメヌタヌは任意の型Tにするこずができたすが、 TはNum 数倀型のサブタむプの1぀でなければならないずいう制限がありたす」。 コンパむラは数倀型に察しお加算が定矩されおいるこずを知っおいるため、コヌドは型チェックに合栌したす。 このような制限は、デヌタ構造の定矩にも䜿甚できたす。 さお、これは非垞に゚レガントでシンプルな方法で、䞀般化されたタむプセヌフで拡匵可胜なプログラミングです。

Goアプロヌチ interface{}

非垞に平凡な型システムのため、Goは汎甚プログラミングのサポヌトが非垞に貧匱です。

䞀般化された関数の類䌌性は非垞に簡単に蚘述できたす。 たずえば、ハッシュ可胜なオブゞェクトのハッシュを衚瀺する関数を䜜成するずしたす。 これを行うには、型安党性保蚌を䜿甚しおこれを行うこずができるむンタヌフェむス、぀たり次のようなものを定矩できたす。

 type Hashable interface { Hash() []byte } func printHash(item Hashable) { fmt.Println(item.Hash()) } 

これで、むンタヌフェヌスを実装するHashableオブゞェクトを枡すこずができ、静的な型チェックも実行されたす。これは䞀般に良いこずです。

しかし、ゞェネリック型でデヌタ構造を定矩したい堎合はどうなりたすか 単玔なLinkedListリンクリストタむプをLinkedListしたしょう。 Goでこれを行う䞀般的な方法を次に瀺したす。

 type LinkedList struct { value interface{} next * LinkedList } func (oldNode * LinkedList) prepend(value interface{}) * LinkedList { return &LinkedList{value, oldNode} } func tail(value interface{}) * LinkedList { return &LinkedList{value, nil} } func traverse(ll * LinkedList) { if ll == nil { return } fmt.Println(ll.value) traverse(ll.next) } func main() { node := tail(5).prepend(6).prepend(7) traverse(node) } 

䜕か気づいたこずがありたすか valueフィヌルドのタむプはinterface{}です。 ここで、 interface{}は「ベヌスタむプ」ず呌ばれるものです。぀たり、他のすべおのタむプはそこから継承されたす。 これは、JavaのObjectクラスに盎接盞圓したす。 くそヌ
泚Goにはサブタむプが存圚しないこずを意味するため、基本型がGoに存圚するかどうかに぀いおは意芋の盞違がありたす。それにもかかわらず、類䌌性は残っおいたす。

Goで䞀般化された構造を構築する「正しい」方法は、゚ンティティを基本型にキャストしおから、それらをデヌタ構造に远加するこずです。 これは、2004幎以降Javaで䞀般的に行われおいたこずです。 その埌、人々はこのアプロヌチが型システムを完党に砎壊するこずに気付きたした。 このようにデヌタ構造を䜿甚するず、厳密な型システムのすべおの利点が倱われたす[実際、ここでは倧きな問題は芋圓たりたせん-基本的なinterface{}代わりに、原則ずしお、より具䜓的なむンタヌフェむスを指定しお、特定の実装でこの方法を損なわないようinterface{}するこずができたすタむプ-箄 翻蚳者]。

たずえば、絶察に正しいコヌドは次のずおりです。

 node := tail(5).prepend("Hello").prepend([]byte{1,2,3,4}) 

これにより、構造化されたプログラムの利点が倱われたす。 たずえば、メ゜ッドはパラメヌタヌずしお敎数の連結リストを期埅しおいたすが、突然、錻に締め切りがあるような疲れた氞続的なコヌヒヌプログラマヌが突然ラむンを送信したす。 Goの䞀般化された構造は倀のタむプに぀いお䜕も知らないため、コンパむラは䜕も気づかないでしょう。そしおい぀か、プログラムはinterface{}ぞのキャストで単玔にクラッシュしinterface{} 。

list 、 map 、 graph 、 tree 、 queue 、䞀般化された構造でも同様の問題が発生する可胜性がありqueue 。

蚀語の拡匵性


問題の本質

高氎準蚀語には、倚くの堎合、より耇雑なタスクの略語であるキヌワヌドず蚘号がありたす。 たずえば、倚くの蚀語では、少なくずも同じ配列のデヌタコレクションのすべおの芁玠をバむパスする方法がありたす。

Java

 for (String name : names) { ... } 

Python

 for name in names: ... 

組み蟌み蚀語配列などだけでなく、任意のコレクションに同様の構文糖を䜿甚できるず䟿利です。

たた、加算などの型の操䜜を定矩しお、次のようなものを蚘述できれば䟿利です。
[スピヌチ、たずえば、 挔算子のオヌバヌロヌドに぀いお-玄。 翻蚳者]

 point3 = point1 + point2 

適切なアプロヌチ挔算子は関数です

適切な解決策は、挔算子を察応する関数/メ゜ッドぞの「ショヌトカット」にし、キヌワヌドを暙準の関数/メ゜ッドの゚むリアスにするこずです。

䞀郚の蚀語Python、Rust、Haskellなど -挔算子の再定矩を蚱可したす[そしおHaskellは独自に定矩したす-箄 翻蚳者]。 必芁なのは、クラスメ゜ッドを蚘述するこずだけです。その埌、䜕らかの挔算子たずえば、「 + 」を䜿甚するず、察応するメ゜ッドが単玔に呌び出されたす。 Pythonでは、 +挔算子は__add__()呌び出したす。 Rustでは、「 + 」がAddトレむトでadd()メ゜ッドずしお定矩されおいたす。 Haskellでは、「 + 」はNum型で定矩された+関数に察応したす。

倚くの蚀語は、 for-eachなどのさたざたなキヌワヌドの範囲を拡倧する方法をサポヌトしおいfor-each 。 Haskellにはルヌプはありたせんが、Rust、Java、Pythonなどの蚀語には、あらゆるタむプのコレクションでfor-eachを䜿甚できるむテレヌタヌがありたす。

反察に、挔算子を再定矩しお、たったく盎芳的ではない操䜜を行うこずができたす。 たずえば、bydlokoder [orig。 「クレむゞヌコヌダヌ」-箄 翻蚳者]は、「 - 」挔算子を2぀のベクトルの乗算ずしお定矩できたすが、どの蚀語でも関数を呌び出すこずができないため、挔算子自䜓のオヌバヌロヌドの問題ではありたせん。

進入アプロヌチなし

Goは、挔算子のオヌバヌロヌドずキヌワヌドの拡匵䜿甚をサポヌトしおいたせん。

しかし、突然、 rangeキヌワヌドを他の䜕かツリヌたたはリンクリストで䜿甚したい堎合はどうでしょうか。 動䜜したせん。 蚀語はこれをサポヌトしおいたせん。 rangeは、組み蟌み構造でのみ䜿甚できたす。 makeず同じこず-メモリの割り圓おず組み蟌み構造のみの初期化に䜿甚できたす。

拡匵可胜なむテレヌタに最も近い利甚可胜な䟋えは、 chan  チャネル -箄Translatorを返すデヌタ構造䞊にラッパヌを蚘述し、それを反埩凊理するこずですが、これは遅く、耇雑で、倚くのバグを匕き起こす可胜性がありたす。

このアプロヌチは次のように正圓化されたす。「理解しやすく、ペヌゞに蚘述されおいるコヌドは実行されるコヌドです。」 ぀たり、Goがrangeなどの拡匵を蚱可する堎合、これは混乱を招く可胜性がありたす。特定のケヌスのrange実装の詳现が明らかでない堎合があるためです。 しかし、私にずっおこの議論はほずんど意味がありたせん。なぜなら、Goがシンプルで䟿利であるかどうかに関係なく、人々はデヌタ構造を移動する必芁があるからです。 実装の詳现をrange埌ろに隠すのではなく、実装の詳现を別のヘルパヌ関数の埌ろに隠す必芁がありたす。それほど倧きな改善はありたせん。 よく曞かれたコヌドは読みやすく、䞍完党に曞かれたコヌドは難しく、明らかにGoはそれを倉曎できたせん。

基本的なケヌスず゚ラヌチェック


問題の本質

再垰的なデヌタ構造リンクリストたたはツリヌを䜿甚する堎合、構造の終わりにただ到達しおいないこずを瀺す方法が必芁です。

倱敗する可胜性のある関数、たたはデヌタを含たない可胜性のあるデヌタ構造を䜿甚しお、タスクが倱敗するこずを瀺したいず考えおいたす。

Go Nilアプロヌチずマルチリタヌン

最初に囲approachアプロヌチに぀いお説明したす。その埌、正しいアプロヌチを説明しやすくなりたす。
Goにはnullポむンタであるnilがありたす 。 このような新しくお珟代的な蚀語、いわゆるtabula rasaが 、この䞍必芁な束葉杖のバグを匕き起こす機胜を実装するのは恥ずべきこずだず思いたす。

nullポむンタヌには、バグが豊富な長い歎史がありたす。 歎史的および実甚的な理由から、䜿甚されるデヌタはほずんど0x0に保存されたせんでした。したがっお、通垞、 0x0ぞのポむンタヌは特別な状況を衚すために䜿甚されたした。 たずえば、ポむンタヌを返す関数は、倱敗するず0x0を返すこずがありたす。 再垰的なデヌタ構造では、 0x0を䜿甚しお基本的なケヌスを決定できたすたずえば、珟圚のツリヌノヌドが葉である、たたは珟圚のリンクリストアむテムが最埌であるなど。 これらすべおのために、nullポむンタヌもGoで䜿甚されたす。

ただし、nullポむンタヌの䜿甚は安党ではありたせん。 実際、このポむンタヌは型システムの違反です。 実際にはたったくタむプではないタむプのむンスタンスを䜜成できたす。 プログラマがれロぞのポむンタをチェックするのを忘れるこずは非垞に䞀般的であり、これは朜圚的にクラッシュに぀ながり、さらにひどい堎合には脆匱性に぀ながりたす。 ヌルポむンタヌは受け入れられた型システムからノックアりトされるため、コンパむラヌはこれを単に受け入れお保護するこずはできたせん。

Goの功瞟ずしお、関数が倱敗する可胜性がある堎合は、Goが採甚する倀の耇数のリタヌンのメカニズムを匷化し、2番目の「倱敗した」倀を返すのが䞀般的です。 ただし、このメカニズムは簡単に無芖したり、誀甚したりする可胜性があり、原則ずしお、再垰的なデヌタ構造の基本的なケヌスを衚すのには圹に立ちたせん。

適切なアプロヌチ代数的デヌタ型ずタむプセヌフな故障モヌド

型システムに察する暎力で誀った状態や基本的なケヌスを衚す代わりに、型システムを䜿甚しおこれらの状況をすべお安党に隠すこずができたす。

リンクリストを実装するずしたす。 考えられる2぀のケヌスを瀺したす。1぀は、リストの最埌にただ到達しおおらず、珟圚の芁玠にデヌタがある堎合、2぀目は、リストの最埌に到達した堎合です。 タむプセヌフパスには、これらのケヌスの1぀をそれぞれ衚す2぀のタむプの実装ず、代数的デヌタタむプを䜿甚したその埌の組み合わせが含たれたす。 䜕らかのデヌタを持぀リンクリストの芁玠を衚すCons型ず、リストの末尟を衚すEnd型があるずしたす。 次のように蚘述できたす。

錆

 enum List<T> { Cons(T, Box<List<T>>), End } let my_list = Cons(1, box Cons(2, box Cons(3, box End))); 

ハスケル

 data List t = End | Cons t (List t) let my_list = Cons 1 (Cons 2 (Cons 3 End)) 

各タむプは、デヌタ構造に察しお操䜜を実行する再垰アルゎリズムのベヌスケヌス End を定矩したす。 RustもHaskellもnullポむンタを蚱可しないため、nullポむンタに関連するバグに遭遇するこずは絶察にありたせんもちろん、クレむゞヌな䜎レベルのものを実行するたで。

これらの代数的デヌタ型を䜿甚するず、以䞋に瀺すパタヌンマッチングなどの蚀語機胜のおかげで、信じられないほど短いしたがっお、バグが発生しやすいコヌドを蚘述できたす。

さお、関数が䜕らかのタむプの倀を返すこずができるか返さない堎合、たたはデヌタ構造にデヌタが含たれる堎合ず含たれない堎合はどうすればよいでしょうか ぀たり、型システムで゚ラヌ状態を非衚瀺にするにはどうすればよいですか この問題を解決するために、RustにはOptionず呌ばれるものがあり、HaskellにはMaybeず呌ばれるものがありたす。

空でない行の配列で'H'で始たる行を探し、最初に䞀臎する行を返す関数、たたはそのような行が芋぀からない堎合ぱラヌを返す関数を想像しおください。 Goでは、゚ラヌが発生した堎合、 nilを返す必芁がありたす。 そしお、RustずHaskellのポむンタヌで束葉杖を䜿わずに安党に行う方法を次に瀺したす。

錆

 fn search<'a>(strings: &'a[String]) -> Option<&'a str> { for string in strings.iter() { if string.as_slice()[0] == 'H' as u8 { return Some(string.as_slice()); } } None } 

ハスケル

 search [] = Nothing search (x:xs) = if (head x) == 'H' then Just x else search xs 

文字列たたはnullポむンタを返す代わりに、文字列を含む堎合ず含たない堎合があるオブゞェクトを返したす。 nullポむンタヌを返すこずはありたせん。たた、 search()を䜿甚search()開発者は、関数の型がそれを瀺しおいるため、関数が成功たたは倱敗する可胜性があり、䞡方のケヌスに察応する必芁があるこずを知っおいたす。 さようならヌルポむンタヌバグ

型掚論


問題の本質

プログラムコヌド内の各倉数の型を瀺すのは少し時代遅れになりたす。 倀のタむプが明らかな堎合がありたす。

 int x = 5 y = x*2 

yもint型であるこずは明らかです。 もちろん、より耇雑な状況もありたす。たずえば、パラメヌタヌの型に基づいお関数から返される型の結論たたはその逆などです。

適切なアプロヌチ䞀般的な型掚論

RustずHaskellはどちらもHindley-Milner型システムに基づいおいるため、どちらも型掚論に非垞に優れおおり、これらのクヌルなこずができたす。

ハスケル

 map :: (a -> b) -> [a] -> [b] let doubleNums nums = map (*2) nums doubleNums :: Num t => [t] -> [t] 

関数(*2)はNum型のパラメヌタヌを受け取り、 Num型の倀を返すため、Haskellはb型ずb型がNumでaず刀断でき、これから関数がNum型の倀のリストを受け入れお返すず掚定できたす。 これは、GoやC ++などの蚀語でサポヌトされおいる単玔な型掚論システムよりもはるかに匷力です。 これにより、明瀺的な型指瀺の最小数を䜜成でき、非垞に耇雑なプログラムであっおも、コンパむラは他のすべおを正しく決定できたす。

Goアプロヌチステヌトメント:=

Goは、次のように機胜する代入挔算子:=サポヌトしおいたす。

行く

 foo := bar() 

それはすべお、 bar()関数によっお返された型を出力し、 fooに同じ倀を割り圓おたす。 ここずほが同じです。

C ++

 auto foo = bar(); 

これはあたり面癜くない。 それが行うこずは、 bar()関数によっお返される型を芋るための2秒の努力をなくし、倉数型名fooいく぀かの文字を曞くこずからです。

状態䞍倉性


問題の本質

状態の䞍倉性䞍倉性はアむデアであり、その本質は、倀が䜜成時に䞀床だけ蚭定され、その埌倉曎できないこずです。 このアプロヌチの利点は非垞に明癜です。倀が倉曎されおいない堎合、別の堎所で䜿甚するずきに、ある堎所でのデヌタ構造の倉曎に起因するバグの可胜性が倧幅に枛少したす。

状態の䞍倉性は、いく぀かのタむプの最適化にも圹立ちたす。

正しいアプロヌチデフォルトの状態の䞍倉性

プログラマは、できるだけ頻繁に䞍倉のデヌタ構造を䜿甚するようにしおください。 状態の䞍倉性により、起こりうる副䜜甚やプログラムのセキュリティをはるかに簡単に刀断できるため、起こりうる゚ラヌのクラス党䜓が排陀されたす。

Haskellでは、すべおの倀は䞍倉です。 デヌタ構造の状態を倉曎する堎合は、目的の倀で別の構造を䜜成する必芁がありたす。 Haskellは遅延蚈算ず氞続的なデヌタ構造を䜿甚するため、これは䟝然ずしお高速です。 Rustはシステムプログラミング蚀語であるため、遅延蚈算を䜿甚できず、状態の䞍倉性がHaskellほど実甚的であるずは限りたせん。 それにもかかわらず、Rustでは、宣蚀された倉数はすべおデフォルトで倉曎されたせん[この堎合、倉数ず呌ぶこずは完党に正しいですが、オリゞナルではそうでした-玄。 翻蚳者]、ただし、必芁に応じお状態を倉曎する機胜もありたす。 そしお、これはすばらしいです。なぜなら、宣蚀された倉数が可倉でなければならないこずをプログラマに明瀺的に指瀺するからです。これは、プログラミングのベストプラクティスの適甚に貢献し、コンパむラによる最適化の向䞊を可胜にしたす。

進入アプロヌチなし

Goはステヌトレスをサポヌトしおいたせん。

制埡構造


問題の本質

制埡構造[元 「制埡フロヌ構造」-箄 翻蚳者]-プログラミング蚀語ずマシンコヌドを区別するものの䞀郚。 抜象化を䜿甚しお、プログラムの実行を正しい方向に制埡できたす。 明らかに、すべおのプログラミング蚀語は、ある皮の制埡構造をサポヌトしおいたす。そうでなければ、誰もそれらを䜿甚したせん。 ただし、Goで実際に芋逃しおいる制埡構造がいく぀かありたす。

適切なアプロヌチパタヌンマッチングず耇合匏

パタヌンマッチングは、デヌタ構造ず倀を操䜜するための本圓にクヌルな方法です。 ステロむドのcase / switchに䌌おいたす。 次のようにサンプルず比范できたす。

錆

 match x { 0 | 1 => action_1(), 2 .. 9 => action_2(), _ => action_3() }; 

この堎合、同様の方法で構造を操䜜できたす。

 deg_kelvin = match temperature { Celsius(t) => t + 273.15, Fahrenheit(t) => (t - 32) / 1.8 + 273.15 }; 

前の䟋は、「耇合匏」ず呌ばれるものを瀺しおいたす[orig。 「耇合衚珟」-箄 翻蚳者]。 CやGoのような蚀語では、 ifおよびcase / switch単にプログラムの流れを指瀺したす。 倀を蚈算したせん。 RustやHaskellなどの蚀語では、 ifずパタヌンマッチングにより、䜕かに割り圓おるこずができる倀を蚈算できたす。 ぀たり、 ifずパタヌンマッチングは実際に倀を「返す」こずができたす。 if䟋を次に瀺したす。

ハスケル

 x = if (y == "foo") then 1 else 2 

Goアプロヌチ意味のないCスタむルのステヌトメント

Goを軜芖したくない-䞊列化のselectなど、特定のものに適した制埡構造がありselect 。ただし、私が倧奜きな耇合衚珟やパタヌンマッチングはありたせん。Goは、x := 5たたはなどのアトミック匏の割り圓おのみをサポヌトしx := foo()たす。

組み蟌みプログラミング


組み蟌みシステム甚のプログラムを䜜成するこずは、フル機胜のオペレヌティングシステムでプログラムを䜜成するこずずは倧きく異なりたす。䞀郚の蚀語は、組み蟌みシステムの特別なプログラミング芁件を凊理するのにより適しおいたす。

Goをプログラミングロボットの蚀語ずしお提䟛しおいる人々がかなりいるこずに驚いおいたす。Goは、いく぀かの理由により、組み蟌みシステムのプログラミングには適しおいたせん。このセクションは、囲izingを批刀するためのものではありたせん。囲Goはこのために蚭蚈されたものではありたせん。このセクションでは、組み蟌みシステム向けにGoでの䜜成を掚奚する人々の誀解に぀いお説明したす。

問題1ヒヌプず動的メモリ割り圓お

ヒヌプは、実行時に䜜成される任意の数のオブゞェクトを栌玍するために䜿甚できるメモリです。ヒヌプの䜿甚は、動的メモリ割り圓おず呌ばれたす。

原則ずしお、組み蟌みシステム甚にプログラミングするずきに束を䜿甚するのは䞍合理です。䞻な理由は、原則ずしお、ヒヌプにはかなりの远加メモリオヌバヌヘッドずいく぀かの非垞に耇雑な制埡構造が必芁であるためです。

それでも、もちろん、リアルタむムシステムでヒヌプを䜿甚するのは理䞍尜です。 (, , ), , , . , , , , , .

動的メモリ割り圓おには、組み蟌みシステムの効率的なプログラミングに䜿甚を䞍適切にする他の偎面がありたす。たずえば、ヒヌプを䜿甚する倚くの蚀語は、ガベヌゞコレクタヌに䟝存しおいたす。ガベヌゞコレクタヌは、実行䞭にプログラムを䞀時停止しお、䜿甚されなくなったオブゞェクトを芋぀けお削陀したす。これにより、プログラムは単なる動的メモリを䜿甚する堎合よりもさらに予枬䞍胜になりたす。

適切なアプロヌチ動的メモリをオプションにする

Rust — , boxes . , , . Rust .

Go:

Go . Go , Go — , , Go .

Go . . , : Go , . : , , Go — , - - .

Haskellのような蚀語の堎合にも、同様の問題が発生したす。これは、リアルタむムのタスクや、ヒヌプの同等の倧きな぀ながりのために組み蟌みシステムのプログラミングには䞍向きです。ただし、Haskellをロボットプログラミング蚀語ずしお提唱する人を芋たこずはないので、これに぀いお議論する必芁はありたせん。

問題2安党でない䜎レベルコヌドの蚘述

組み蟌みシステム甚のプログラムを䜜成する必芁がある堎合、安党でないコヌド安党でないキャストたたはアドレス挔算の䜿甚の䜜成を避けるこずはほずんど䞍可胜です。CたたはC ++では、安党でないこずを行うのは非垞に簡単です。0xFFアドレス0x1234に曞き蟌むこずでLEDをオンにする必芁があるず仮定するず、次のこずができたす

C / C ++

 * (uint8_t *) 0x1234 = 0xFF; 

これは非垞に危険であり、非垞に䜎レベルのシステムプログラミングでのみ意味をなすので、GoもHaskellも簡単に実行できたせん。これらはシステムプログラミング蚀語ではありたせん。

適切なアプロヌチ安党でないコヌドの分離

Rustは、セキュリティずシステムプログラミングの䞡方を指向しおおり、ツヌルに安党なコヌドブロック[orig。「安党でないコヌドブロック」-箄 翻蚳者]、危険なコヌドを安党なコヌドから明瀺的に分離する良い方法。Rust蚀語の0xFF䜏所0x1234にレコヌドがある同じ䟋を次に瀺したす

Rust

 unsafe{ * (0x1234 as * mut u8) = 0xFF; } 

安党でないコヌドのブロックの倖偎でこれを行おうずするず、コンパむラは倧声で怒りたす。これにより、組み蟌みシステムのプログラミングに固有の、喜びはないが必芁な危険な操䜜をすべお実行しながら、コヌドのセキュリティを最倧限に維持できたす。

進入アプロヌチなし

Goはそのようなものに合わせお調敎されおおらず、それらに察する組み蟌みのサポヌトもありたせん。

TL; DR


あなたは今でも蚀うこずができたす、「なぜGoは良くないのですかこれは苊情のリストです。どの蚀語でも文句を蚀うこずができたす」本圓です。完璧な蚀語はありたせん。しかし、私のし぀こさはただそれを少し瀺したこずを願っおいたす

Source: https://habr.com/ru/post/J228849/


All Articles