2010-06-11 2 views
3

, поэтому я спросил здесь несколько дней назад о C# и его принципах. Теперь, если возможно, у меня есть некоторые дополнительные общие вопросы о некоторых языках, потому что для новичков, подобных мне, это кажется немного запутанным. Чтобы быть точным, я хочу больше узнать о возможностях языковых функций, чем синтаксисе.Помогите мне отсортировать языки программирования немного

Чтобы быть честным, это только те особые функции, которые меня беспокоят и заставляют меня так запутаться. Например, C имеет свой printf(), Pascal имеет writeln() и так далее. Я знаю, что в основном вывод в ассемблере этих функций будет схожим, каждый язык имеет более или менее свои специальные функции. Для консольного вывода, для манипуляций с файлами и т. Д. Но все эти функции являются де-факто частью его OS API, поэтому почему, например, в C различаются между стандартными библиотечными функциями C и (в Windows) функции WinAPI, когда даже printf() имеет для использования некоторых функций Windows, вызовите часть своей функции, чтобы на самом деле отобразить нужный текст в окне консоли, потому что фактическое «показ» выполняется ОС. Где линия между языковыми функциями и системным API?

Теперь языки я не совсем понимаю - Python, Ruby и тому подобное. Чтобы быть более конкретным, я знаю, что они похожи на java и C#, поскольку они скомпилированы в байт-код. Но я не понимаю, каковы его возможности с точки зрения создания графических приложений. Я видел учебное пособие по использованию Ruby для программирования графических приложений в Linux и Windows. Но разве это не просто обновление? Я имею в виду рамки других учебников. Похоже, что эти языки были сначала предназначены для небольших скриптов, чем для создания больших приложений.

Надеюсь, вы понимаете, почему я смущен. Если да, пожалуйста, помогите мне разобраться в этом, мне некому спросить.

+0

Почему это закрыто как «не настоящий вопрос»? Просто потому, что ОП в целом был смущен и не мог более точно задать вопрос? Проголосовал за reopen. – DevSolar

+0

