UNIX / POSIXシステムコールの命名がなぜ読みにくいのですか?


43

Unix やの場合、and やorのようなtimeandのcreat代わりに、多分もっと適切な、そのようなアンテリングシステムコール名を使用する理由は何ですか。それは次の点に私を連れて行きます:なぜ誰かがそれを読みやすくするためにキャメルケースや少なくともアンダースコアなしのようなものが欲しいのですか?もちろん、呼び出しにはより多くの文字が含まれますが、コードの可読性がより重要であることは誰でも知っていますか?getCurrentTimeSecscreateFileget_current_time_secscreate_filecfsetospeed


42
ハンガリーの表記法、ラクダケース、スネークケースなどが流行する数十年前に発明されたからです。また、当時のコンパイラにはリソースがほとんどなく、識別子名は(IIRC)8文字に制限されていたためです。
lcd047

3
@phresnelファイル名と変数IDの関係はわかりませんが、ええ、8、12、14の間で迷っていました。変数IDの制限は14だったかもしれません。確かに256以上ではありませんでした。表記については、「常に」を定義してください。ArminiusはCamelCaseの単語を使用しましたか?そうでないかもしれない。AFAIR、ハンガリーの表記法は、1990年代初頭にWindowsに導入されました。CamelCaseとsneak_caseは後のバリエーションでした。もちろん、両方はその前に使用されました。私が言っているのは、彼らが1990年代半ばに人気を博したということです。
lcd047

6
@phresnel:リンクが最初のUnixファイルシステムの制限について述べていることに注意してください。トンプソン、リッチーら Unix を設計していたとき、彼らはまだUnixを実行していないマシン、つまりおそらくより厳しい環境でUnix をブートストラップしなければなりませんでした
-DevSolar

11
それは、私はJavaが受け入れるようにプログラマーを教えた過剰長い怪物のための考えることができる最も近い自然言語の近似についてですので、彼らは、ドイツ語で書かれていない理由をあなたにも...頼むかもしれない
R ...

12
このようなことがとても嬉しいです。ls -la | grepがどのように見えるか想像してみてくださいlistAllHiddenAndNormalFiles() | globallySearchARegularExpressionAndPrint()
ポウヤ

回答:


61

それは、当時の技術的な制約によるものです。POSIX標準は、1980年代に作成され、1970年に誕生したUNIXを参照していました。当時のいくつかのCコンパイラは、6文字または8文字の識別子に制限されていたため、変数と関数の長さの標準が決まりました名前。

関連する質問:


5
技術的な制約は当てはまらないと思います。6バイトを超えるファイルを作成したり、数千行のコードにまたがるプログラムを作成したりできます。抽象構文木は、6レベルよりもはるかに深く、レベルごとにノードが増えます。理由としては、6文字の制限は技術的なものではなく、設計されたものです。また、「作成」より「作成」の方が優れている理由は説明されていません。また、あなたが話しているいくつかのCコンパイラに名前を付けてください。あなたの答えは、「いつかどこかで聞いた」ようなものです。
フレネル

41
@phresnel:彼は、ファイルサイズ、行数、または構文ツリーの深さについて話していません。古いバージョンのC言語では、コンパイラーとリンカーは、内部リンケージを持つ識別子の最初の31文字以上または外部識別子の場合は6文字以上を保持する必要がありませんでした。このように、そしてこれらの初期のツールチェーンの一部だけ離れて語らすることができませんでした。その理由は、これらのシステムは数キロバイトの小さなフットプリントで動作していたからです。get_current_date()get_current_time()
DevSolar

34
しかし、あなたは正しいcreat()。ケントンプソンは、かつてUNIXシステムを再設計している場合、どのように変更するか尋ねられました。彼の返事:「私はeでcreatを綴ります。」
DevSolar

8
@phresnel:限られたメモリしか持たないことはハードリミットではありません。識別子の限定された保証された長さだけを持っているのです。6つの重要なキャラクターしか保証されていない場合、ソルトに値するなら、それがあなたが取り組んでいるものです。
DevSolar

6
FWIW、古いFortran規格では6文字に制限されています。この本から:「1つの識別子の6文字のFortranルールは、1つのIBM 704ワードで6文字を表すことができるという事実に由来します。」私はCについて話すことはできませんが、制限は非常に似た起源(またはおそらく、同一の起源)を
持っていると思います-tpg2114

26

dr01は正しいですが、別の理由もあります-ユーザビリティ。昔は、キーボードのように快適に入力できるものはありませんでした。運が良ければ、昔ながらのタイプライターに似たものがありました。運が悪かった場合は、実際の物理的な作業が必要なシステム(「キー」を押すのに多大な力を要した)を処理するか、手動でカードに穴を開けなければなりませんでした。

