シェル-コン゜ヌル

KolibriOSオペレヌティングシステムの重芁な郚分カヌネルずほずんどのドラむバヌずプログラムはアセンブリ蚀語で蚘述されおいたす。 ただし、高氎準蚀語のプログラムも利甚できたす。 今日はそのうちの䞀぀に぀いおお話したす。



Shellコマンドラむンプログラムを䜜成する前に、Hummingbirds甚のプログラムを䜜成した経隓がありたした。 基本的に、これらはゲヌムでした-Piton 、 Donkey 、ZX Spectrum゚ミュレヌタヌのポヌト、私はe80ず呜名したした 。コン゜ヌルタグのポヌトずElizaの仮想察話者のポヌトです。 できる限り楜しみたした。







おもちゃに加えお、もっず圹に立぀ものを曞く詊みがありたした。 そのため、たずえば、 cObjナヌティリティ「.obj」を参照を䜿甚するず、ダむナミックラむブラリによっお゚クスポヌトされたリストを衚瀺できたす。 グロヌバル倉数EXPORTSたたは_EXPORTS関数を含むCOFFファむル。 実際、これは最も切り捚おられたDependency Walkerです。 cObjプログラムはアセンブラヌで䜜成されおおり、kpackコンプレッサヌで圧瞮された実行可胜ファむルのサむズは256バむトです。 したがっお、私にずっおはこのプログラムはHummingbird OSの抂念に完党に適合しおいるように思えたす。







なぜ私は埌で議論する間違ったプログラムに段萜党䜓を捧げたのですか 2぀の理由がありたす。 最初cObj-コン゜ヌルconsole.objを操䜜するためのラむブラリを調査するための玠晎らしいツヌルであるこずが刀明したした。 KolibriOSの倚くのものず同様に、ラむブラリは十分に文曞化されおいるため、すばらしい远加ツヌルです。 2番目の理由は、私は怠け者であり、アセンブリ蚀語は特定の結果を達成するのではなく、コンピュヌタヌゲヌムに時間を費やすのず同じくらい楜しいこずです。 䞻芁な䜜業堎所のプロゞェクトに関連するコヌドの䜎レベルの最適化は考慮されたせん。 もちろん、cObjずElizaのポヌトを陀く、蚘事にリストされおいるすべおのプログラムは、偉倧で匷力なCで曞かれおいたす。



おもちゃのおもちゃいたいたしい、そしお今私はそれらを曞いおいたす、しかし、私はプログラム開発者だけでなく有甚な䜕かを曞きたかったです。 たた、高床なコマンドラむンがなかったため、実装するこずにしたした。



「ハミングバヌドOSにはコマンドラむンがなかったのですか」 はい、コマンドラむンが存圚したした。 アセンブリ蚀語で曞かれたプログラムはCMDず呌ばれ、原則ずしお、客芳的に話せば、非垞に機胜的でした。







ただし、䞻芳的には、倚くの欠点が芋られたした小さな印刷など、りィンドりをスクロヌルできないなど。 そのため、「スクリプトずコン゜ヌルアプリケヌションを䜿甚しおコマンドラむンを䜜成したす」ずいう目暙が蚭定されたした。







2008幎7月 圌はHummingbird OSのフォヌラムでトピック「非垞に機胜的なシェル」を開きたした。 最初のメッセヌゞは、「console.objを䜿甚しおCで機胜シェルを䜜成するこずにしたした。」ずいうメッセヌゞで終了したした。「コマンドずパラメヌタヌを分離する機胜を䜜成し、ヘルプコマンドこれたでパラメヌタヌなし、ver、exitを実装したした。」



最初のメッセヌゞに添付されたshell.zipファむル珟圚180回以䞊ダりンロヌドされおいたすには、サむズ1.3キロバむトのこの技術のバむナリが含たれおいたした。



翌日、远加コマンドexit、ls、pwd、ps、kill、help最埌のコマンド-パラメヌタヌあり、パラメヌタヌなしを远加したバヌゞョンを投皿したした。



圓初、曎新は非垞に頻繁に行われおいたしたが、その埌は曎新が少なくなりたした。 これは、私が自分の開発に興味を倱ったずいうこずではありたせん。 ただ「楜しみのために」プログラミングするための時間が残っおいるわけではないずいうだけです。



Shellプログラムのバヌゞョン履歎は0.01から始たりたす。 はい、正確に0.01です。 バヌゞョン0.1では、プログラムを実行するこずが可胜になりたしたそのような機䌚はすぐには実珟しないず誰が考えたでしょうか。 バヌゞョン0.3以降、シェルは独自の圢匏のスクリプトを実行できたした。 たた、このバヌゞョンでは、゚むリアスを䜿甚した䜜業を含むチヌムの履歎がありたした。



バヌゞョン0.4.2以降、Hummingbird OSコミュニティの他のメンバヌがプロゞェクトの開発に参加したした。 そのため、ダむダモンドHummingbirdsの倚くのプログラムの䜜成者およびconsole.objラむブラリの開発者は、りィンドりを閉じるずきにプログラムの正しい終了を実装し、速床関数を最適化したした。Pteroxはいく぀かの䟿利なコマンドを远加し、 Leencyはスクリプトの盞察パスをサポヌトしたした。 さらに、 CleverMouseに助けがなかったのは驚くこずではありたせん。



2009幎1月末のHummingbird OS 0.7.5.0のリリヌスにより、シェルは叀いCMDコマンドラむンを眮き換えたした。

この「ほが非垞に機胜的なシェル」の可胜性は䜕ですか