Я думаю, что на самом деле это * настоящий вопрос, связанный с программированием здесь (что-то вроде * «Почему есть * и * стандартные библиотеки и OS API, когда они, похоже, дублируют некоторые функции?» *), Но я не уверен, как для исправления текста. ** Ответ: ** история. Попытайтесь выяснить, когда c получил printf (http://en.wikipedia.org/wiki/Printf#1970s:_C.2C_Lisp), и когда используемая версия получила эти особые вызовы Windows ... – dmckee

ответ

2

Внизу у вас есть само ядро ​​ОС - код, который работает в специальном режиме процессора, который позволяет напрямую обращаться к другим защищенным ресурсам. Вам никогда не придется иметь дело с этим, если вы не разработчик ОС.

Затем идет беспроигрышная линия, разделяющая это «пространство ядра» от «пользовательского пространства». Все, что вы делаете как «нормальный» разработчик, выполняется в пространстве пользователя.

Ядро ОС экспортирует ограниченное количество очень простых функций в пространство пользователя, получившее название «системные вызовы». Откройте файл, прочитайте/напишите несколько байтов, например, закрыв файл.

Поскольку эти системные вызовы обычно требуют, чтобы разработчики кода Ассемблера не хотели, чтобы их беспокоили, они «завернуты» в (обычно) функции кода C: open(), read(), write(), close ().

Теперь приходят два набора API-интерфейсов, доступных разработчику: API-интерфейс ОС и стандартный API-интерфейс.

Стандартный язык API предоставляет функции, которые могут использоваться на любой платформе, поддерживающей язык: fopen(), fputc(), fgetc(), fclose(). Он также будет предоставлять функции более высокого уровня, облегчающие жизнь: например, fprintf().

OS API предоставляет свой собственный набор функций. Они не переносимы в другую операционную систему, но могут быть более интуитивными в использовании или более мощными или просто разными. OpenFile(), ReadFile(), WriteFile(), CloseFile(). Опять же, могут быть доступны функции более высокого уровня, т. Е. PrintLn().

Эти два набора функций могут частично полагаться друг на друга или делать системные вызовы напрямую, но это не должно вас слишком беспокоить.Вы, , должны, однако, принять заранее, какой набор функций вы хотите использовать для своего проекта, поскольку смешивание двух наборов - хотя и не ошибка само по себе - открывает совершенно новую банку червей (то есть потенциальных ошибок) ,

-2

Чтобы быть более конкретным, я знаю, что они похожи на java и C# в терминах, которые они скомпилированы в bytecode.

Ruby и Python - это как переведенные языки, http://en.wikipedia.org/wiki/Interpreted_language, так и их код не переведен в байт-код перед исполнением.

+1

Я не знать о Ruby, но Python, конечно же, сокращен. –

+0

Вид не по теме, даже если он ошибается –

+0

Я собирался сказать то же самое ... но у google, похоже, есть куча компиляторов python и ruby, поэтому я думаю, что правильнее сказать, что они не имеют * для компиляции: D просто педантичен ...: P – Jeriko

1

So.

Для вашего первого вопроса интерфейс между API C и OS API является средой выполнения C. В Windows это некоторое воплощение MSVCRT.DLL, тогда как в Linux это glibc.

Во-вторых, родной язык для большинства инструментов GUI - это C или C++. Языкам более высокого уровня, которые хотят использовать их, требуются привязки, которые переводится между языком и C/C++ API.

В-третьих, эти языки высокого уровня, по-видимому, используются для «небольших скриптов». Простой факт заключается в том, что они гораздо более выразительны, чем C или C++, а это означает, что они имеют равные или более возможности, чем C или C++, и записываются в меньшем количестве строк кода.

2

C переносной. Это означает, что в разных системах выход ассемблера для printf будет другим ... это то, что компилятор действительно основан на вашей целевой системе. Напишите код C и скомпилируйте его в качестве приложения для Linux, и результат будет отличаться от того, как в качестве приложения Win32, а также отличается от того, если вы скомпилируете тот же самый код для iPhone или что-то в этом роде.

Внутренне, стандартные библиотеки C могут обернуть вызов API Win32 при вызове printf, но это не ваша забота в большинстве случаев.Стандартная библиотека C (например, printf и другие операции ввода-вывода для файлов и т. Д.) обертывает низкоуровневую ОС или аппаратный код, необходимый для выполнения того, что вы хотите.

Стоит отметить, что тот же эффект происходит на Java, но по-другому. На широком уровне: в Java код, который вы пишете всегда компилирует в тот же байт-код. Но тогда, когда JVM запускает этот байт-код, то JRE переводит его в машинные инструкции по конкретным во время выполнения, а не во время компиляции на С.

1

Если я предполагаю, что это ваш главный вопрос:

Где находится линия между языковыми функциями и системным API?

Тогда представьте себе, если вы будете эту аналогию:

система OS API вызовы, как лего кирпича и компонентов лего.

Программирование «функции» - это просто компоновка многих деревянных кирпичей. Таким образом, комбинация приводит к инструменту.

Таким образом, различные языки могут «организовать» и создать инструмент по-разному.

Если бы я попросил вас создать автомобиль с лего, вы можете придумать много разных конструкций.

0

C printf() является оберткой. Вы можете использовать его и скомпилировать свой код под любой ОС, но полученный машинный код будет другим. В Windows это может вызвать некоторые функции внутри Windows API. В Linux он будет использовать Linux API. Вы спрашиваете, почему отличается Windows API. Это потому, что, если вы программируете для Windows, вы можете использовать его для выполнения некоторых специфичных для ОС вещей, таких как создание графических интерфейсов, управление текстом консоли, а не просто печать, запрос ресурсов ОС и тому подобное. Подобный API существует для Linux и Mac (и я думаю, что все остальные ОС) тоже, и они позволяют вам делать более или менее то же самое. В отличие от printf(), они не переносимы.

Вы спрашиваете, что такое линия между языковыми функциями и системным API. Функции языка просто вызывают API ОС. Вы можете позвонить , но тогда вы не сможете скомпилировать свой код в разных системах.

Python и Ruby (и некоторые другие) интерпретируются. Они скомпилированы для байт-кода за кулисами, но все пользователи видят, что двойной щелчок по исходному файлу запустит его. Нет необходимости компилировать. Это означает, очевидно, что они медленнее, чем скомпилированные языки. Однако их динамическая природа способствует более быстрому развитию, поскольку обычно вам нужно меньше кода для выполнения того же самого (я сказал обычно).

Это не значит, что эти языки нельзя использовать для «больших» приложений: для них есть библиотеки графического интерфейса. Это потому, что это языки общего назначения, в отличие от некоторых других, таких как Bash.

Смежные вопросы