これは、6〜8文字の制限内であっても、コマンドをできるだけ短くすることを試みたことを意味します。あなたが持っている理由ですls代わりにlist、そしてcreat代わりにcreate。その時代のコードはaxなどの変数でいっぱいですi-そしてもちろん、x2そして友人です。タイピングは大変な作業でした-今日では、listIndex「タイピング」のときよりもタイピングの労力が少なくなっていますi-そして、それほど遅くはありません(特にオートコンプリートのような追加の技術)。

本当の質問は-どうしてそんなに多くのUnixイディオムが、もはや望ましくないのにどうして持続するのか?


23
カーネルがからtimeに変わる日getCurrentTimeSecsなどに、アップグレードを停止します。私の快適なキーボードと最近のハードウェアでさえ、これらの名前は非常に便利でシンプルなままです(シンプルさはUNIXの基本の1つです)。Linuxカーネルでは言うまでもなく、この種のJava / C#スタイルの命名をC言語に持ち込む必要は本当にありません。IMOは、カーネル開発者または一般にUNIX開発者の観点から、これらのイディオム望ましくないものに近いものではありません。
ジョンWHスミス

11
@BenjoyoはunRootlyLongNamed.Packaged.nonsensicalFunctionある醜い私に、私はむしろ、必ずそれが実行して何だろうman 2 time、何を思われるものを推測より。
ムル

7
@Benjoyoさて、この環境に慣れていない人は、特にシステムコールを使用する人を対象としているため、そもそもシステムコールを使用することは想定されていません。(標準)ライブラリは他のライブラリ用です。UNIXは、一見簡単に理解できるこれらのファッショナブルなデザイン「ルール」に従っていません。それを使用する人はどのドキュメントに見もせずにためにある多くのトラブルの、およびUNIXコミュニティの少数の人々は、問題が解決されることを考えるでしょう。
ジョンWHスミス

4
@JohnWHSmithは、カーネルモードの開発者がシステムとそのドキュメントを知っていることを確認しますが、それは簡潔わかりやすい名前を持たない理由ではありません。
-Benjoyo

7
@JohnWHSmithカーネルドライバーを作成したことがあり、略語で一杯ではない意味のある名前を好む低位の開発者として、私は反対しなければなりません。しかし、元のgitソースコードを見てみると、少なくとも1人のカーネル開発者が私に同意していることがわかるので、それは大丈夫です。あなたは彼のことはLinusを伝える場合がget_Xたりremove_file_from_cache(私が提案するかもしれないがrmfc?)カーネル開発者にとって望ましくない、公にそれを実行してください-私は思い愛する彼の反応を見るために。
Voo

22

他の回答に加えて、UnixはMultics、CTSS、およびその他の現代的なオペレーティングシステムへの反応として開発されたことを指摘したいと思います。http://www.multicians.org/devdoc.htmlでこれらのOSの感触をつかむことができます。たとえば、http://www.multicians.org/mspm-bx-1-00.htmlchange_name、ファイルの名前を変更するコマンドとして提供します。Unixを比較しmvます。

また、非常に短いシステムコール名が続く主な理由は、下位互換性です。新しいAPIはより明確になる傾向があることに気付くでしょう。たとえばgettimeofdayclock_gettime単にの代わりにtime

(今日でも、ループインデックスのwhateverIndex代わりに使用するとi私の本では自動的にコードレビューが失敗します;-)


2
うん。LISP MachinesがUNIXよりも前の時代のハードウェア機能に関する技術的議論を聞くのはおかしいです。確かに、UNIXマシンは安く購入できましたが、それだけです。メンテナンスコスト(もちろん* nixの土地ではカウントされない)を追加すると、テーブルは変わりましたが、とにかく説得力のある議論ではありませんでした。(そして、うん、iあなたがいるときに、配列を反復、たとえば、インデックスの罰金である座標を使用。?xyいくつかの順序を横断記述が必要です。?。)
Luaan

@Luaan LISPマシンはUnixよりも前のものではありません。あなたは失敗します。
pizdelect

@pizdelectそれは技術的には本当ですが、技術的な真実は誰かにスナップするのに十分な理由ではありません。
zwol

@pizdelect申し訳ありませんが、私はLispがUNIX(およびC)よりも前のものであることを意味していました。しかし、商業的な影響を比較すると、LISPマシンは本質的に現代的でした(UNIXの開始は約3年でしたが、LISPマシンが登場する頃には、商用UNIXマシンはまだほとんどなく、ほとんどのUNIXは学界またはサポートなし)。いずれにせよ、それは人々が実際にUNIXマシンとLISPMの間を決定していた80年代の当時の一般的な技術的議論への応答であり、それらは間違っていました。それは、とにかく高速にLISPを実行できるマイクロコンピューターによって変わりました。
Luaan

10

デニスリッチーは、Fortranでも必要とされなかったリンカー機能に依存しないという制約をCに設定しました。したがって、外部名には6文字の制限があります。


@downvoterあなたはこれについてDenni Ritchieに同意しないかもしれませんが、それは彼がしたことです。この答えを取り上げるのは無益です。
user207421 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.