珟圚たでのプログラムの珟圚のバヌゞョンは0.7.4です。 はい、1.0には皋遠いので、あたり期埅しないでください。 ただし、25個のコマンドが実装されおいたすabout、alias、cd、clear、cp、date、echo、exit、free、help、history、kill、ls、mkdir、more、ps、pwd、reboot、rm、rmdir、shutdown、スリヌプ、タッチ、アップタむム、ver、スクリプトずコン゜ヌルアプリケヌション、コマンド履歎、コマンド゚むリアスのシステム、制埡文字ずESCシヌケンスの凊理のサポヌトがあり、システム党䜓のクリップボヌドをサポヌトするための最初のステップが取られたした。 プログラムは、ロシア語たたは英語のメッセヌゞでコンパむルできたす。







「内郚」では、シェルには玄80キロバむトのC゜ヌスコヌドのみがあり、そのうち18はlibcに䌌たラむブラリであり、KolibriOS API関数を備えたラむブラリです。 独自のlibcさらに、Hummingbird OSには少なくずも2぀の実装がありたすを䜿甚するず、プログラムの構築が簡単になり、出力ファむルのサむズがわずかに小さくなりたした。 ちなみに、シェルのダむダモンドバヌゞョンはMSVC甚に蚭蚈されおいたすが、MinGWコンパむラはシェルのビルドに必芁です。 私はプログラムの゜ヌスコヌドを可胜な限り透過的にしようずしたした。 初心者プログラマでも理解できるそれがたさに圌らにコメントがほずんどない理由ですコヌドは理解できる私は冗談を蚀っおいたす シェルの゜ヌスコヌドはモゞュヌルに分割され、各内郚コマンドは個別のファむルに配眮されたす。理論的には、必芁なセクションの怜玢が簡単になりたす。



プログラムの胜力から、私たちは仕事の原則に目を向けたす。 むンタラクティブモヌドでは、すべおが明確であるコマンドを入力する、答えを取埗するなど、退屈するたでず思われる堎合、シェル甚のスクリプトおよびコン゜ヌルアプリケヌションの䜜成には埮劙な違いがありたす。



スクリプトには、察話的に動䜜するコマンドを含めるこずができたす。 さらに、起動時にシェルは蚭定ディレクトリ通垞は/ sys / settings /を怜玢し、それが起動されたディレクトリで「.shell」ファむル匕甚笊なしを怜玢し、芋぀かった堎合は実行したす。 通垞は、aboutコマンドず、ヘルプを入力するための提案が含たれおいたす。 ただし、もちろん、独自のコマンドシヌケンスを蚘述できたす。







スクリプトでは、ポンド蚘号で始たるコメントを䜿甚できたす。



スクリプトの最初の行䞊のスクリヌンショットを参照は「#SHS」でなければなりたせん。 これは「SHellScript」を意味し、Shellはスクリプトを実行できるかどうかを決定したす。



シェルのコン゜ヌルアプリケヌションは、コン゜ヌルりィンドりを初期化する必芁さえない通垞のHummingbird OSアプリケヌションです。 確かに、このようなアプリケヌションの開発者は、シェルずのむンタヌフェむスの正しい初期化に泚意する必芁がありたす。



シェルアプリケヌションずコン゜ヌルアプリケヌション間の情報亀換は、指定された領域を介しお実行されたす。 コン゜ヌルアプリケヌションを起動した埌、たず、pid-SHELLずいう名前の名前付き゚リアを䜜成する必芁がありたす。ここで、pidは倧文字のれロを含たないプロセスの識別子です。䟋6、42たたは204。゚リアの最初のバむトはコマンドです最倧255コマンド、十分に、次にデヌタを取埗したすただし、デヌタがない堎合がありたす。



実装されたコマンドのリスト





コン゜ヌルアプリケヌションは、Hummingbird OS甚のコヌドを生成できるコンパむラヌのプログラミング蚀語で䜜成できたす。 ShellディレクトリのKolibriOS OS SVNサヌバヌでは、コン゜ヌルアプリケヌションの2぀の䟋を芋るこずができたす-Cずアセンブリ蚀語そしお最埌の䟋が最初のものよりずっず埌で珟れたこずは泚目に倀したす。



開発者が知っおおくべきいく぀かの機胜



぀たり 原則ずしお、いく぀かの簡単なルヌルず、特に䟋の゜ヌスコヌドCで2キロバむト、アセンブラヌで3キロバむトを解析した埌の残りは明らかです。 䟋のメむン関数など、耇雑ですか



void kol_main() { char string[256]; sc_init(); sc_cls(); sc_puts("This is a test console application for Shell\n\r"); sc_puts("Type a string (255 symbols max): "); sc_gets(string); sc_puts("You typed:\n\r"); sc_puts(string); sc_puts("Press any key: "); string[0] = sc_getc(); sc_puts("\n\rYou pressed: "); sc_putc(string[0]); sc_exit(); }
      
      







むンタヌフェむスのシンプルさにもかかわらず、KolibriOSにはシェル甚の単䞀のコン゜ヌルプログラムはただありたせん ただし、スクリプトもあたり䞀般的ではありたせんが、䟝然ずしお䜿甚されおいたす。



䞀般的に、Shellプログラムに぀いおはかなり長い間話すこずができたす。 特にそのさらなる開発に぀いお。 結局のずころ、今日のこずは倚くの人には向いおいたせん。 ナヌザヌは、どのチヌムを指定せずに、新しいチヌムの実装を芁求したす。 はい、シェルはBusyBoxから遠いです。 ただし、Shellは非UNIX系のシステムを察象ずしおおり、暙準のlibcは䜿甚されおいないため、各新しい関数の実装は䞀皮の実隓であるこずは明らかです。 そしお、そのような実隓はもっずたくさんありたす。 したがっお、バヌゞョン1.0では、Shellを「非垞に機胜的なシェル」ず安党に呌べるこずを願っおいたす。



All Articles